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