From: Ken Thomases Subject: [PATCH 1/6] winemac: Make ChangeDisplaySettingsEx() operate on the display named by the devname parameter. Message-Id: <124FF2C1-6931-437F-9D3F-B2629473F2CB@codeweavers.com> Date: Thu, 27 Mar 2014 18:18:28 -0500 It used to ignore devname and always operate on the primary display. --- dlls/winemac.drv/display.c | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/dlls/winemac.drv/display.c b/dlls/winemac.drv/display.c index 2f801f0..5ce419a 100644 --- a/dlls/winemac.drv/display.c +++ b/dlls/winemac.drv/display.c @@ -221,6 +221,16 @@ static int get_default_bpp(void) } +static BOOL is_display_device_name(const WCHAR *devname, int i) +{ + static const WCHAR name_format[] = { '\\','\\','.','\\','D','I','S','P','L','A','Y','%','d',0 }; + WCHAR name[CCHDEVICENAME]; + + snprintfW(name, sizeof(name) / sizeof(WCHAR), name_format, i); + return !strcmpiW(name, devname); +} + + /*********************************************************************** * ChangeDisplaySettingsEx (MACDRV.@) * @@ -233,7 +243,7 @@ LONG CDECL macdrv_ChangeDisplaySettingsEx(LPCWSTR devname, LPDEVMODEW devmode, DEVMODEW dm; BOOL def_mode = TRUE; struct macdrv_display *displays; - int num_displays; + int num_displays, display_index; CFArrayRef display_modes; CFIndex count, i, safe, best; CGDisplayModeRef best_display_mode; @@ -278,7 +288,19 @@ LONG CDECL macdrv_ChangeDisplaySettingsEx(LPCWSTR devname, LPDEVMODEW devmode, if (macdrv_get_displays(&displays, &num_displays)) return DISP_CHANGE_FAILED; - display_modes = CGDisplayCopyAllDisplayModes(displays[0].displayID, NULL); + for (display_index = 0; devname && devname[0] && display_index < num_displays; display_index++) + { + if (is_display_device_name(devname, display_index + 1)) + break; + } + if (display_index >= num_displays) + { + TRACE("no device named %s\n", debugstr_w(devname)); + macdrv_free_displays(displays); + return DISP_CHANGE_BADPARAM; + } + + display_modes = CGDisplayCopyAllDisplayModes(displays[display_index].displayID, NULL); if (!display_modes) { macdrv_free_displays(displays); @@ -383,7 +405,7 @@ better: } else if (flags & (CDS_TEST | CDS_NORESET)) ret = DISP_CHANGE_SUCCESSFUL; - else if (macdrv_set_display_mode(&displays[0], best_display_mode)) + else if (macdrv_set_display_mode(&displays[display_index], best_display_mode)) { int mode_bpp = display_mode_bits_per_pixel(best_display_mode); size_t width = CGDisplayModeGetWidth(best_display_mode);