Bell can now play an arbitrary sound file.
[sgt/putty] / windlg.c
index 0120a3b..133c2d2 100644 (file)
--- a/windlg.c
+++ b/windlg.c
@@ -223,6 +223,7 @@ enum { IDCX_ABOUT = IDC_ABOUT, IDCX_TVSTATIC, IDCX_TREEVIEW, controlstartvalue,
     sessionpanelend,
 
     loggingpanelstart,
+    IDC_TITLE_LOGGING,
     IDC_BOX_LOGGING1,
     IDC_LSTATSTATIC,
     IDC_LSTATOFF,
@@ -259,6 +260,7 @@ enum { IDCX_ABOUT = IDC_ABOUT, IDCX_TVSTATIC, IDCX_TREEVIEW, controlstartvalue,
     IDC_CURNORMAL,
     IDC_CURAPPLIC,
     IDC_COMPOSEKEY,
+    IDC_CTRLALTKEYS,
     keyboardpanelend,
 
     terminalpanelstart,
@@ -268,9 +270,10 @@ enum { IDCX_ABOUT = IDC_ABOUT, IDCX_TVSTATIC, IDCX_TREEVIEW, controlstartvalue,
     IDC_WRAPMODE,
     IDC_DECOM,
     IDC_LFHASCR,
-    IDC_BEEP,
     IDC_BCE,
     IDC_BLINKTEXT,
+    IDC_ANSWERBACK,
+    IDC_ANSWEREDIT,
     IDC_ECHOSTATIC,
     IDC_ECHOBACKEND,
     IDC_ECHOYES,
@@ -281,6 +284,28 @@ enum { IDCX_ABOUT = IDC_ABOUT, IDCX_TVSTATIC, IDCX_TREEVIEW, controlstartvalue,
     IDC_EDITNO,
     terminalpanelend,
 
+    bellpanelstart,
+    IDC_TITLE_BELL,
+    IDC_BOX_BELL1,
+    IDC_BOX_BELL2,
+    IDC_BELLSTATIC,
+    IDC_BELL_DISABLED,
+    IDC_BELL_DEFAULT,
+    IDC_BELL_WAVEFILE,
+    IDC_BELL_VISUAL,
+    IDC_BELL_WAVESTATIC,
+    IDC_BELL_WAVEEDIT,
+    IDC_BELL_WAVEBROWSE,
+    IDC_BELLOVL,
+    IDC_BELLOVLNSTATIC,
+    IDC_BELLOVLN,
+    IDC_BELLOVLTSTATIC,
+    IDC_BELLOVLT,
+    IDC_BELLOVLEXPLAIN,
+    IDC_BELLOVLSSTATIC,
+    IDC_BELLOVLS,
+    bellpanelend,
+
     windowpanelstart,
     IDC_TITLE_WINDOW,
     IDC_BOX_WINDOW1,
@@ -524,12 +549,14 @@ static void init_dlg_ctrls(HWND hwnd) {
     CheckDlgButton (hwnd, IDC_ALTSPACE, cfg.alt_space);
     CheckDlgButton (hwnd, IDC_ALTONLY, cfg.alt_only);
     CheckDlgButton (hwnd, IDC_COMPOSEKEY, cfg.compose_key);
+    CheckDlgButton (hwnd, IDC_CTRLALTKEYS, cfg.ctrlaltkeys);
     CheckRadioButton (hwnd, IDC_ECHOBACKEND, IDC_ECHONO,
                      cfg.localecho == LD_BACKEND ? IDC_ECHOBACKEND:
                       cfg.localecho == LD_YES ? IDC_ECHOYES : IDC_ECHONO);
     CheckRadioButton (hwnd, IDC_EDITBACKEND, IDC_EDITNO,
                      cfg.localedit == LD_BACKEND ? IDC_EDITBACKEND:
                       cfg.localedit == LD_YES ? IDC_EDITYES : IDC_EDITNO);
+    SetDlgItemText (hwnd, IDC_ANSWEREDIT, cfg.answerback);
     CheckDlgButton (hwnd, IDC_ALWAYSONTOP, cfg.alwaysontop);
     CheckDlgButton (hwnd, IDC_SCROLLKEY, cfg.scroll_on_key);
     CheckDlgButton (hwnd, IDC_SCROLLDISP, cfg.scroll_on_disp);
@@ -542,7 +569,17 @@ static void init_dlg_ctrls(HWND hwnd) {
     SetDlgItemInt (hwnd, IDC_SAVEEDIT, cfg.savelines, FALSE);
     fmtfont (fontstatic);
     SetDlgItemText (hwnd, IDC_FONTSTATIC, fontstatic);
-    CheckDlgButton (hwnd, IDC_BEEP, cfg.beep);
+    CheckRadioButton (hwnd, IDC_BELL_DISABLED, IDC_BELL_VISUAL,
+                     cfg.beep==BELL_DISABLED ? IDC_BELL_DISABLED :
+                     cfg.beep==BELL_DEFAULT ? IDC_BELL_DEFAULT :
+                     cfg.beep==BELL_WAVEFILE ? IDC_BELL_WAVEFILE :
+                     cfg.beep==BELL_VISUAL ? IDC_BELL_VISUAL : IDC_BELL_DEFAULT);
+    SetDlgItemText (hwnd, IDC_BELL_WAVEEDIT, cfg.bell_wavefile);
+    CheckDlgButton (hwnd, IDC_BELLOVL, cfg.bellovl);
+    SetDlgItemInt (hwnd, IDC_BELLOVLN, cfg.bellovl_n, FALSE);
+    SetDlgItemInt (hwnd, IDC_BELLOVLT, cfg.bellovl_t, FALSE);
+    SetDlgItemInt (hwnd, IDC_BELLOVLS, cfg.bellovl_s, FALSE);
+
     CheckDlgButton (hwnd, IDC_BCE, cfg.bce);
     CheckDlgButton (hwnd, IDC_BLINKTEXT, cfg.blinktext);
 
@@ -733,7 +770,7 @@ static void create_controls(HWND hwnd, int dlgtype, int panel) {
         struct ctlpos cp;
         ctlposinit(&cp, hwnd, 80, 3, 13);
         bartitle(&cp, "Options controlling session logging",
-                 IDC_TITLE_TERMINAL);
+                 IDC_TITLE_LOGGING);
         beginbox(&cp, NULL, IDC_BOX_LOGGING1);
         radiobig(&cp,
                  "Session logging:", IDC_LSTATSTATIC,
@@ -747,7 +784,7 @@ static void create_controls(HWND hwnd, int dlgtype, int panel) {
     }
 
     if (panel == terminalpanelstart) {
-        /* The Terminal panel. Accelerators used: [acgo] wdlben ht */
+        /* The Terminal panel. Accelerators used: [acgo] wdlen hts */
         struct ctlpos cp;
         ctlposinit(&cp, hwnd, 80, 3, 13);
         bartitle(&cp, "Options controlling the terminal emulation",
@@ -757,9 +794,11 @@ static void create_controls(HWND hwnd, int dlgtype, int panel) {
         checkbox(&cp, "Auto &wrap mode initially on", IDC_WRAPMODE);
         checkbox(&cp, "&DEC Origin Mode initially on", IDC_DECOM);
         checkbox(&cp, "Implicit CR in every &LF", IDC_LFHASCR);
-        checkbox(&cp, "&Beep enabled", IDC_BEEP);
         checkbox(&cp, "Use background colour to &erase screen", IDC_BCE);
         checkbox(&cp, "Enable bli&nking text", IDC_BLINKTEXT);
+        multiedit(&cp,
+                  "An&swerback to ^E:", IDC_ANSWERBACK,
+                  IDC_ANSWEREDIT, 100, NULL);
         endbox(&cp);
 
         beginbox(&cp, "Line discipline options",
@@ -775,8 +814,41 @@ static void create_controls(HWND hwnd, int dlgtype, int panel) {
         endbox(&cp);
     }
 
+    if (panel == bellpanelstart) {
+        /* The Bell panel. Accelerators used: [acgo] bdsm w */
+        struct ctlpos cp;
+        ctlposinit(&cp, hwnd, 80, 3, 13);
+        bartitle(&cp, "Options controlling the terminal bell",
+                 IDC_TITLE_BELL);
+        beginbox(&cp, "Set the style of bell",
+                 IDC_BOX_BELL1);
+        radiobig(&cp,
+                 "Action to happen when a &bell occurs:", IDC_BELLSTATIC,
+                 "None (bell disabled)", IDC_BELL_DISABLED,
+                 "Play Windows Default Sound", IDC_BELL_DEFAULT,
+                 "Play a custom sound file", IDC_BELL_WAVEFILE,
+                 "Visual bell (flash window)", IDC_BELL_VISUAL, NULL);
+       editbutton(&cp, "Custom sound file to play as a bell:",
+                  IDC_BELL_WAVESTATIC, IDC_BELL_WAVEEDIT,
+                  "Bro&wse...", IDC_BELL_WAVEBROWSE);
+        endbox(&cp);
+       beginbox(&cp, "Control the bell overload behaviour",
+                IDC_BOX_BELL2);
+       checkbox(&cp, "Bell is temporarily &disabled when over-used",
+                IDC_BELLOVL);
+       staticedit(&cp, "Over-use means this &many bells...",
+                  IDC_BELLOVLNSTATIC, IDC_BELLOVLN, 20);
+       staticedit(&cp, "... in this many &seconds",
+                  IDC_BELLOVLTSTATIC, IDC_BELLOVLT, 20);
+       statictext(&cp, "The bell is re-enabled after a few seconds of silence.",
+                  IDC_BELLOVLEXPLAIN);
+       staticedit(&cp, "Seconds of silence required",
+                  IDC_BELLOVLSSTATIC, IDC_BELLOVLS, 20);
+        endbox(&cp);
+    }
+
     if (panel == keyboardpanelstart) {
-        /* The Keyboard panel. Accelerators used: [acgo] h?sr~lxv unpymie t */
+        /* The Keyboard panel. Accelerators used: [acgo] h?sr~lxvunpymietd */
         struct ctlpos cp;
         ctlposinit(&cp, hwnd, 80, 3, 13);
         bartitle(&cp, "Options controlling the effects of keys",
@@ -813,8 +885,10 @@ static void create_controls(HWND hwnd, int dlgtype, int panel) {
         endbox(&cp);
         beginbox(&cp, "Enable extra keyboard features:",
                  IDC_BOX_KEYBOARD3);
-        checkbox(&cp, "Application and AltGr ac&t as Compose key",
+        checkbox(&cp, "AltGr ac&ts as Compose key",
                  IDC_COMPOSEKEY);
+        checkbox(&cp, "Control-Alt is &different from AltGr",
+                 IDC_CTRLALTKEYS);
         endbox(&cp);
     }
 
@@ -1155,6 +1229,7 @@ static int GenericMainDlgProc (HWND hwnd, UINT msg,
         treeview_insert(&tvfaff, 1, "Logging");
         treeview_insert(&tvfaff, 0, "Terminal");
         treeview_insert(&tvfaff, 1, "Keyboard");
+        treeview_insert(&tvfaff, 1, "Bell");
         treeview_insert(&tvfaff, 0, "Window");
         treeview_insert(&tvfaff, 1, "Appearance");
         treeview_insert(&tvfaff, 1, "Translation");
@@ -1222,6 +1297,8 @@ static int GenericMainDlgProc (HWND hwnd, UINT msg,
                create_controls(hwnd, dlgtype, keyboardpanelstart);
            if (!strcmp(buffer, "Terminal"))
                create_controls(hwnd, dlgtype, terminalpanelstart);
+           if (!strcmp(buffer, "Bell"))
+               create_controls(hwnd, dlgtype, bellpanelstart);
            if (!strcmp(buffer, "Window"))
                create_controls(hwnd, dlgtype, windowpanelstart);
            if (!strcmp(buffer, "Appearance"))
@@ -1492,6 +1569,11 @@ static int GenericMainDlgProc (HWND hwnd, UINT msg,
                if (LOWORD(wParam)==IDC_EDITNO) cfg.localedit=LD_NO;
             }
            break;
+         case IDC_ANSWEREDIT:
+           if (HIWORD(wParam) == EN_CHANGE)
+               GetDlgItemText (hwnd, IDC_ANSWEREDIT, cfg.answerback,
+                               sizeof(cfg.answerback)-1);
+           break;
           case IDC_ALWAYSONTOP:
            if (HIWORD(wParam) == BN_CLICKED ||
                HIWORD(wParam) == BN_DOUBLECLICKED)
@@ -1512,6 +1594,11 @@ static int GenericMainDlgProc (HWND hwnd, UINT msg,
                HIWORD(wParam) == BN_DOUBLECLICKED)
                cfg.compose_key = IsDlgButtonChecked (hwnd, IDC_COMPOSEKEY);
            break;
+         case IDC_CTRLALTKEYS:
+           if (HIWORD(wParam) == BN_CLICKED ||
+               HIWORD(wParam) == BN_DOUBLECLICKED)
+               cfg.ctrlaltkeys = IsDlgButtonChecked (hwnd, IDC_CTRLALTKEYS);
+           break;
          case IDC_WRAPMODE:
            if (HIWORD(wParam) == BN_CLICKED ||
                HIWORD(wParam) == BN_DOUBLECLICKED)
@@ -1568,11 +1655,62 @@ static int GenericMainDlgProc (HWND hwnd, UINT msg,
                SetDlgItemText (hwnd, IDC_FONTSTATIC, fontstatic);
            }
            break;
-         case IDC_BEEP:
+         case IDC_BELL_DISABLED:
+         case IDC_BELL_DEFAULT:
+         case IDC_BELL_WAVEFILE:
+         case IDC_BELL_VISUAL:
+           if (HIWORD(wParam) == BN_CLICKED ||
+               HIWORD(wParam) == BN_DOUBLECLICKED) {
+               if (LOWORD(wParam)==IDC_BELL_DISABLED) cfg.beep = BELL_DISABLED;
+               if (LOWORD(wParam)==IDC_BELL_DEFAULT) cfg.beep = BELL_DEFAULT;
+               if (LOWORD(wParam)==IDC_BELL_WAVEFILE) cfg.beep = BELL_WAVEFILE;
+               if (LOWORD(wParam)==IDC_BELL_VISUAL) cfg.beep = BELL_VISUAL;
+            }
+           break;
+         case IDC_BELL_WAVEBROWSE:
+            memset(&of, 0, sizeof(of));
+#ifdef OPENFILENAME_SIZE_VERSION_400
+            of.lStructSize = OPENFILENAME_SIZE_VERSION_400;
+#else
+            of.lStructSize = sizeof(of);
+#endif
+            of.hwndOwner = hwnd;
+            of.lpstrFilter = "Wave Files\0*.WAV\0AllFiles\0*\0\0\0";
+            of.lpstrCustomFilter = NULL;
+            of.nFilterIndex = 1;
+            of.lpstrFile = filename; strcpy(filename, cfg.bell_wavefile);
+            of.nMaxFile = sizeof(filename);
+            of.lpstrFileTitle = NULL;
+            of.lpstrInitialDir = NULL;
+            of.lpstrTitle = "Select Bell Sound File";
+            of.Flags = 0;
+            if (GetOpenFileName(&of)) {
+                strcpy(cfg.bell_wavefile, filename);
+                SetDlgItemText (hwnd, IDC_BELL_WAVEEDIT, cfg.bell_wavefile);
+            }
+           break;
+         case IDC_BELL_WAVEEDIT:
+           if (HIWORD(wParam) == EN_CHANGE)
+               GetDlgItemText (hwnd, IDC_BELL_WAVEEDIT, cfg.bell_wavefile,
+                               sizeof(cfg.bell_wavefile)-1);
+           break;
+         case IDC_BELLOVL:
            if (HIWORD(wParam) == BN_CLICKED ||
                HIWORD(wParam) == BN_DOUBLECLICKED)
-               cfg.beep = IsDlgButtonChecked (hwnd, IDC_BEEP);
+               cfg.bellovl = IsDlgButtonChecked (hwnd, IDC_BELLOVL);
            break;
+          case IDC_BELLOVLN:
+            if (HIWORD(wParam) == EN_CHANGE)
+                MyGetDlgItemInt (hwnd, IDC_BELLOVLN, &cfg.bellovl_n);
+            break;
+          case IDC_BELLOVLT:
+            if (HIWORD(wParam) == EN_CHANGE)
+                MyGetDlgItemInt (hwnd, IDC_BELLOVLT, &cfg.bellovl_t);
+            break;
+          case IDC_BELLOVLS:
+            if (HIWORD(wParam) == EN_CHANGE)
+                MyGetDlgItemInt (hwnd, IDC_BELLOVLS, &cfg.bellovl_s);
+            break;
          case IDC_BLINKTEXT:
            if (HIWORD(wParam) == BN_CLICKED ||
                HIWORD(wParam) == BN_DOUBLECLICKED)