]> granicus.if.org Git - vim/commitdiff
patch 8.0.0113 v8.0.0113
authorBram Moolenaar <Bram@vim.org>
Thu, 1 Dec 2016 19:18:50 +0000 (20:18 +0100)
committerBram Moolenaar <Bram@vim.org>
Thu, 1 Dec 2016 19:18:50 +0000 (20:18 +0100)
Problem:    MS-Windows: message box to prompt for saving changes may appear on
            the wrong monitor.
Solution:   Adjust the CenterWindow function. (Ken Takata)

src/gui_w32.c
src/version.c

index 02c5ed16a6f43dcfe1f5287c283675d73b70e193..84a23787a3fff11e4a753eb7ea734ad3e964014a 100644 (file)
@@ -2297,19 +2297,24 @@ 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;
@@ -2317,32 +2322,39 @@ CenterWindow(
 
     /* 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);
index 557e990b2531de637a1fc3fddb0374c47c9a5a05..df32644178d6c76beee1422c8e606663d8bca46f 100644 (file)
@@ -764,6 +764,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    113,
 /**/
     112,
 /**/