From b8473f0c11e3356cdf84d38ee5edf2062fc32824 Mon Sep 17 00:00:00 2001 From: Simon Tatham Date: Tue, 13 Sep 2022 11:11:59 +0100 Subject: [PATCH 1/2] Windows: remove static variables in wintw_request_resize. Those have been there since around 2001. They're in a piece of code that calls get_fullscreen_rect to find the overall screen size, and then prevents attempts to resize the window larger than that. The static variables were arranging that we don't have to call get_fullscreen_rect more than once. But, firstly, computers are faster 20 years on; secondly, remote window-resize requests are intentionally rate-limited (as of commit d74308e90e3813a), so this shouldn't be the limiting factor anyway; and thirdly, multi-monitor support has appeared since then, which means that if the window has been dragged from one monitor to another then get_fullscreen_rect might _legitimately_ return a different bounding rectangle when called a second time. So we should just do the full check every time unconditionally. (cherry picked from commit 4b3a8cbf61ce4ee19227784ba27c52a9e47774fb) --- windows/window.c | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-) diff --git a/windows/window.c b/windows/window.c index 059a123c..6ed581cd 100644 --- a/windows/window.c +++ b/windows/window.c @@ -1692,20 +1692,9 @@ static void wintw_request_resize(TermWin *tw, int w, int h) /* Sanity checks ... */ { - static int first_time = 1; - static RECT ss; - - switch (first_time) { - case 1: - /* Get the size of the screen */ - if (get_fullscreen_rect(&ss)) - /* first_time = 0 */ ; - else { - first_time = 2; - break; - } - case 0: - /* Make sure the values are sane */ + RECT ss; + if (get_fullscreen_rect(&ss)) { + /* Make sure the values aren't too big */ width = (ss.right - ss.left - extra_width) / 4; height = (ss.bottom - ss.top - extra_height) / 6; From 3037244132fc1799a31ef42cbd02a9c3c8a2077c Mon Sep 17 00:00:00 2001 From: Simon Tatham Date: Tue, 13 Sep 2022 12:30:42 +0100 Subject: [PATCH 2/2] wintw_request_resize: add missing NACKs. In cases where we refuse a resize request, either because it's too large or because the window is not currently resizable due to being maximised, we were failing to communicate that back to the Terminal so that it could stop waiting for the resize and resume processing input. --- windows/window.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/windows/window.c b/windows/window.c index 6ed581cd..6a17d54b 100644 --- a/windows/window.c +++ b/windows/window.c @@ -1680,8 +1680,10 @@ static void wintw_request_resize(TermWin *tw, int w, int h) /* If the window is maximized suppress resizing attempts */ if (IsZoomed(wgs.term_hwnd)) { - if (conf_get_int(conf, CONF_resize_action) == RESIZE_TERM) + if (conf_get_int(conf, CONF_resize_action) == RESIZE_TERM) { + term_resize_request_completed(term); return; + } } if (conf_get_int(conf, CONF_resize_action) == RESIZE_DISABLED) return; @@ -1698,8 +1700,10 @@ static void wintw_request_resize(TermWin *tw, int w, int h) width = (ss.right - ss.left - extra_width) / 4; height = (ss.bottom - ss.top - extra_height) / 6; - if (w > width || h > height) + if (w > width || h > height) { + term_resize_request_completed(term); return; + } if (w < 15) w = 15; if (h < 1)