Mercurial > vim
changeset 10438:935bdb919a50 v8.0.0113
commit https://github.com/vim/vim/commit/87f3d202a90bd2d08a7afd55b3486b10bef858bb
Author: Bram Moolenaar <Bram@vim.org>
Date: Thu Dec 1 20:18:50 2016 +0100
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)
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Thu, 01 Dec 2016 20:30:04 +0100 |
parents | 1e42baadb82a |
children | fed4e956f530 |
files | src/gui_w32.c src/version.c |
diffstat | 2 files changed, 41 insertions(+), 27 deletions(-) [+] |
line wrap: on
line diff
--- a/src/gui_w32.c +++ b/src/gui_w32.c @@ -2297,19 +2297,24 @@ GetTextWidthEnc(HDC hdc, char_u *str, in # 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) - { - xNew = 0; - } - else if ((xNew+wChild) > wScreen) - { - xNew = wScreen - wChild; - } - - yNew = rParent.top + ((hParent - hChild) /2); - if (yNew < 0) - yNew = 0; - else if ((yNew+hChild) > hScreen) - yNew = hScreen - hChild; + moninfo.cbSize = sizeof(MONITORINFO); + mon = MonitorFromWindow(hwndChild, MONITOR_DEFAULTTOPRIMARY); + if (mon != NULL && GetMonitorInfo(mon, &moninfo)) + { + rScreen = moninfo.rcWork; + } + else + { + hdc = GetDC(hwndChild); + rScreen.left = 0; + rScreen.top = 0; + rScreen.right = GetDeviceCaps(hdc, HORZRES); + rScreen.bottom = GetDeviceCaps(hdc, VERTRES); + ReleaseDC(hwndChild, hdc); + } + + 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);