Don't call ReleaseCapture() on any mouse-button-up event. Instead,
[u/mdw/putty] / windows / window.c
index b424674..416be3f 100644 (file)
@@ -1325,7 +1325,7 @@ debug(("\n           rect: [%d,%d %d,%d]\n", newrc.left, newrc.top, newrc.right,
 #ifdef FIXME_REMOVE_BEFORE_CHECKIN
 debug(("general_textout: done, xn=%d\n", xn));
 #endif
-    assert(xn - x == lprc->right - lprc->left);
+    assert(xn - x >= lprc->right - lprc->left);
 }
 
 /*
@@ -2247,7 +2247,7 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message,
            term_copyall(term);
            break;
          case IDM_PASTE:
-           term_do_paste(term);
+           request_paste(NULL);
            break;
          case IDM_CLRSB:
            term_clrsb(term);
@@ -2335,26 +2335,32 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message,
            switch (message) {
              case WM_LBUTTONDOWN:
                button = MBT_LEFT;
+               wParam |= MK_LBUTTON;
                press = 1;
                break;
              case WM_MBUTTONDOWN:
                button = MBT_MIDDLE;
+               wParam |= MK_MBUTTON;
                press = 1;
                break;
              case WM_RBUTTONDOWN:
                button = MBT_RIGHT;
+               wParam |= MK_RBUTTON;
                press = 1;
                break;
              case WM_LBUTTONUP:
                button = MBT_LEFT;
+               wParam &= ~MK_LBUTTON;
                press = 0;
                break;
              case WM_MBUTTONUP:
                button = MBT_MIDDLE;
+               wParam &= ~MK_MBUTTON;
                press = 0;
                break;
              case WM_RBUTTONUP:
                button = MBT_RIGHT;
+               wParam &= ~MK_RBUTTON;
                press = 0;
                break;
              default:
@@ -2413,7 +2419,8 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message,
                           TO_CHR_X(X_POS(lParam)),
                           TO_CHR_Y(Y_POS(lParam)), wParam & MK_SHIFT,
                           wParam & MK_CONTROL, is_alt_pressed());
-               ReleaseCapture();
+               if (!(wParam & (MK_LBUTTON | MK_MBUTTON | MK_RBUTTON)))
+                   ReleaseCapture();
            }
        }
        return 0;
@@ -3046,16 +3053,22 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message,
 
                if (send_raw_mouse &&
                    !(cfg.mouse_override && shift_pressed)) {
-                   /* send a mouse-down followed by a mouse up */
-                   term_mouse(term, b, translate_button(b),
-                              MA_CLICK,
-                              TO_CHR_X(X_POS(lParam)),
-                              TO_CHR_Y(Y_POS(lParam)), shift_pressed,
-                              control_pressed, is_alt_pressed());
-                   term_mouse(term, b, translate_button(b),
-                              MA_RELEASE, TO_CHR_X(X_POS(lParam)),
-                              TO_CHR_Y(Y_POS(lParam)), shift_pressed,
-                              control_pressed, is_alt_pressed());
+                   /* Mouse wheel position is in screen coordinates for
+                    * some reason */
+                   POINT p;
+                   p.x = X_POS(lParam); p.y = Y_POS(lParam);
+                   if (ScreenToClient(hwnd, &p)) {
+                       /* send a mouse-down followed by a mouse up */
+                       term_mouse(term, b, translate_button(b),
+                                  MA_CLICK,
+                                  TO_CHR_X(p.x),
+                                  TO_CHR_Y(p.y), shift_pressed,
+                                  control_pressed, is_alt_pressed());
+                       term_mouse(term, b, translate_button(b),
+                                  MA_RELEASE, TO_CHR_X(p.x),
+                                  TO_CHR_Y(p.y), shift_pressed,
+                                  control_pressed, is_alt_pressed());
+                   } /* else: not sure when this can fail */
                } else {
                    /* trigger a scroll */
                    term_scroll(term, 0,
@@ -3807,7 +3820,7 @@ static int TranslateKey(UINT message, WPARAM wParam, LPARAM lParam,
            return 0;
        }
        if (wParam == VK_INSERT && shift_state == 1) {
-           term_do_paste(term);
+           request_paste(NULL);
            return 0;
        }
        if (left_alt && wParam == VK_F4 && cfg.alt_f4) {
@@ -4914,8 +4927,6 @@ static DWORD WINAPI clipboard_read_threadfunc(void *param)
 
 static int process_clipdata(HGLOBAL clipdata, int unicode)
 {
-    static wchar_t *converted = 0;
-
     sfree(clipboard_contents);
     clipboard_contents = NULL;
     clipboard_length = 0;