0
0
mirror of https://github.com/vim/vim.git synced 2025-07-26 11:04:33 -04:00

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)
This commit is contained in:
Bram Moolenaar 2016-12-01 20:18:50 +01:00
parent eca626fcdb
commit 87f3d202a9
2 changed files with 36 additions and 22 deletions

View File

@ -2297,19 +2297,24 @@ GetTextWidthEnc(HDC hdc, char_u *str, int len)
# define GetTextWidthEnc(h, s, l) GetTextWidth((h), (s), (l)) # define GetTextWidthEnc(h, s, l) GetTextWidth((h), (s), (l))
#endif #endif
static void get_work_area(RECT *spi_rect);
/* /*
* A quick little routine that will center one window over another, handy for * 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 static BOOL
CenterWindow( CenterWindow(
HWND hwndChild, HWND hwndChild,
HWND hwndParent) HWND hwndParent)
{ {
RECT rChild, rParent; HMONITOR mon;
int wChild, hChild, wParent, hParent; MONITORINFO moninfo;
int wScreen, hScreen, xNew, yNew; RECT rChild, rParent, rScreen;
HDC hdc; int wChild, hChild, wParent, hParent;
int xNew, yNew;
HDC hdc;
GetWindowRect(hwndChild, &rChild); GetWindowRect(hwndChild, &rChild);
wChild = rChild.right - rChild.left; wChild = rChild.right - rChild.left;
@ -2317,32 +2322,39 @@ CenterWindow(
/* If Vim is minimized put the window in the middle of the screen. */ /* If Vim is minimized put the window in the middle of the screen. */
if (hwndParent == NULL || IsMinimized(hwndParent)) if (hwndParent == NULL || IsMinimized(hwndParent))
SystemParametersInfo(SPI_GETWORKAREA, 0, &rParent, 0); get_work_area(&rParent);
else else
GetWindowRect(hwndParent, &rParent); GetWindowRect(hwndParent, &rParent);
wParent = rParent.right - rParent.left; wParent = rParent.right - rParent.left;
hParent = rParent.bottom - rParent.top; hParent = rParent.bottom - rParent.top;
hdc = GetDC(hwndChild); moninfo.cbSize = sizeof(MONITORINFO);
wScreen = GetDeviceCaps (hdc, HORZRES); mon = MonitorFromWindow(hwndChild, MONITOR_DEFAULTTOPRIMARY);
hScreen = GetDeviceCaps (hdc, VERTRES); if (mon != NULL && GetMonitorInfo(mon, &moninfo))
ReleaseDC(hwndChild, hdc);
xNew = rParent.left + ((wParent - wChild) /2);
if (xNew < 0)
{ {
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); xNew = rParent.left + ((wParent - wChild) / 2);
if (yNew < 0) if (xNew < rScreen.left)
yNew = 0; xNew = rScreen.left;
else if ((yNew+hChild) > hScreen) else if ((xNew + wChild) > rScreen.right)
yNew = hScreen - hChild; 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, return SetWindowPos(hwndChild, NULL, xNew, yNew, 0, 0,
SWP_NOSIZE | SWP_NOZORDER); SWP_NOSIZE | SWP_NOZORDER);
@ -5559,7 +5571,7 @@ get_work_area(RECT *spi_rect)
MONITORINFO moninfo; MONITORINFO moninfo;
/* work out which monitor the window is on, and get *it's* work area */ /* 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) if (mon != NULL)
{ {
moninfo.cbSize = sizeof(MONITORINFO); moninfo.cbSize = sizeof(MONITORINFO);

View File

@ -764,6 +764,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 */
/**/
113,
/**/ /**/
112, 112,
/**/ /**/