Scrollbar was failing to update when no scrollback-reset event had happened
[u/mdw/putty] / window.c
index 437f7dd..11aeb69 100644 (file)
--- a/window.c
+++ b/window.c
 #define VK_PROCESSKEY 0xE5
 #endif
 
+/* Needed for mouse wheel support and not defined in earlier SDKs. */
+#ifndef WM_MOUSEWHEEL
+#define WM_MOUSEWHEEL 0x020A
+#endif
+
 static LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
 static int TranslateKey(UINT message, WPARAM wParam, LPARAM lParam,
                        unsigned char *output);
@@ -72,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;
 
@@ -297,6 +303,14 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show)
            }
        }
 
+       /*
+        * Trim leading whitespace off the hostname if it's there.
+        */
+       {
+           int space = strspn(cfg.host, " \t");
+           memmove(cfg.host, cfg.host+space, 1+strlen(cfg.host)-space);
+       }
+
        /* See if host is of the form user@host */
        if (cfg.host[0] != '\0') {
            char *atsign = strchr(cfg.host, '@');
@@ -631,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;
@@ -1129,6 +1146,7 @@ Mouse_Button translate_button(Mouse_Button button)
        return cfg.mouse_is_xterm ? MBT_PASTE : MBT_EXTEND;
     if (button == MBT_RIGHT)
        return cfg.mouse_is_xterm ? MBT_EXTEND : MBT_PASTE;
+    return 0;                         /* shouldn't happen */
 }
 
 static void show_mouseptr(int show)
@@ -1544,6 +1562,8 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message,
                button = MBT_RIGHT;
                press = 0;
                break;
+             default:
+               button = press = 0;    /* shouldn't happen */
            }
            show_mouseptr(1);
            if (press) {
@@ -1571,11 +1591,11 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message,
        if (wParam & (MK_LBUTTON | MK_MBUTTON | MK_RBUTTON)) {
            Mouse_Button b;
            if (wParam & MK_LBUTTON)
-               b = MBT_SELECT;
+               b = MBT_LEFT;
            else if (wParam & MK_MBUTTON)
-               b = cfg.mouse_is_xterm ? MBT_PASTE : MBT_EXTEND;
+               b = MBT_MIDDLE;
            else
-               b = cfg.mouse_is_xterm ? MBT_EXTEND : MBT_PASTE;
+               b = MBT_RIGHT;
            term_mouse(b, MA_DRAG, TO_CHR_X(X_POS(lParam)),
                       TO_CHR_Y(Y_POS(lParam)), wParam & MK_SHIFT,
                       wParam & MK_CONTROL);
@@ -1627,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();
@@ -3160,7 +3181,7 @@ void get_clip(wchar_t ** p, int *len)
        clipdata = NULL;
        return;
     } else if (OpenClipboard(NULL)) {
-       if (clipdata = GetClipboardData(CF_UNICODETEXT)) {
+       if ((clipdata = GetClipboardData(CF_UNICODETEXT))) {
            CloseClipboard();
            *p = GlobalLock(clipdata);
            if (*p) {
@@ -3168,7 +3189,7 @@ void get_clip(wchar_t ** p, int *len)
                *len = p2 - *p;
                return;
            }
-       } else if (clipdata = GetClipboardData(CF_TEXT)) {
+       } else if ( (clipdata = GetClipboardData(CF_TEXT)) ) {
            char *s;
            int i;
            CloseClipboard();
@@ -3223,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)
@@ -3256,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 */
+    }
 }