summaryrefslogtreecommitdiff
path: root/src/gui_w32.c
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-07-16 22:30:31 +0200
committerBram Moolenaar <Bram@vim.org>2020-07-16 22:30:31 +0200
commit98af99f2d79b310e81003f5e27862a7b522d8372 (patch)
treef35f0790fe7e25536ea15128764280aa924945df /src/gui_w32.c
parentee1b93169d21896e5401a54a5189c9465abb7bc9 (diff)
downloadvim-git-98af99f2d79b310e81003f5e27862a7b522d8372.tar.gz
patch 8.2.1226: MS-Windows: windows positioning wrong depending on taskbarv8.2.1226
Problem: MS-Windows: windows positioning wrong when the taskbar is placed at the top or left of the screen. Solution: Use GetWindowRect and MoveWindow APIs. (Yukihiro Nakadaira, Ken Takata, closes #6455)
Diffstat (limited to 'src/gui_w32.c')
-rw-r--r--src/gui_w32.c59
1 files changed, 21 insertions, 38 deletions
diff --git a/src/gui_w32.c b/src/gui_w32.c
index 6527b4230..c46cb4769 100644
--- a/src/gui_w32.c
+++ b/src/gui_w32.c
@@ -1429,7 +1429,7 @@ gui_mch_create_scrollbar(
/*
* Find the scrollbar with the given hwnd.
*/
- static scrollbar_T *
+ static scrollbar_T *
gui_mswin_find_scrollbar(HWND hwnd)
{
win_T *wp;
@@ -5395,28 +5395,21 @@ gui_mch_set_shellsize(
int direction)
{
RECT workarea_rect;
+ RECT window_rect;
int win_width, win_height;
- WINDOWPLACEMENT wndpl;
// Try to keep window completely on screen.
// Get position of the screen work area. This is the part that is not
// used by the taskbar or appbars.
get_work_area(&workarea_rect);
- // Get current position of our window. Note that the .left and .top are
- // relative to the work area.
- wndpl.length = sizeof(WINDOWPLACEMENT);
- GetWindowPlacement(s_hwnd, &wndpl);
-
// Resizing a maximized window looks very strange, unzoom it first.
// But don't do it when still starting up, it may have been requested in
// the shortcut.
- if (wndpl.showCmd == SW_SHOWMAXIMIZED && starting == 0)
- {
+ if (IsZoomed(s_hwnd) && starting == 0)
ShowWindow(s_hwnd, SW_SHOWNORMAL);
- // Need to get the settings of the normal window.
- GetWindowPlacement(s_hwnd, &wndpl);
- }
+
+ GetWindowRect(s_hwnd, &window_rect);
// compute the size of the outside of the window
win_width = width + (GetSystemMetrics(SM_CXFRAME) +
@@ -5432,34 +5425,24 @@ gui_mch_set_shellsize(
// The following should take care of keeping Vim on the same monitor, no
// matter if the secondary monitor is left or right of the primary
// monitor.
- wndpl.rcNormalPosition.right = wndpl.rcNormalPosition.left + win_width;
- wndpl.rcNormalPosition.bottom = wndpl.rcNormalPosition.top + win_height;
+ window_rect.right = window_rect.left + win_width;
+ window_rect.bottom = window_rect.top + win_height;
// If the window is going off the screen, move it on to the screen.
- if ((direction & RESIZE_HOR)
- && wndpl.rcNormalPosition.right > workarea_rect.right)
- OffsetRect(&wndpl.rcNormalPosition,
- workarea_rect.right - wndpl.rcNormalPosition.right, 0);
-
- if ((direction & RESIZE_HOR)
- && wndpl.rcNormalPosition.left < workarea_rect.left)
- OffsetRect(&wndpl.rcNormalPosition,
- workarea_rect.left - wndpl.rcNormalPosition.left, 0);
-
- if ((direction & RESIZE_VERT)
- && wndpl.rcNormalPosition.bottom > workarea_rect.bottom)
- OffsetRect(&wndpl.rcNormalPosition,
- 0, workarea_rect.bottom - wndpl.rcNormalPosition.bottom);
-
- if ((direction & RESIZE_VERT)
- && wndpl.rcNormalPosition.top < workarea_rect.top)
- OffsetRect(&wndpl.rcNormalPosition,
- 0, workarea_rect.top - wndpl.rcNormalPosition.top);
-
- // set window position - we should use SetWindowPlacement rather than
- // SetWindowPos as the MSDN docs say the coord systems returned by
- // these two are not compatible.
- SetWindowPlacement(s_hwnd, &wndpl);
+ if ((direction & RESIZE_HOR) && window_rect.right > workarea_rect.right)
+ OffsetRect(&window_rect, workarea_rect.right - window_rect.right, 0);
+
+ if ((direction & RESIZE_HOR) && window_rect.left < workarea_rect.left)
+ OffsetRect(&window_rect, workarea_rect.left - window_rect.left, 0);
+
+ if ((direction & RESIZE_VERT) && window_rect.bottom > workarea_rect.bottom)
+ OffsetRect(&window_rect, 0, workarea_rect.bottom - window_rect.bottom);
+
+ if ((direction & RESIZE_VERT) && window_rect.top < workarea_rect.top)
+ OffsetRect(&window_rect, 0, workarea_rect.top - window_rect.top);
+
+ MoveWindow(s_hwnd, window_rect.left, window_rect.top,
+ win_width, win_height, TRUE);
SetActiveWindow(s_hwnd);
SetFocus(s_hwnd);