Jacek Caban : winex11: Get primary monitor rect from win32u.

Alexandre Julliard julliard at winehq.org
Fri Feb 18 15:15:00 CST 2022


Module: wine
Branch: master
Commit: 656edbb508d51cbe3155d856ee3f2c27a6cd4cba
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=656edbb508d51cbe3155d856ee3f2c27a6cd4cba

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Fri Feb 18 13:37:29 2022 +0100

winex11: Get primary monitor rect from win32u.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Huw Davies <huw at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/win32u/sysparams.c      |  11 +++--
 dlls/winex11.drv/Makefile.in |   2 +-
 dlls/winex11.drv/display.c   | 101 +------------------------------------------
 include/ntuser.h             |   1 +
 4 files changed, 11 insertions(+), 104 deletions(-)

diff --git a/dlls/win32u/sysparams.c b/dlls/win32u/sysparams.c
index 09a04892d2d..58bd22a3adf 100644
--- a/dlls/win32u/sysparams.c
+++ b/dlls/win32u/sysparams.c
@@ -1474,7 +1474,7 @@ RECT get_display_rect( const WCHAR *display )
     return map_dpi_rect( rect, system_dpi, get_thread_dpi() );
 }
 
-static RECT get_primary_monitor_rect(void)
+static RECT get_primary_monitor_rect( UINT dpi )
 {
     struct monitor *monitor;
     RECT rect = {0};
@@ -1489,7 +1489,7 @@ static RECT get_primary_monitor_rect(void)
     }
 
     unlock_display_devices();
-    return map_dpi_rect( rect, system_dpi, get_thread_dpi() );
+    return map_dpi_rect( rect, system_dpi, dpi );
 }
 
 /**********************************************************************
@@ -4203,10 +4203,10 @@ int get_system_metrics( int index )
     case SM_MOUSEWHEELPRESENT:
         return 1;
     case SM_CXSCREEN:
-        rect = get_primary_monitor_rect();
+        rect = get_primary_monitor_rect( get_thread_dpi() );
         return rect.right - rect.left;
     case SM_CYSCREEN:
-        rect = get_primary_monitor_rect();
+        rect = get_primary_monitor_rect( get_thread_dpi() );
         return rect.bottom - rect.top;
     case SM_XVIRTUALSCREEN:
         rect = get_virtual_screen_rect( get_thread_dpi() );
@@ -4528,6 +4528,9 @@ ULONG_PTR WINAPI NtUserCallOneParam( ULONG_PTR arg, ULONG code )
         return get_sys_color( arg );
     case NtUserRealizePalette:
         return realize_palette( UlongToHandle(arg) );
+    case NtUserGetPrimaryMonitorRect:
+        *(RECT *)arg = get_primary_monitor_rect( 0 );
+        return 1;
     case NtUserGetSysColorBrush:
         return HandleToUlong( get_sys_color_brush(arg) );
     case NtUserGetSysColorPen:
diff --git a/dlls/winex11.drv/Makefile.in b/dlls/winex11.drv/Makefile.in
index 64df2075cc4..93a975d7f63 100644
--- a/dlls/winex11.drv/Makefile.in
+++ b/dlls/winex11.drv/Makefile.in
@@ -1,6 +1,6 @@
 EXTRADEFS = -DWINE_NO_LONG_TYPES
 MODULE    = winex11.drv
-IMPORTS   = uuid setupapi rpcrt4 user32 gdi32 advapi32 win32u
+IMPORTS   = uuid user32 gdi32 advapi32 win32u
 DELAYIMPORTS = comctl32 ole32 shell32 imm32
 EXTRAINCL = $(X_CFLAGS)
 EXTRALIBS = $(X_LIBS) $(X_EXTRA_LIBS)
diff --git a/dlls/winex11.drv/display.c b/dlls/winex11.drv/display.c
index bff14d3370c..ab5dcdac23f 100644
--- a/dlls/winex11.drv/display.c
+++ b/dlls/winex11.drv/display.c
@@ -19,52 +19,14 @@
  */
 
 #include "config.h"
-
-#include <stdarg.h>
-
-#include "windef.h"
-#include "winbase.h"
-#include "rpc.h"
-#include "winreg.h"
-#include "cfgmgr32.h"
-#include "initguid.h"
-#include "devguid.h"
-#include "devpkey.h"
-#include "ntddvdeo.h"
-#include "setupapi.h"
-#define WIN32_NO_STATUS
-#include "winternl.h"
-#include "wine/debug.h"
-#include "wine/unicode.h"
 #include "x11drv.h"
+#include "wine/debug.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(x11drv);
 
-/* Wine specific properties */
-DEFINE_DEVPROPKEY(WINE_DEVPROPKEY_MONITOR_RCMONITOR, 0x233a9ef3, 0xafc4, 0x4abd, 0xb5, 0x64, 0xc3, 0x2f, 0x21, 0xf1, 0x53, 0x5b, 3);
-
-static const WCHAR displayW[] = {'D','I','S','P','L','A','Y',0};
-static const WCHAR video_keyW[] = {
-    'H','A','R','D','W','A','R','E','\\',
-    'D','E','V','I','C','E','M','A','P','\\',
-    'V','I','D','E','O',0};
-
 static struct x11drv_display_device_handler host_handler;
 struct x11drv_display_device_handler desktop_handler;
 
-/* Cached screen information, protected by screen_section */
-static HKEY video_key;
-static RECT primary_monitor_rect;
-static FILETIME last_query_screen_time;
-static CRITICAL_SECTION screen_section;
-static CRITICAL_SECTION_DEBUG screen_critsect_debug =
-{
-    0, 0, &screen_section,
-    {&screen_critsect_debug.ProcessLocksList, &screen_critsect_debug.ProcessLocksList},
-     0, 0, {(DWORD_PTR)(__FILE__ ": screen_section")}
-};
-static CRITICAL_SECTION screen_section = {&screen_critsect_debug, -1, 0, 0, 0, 0};
-
 HANDLE get_display_device_init_mutex(void)
 {
     static const WCHAR init_mutexW[] = {'d','i','s','p','l','a','y','_','d','e','v','i','c','e','_','i','n','i','t',0};
@@ -80,61 +42,6 @@ void release_display_device_init_mutex(HANDLE mutex)
     CloseHandle(mutex);
 }
 
-/* Update screen rectangle cache from SetupAPI if it's outdated, return FALSE on failure and TRUE on success */
-static BOOL update_screen_cache(void)
-{
-    RECT virtual_rect = {0}, primary_rect = {0}, monitor_rect;
-    SP_DEVINFO_DATA device_data = {sizeof(device_data)};
-    HDEVINFO devinfo = INVALID_HANDLE_VALUE;
-    FILETIME filetime = {0};
-    HANDLE mutex = NULL;
-    DWORD i = 0;
-    INT result;
-    DWORD type;
-    BOOL ret = FALSE;
-
-    EnterCriticalSection(&screen_section);
-    if ((!video_key && RegOpenKeyW(HKEY_LOCAL_MACHINE, video_keyW, &video_key))
-        || RegQueryInfoKeyW(video_key, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, &filetime))
-    {
-        LeaveCriticalSection(&screen_section);
-        return FALSE;
-    }
-    result = CompareFileTime(&filetime, &last_query_screen_time);
-    LeaveCriticalSection(&screen_section);
-    if (result < 1)
-        return TRUE;
-
-    mutex = get_display_device_init_mutex();
-
-    devinfo = SetupDiGetClassDevsW(&GUID_DEVCLASS_MONITOR, displayW, NULL, DIGCF_PRESENT);
-    if (devinfo == INVALID_HANDLE_VALUE)
-        goto fail;
-
-    while (SetupDiEnumDeviceInfo(devinfo, i++, &device_data))
-    {
-        if (!SetupDiGetDevicePropertyW(devinfo, &device_data, &WINE_DEVPROPKEY_MONITOR_RCMONITOR, &type,
-                                       (BYTE *)&monitor_rect, sizeof(monitor_rect), NULL, 0))
-            goto fail;
-
-        UnionRect(&virtual_rect, &virtual_rect, &monitor_rect);
-        if (i == 1)
-            primary_rect = monitor_rect;
-    }
-
-    EnterCriticalSection(&screen_section);
-    primary_monitor_rect = primary_rect;
-    last_query_screen_time = filetime;
-    LeaveCriticalSection(&screen_section);
-    ret = TRUE;
-fail:
-    SetupDiDestroyDeviceInfoList(devinfo);
-    release_display_device_init_mutex(mutex);
-    if (!ret)
-        WARN("Update screen cache failed!\n");
-    return ret;
-}
-
 POINT virtual_screen_to_root(INT x, INT y)
 {
     RECT virtual = get_virtual_screen_rect();
@@ -165,11 +72,7 @@ RECT get_virtual_screen_rect(void)
 RECT get_primary_monitor_rect(void)
 {
     RECT primary;
-
-    update_screen_cache();
-    EnterCriticalSection(&screen_section);
-    primary = primary_monitor_rect;
-    LeaveCriticalSection(&screen_section);
+    NtUserCallOneParam( (UINT_PTR)&primary, NtUserGetPrimaryMonitorRect );
     return primary;
 }
 
diff --git a/include/ntuser.h b/include/ntuser.h
index 43c1880fc9b..b7e2e63dcb3 100644
--- a/include/ntuser.h
+++ b/include/ntuser.h
@@ -75,6 +75,7 @@ enum
 {
     NtUserGetClipCursor,
     NtUserGetCursorPos,
+    NtUserGetPrimaryMonitorRect,
     NtUserGetSysColor,
     NtUserGetSysColorBrush,
     NtUserGetSysColorPen,




More information about the wine-cvs mailing list