From: R��mi Bernon rbernon@codeweavers.com
--- dlls/winemac.drv/display.c | 35 +++++++++++++++++++++++++++-------- 1 file changed, 27 insertions(+), 8 deletions(-)
diff --git a/dlls/winemac.drv/display.c b/dlls/winemac.drv/display.c index 2034c8b21b4..e451de21e4b 100644 --- a/dlls/winemac.drv/display.c +++ b/dlls/winemac.drv/display.c @@ -1142,8 +1142,10 @@ failed: BOOL macdrv_GetCurrentDisplaySettings(LPCWSTR devname, LPDEVMODEW devmode) { struct macdrv_display *displays = NULL; - int num_displays; + int i, num_displays, display_idx, min_x, min_y; CGDisplayModeRef display_mode; + CGDirectDisplayID display_id; + WCHAR *end;
TRACE("%s, %p + %hu\n", debugstr_w(devname), devmode, devmode->dmSize);
@@ -1152,17 +1154,33 @@ BOOL macdrv_GetCurrentDisplaySettings(LPCWSTR devname, LPDEVMODEW devmode) if (macdrv_get_displays(&displays, &num_displays)) return FALSE;
- display_mode = CGDisplayCopyDisplayMode(displays[0].displayID); + display_idx = wcstol(devname + 11, &end, 10) - 1; + if (display_idx >= num_displays) + { + macdrv_free_displays(displays); + return FALSE; + }
- /* We currently only report modes for the primary display, so it's at (0, 0). */ - devmode->dmPosition.x = 0; - devmode->dmPosition.y = 0; + display_id = displays[display_idx].displayID; + display_mode = CGDisplayCopyDisplayMode(display_id); + + devmode->dmPosition.x = min_x = CGRectGetMinX(displays[display_idx].frame); + devmode->dmPosition.y = min_y = CGRectGetMinY(displays[display_idx].frame); + for (i = 0; i < num_displays; ++i) + { + if (min_x > CGRectGetMinX(displays[i].frame)) + min_x = CGRectGetMinX(displays[i].frame); + if (min_y > CGRectGetMinY(displays[i].frame)) + min_y = CGRectGetMinY(displays[i].frame); + } + devmode->dmPosition.x -= min_x; + devmode->dmPosition.y -= min_y; devmode->dmFields |= DM_POSITION;
- display_mode_to_devmode(displays[0].displayID, display_mode, devmode); + display_mode_to_devmode(display_id, display_mode, devmode); if (retina_enabled) { - struct display_mode_descriptor *desc = create_original_display_mode_descriptor(displays[0].displayID); + struct display_mode_descriptor *desc = create_original_display_mode_descriptor(display_id); if (display_mode_matches_descriptor(display_mode, desc)) { devmode->dmPelsWidth *= 2; @@ -1174,7 +1192,8 @@ BOOL macdrv_GetCurrentDisplaySettings(LPCWSTR devname, LPDEVMODEW devmode) CFRelease(display_mode); macdrv_free_displays(displays);
- TRACE("current mode -- %dx%dx%dbpp @%d Hz", + TRACE("current mode -- %dx%d-%dx%dx%dbpp @%d Hz", + devmode->dmPosition.x, devmode->dmPosition.y, devmode->dmPelsWidth, devmode->dmPelsHeight, devmode->dmBitsPerPel, devmode->dmDisplayFrequency); if (devmode->dmDisplayOrientation)