Signed-off-by: Zhiyi Zhang <zzhang(a)codeweavers.com>
---
dlls/user32/sysparams.c | 4 +-
dlls/winex11.drv/display.c | 114 +++++++++----------------------------
2 files changed, 29 insertions(+), 89 deletions(-)
diff --git a/dlls/user32/sysparams.c b/dlls/user32/sysparams.c
index 846d5b9cc36..40c26cba1c0 100644
--- a/dlls/user32/sysparams.c
+++ b/dlls/user32/sysparams.c
@@ -3982,7 +3982,7 @@ BOOL CDECL nulldrv_GetMonitorInfo( HMONITOR handle, MONITORINFO *info )
SERVER_START_REQ( get_monitor_info )
{
req->handle = wine_server_user_handle( handle );
- if (info->cbSize >= sizeof(MONITORINFOEXW))
+ if (info->cbSize == sizeof(MONITORINFOEXW))
wine_server_set_reply( req, ((MONITORINFOEXW *)info)->szDevice,
sizeof(((MONITORINFOEXW *)info)->szDevice) - sizeof(WCHAR) );
if (!(status = wine_server_call( req )))
@@ -3995,7 +3995,7 @@ BOOL CDECL nulldrv_GetMonitorInfo( HMONITOR handle, MONITORINFO *info )
info->dwFlags = MONITORINFOF_PRIMARY;
else
info->dwFlags = 0;
- if (info->cbSize >= sizeof(MONITORINFOEXW))
+ if (info->cbSize == sizeof(MONITORINFOEXW))
((MONITORINFOEXW *)info)->szDevice[wine_server_reply_size( req ) / sizeof(WCHAR)] = 0;
}
}
diff --git a/dlls/winex11.drv/display.c b/dlls/winex11.drv/display.c
index a70b5c811dc..8d5d6755cbb 100644
--- a/dlls/winex11.drv/display.c
+++ b/dlls/winex11.drv/display.c
@@ -48,7 +48,6 @@ DEFINE_DEVPROPKEY(DEVPROPKEY_MONITOR_OUTPUT_ID, 0xca085853, 0x16ce, 0x48aa, 0xb1
/* Wine specific properties */
DEFINE_DEVPROPKEY(WINE_DEVPROPKEY_GPU_VULKAN_UUID, 0x233a9ef3, 0xafc4, 0x4abd, 0xb5, 0x64, 0xc3, 0x2f, 0x21, 0xf1, 0x53, 0x5c, 2);
DEFINE_DEVPROPKEY(WINE_DEVPROPKEY_MONITOR_STATEFLAGS, 0x233a9ef3, 0xafc4, 0x4abd, 0xb5, 0x64, 0xc3, 0x2f, 0x21, 0xf1, 0x53, 0x5b, 2);
-DEFINE_DEVPROPKEY(WINE_DEVPROPKEY_MONITOR_RCMONITOR, 0x233a9ef3, 0xafc4, 0x4abd, 0xb5, 0x64, 0xc3, 0x2f, 0x21, 0xf1, 0x53, 0x5b, 3);
DEFINE_DEVPROPKEY(WINE_DEVPROPKEY_MONITOR_ADAPTERNAME, 0x233a9ef3, 0xafc4, 0x4abd, 0xb5, 0x64, 0xc3, 0x2f, 0x21, 0xf1, 0x53, 0x5b, 5);
static const WCHAR driver_date_dataW[] = {'D','r','i','v','e','r','D','a','t','e','D','a','t','a',0};
@@ -114,20 +113,6 @@ static const WCHAR driver_date_fmtW[] = {'%','u','-','%','u','-','%','u',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 virtual_screen_rect;
-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};
@@ -143,62 +128,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);
- virtual_screen_rect = virtual_rect;
- 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();
@@ -219,26 +148,41 @@ POINT root_to_virtual_screen(INT x, INT y)
return pt;
}
+static BOOL CALLBACK get_virtual_screen_proc(HMONITOR monitor, HDC hdc, LPRECT rect, LPARAM lp)
+{
+ RECT *virtual_rect = (RECT *)lp;
+
+ UnionRect(virtual_rect, virtual_rect, rect);
+ return TRUE;
+}
+
+static BOOL CALLBACK get_primary_monitor_proc(HMONITOR monitor, HDC hdc, LPRECT rect, LPARAM lp)
+{
+ RECT *primary_rect = (RECT *)lp;
+
+ if (!rect->top && !rect->left && rect->right && rect->bottom)
+ {
+ *primary_rect = *rect;
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
RECT get_virtual_screen_rect(void)
{
- RECT virtual;
+ RECT rect = {0};
- update_screen_cache();
- EnterCriticalSection(&screen_section);
- virtual = virtual_screen_rect;
- LeaveCriticalSection(&screen_section);
- return virtual;
+ EnumDisplayMonitors(0, NULL, get_virtual_screen_proc, (LPARAM)&rect);
+ return rect;
}
RECT get_primary_monitor_rect(void)
{
- RECT primary;
+ RECT rect = {0};
- update_screen_cache();
- EnterCriticalSection(&screen_section);
- primary = primary_monitor_rect;
- LeaveCriticalSection(&screen_section);
- return primary;
+ EnumDisplayMonitors(0, NULL, get_primary_monitor_proc, (LPARAM)&rect);
+ return rect;
}
/* Get the primary monitor rect from the host system */
@@ -622,10 +566,6 @@ static BOOL X11DRV_InitMonitor(HDEVINFO devinfo, const struct x11drv_monitor *mo
if (!SetupDiSetDevicePropertyW(devinfo, &device_data, &WINE_DEVPROPKEY_MONITOR_STATEFLAGS, DEVPROP_TYPE_UINT32,
(const BYTE *)&monitor->state_flags, sizeof(monitor->state_flags), 0))
goto done;
- /* RcMonitor */
- if (!SetupDiSetDevicePropertyW(devinfo, &device_data, &WINE_DEVPROPKEY_MONITOR_RCMONITOR, DEVPROP_TYPE_BINARY,
- (const BYTE *)&monitor->rc_monitor, sizeof(monitor->rc_monitor), 0))
- goto done;
/* Adapter name */
length = sprintfW(bufferW, adapter_name_fmtW, video_index + 1);
if (!SetupDiSetDevicePropertyW(devinfo, &device_data, &WINE_DEVPROPKEY_MONITOR_ADAPTERNAME, DEVPROP_TYPE_STRING,
--
2.30.2