Add DeleteObject calls to go with the CreatePen calls in do_text. Should
[u/mdw/putty] / window.c
index 151441f..829abe7 100644 (file)
--- a/window.c
+++ b/window.c
@@ -556,7 +556,9 @@ void request_resize (int w, int h) {
 }
 
 static void click (Mouse_Button b, int x, int y) {
-    if (lastbtn == b && GetMessageTime() - lasttime < dbltime) {
+    int thistime = GetMessageTime();
+
+    if (lastbtn == b && thistime - lasttime < dbltime) {
        lastact = (lastact == MA_CLICK ? MA_2CLK :
                   lastact == MA_2CLK ? MA_3CLK :
                   lastact == MA_3CLK ? MA_CLICK : MA_NOTHING);
@@ -566,7 +568,7 @@ static void click (Mouse_Button b, int x, int y) {
     }
     if (lastact != MA_NOTHING)
        term_mouse (b, lastact, x, y);
-    lasttime = GetMessageTime();
+    lasttime = thistime;
 }
 
 static int WINAPI WndProc (HWND hwnd, UINT message,
@@ -698,33 +700,46 @@ static int WINAPI WndProc (HWND hwnd, UINT message,
            break;
        }
        break;
+
+#define X_POS(l) ((int)(short)LOWORD(l))
+#define Y_POS(l) ((int)(short)HIWORD(l))
+
+#define TO_CHR_X(x) (((x)<0 ? (x)-font_width+1 : (x)) / font_width)
+#define TO_CHR_Y(y) (((y)<0 ? (y)-font_height+1: (y)) / font_height)
+
       case WM_LBUTTONDOWN:
-       click (MB_SELECT, LOWORD(lParam) / font_width,
-              HIWORD(lParam) / font_height);
+       click (MB_SELECT, TO_CHR_X(X_POS(lParam)),
+              TO_CHR_Y(Y_POS(lParam)));
+        SetCapture(hwnd);
        return 0;
       case WM_LBUTTONUP:
-       term_mouse (MB_SELECT, MA_RELEASE, LOWORD(lParam) / font_width,
-                   HIWORD(lParam) / font_height);
+       term_mouse (MB_SELECT, MA_RELEASE, TO_CHR_X(X_POS(lParam)),
+                   TO_CHR_Y(Y_POS(lParam)));
+        ReleaseCapture();
        return 0;
       case WM_MBUTTONDOWN:
+        SetCapture(hwnd);
        click (cfg.mouse_is_xterm ? MB_PASTE : MB_EXTEND,
-              LOWORD(lParam) / font_width,
-              HIWORD(lParam) / font_height);
+              TO_CHR_X(X_POS(lParam)),
+              TO_CHR_Y(Y_POS(lParam)));
        return 0;
       case WM_MBUTTONUP:
        term_mouse (cfg.mouse_is_xterm ? MB_PASTE : MB_EXTEND,
-                   MA_RELEASE, LOWORD(lParam) / font_width,
-                   HIWORD(lParam) / font_height);
+                   MA_RELEASE, TO_CHR_X(X_POS(lParam)),
+                   TO_CHR_Y(Y_POS(lParam)));
        return 0;
+        ReleaseCapture();
       case WM_RBUTTONDOWN:
+        SetCapture(hwnd);
        click (cfg.mouse_is_xterm ? MB_EXTEND : MB_PASTE,
-              LOWORD(lParam) / font_width,
-              HIWORD(lParam) / font_height);
+              TO_CHR_X(X_POS(lParam)),
+              TO_CHR_Y(Y_POS(lParam)));
        return 0;
       case WM_RBUTTONUP:
        term_mouse (cfg.mouse_is_xterm ? MB_EXTEND : MB_PASTE,
-                   MA_RELEASE, LOWORD(lParam) / font_width,
-                   HIWORD(lParam) / font_height);
+                   MA_RELEASE, TO_CHR_X(X_POS(lParam)),
+                   TO_CHR_Y(Y_POS(lParam)));
+        ReleaseCapture();
        return 0;
       case WM_MOUSEMOVE:
        /*
@@ -742,12 +757,9 @@ static int WINAPI WndProc (HWND hwnd, UINT message,
                b = cfg.mouse_is_xterm ? MB_PASTE : MB_EXTEND;
            else
                b = cfg.mouse_is_xterm ? MB_EXTEND : MB_PASTE;
-           term_mouse (b, MA_DRAG, LOWORD(lParam) / font_width,
-                       HIWORD(lParam) / font_height);
+           term_mouse (b, MA_DRAG, TO_CHR_X(X_POS(lParam)),
+                       TO_CHR_Y(Y_POS(lParam)));
        }
-       lastbtn = MB_NOTHING;
-       lastact = MA_NOTHING;
-       lasttime = GetMessageTime();
        return 0;
       case WM_IGNORE_CLIP:
        ignore_clip = wParam;          /* don't panic on DESTROYCLIPBOARD */
@@ -854,7 +866,10 @@ static int WINAPI WndProc (HWND hwnd, UINT message,
        if (wParam == SIZE_RESTORED || wParam == SIZE_MAXIMIZED)
            SetWindowText (hwnd, window_name);
        if (!ignore_size) {
-           int width, height, w, h, ew, eh;
+           int width, height, w, h;
+#if 0 /* we have fixed this using WM_SIZING now */
+            int ew, eh;
+#endif
 
            width = LOWORD(lParam);
            height = HIWORD(lParam);
@@ -1072,18 +1087,24 @@ void do_text (Context ctx, int x, int y, char *text, int len,
        TextOut (hdc, x-1, y, text, len);
     }
     if (und_mode == UND_LINE && (attr & ATTR_UNDER)) {
-       SelectObject (hdc, CreatePen(PS_SOLID, 0, fg));
+        HPEN oldpen;
+       oldpen = SelectObject (hdc, CreatePen(PS_SOLID, 0, fg));
        MoveToEx (hdc, x, y+descent, NULL);
        LineTo (hdc, x+len*font_width, y+descent);
+        oldpen = SelectObject (hdc, oldpen);
+        DeleteObject (oldpen);
     }
     if (attr & ATTR_PASCURS) {
        POINT pts[5];
+        HPEN oldpen;
        pts[0].x = pts[1].x = pts[4].x = x;
        pts[2].x = pts[3].x = x+font_width-1;
        pts[0].y = pts[3].y = pts[4].y = y;
        pts[1].y = pts[2].y = y+font_height-1;
-       SelectObject (hdc, CreatePen(PS_SOLID, 0, colours[23]));
+       oldpen = SelectObject (hdc, CreatePen(PS_SOLID, 0, colours[23]));
        Polyline (hdc, pts, 5);
+        oldpen = SelectObject (hdc, oldpen);
+        DeleteObject (oldpen);
     }
 }
 
@@ -1315,7 +1336,7 @@ void set_title (char *title) {
     sfree (window_name);
     window_name = smalloc(1+strlen(title));
     strcpy (window_name, title);
-    if (!IsIconic(hwnd))
+    if (cfg.win_name_always || !IsIconic(hwnd))
        SetWindowText (hwnd, title);
 }
 
@@ -1323,7 +1344,7 @@ void set_icon (char *title) {
     sfree (icon_name);
     icon_name = smalloc(1+strlen(title));
     strcpy (icon_name, title);
-    if (IsIconic(hwnd))
+    if (!cfg.win_name_always && IsIconic(hwnd))
        SetWindowText (hwnd, title);
 }
 
@@ -1335,7 +1356,8 @@ void set_sbar (int total, int start, int page) {
     si.nMax = total - 1;
     si.nPage = page;
     si.nPos = start;
-    SetScrollInfo (hwnd, SB_VERT, &si, TRUE);
+    if (hwnd)
+        SetScrollInfo (hwnd, SB_VERT, &si, TRUE);
 }
 
 Context get_ctx() {