Signed-off-by: Zhiyi Zhang zzhang@codeweavers.com --- dlls/winemac.drv/display.c | 47 ++++++++++++++++++++++++-------------- 1 file changed, 30 insertions(+), 17 deletions(-)
diff --git a/dlls/winemac.drv/display.c b/dlls/winemac.drv/display.c index 00ad7738bb..9a9c8695f4 100644 --- a/dlls/winemac.drv/display.c +++ b/dlls/winemac.drv/display.c @@ -75,27 +75,40 @@ static inline CGDirectDisplayID monitor_to_display_id(HMONITOR handle) }
-static BOOL get_display_device_reg_key(char *key, unsigned len) +/* Get the primary adapter key in the form of System\CurrentControlSet\Control\Video{Primary adapter GUID}\0000 */ +static BOOL get_primary_adapter_key(char *key, unsigned len) { - static const char display_device_guid_prop[] = "__wine_display_device_guid"; - static const char video_path[] = "System\CurrentControlSet\Control\Video\{"; - static const char display0[] = "}\0000"; - ATOM guid_atom; - - assert(len >= sizeof(video_path) + sizeof(display0) + 40); + static const CHAR value_prefix[] = "\Registry\Machine\"; + CHAR buffer[MAX_PATH]; + CHAR *substring; + DWORD size; + size_t length; + BOOL ret = FALSE;
- guid_atom = HandleToULong(GetPropA(GetDesktopWindow(), display_device_guid_prop)); - if (!guid_atom) return FALSE; + /* Vaule data of \Device\Video0 in HKLM\HARDWARE\DEVICEMAP\VIDEO\ */ + size = sizeof(buffer); + if (RegGetValueA(HKEY_LOCAL_MACHINE, "HARDWARE\DEVICEMAP\VIDEO", "\Device\Video0", + RRF_RT_REG_SZ | RRF_ZEROONFAILURE, NULL, buffer, &size)) + goto fail;
- memcpy(key, video_path, sizeof(video_path)); + /* Need to strip "\Registry\Machine" from the value data, which starts with "\Registry\Machine\System..." */ + length = strlen(value_prefix); + if (strncasecmp(buffer, value_prefix, length)) + goto fail;
- if (!GlobalGetAtomNameA(guid_atom, key + strlen(key), 40)) - return FALSE; + substring = buffer + length; + length = strlen(substring); + if (len < length + 1) + goto fail;
- strcat(key, display0); + strcpy(key, substring);
- TRACE("display device key %s\n", wine_dbgstr_a(key)); - return TRUE; + ret = TRUE; + TRACE("primary adapter key %s\n", wine_dbgstr_a(key)); +fail: + if (!ret) + ERR("Failed to get primary adapter registry key\n"); + return ret; }
@@ -108,7 +121,7 @@ static BOOL read_registry_settings(DEVMODEW *dm)
dm->dmFields = 0;
- if (!get_display_device_reg_key(wine_mac_reg_key, sizeof(wine_mac_reg_key))) + if (!get_primary_adapter_key(wine_mac_reg_key, sizeof(wine_mac_reg_key))) return FALSE;
if (RegOpenKeyExA(HKEY_CURRENT_CONFIG, wine_mac_reg_key, 0, KEY_READ, &hkey)) @@ -148,7 +161,7 @@ static BOOL write_registry_settings(const DEVMODEW *dm) HKEY hkey; BOOL ret = TRUE;
- if (!get_display_device_reg_key(wine_mac_reg_key, sizeof(wine_mac_reg_key))) + if (!get_primary_adapter_key(wine_mac_reg_key, sizeof(wine_mac_reg_key))) return FALSE;
if (RegCreateKeyExA(HKEY_CURRENT_CONFIG, wine_mac_reg_key, 0, NULL,
Hi,
While running your changed tests on Windows, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=48827
Your paranoid android.
=== debian9 (64 bit WoW report) ===
user32: input.c:2133: Test failed: expected WM_NCHITTEST message