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