From: Zhiyi Zhang Subject: [PATCH 6/6] winemac.drv: Use generic EnumDisplayMonitors and GetMonitorInfo. Message-Id: <989cfa71-a8b5-e304-9aea-c189642031a6@codeweavers.com> Date: Thu, 4 Jul 2019 21:23:20 +0800 Signed-off-by: Zhiyi Zhang --- dlls/winemac.drv/cocoa_display.m | 2 + dlls/winemac.drv/display.c | 154 +++++--------------------------------- dlls/winemac.drv/macdrv_cocoa.h | 4 + dlls/winemac.drv/winemac.drv.spec | 2 - 4 files changed, 26 insertions(+), 136 deletions(-) diff --git a/dlls/winemac.drv/cocoa_display.m b/dlls/winemac.drv/cocoa_display.m index e1c1b0cb17..6ffb2714f8 100644 --- a/dlls/winemac.drv/cocoa_display.m +++ b/dlls/winemac.drv/cocoa_display.m @@ -654,6 +654,8 @@ int macdrv_get_monitors(uint32_t adapter_id, struct macdrv_monitor** new_monitor strcpy(monitors[monitor_count].name, "Generic Non-PnP Monitor"); monitors[monitor_count].state_flags = DISPLAY_DEVICE_ATTACHED | DISPLAY_DEVICE_ACTIVE; + monitors[monitor_count].rc_monitor = displays[j].frame; + monitors[monitor_count].rc_work = displays[j].work_frame; monitor_count++; } } diff --git a/dlls/winemac.drv/display.c b/dlls/winemac.drv/display.c index 5a1419511d..08067e0ad8 100644 --- a/dlls/winemac.drv/display.c +++ b/dlls/winemac.drv/display.c @@ -53,6 +53,9 @@ BOOL CDECL macdrv_EnumDisplaySettingsEx(LPCWSTR devname, DWORD mode, LPDEVMODEW /* Wine specific monitor properties */ 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_RCWORK, 0x233a9ef3, 0xafc4, 0x4abd, 0xb5, 0x64, 0xc3, 0x2f, 0x21, 0xf1, 0x53, 0x5b, 4); +DEFINE_DEVPROPKEY(WINE_DEVPROPKEY_MONITOR_ADAPTERNAME, 0x233a9ef3, 0xafc4, 0x4abd, 0xb5, 0x64, 0xc3, 0x2f, 0x21, 0xf1, 0x53, 0x5b, 5); static const char initial_mode_key[] = "Initial Display Mode"; static const WCHAR pixelencodingW[] = {'P','i','x','e','l','E','n','c','o','d','i','n','g',0}; @@ -63,6 +66,7 @@ static const WCHAR video_idW[] = {'V','i','d','e','o','I','D',0}; static const WCHAR symbolic_link_valueW[]= {'S','y','m','b','o','l','i','c','L','i','n','k','V','a','l','u','e',0}; static const WCHAR gpu_idW[] = {'G','P','U','I','D',0}; static const WCHAR mointor_id_fmtW[] = {'M','o','n','i','t','o','r','I','D','%','d',0}; +static const WCHAR adapter_name_fmtW[] = {'\\','\\','.','\\','D','I','S','P','L','A','Y','%','d',0}; static const WCHAR state_flagsW[] = {'S','t','a','t','e','F','l','a','g','s',0}; static const WCHAR guid_fmtW[] = { '{','%','0','8','x','-','%','0','4','x','-','%','0','4','x','-','%','0','2','x','%','0','2','x','-', @@ -127,18 +131,6 @@ static CRITICAL_SECTION modes_section = { &critsect_debug, -1, 0, 0, 0, 0 }; static BOOL inited_original_display_mode; - -static inline HMONITOR display_id_to_monitor(CGDirectDisplayID display_id) -{ - return (HMONITOR)(UINT_PTR)display_id; -} - -static inline CGDirectDisplayID monitor_to_display_id(HMONITOR handle) -{ - return (CGDirectDisplayID)(UINT_PTR)handle; -} - - static BOOL get_display_device_reg_key(char *key, unsigned len) { static const char display_device_guid_prop[] = "__wine_display_device_guid"; @@ -968,76 +960,6 @@ better: return ret; } - -/*********************************************************************** - * EnumDisplayMonitors (MACDRV.@) - */ -BOOL CDECL macdrv_EnumDisplayMonitors(HDC hdc, LPRECT rect, MONITORENUMPROC proc, LPARAM lparam) -{ - struct macdrv_display *displays; - int num_displays; - int i; - BOOL ret = TRUE; - - TRACE("%p, %s, %p, %#lx\n", hdc, wine_dbgstr_rect(rect), proc, lparam); - - if (hdc) - { - POINT origin; - RECT limit; - - if (!GetDCOrgEx(hdc, &origin)) return FALSE; - if (GetClipBox(hdc, &limit) == ERROR) return FALSE; - - if (rect && !IntersectRect(&limit, &limit, rect)) return TRUE; - - if (macdrv_get_displays(&displays, &num_displays)) - return FALSE; - - for (i = 0; i < num_displays; i++) - { - RECT monrect = rect_from_cgrect(displays[i].frame); - OffsetRect(&monrect, -origin.x, -origin.y); - if (IntersectRect(&monrect, &monrect, &limit)) - { - HMONITOR monitor = display_id_to_monitor(displays[i].displayID); - TRACE("monitor %d handle %p @ %s\n", i, monitor, wine_dbgstr_rect(&monrect)); - if (!proc(monitor, hdc, &monrect, lparam)) - { - ret = FALSE; - break; - } - } - } - } - else - { - if (macdrv_get_displays(&displays, &num_displays)) - return FALSE; - - for (i = 0; i < num_displays; i++) - { - RECT monrect = rect_from_cgrect(displays[i].frame); - RECT unused; - if (!rect || IntersectRect(&unused, &monrect, rect)) - { - HMONITOR monitor = display_id_to_monitor(displays[i].displayID); - TRACE("monitor %d handle %p @ %s\n", i, monitor, wine_dbgstr_rect(&monrect)); - if (!proc(monitor, 0, &monrect, lparam)) - { - ret = FALSE; - break; - } - } - } - } - - macdrv_free_displays(displays); - - return ret; -} - - /*********************************************************************** * EnumDisplaySettingsEx (MACDRV.@) * @@ -1322,58 +1244,6 @@ done: return ret; } - -/*********************************************************************** - * GetMonitorInfo (MACDRV.@) - */ -BOOL CDECL macdrv_GetMonitorInfo(HMONITOR monitor, LPMONITORINFO info) -{ - static const WCHAR adapter_name[] = { '\\','\\','.','\\','D','I','S','P','L','A','Y','1',0 }; - struct macdrv_display *displays; - int num_displays; - CGDirectDisplayID display_id; - int i; - - TRACE("%p, %p\n", monitor, info); - - if (macdrv_get_displays(&displays, &num_displays)) - { - ERR("couldn't get display list\n"); - SetLastError(ERROR_GEN_FAILURE); - return FALSE; - } - - display_id = monitor_to_display_id(monitor); - for (i = 0; i < num_displays; i++) - { - if (displays[i].displayID == display_id) - break; - } - - if (i < num_displays) - { - info->rcMonitor = rect_from_cgrect(displays[i].frame); - info->rcWork = rect_from_cgrect(displays[i].work_frame); - - info->dwFlags = (i == 0) ? MONITORINFOF_PRIMARY : 0; - - if (info->cbSize >= sizeof(MONITORINFOEXW)) - lstrcpyW(((MONITORINFOEXW*)info)->szDevice, adapter_name); - - TRACE(" -> rcMonitor %s rcWork %s dwFlags %08x\n", wine_dbgstr_rect(&info->rcMonitor), - wine_dbgstr_rect(&info->rcWork), info->dwFlags); - } - else - { - ERR("invalid monitor handle\n"); - SetLastError(ERROR_INVALID_HANDLE); - } - - macdrv_free_displays(displays); - return (i < num_displays); -} - - /*********************************************************************** * SetDeviceGammaRamp (MACDRV.@) */ @@ -1634,6 +1504,7 @@ static BOOL macdrv_init_monitor(HDEVINFO devinfo, const struct macdrv_monitor *m WCHAR nameW[MAX_PATH]; WCHAR bufferW[MAX_PATH]; HKEY hkey; + RECT rect; BOOL ret = FALSE; /* Create GUID_DEVCLASS_MONITOR instance */ @@ -1658,6 +1529,21 @@ static BOOL macdrv_init_monitor(HDEVINFO devinfo, const struct macdrv_monitor *m 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 */ + rect = rect_from_cgrect(monitor->rc_monitor); + if (!SetupDiSetDevicePropertyW(devinfo, &device_data, &WINE_DEVPROPKEY_MONITOR_RCMONITOR, DEVPROP_TYPE_BINARY, + (const BYTE *)&rect, sizeof(rect), 0)) + goto done; + /* RcWork */ + rect = rect_from_cgrect(monitor->rc_work); + if (!SetupDiSetDevicePropertyW(devinfo, &device_data, &WINE_DEVPROPKEY_MONITOR_RCWORK, DEVPROP_TYPE_BINARY, + (const BYTE *)&rect, sizeof(rect), 0)) + goto done; + /* Adapter name */ + sprintfW(bufferW, adapter_name_fmtW, video_index + 1); + if (!SetupDiSetDevicePropertyW(devinfo, &device_data, &WINE_DEVPROPKEY_MONITOR_ADAPTERNAME, DEVPROP_TYPE_STRING, + (const BYTE *)bufferW, (lstrlenW(bufferW) + 1) * sizeof(WCHAR), 0)) + goto done; ret = TRUE; done: diff --git a/dlls/winemac.drv/macdrv_cocoa.h b/dlls/winemac.drv/macdrv_cocoa.h index 96ebb97e76..676adb435b 100644 --- a/dlls/winemac.drv/macdrv_cocoa.h +++ b/dlls/winemac.drv/macdrv_cocoa.h @@ -293,6 +293,10 @@ static inline CGPoint cgpoint_win_from_mac(CGPoint point) { /* Name, in UTF-8 encoding */ char name[128]; + /* as RcMonitor in MONITORINFO struct after conversion by rect_from_cgrect */ + CGRect rc_monitor; + /* as RcWork in MONITORINFO struct after conversion by rect_from_cgrect */ + CGRect rc_work; /* StateFlags in DISPLAY_DEVICE struct */ uint32_t state_flags; }; diff --git a/dlls/winemac.drv/winemac.drv.spec b/dlls/winemac.drv/winemac.drv.spec index 6fa723a690..39cf33370b 100644 --- a/dlls/winemac.drv/winemac.drv.spec +++ b/dlls/winemac.drv/winemac.drv.spec @@ -12,14 +12,12 @@ @ cdecl CreateWindow(long) macdrv_CreateWindow @ cdecl DestroyCursorIcon(long) macdrv_DestroyCursorIcon @ cdecl DestroyWindow(long) macdrv_DestroyWindow -@ cdecl EnumDisplayMonitors(long ptr ptr long) macdrv_EnumDisplayMonitors @ cdecl EnumDisplaySettingsEx(ptr long ptr long) macdrv_EnumDisplaySettingsEx @ cdecl GetCursorPos(ptr) macdrv_GetCursorPos @ cdecl GetKeyboardLayout(long) macdrv_GetKeyboardLayout @ cdecl GetKeyboardLayoutList(long ptr) macdrv_GetKeyboardLayoutList @ cdecl GetKeyboardLayoutName(ptr) macdrv_GetKeyboardLayoutName @ cdecl GetKeyNameText(long ptr long) macdrv_GetKeyNameText -@ cdecl GetMonitorInfo(long ptr) macdrv_GetMonitorInfo @ cdecl MapVirtualKeyEx(long long long) macdrv_MapVirtualKeyEx @ cdecl MsgWaitForMultipleObjectsEx(long ptr long long long) macdrv_MsgWaitForMultipleObjectsEx @ cdecl RegisterHotKey(long long long) macdrv_RegisterHotKey -- 2.15.2 (Apple Git-101.1)