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 [email protected].
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;
}