Permalink
Browse files

patch 8.0.0113

Problem:    MS-Windows: message box to prompt for saving changes may appear on
            the wrong monitor.
Solution:   Adjust the CenterWindow function. (Ken Takata)
  • Loading branch information...
1 parent eca626f commit 87f3d202a90bd2d08a7afd55b3486b10bef858bb @brammool brammool committed Dec 1, 2016
Showing with 36 additions and 22 deletions.
  1. +34 −22 src/gui_w32.c
  2. +2 −0 src/version.c
View
@@ -2297,52 +2297,64 @@ GetTextWidthEnc(HDC hdc, char_u *str, int len)
# define GetTextWidthEnc(h, s, l) GetTextWidth((h), (s), (l))
#endif
+static void get_work_area(RECT *spi_rect);
+
/*
* A quick little routine that will center one window over another, handy for
- * dialog boxes. Taken from the Win32SDK samples.
+ * dialog boxes. Taken from the Win32SDK samples and modified for multiple
+ * monitors.
*/
static BOOL
CenterWindow(
HWND hwndChild,
HWND hwndParent)
{
- RECT rChild, rParent;
- int wChild, hChild, wParent, hParent;
- int wScreen, hScreen, xNew, yNew;
- HDC hdc;
+ HMONITOR mon;
+ MONITORINFO moninfo;
+ RECT rChild, rParent, rScreen;
+ int wChild, hChild, wParent, hParent;
+ int xNew, yNew;
+ HDC hdc;
GetWindowRect(hwndChild, &rChild);
wChild = rChild.right - rChild.left;
hChild = rChild.bottom - rChild.top;
/* If Vim is minimized put the window in the middle of the screen. */
if (hwndParent == NULL || IsMinimized(hwndParent))
- SystemParametersInfo(SPI_GETWORKAREA, 0, &rParent, 0);
+ get_work_area(&rParent);
else
GetWindowRect(hwndParent, &rParent);
wParent = rParent.right - rParent.left;
hParent = rParent.bottom - rParent.top;
- hdc = GetDC(hwndChild);
- wScreen = GetDeviceCaps (hdc, HORZRES);
- hScreen = GetDeviceCaps (hdc, VERTRES);
- ReleaseDC(hwndChild, hdc);
-
- xNew = rParent.left + ((wParent - wChild) /2);
- if (xNew < 0)
+ moninfo.cbSize = sizeof(MONITORINFO);
+ mon = MonitorFromWindow(hwndChild, MONITOR_DEFAULTTOPRIMARY);
+ if (mon != NULL && GetMonitorInfo(mon, &moninfo))
{
- xNew = 0;
+ rScreen = moninfo.rcWork;
}
- else if ((xNew+wChild) > wScreen)
+ else
{
- xNew = wScreen - wChild;
+ hdc = GetDC(hwndChild);
+ rScreen.left = 0;
+ rScreen.top = 0;
+ rScreen.right = GetDeviceCaps(hdc, HORZRES);
+ rScreen.bottom = GetDeviceCaps(hdc, VERTRES);
+ ReleaseDC(hwndChild, hdc);
}
- yNew = rParent.top + ((hParent - hChild) /2);
- if (yNew < 0)
- yNew = 0;
- else if ((yNew+hChild) > hScreen)
- yNew = hScreen - hChild;
+ xNew = rParent.left + ((wParent - wChild) / 2);
+ if (xNew < rScreen.left)
+ xNew = rScreen.left;
+ else if ((xNew + wChild) > rScreen.right)
+ xNew = rScreen.right - wChild;
+
+ yNew = rParent.top + ((hParent - hChild) / 2);
+ if (yNew < rScreen.top)
+ yNew = rScreen.top;
+ else if ((yNew + hChild) > rScreen.bottom)
+ yNew = rScreen.bottom - hChild;
return SetWindowPos(hwndChild, NULL, xNew, yNew, 0, 0,
SWP_NOSIZE | SWP_NOZORDER);
@@ -5559,7 +5571,7 @@ get_work_area(RECT *spi_rect)
MONITORINFO moninfo;
/* work out which monitor the window is on, and get *it's* work area */
- mon = MonitorFromWindow(s_hwnd, 1 /*MONITOR_DEFAULTTOPRIMARY*/);
+ mon = MonitorFromWindow(s_hwnd, MONITOR_DEFAULTTOPRIMARY);
if (mon != NULL)
{
moninfo.cbSize = sizeof(MONITORINFO);
View
@@ -765,6 +765,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 113,
+/**/
112,
/**/
111,

0 comments on commit 87f3d20

Please sign in to comment.