X-Git-Url: https://git.distorted.org.uk/~mdw/sgt/putty/blobdiff_plain/1d43245444734affd50842ed73f2d153636a000e..32f46b5c30131a9ba5bbadd28da6425434aca47f:/windows/window.c diff --git a/windows/window.c b/windows/window.c index b424674e..05d5ccc4 100644 --- a/windows/window.c +++ b/windows/window.c @@ -110,7 +110,6 @@ static LPARAM pend_netevent_lParam = 0; static void enact_pending_netevent(void); static void flash_window(int mode); static void sys_cursor_update(void); -static int is_shift_pressed(void); static int get_fullscreen_rect(RECT * ss); static int caret_x = -1, caret_y = -1; @@ -636,7 +635,7 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show) guess_height = extra_height + font_height * cfg.height; { RECT r; - get_fullscreen_rect(&r); + get_fullscreen_rect(&r); if (guess_width > r.right - r.left) guess_width = r.right - r.left; if (guess_height > r.bottom - r.top) @@ -912,6 +911,8 @@ static void update_savedsess_menu(void) AppendMenu(savedsess_menu, MF_ENABLED, IDM_SAVED_MIN + (i-1)*MENU_SAVED_STEP, sesslist.sessions[i]); + if (sesslist.nsessions <= 1) + AppendMenu(savedsess_menu, MF_GRAYED, IDM_SAVED_MIN, "(No sessions)"); } /* @@ -1325,7 +1326,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); } /* @@ -1907,17 +1908,6 @@ static int is_alt_pressed(void) return FALSE; } -static int is_shift_pressed(void) -{ - BYTE keystate[256]; - int r = GetKeyboardState(keystate); - if (!r) - return FALSE; - if (keystate[VK_SHIFT] & 0x80) - return TRUE; - return FALSE; -} - static int resizing; void notify_remote_exit(void *fe) @@ -2112,10 +2102,12 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message, { /* Disable full-screen if resizing forbidden */ - HMENU m = GetSystemMenu (hwnd, FALSE); - EnableMenuItem(m, IDM_FULLSCREEN, MF_BYCOMMAND | - (cfg.resize_action == RESIZE_DISABLED) - ? MF_GRAYED : MF_ENABLED); + int i; + for (i = 0; i < lenof(popup_menus); i++) + EnableMenuItem(popup_menus[i].menu, IDM_FULLSCREEN, + MF_BYCOMMAND | + (cfg.resize_action == RESIZE_DISABLED) + ? MF_GRAYED : MF_ENABLED); /* Gracefully unzoom if necessary */ if (IsZoomed(hwnd) && (cfg.resize_action == RESIZE_DISABLED)) { @@ -2247,7 +2239,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 +2327,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 +2411,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 +3045,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 +3812,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 +4919,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; @@ -5038,16 +5041,12 @@ void modalfatalbox(char *fmt, ...) cleanup_exit(1); } -typedef BOOL (WINAPI *p_FlashWindowEx_t)(PFLASHWINFO); -static p_FlashWindowEx_t p_FlashWindowEx = NULL; +DECL_WINDOWS_FUNCTION(static, BOOL, FlashWindowEx, (PFLASHWINFO)); static void init_flashwindow(void) { HMODULE user32_module = LoadLibrary("USER32.DLL"); - if (user32_module) { - p_FlashWindowEx = (p_FlashWindowEx_t) - GetProcAddress(user32_module, "FlashWindowEx"); - } + GET_WINDOWS_FUNCTION(user32_module, FlashWindowEx); } static BOOL flash_window_ex(DWORD dwFlags, UINT uCount, DWORD dwTimeout) @@ -5359,9 +5358,12 @@ static void make_full_screen() reset_window(0); - /* Tick the menu item in the System menu. */ - CheckMenuItem(GetSystemMenu(hwnd, FALSE), IDM_FULLSCREEN, - MF_CHECKED); + /* Tick the menu item in the System and context menus. */ + { + int i; + for (i = 0; i < lenof(popup_menus); i++) + CheckMenuItem(popup_menus[i].menu, IDM_FULLSCREEN, MF_CHECKED); + } } /* @@ -5389,9 +5391,12 @@ static void clear_full_screen() SWP_FRAMECHANGED); } - /* Untick the menu item in the System menu. */ - CheckMenuItem(GetSystemMenu(hwnd, FALSE), IDM_FULLSCREEN, - MF_UNCHECKED); + /* Untick the menu item in the System and context menus. */ + { + int i; + for (i = 0; i < lenof(popup_menus); i++) + CheckMenuItem(popup_menus[i].menu, IDM_FULLSCREEN, MF_UNCHECKED); + } } /*