Alexandre Julliard : user: Fixed MonitorFromWindow behavior for an invalid window handle.

Alexandre Julliard julliard at wine.codeweavers.com
Tue Oct 24 04:55:25 CDT 2006


Module: wine
Branch: master
Commit: 75fb678070ac4b43b01444e56682f5b83a425f5b
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=75fb678070ac4b43b01444e56682f5b83a425f5b

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Mon Oct 23 18:03:16 2006 +0200

user: Fixed MonitorFromWindow behavior for an invalid window handle.

---

 dlls/user/dialog.c        |    7 +------
 dlls/user/dialog16.c      |    7 +------
 dlls/user/misc.c          |    7 ++++++-
 dlls/user/tests/monitor.c |   18 ++++++++++++++++++
 dlls/user/win.c           |   12 +-----------
 5 files changed, 27 insertions(+), 24 deletions(-)

diff --git a/dlls/user/dialog.c b/dlls/user/dialog.c
index d43247c..4021151 100644
--- a/dlls/user/dialog.c
+++ b/dlls/user/dialog.c
@@ -543,12 +543,7 @@ static HWND DIALOG_CreateIndirect( HINST
         mon_info.cbSize = sizeof(mon_info);
         if (template.style & DS_CENTER)
         {
-            if (!(monitor = MonitorFromWindow( owner ? owner : GetActiveWindow(),
-                                               MONITOR_DEFAULTTOPRIMARY )))
-            {
-                pos.x = pos.y = 0;  /* default to primary monitor */
-                monitor = MonitorFromPoint( pos, MONITOR_DEFAULTTOPRIMARY );
-            }
+            monitor = MonitorFromWindow( owner ? owner : GetActiveWindow(), MONITOR_DEFAULTTOPRIMARY );
             GetMonitorInfoW( monitor, &mon_info );
             pos.x = (mon_info.rcWork.left + mon_info.rcWork.right - size.cx) / 2;
             pos.y = (mon_info.rcWork.top + mon_info.rcWork.bottom - size.cy) / 2;
diff --git a/dlls/user/dialog16.c b/dlls/user/dialog16.c
index 2df59fc..3208b34 100644
--- a/dlls/user/dialog16.c
+++ b/dlls/user/dialog16.c
@@ -375,12 +375,7 @@ static HWND DIALOG_CreateIndirect16( HIN
         mon_info.cbSize = sizeof(mon_info);
         if (template.style & DS_CENTER)
         {
-            if (!(monitor = MonitorFromWindow( owner ? owner : GetActiveWindow(),
-                                               MONITOR_DEFAULTTOPRIMARY )))
-            {
-                pos.x = pos.y = 0;  /* default to primary monitor */
-                monitor = MonitorFromPoint( pos, MONITOR_DEFAULTTOPRIMARY );
-            }
+            monitor = MonitorFromWindow( owner ? owner : GetActiveWindow(), MONITOR_DEFAULTTOPRIMARY );
             GetMonitorInfoW( monitor, &mon_info );
             pos.x = (mon_info.rcWork.left + mon_info.rcWork.right - size.cx) / 2;
             pos.y = (mon_info.rcWork.top + mon_info.rcWork.bottom - size.cy) / 2;
diff --git a/dlls/user/misc.c b/dlls/user/misc.c
index 114a042..4cc1105 100644
--- a/dlls/user/misc.c
+++ b/dlls/user/misc.c
@@ -430,7 +430,12 @@ HMONITOR WINAPI MonitorFromWindow(HWND h
     if (IsIconic(hWnd) && GetWindowPlacement(hWnd, &wp))
         return MonitorFromRect( &wp.rcNormalPosition, dwFlags );
 
-    GetWindowRect( hWnd, &rect );
+    if (GetWindowRect( hWnd, &rect ))
+        return MonitorFromRect( &rect, dwFlags );
+
+    if (!(dwFlags & (MONITOR_DEFAULTTOPRIMARY|MONITOR_DEFAULTTONEAREST))) return 0;
+    /* retrieve the primary */
+    SetRect( &rect, 0, 0, 1, 1 );
     return MonitorFromRect( &rect, dwFlags );
 }
 
diff --git a/dlls/user/tests/monitor.c b/dlls/user/tests/monitor.c
index ad3165f..787ac2e 100644
--- a/dlls/user/tests/monitor.c
+++ b/dlls/user/tests/monitor.c
@@ -146,10 +146,28 @@ static void test_ChangeDisplaySettingsEx
     ok(res == DISP_CHANGE_SUCCESSFUL, "Failed to reset default resolution: %d\n", res);
 }
 
+static void test_monitors(void)
+{
+    HMONITOR monitor, primary;
+    POINT pt;
+
+    pt.x = pt.y = 0;
+    primary = MonitorFromPoint( pt, MONITOR_DEFAULTTOPRIMARY );
+    ok( primary != 0, "couldn't get primary monitor\n" );
+
+    monitor = MonitorFromWindow( 0, MONITOR_DEFAULTTONULL );
+    ok( !monitor, "got %p, should not get a monitor for an invalid window\n", monitor );
+    monitor = MonitorFromWindow( 0, MONITOR_DEFAULTTOPRIMARY );
+    ok( monitor == primary, "got %p, should get primary %p for MONITOR_DEFAULTTOPRIMARY\n", monitor, primary );
+    monitor = MonitorFromWindow( 0, MONITOR_DEFAULTTONEAREST );
+    ok( monitor == primary, "got %p, should get primary %p for MONITOR_DEFAULTTONEAREST\n", monitor, primary );
+}
+
 
 START_TEST(monitor)
 {
     init_function_pointers();
     test_enumdisplaydevices();
     test_ChangeDisplaySettingsEx();
+    test_monitors();
 }
diff --git a/dlls/user/win.c b/dlls/user/win.c
index d52cac0..91a9f09 100644
--- a/dlls/user/win.c
+++ b/dlls/user/win.c
@@ -706,20 +706,10 @@ #define IS_DEFAULT(x)  ((x) == CW_USEDEF
         HMONITOR monitor;
         MONITORINFO mon_info;
         STARTUPINFOW info;
-        POINT pt;
 
         if (!IS_DEFAULT(cs->x) && !IS_DEFAULT(cs->cx) && !IS_DEFAULT(cs->cy)) return;
 
-        if (!(monitor = MonitorFromWindow( cs->hwndParent, MONITOR_DEFAULTTOPRIMARY )))
-        {
-            pt.x = pt.y = 0;  /* default to primary monitor */
-            if (!IS_DEFAULT(cs->x))
-            {
-                pt.x = cs->x;
-                pt.y = cs->y;
-            }
-            monitor = MonitorFromPoint( pt, MONITOR_DEFAULTTOPRIMARY );
-        }
+        monitor = MonitorFromWindow( cs->hwndParent, MONITOR_DEFAULTTOPRIMARY );
         mon_info.cbSize = sizeof(mon_info);
         GetMonitorInfoW( monitor, &mon_info );
         GetStartupInfoW( &info );




More information about the wine-cvs mailing list