Hi, The CenterWindow() function in gui_w32.c doesn't work properly on multiple monitors. E.g.:
1. Open a gvim window on the secondary monitor. 2. Input some texts. (e.g. iHello<Esc>) 3. Press Alt+F4 to close the window. 4. A message box (Save changes to "Untitled"?) will be shown on the primary monitor. It should be shown on the secondary monitor. Attached patch fixes the problem. Also attached a patch for fixing some coding style and indentation problems. Regards, Ken Takata -- -- You received this message from the "vim_dev" maillist. Do not top-post! Type your reply below the text you are replying to. For more information, visit http://www.vim.org/maillist.php --- You received this message because you are subscribed to the Google Groups "vim_dev" group. To unsubscribe from this group and stop receiving emails from it, send an email to vim_dev+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.
# HG changeset patch # Parent 8ecfeee190111016916fb85ae8a0aefed8c75cee diff --git a/src/gui_w32.c b/src/gui_w32.c --- a/src/gui_w32.c +++ b/src/gui_w32.c @@ -2298,19 +2298,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; @@ -2318,32 +2323,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); @@ -5560,7 +5572,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);
# HG changeset patch # Parent 276c79c8ae0062ebc0809245b21a520662f7d608 diff --git a/src/gui_w32.c b/src/gui_w32.c --- a/src/gui_w32.c +++ b/src/gui_w32.c @@ -3540,12 +3540,12 @@ gui_mch_browseW( filterp = convert_filterW(filter); vim_memset(&fileStruct, 0, sizeof(OPENFILENAMEW)); -#ifdef OPENFILENAME_SIZE_VERSION_400W +# ifdef OPENFILENAME_SIZE_VERSION_400W /* be compatible with Windows NT 4.0 */ fileStruct.lStructSize = OPENFILENAME_SIZE_VERSION_400W; -#else +# else fileStruct.lStructSize = sizeof(fileStruct); -#endif +# endif if (title != NULL) titlep = enc_to_utf16(title, NULL); @@ -3582,10 +3582,10 @@ gui_mch_browseW( * Don't use OFN_OVERWRITEPROMPT, Vim has its own ":confirm" dialog. */ fileStruct.Flags = (OFN_NOCHANGEDIR | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY); -#ifdef FEAT_SHORTCUT +# ifdef FEAT_SHORTCUT if (curbuf->b_p_bin) fileStruct.Flags |= OFN_NODEREFERENCELINKS; -#endif +# endif if (saving) { if (!GetSaveFileNameW(&fileStruct)) diff --git a/src/os_mswin.c b/src/os_mswin.c --- a/src/os_mswin.c +++ b/src/os_mswin.c @@ -40,7 +40,7 @@ # include <dlgs.h> # include <winspool.h> # include <commdlg.h> -#endif +# endif #endif /* PROTO */ @@ -1619,7 +1619,9 @@ mch_print_init(prt_settings_T *psettings if (psettings->n_uncollated_copies == 0) psettings->n_uncollated_copies = 1; - } else { + } + else + { psettings->n_collated_copies = 1; psettings->n_uncollated_copies = 1; }