Glenn Maynard's patch (as adapted by Jacob) for taskbar flashing
authorsimon <simon@cda61777-01e9-0310-a592-d414129be87e>
Sun, 13 May 2001 14:42:17 +0000 (14:42 +0000)
committersimon <simon@cda61777-01e9-0310-a592-d414129be87e>
Sun, 13 May 2001 14:42:17 +0000 (14:42 +0000)
when a bell occurs and the window is minimised.

git-svn-id: svn://svn.tartarus.org/sgt/putty@1123 cda61777-01e9-0310-a592-d414129be87e

putty.h
settings.c
terminal.c
windlg.c
window.c

diff --git a/putty.h b/putty.h
index f665f31..eaffec2 100644 (file)
--- a/putty.h
+++ b/putty.h
@@ -272,6 +272,9 @@ typedef struct {
     enum {
        BELL_DISABLED, BELL_DEFAULT, BELL_VISUAL, BELL_WAVEFILE
     } beep;
+    enum {
+       B_IND_DISABLED, B_IND_FLASH, B_IND_STEADY
+    } beep_ind;
     int bellovl;                      /* bell overload protection active? */
     int bellovl_n;                    /* number of bells to cause overload */
     int bellovl_t;                    /* time interval for overload (seconds) */
index 618d753..b621fbf 100644 (file)
@@ -110,6 +110,7 @@ void save_settings(char *section, int do_host, Config * cfg)
     write_setting_i(sesskey, "CurType", cfg->cursor_type);
     write_setting_i(sesskey, "BlinkCur", cfg->blink_cur);
     write_setting_i(sesskey, "Beep", cfg->beep);
+    write_setting_i(sesskey, "BeepInd", cfg->beep_ind);
     write_setting_s(sesskey, "BellWaveFile", cfg->bell_wavefile);
     write_setting_i(sesskey, "BellOverload", cfg->bellovl);
     write_setting_i(sesskey, "BellOverloadN", cfg->bellovl_n);
@@ -273,6 +274,7 @@ void load_settings(char *section, int do_host, Config * cfg)
     gppi(sesskey, "BlinkCur", 0, &cfg->blink_cur);
     /* pedantic compiler tells me I can't use &cfg->beep as an int * :-) */
     gppi(sesskey, "Beep", 1, &i); cfg->beep = i;
+    gppi(sesskey, "BeepInd", 0, &i); cfg->beep_ind = i;
     gpps(sesskey, "BellWaveFile", "", cfg->bell_wavefile,
         sizeof(cfg->bell_wavefile));
     gppi(sesskey, "BellOverload", 1, &cfg->bellovl);
index 6a6deb0..119ecaa 100644 (file)
@@ -1142,11 +1142,9 @@ void term_out(void)
                    /*
                     * Perform an actual beep if we're not overloaded.
                     */
-                   if ((!cfg.bellovl || !beep_overloaded)
-                       && cfg.beep != 0) {
-                       if (cfg.beep != 2)
-                           beep(cfg.beep);
-                       else if (cfg.beep == 2) {
+                   if (!cfg.bellovl || !beep_overloaded) {
+                       beep(cfg.beep);
+                       if (cfg.beep == BELL_VISUAL) {
                            in_vbell = TRUE;
                            vbell_timeout = ticks + VBELL_TIMEOUT;
                            term_update();
index 8ad85bb..1e5a632 100644 (file)
--- a/windlg.c
+++ b/windlg.c
@@ -328,6 +328,10 @@ enum { IDCX_ABOUT =
     IDC_BELL_WAVESTATIC,
     IDC_BELL_WAVEEDIT,
     IDC_BELL_WAVEBROWSE,
+    IDC_B_IND_STATIC,
+    IDC_B_IND_DISABLED,
+    IDC_B_IND_FLASH,
+    IDC_B_IND_STEADY,
     IDC_BELLOVL,
     IDC_BELLOVLNSTATIC,
     IDC_BELLOVLN,
@@ -614,6 +618,11 @@ static void init_dlg_ctrls(HWND hwnd, int keepsess)
                     cfg.beep == BELL_WAVEFILE ? IDC_BELL_WAVEFILE :
                     cfg.beep ==
                     BELL_VISUAL ? IDC_BELL_VISUAL : IDC_BELL_DEFAULT);
+    CheckRadioButton(hwnd, IDC_B_IND_DISABLED, IDC_B_IND_STEADY,
+                    cfg.beep_ind ==
+                    B_IND_DISABLED ? IDC_B_IND_DISABLED : cfg.beep_ind ==
+                    B_IND_FLASH ? IDC_B_IND_FLASH : cfg.beep_ind ==
+                    B_IND_STEADY ? IDC_B_IND_STEADY : IDC_B_IND_DISABLED);
     SetDlgItemText(hwnd, IDC_BELL_WAVEEDIT, cfg.bell_wavefile);
     CheckDlgButton(hwnd, IDC_BELLOVL, cfg.bellovl);
     SetDlgItemInt(hwnd, IDC_BELLOVLN, cfg.bellovl_n, FALSE);
@@ -861,7 +870,7 @@ static void create_controls(HWND hwnd, int dlgtype, int panel)
     }
 
     if (panel == bellpanelstart) {
-       /* The Bell panel. Accelerators used: [acgo] bdsm wt */
+       /* The Bell panel. Accelerators used: [acgo] bdsm wit */
        struct ctlpos cp;
        ctlposinit(&cp, hwnd, 80, 3, 13);
        bartitle(&cp, "Options controlling the terminal bell",
@@ -876,6 +885,10 @@ static void create_controls(HWND hwnd, int dlgtype, int panel)
        editbutton(&cp, "Custom sound file to play as a bell:",
                   IDC_BELL_WAVESTATIC, IDC_BELL_WAVEEDIT,
                   "Bro&wse...", IDC_BELL_WAVEBROWSE);
+       radioline(&cp, "Taskbar/caption &indication on bell:",
+                 IDC_B_IND_STATIC, 3, "Disabled", IDC_B_IND_DISABLED,
+                 "Flashing", IDC_B_IND_FLASH, "Steady", IDC_B_IND_STEADY,
+                 NULL);
        endbox(&cp);
        beginbox(&cp, "Control the bell overload behaviour",
                 IDC_BOX_BELL2);
@@ -1825,6 +1838,19 @@ static int GenericMainDlgProc(HWND hwnd, UINT msg,
                        cfg.beep = BELL_VISUAL;
                }
                break;
+             case IDC_B_IND_DISABLED:
+             case IDC_B_IND_FLASH:
+             case IDC_B_IND_STEADY:
+               if (HIWORD(wParam) == BN_CLICKED ||
+                   HIWORD(wParam) == BN_DOUBLECLICKED) {
+                   if (LOWORD(wParam) == IDC_B_IND_DISABLED)
+                       cfg.beep_ind = B_IND_DISABLED;
+                   if (LOWORD(wParam) == IDC_B_IND_FLASH)
+                       cfg.beep_ind = B_IND_FLASH;
+                   if (LOWORD(wParam) == IDC_B_IND_STEADY)
+                       cfg.beep_ind = B_IND_STEADY;
+               }
+               break;
              case IDC_BELL_WAVEBROWSE:
                memset(&of, 0, sizeof(of));
 #ifdef OPENFILENAME_SIZE_VERSION_400
index ea349bd..905c43e 100644 (file)
--- a/window.c
+++ b/window.c
@@ -77,6 +77,7 @@ static int pending_netevent = 0;
 static WPARAM pend_netevent_wParam = 0;
 static LPARAM pend_netevent_lParam = 0;
 static void enact_pending_netevent(void);
+static void flash_window(int mode);
 
 static time_t last_movement = 0;
 
@@ -644,11 +645,14 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show)
                term_out();
            term_update();
            ShowCaret(hwnd);
+
+           flash_window(1);           /* maintain */
+
            if (in_vbell)
                /* Hmm, term_update didn't want to do an update too soon ... */
                timer_id = SetTimer(hwnd, 1, 50, NULL);
            else if (!has_focus)
-               timer_id = SetTimer(hwnd, 1, 2000, NULL);
+               timer_id = SetTimer(hwnd, 1, 500, NULL);
            else
                timer_id = SetTimer(hwnd, 1, 100, NULL);
            long_timer = 1;
@@ -1643,6 +1647,7 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message,
        has_focus = TRUE;
        CreateCaret(hwnd, caretbm, font_width, font_height);
        ShowCaret(hwnd);
+       flash_window(0);               /* stop */
        compose_state = 0;
        term_out();
        term_update();
@@ -3239,6 +3244,42 @@ void fatalbox(char *fmt, ...)
 }
 
 /*
+ * Manage window caption / taskbar flashing, if enabled.
+ * 0 = stop, 1 = maintain, 2 = start
+ */
+static void flash_window(int mode)
+{
+    static long last_flash = 0;
+    static int flashing = 0;
+    if ((mode == 0) || (cfg.beep_ind == B_IND_DISABLED)) {
+       /* stop */
+       if (flashing) {
+           FlashWindow(hwnd, FALSE);
+           flashing = 0;
+       }
+
+    } else if (mode == 2) {
+       /* start */
+       if (!flashing) {
+           last_flash = GetTickCount();
+           flashing = 1;
+           FlashWindow(hwnd, TRUE);
+       }
+
+    } else if ((mode == 1) && (cfg.beep_ind == B_IND_FLASH)) {
+       /* maintain */
+       if (flashing) {
+           long now = GetTickCount();
+           long fdiff = now - last_flash;
+           if (fdiff < 0 || fdiff > 450) {
+               last_flash = now;
+               FlashWindow(hwnd, TRUE);        /* toggle */
+           }
+       }
+    }
+}
+
+/*
  * Beep.
  */
 void beep(int mode)
@@ -3272,4 +3313,8 @@ void beep(int mode)
            cfg.beep = BELL_DEFAULT;
        }
     }
+    /* Otherwise, either visual bell or disabled; do nothing here */
+    if (!has_focus) {
+       flash_window(2);               /* start */
+    }
 }