Alexandre Julliard : user: Adapt system metrics for multi-monitor setups.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Oct 23 10:01:20 CDT 2006


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Mon Oct 23 14:29:57 2006 +0200

user: Adapt system metrics for multi-monitor setups.

---

 dlls/user/sysparams.c       |   58 ++++++++++++++++++++++++++++++++++++++----
 dlls/user/tests/sysparams.c |    4 +-
 2 files changed, 54 insertions(+), 8 deletions(-)

diff --git a/dlls/user/sysparams.c b/dlls/user/sysparams.c
index 906eea1..4ef2782 100644
--- a/dlls/user/sysparams.c
+++ b/dlls/user/sysparams.c
@@ -488,6 +488,31 @@ static void SYSPARAMS_NonClientMetrics32
     SYSPARAMS_LogFont32ATo32W( &lpnm32A->lfMessageFont,		&lpnm32W->lfMessageFont );
 }
 
+
+/* Helper functions to retrieve monitors info */
+
+struct monitor_info
+{
+    int count;
+    RECT virtual_rect;
+};
+
+static BOOL CALLBACK monitor_info_proc( HMONITOR monitor, HDC hdc, LPRECT rect, LPARAM lp )
+{
+    struct monitor_info *info = (struct monitor_info *)lp;
+    info->count++;
+    UnionRect( &info->virtual_rect, &info->virtual_rect, rect );
+    return TRUE;
+}
+
+static void get_monitors_info( struct monitor_info *info )
+{
+    info->count = 0;
+    SetRectEmpty( &info->virtual_rect );
+    EnumDisplayMonitors( 0, NULL, monitor_info_proc, (LPARAM)info );
+}
+
+
 /* get text metrics and/or "average" char width of the specified logfont 
  * for the specified dc */
 static void get_text_metr_size( HDC hdc, LOGFONTW *plf, TEXTMETRICW * ptm, UINT *psz)
@@ -2677,9 +2702,9 @@ INT WINAPI GetSystemMetrics( INT index )
         if (!spi_loaded[SPI_NONCLIENTMETRICS_IDX]) load_nonclient_metrics();
         return nonclient_metrics.iCaptionHeight + 6;
     case SM_CXMAXTRACK:
-        return GetSystemMetrics(SM_CXSCREEN) + 4 + 2 * GetSystemMetrics(SM_CXFRAME);
+        return GetSystemMetrics(SM_CXVIRTUALSCREEN) + 4 + 2 * GetSystemMetrics(SM_CXFRAME);
     case SM_CYMAXTRACK:
-        return GetSystemMetrics(SM_CYSCREEN) + 4 + 2 * GetSystemMetrics(SM_CYFRAME);
+        return GetSystemMetrics(SM_CYVIRTUALSCREEN) + 4 + 2 * GetSystemMetrics(SM_CYFRAME);
     case SM_CXMAXIMIZED:
         /* FIXME: subtract the width of any vertical application toolbars*/
         return GetSystemMetrics(SM_CXSCREEN) + 2 * GetSystemMetrics(SM_CXFRAME);
@@ -2708,14 +2733,35 @@ INT WINAPI GetSystemMetrics( INT index )
     case SM_MOUSEWHEELPRESENT:
         return 1;
     case SM_XVIRTUALSCREEN:
+    {
+        struct monitor_info info;
+        get_monitors_info( &info );
+        return info.virtual_rect.left;
+    }
     case SM_YVIRTUALSCREEN:
-        return 0;
+    {
+        struct monitor_info info;
+        get_monitors_info( &info );
+        return info.virtual_rect.top;
+    }
     case SM_CXVIRTUALSCREEN:
-        return GetSystemMetrics(SM_CXSCREEN);
+    {
+        struct monitor_info info;
+        get_monitors_info( &info );
+        return info.virtual_rect.right - info.virtual_rect.left;
+    }
     case SM_CYVIRTUALSCREEN:
-        return GetSystemMetrics(SM_CYSCREEN);
+    {
+        struct monitor_info info;
+        get_monitors_info( &info );
+        return info.virtual_rect.bottom - info.virtual_rect.top;
+    }
     case SM_CMONITORS:
-        return 1;
+    {
+        struct monitor_info info;
+        get_monitors_info( &info );
+        return info.count;
+    }
     case SM_SAMEDISPLAYFORMAT:
         return 1;
     case SM_IMMENABLED:
diff --git a/dlls/user/tests/sysparams.c b/dlls/user/tests/sysparams.c
index fa7bfdd..1555e5a 100644
--- a/dlls/user/tests/sysparams.c
+++ b/dlls/user/tests/sysparams.c
@@ -2384,9 +2384,9 @@ void test_GetSystemMetrics( void)
     /* SM_ARRANGE */
     ok_gsm( SM_CXMINIMIZED, minim.iWidth + 6);
     ok_gsm( SM_CYMINIMIZED, GetSystemMetrics( SM_CYCAPTION) + 5);
-    ok_gsm( SM_CXMAXTRACK, GetSystemMetrics( SM_CXSCREEN) +
+    ok_gsm( SM_CXMAXTRACK, GetSystemMetrics( SM_CXVIRTUALSCREEN) +
             4 + 2 * GetSystemMetrics( SM_CXFRAME));
-    ok_gsm( SM_CYMAXTRACK, GetSystemMetrics( SM_CYSCREEN) +
+    ok_gsm( SM_CYMAXTRACK, GetSystemMetrics( SM_CYVIRTUALSCREEN) +
             4 + 2 * GetSystemMetrics( SM_CYFRAME));
     /* the next two cannot really be tested as they depend on (application)
      * toolbars */




More information about the wine-cvs mailing list