Module: wine Branch: master Commit: 75fb678070ac4b43b01444e56682f5b83a425f5b URL: http://source.winehq.org/git/wine.git/?a=commit;h=75fb678070ac4b43b01444e566...
Author: Alexandre Julliard julliard@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 );