X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/374330e25a6b51c40436fa869a381dd510790f6e..1a6f78fe2deea81bff8c2d14d6078a51e0c57b60:/window.c diff --git a/window.c b/window.c index 151441f8..829abe79 100644 --- 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() {