forked from aniani/vim
patch 8.2.1226: MS-Windows: windows positioning wrong depending on taskbar
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)
This commit is contained in:
@@ -5395,28 +5395,21 @@ gui_mch_set_shellsize(
|
|||||||
int direction)
|
int direction)
|
||||||
{
|
{
|
||||||
RECT workarea_rect;
|
RECT workarea_rect;
|
||||||
|
RECT window_rect;
|
||||||
int win_width, win_height;
|
int win_width, win_height;
|
||||||
WINDOWPLACEMENT wndpl;
|
|
||||||
|
|
||||||
// Try to keep window completely on screen.
|
// Try to keep window completely on screen.
|
||||||
// Get position of the screen work area. This is the part that is not
|
// Get position of the screen work area. This is the part that is not
|
||||||
// used by the taskbar or appbars.
|
// used by the taskbar or appbars.
|
||||||
get_work_area(&workarea_rect);
|
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.
|
// 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
|
// But don't do it when still starting up, it may have been requested in
|
||||||
// the shortcut.
|
// the shortcut.
|
||||||
if (wndpl.showCmd == SW_SHOWMAXIMIZED && starting == 0)
|
if (IsZoomed(s_hwnd) && starting == 0)
|
||||||
{
|
|
||||||
ShowWindow(s_hwnd, SW_SHOWNORMAL);
|
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
|
// compute the size of the outside of the window
|
||||||
win_width = width + (GetSystemMetrics(SM_CXFRAME) +
|
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
|
// 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
|
// matter if the secondary monitor is left or right of the primary
|
||||||
// monitor.
|
// monitor.
|
||||||
wndpl.rcNormalPosition.right = wndpl.rcNormalPosition.left + win_width;
|
window_rect.right = window_rect.left + win_width;
|
||||||
wndpl.rcNormalPosition.bottom = wndpl.rcNormalPosition.top + win_height;
|
window_rect.bottom = window_rect.top + win_height;
|
||||||
|
|
||||||
// If the window is going off the screen, move it on to the screen.
|
// If the window is going off the screen, move it on to the screen.
|
||||||
if ((direction & RESIZE_HOR)
|
if ((direction & RESIZE_HOR) && window_rect.right > workarea_rect.right)
|
||||||
&& wndpl.rcNormalPosition.right > workarea_rect.right)
|
OffsetRect(&window_rect, workarea_rect.right - window_rect.right, 0);
|
||||||
OffsetRect(&wndpl.rcNormalPosition,
|
|
||||||
workarea_rect.right - wndpl.rcNormalPosition.right, 0);
|
|
||||||
|
|
||||||
if ((direction & RESIZE_HOR)
|
if ((direction & RESIZE_HOR) && window_rect.left < workarea_rect.left)
|
||||||
&& wndpl.rcNormalPosition.left < workarea_rect.left)
|
OffsetRect(&window_rect, workarea_rect.left - window_rect.left, 0);
|
||||||
OffsetRect(&wndpl.rcNormalPosition,
|
|
||||||
workarea_rect.left - wndpl.rcNormalPosition.left, 0);
|
|
||||||
|
|
||||||
if ((direction & RESIZE_VERT)
|
if ((direction & RESIZE_VERT) && window_rect.bottom > workarea_rect.bottom)
|
||||||
&& wndpl.rcNormalPosition.bottom > workarea_rect.bottom)
|
OffsetRect(&window_rect, 0, workarea_rect.bottom - window_rect.bottom);
|
||||||
OffsetRect(&wndpl.rcNormalPosition,
|
|
||||||
0, workarea_rect.bottom - wndpl.rcNormalPosition.bottom);
|
|
||||||
|
|
||||||
if ((direction & RESIZE_VERT)
|
if ((direction & RESIZE_VERT) && window_rect.top < workarea_rect.top)
|
||||||
&& wndpl.rcNormalPosition.top < workarea_rect.top)
|
OffsetRect(&window_rect, 0, workarea_rect.top - window_rect.top);
|
||||||
OffsetRect(&wndpl.rcNormalPosition,
|
|
||||||
0, workarea_rect.top - wndpl.rcNormalPosition.top);
|
|
||||||
|
|
||||||
// set window position - we should use SetWindowPlacement rather than
|
MoveWindow(s_hwnd, window_rect.left, window_rect.top,
|
||||||
// SetWindowPos as the MSDN docs say the coord systems returned by
|
win_width, win_height, TRUE);
|
||||||
// these two are not compatible.
|
|
||||||
SetWindowPlacement(s_hwnd, &wndpl);
|
|
||||||
|
|
||||||
SetActiveWindow(s_hwnd);
|
SetActiveWindow(s_hwnd);
|
||||||
SetFocus(s_hwnd);
|
SetFocus(s_hwnd);
|
||||||
|
|||||||
@@ -754,6 +754,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
1226,
|
||||||
/**/
|
/**/
|
||||||
1225,
|
1225,
|
||||||
/**/
|
/**/
|
||||||
|
|||||||
Reference in New Issue
Block a user