Split from https://gitlab.winehq.org/wine/wine/-/merge_requests/576 which is getting long and needs some fixing.
-- v3: winemac.drv: Avoid setting DM_POSITION on enumerated modes. wineandroid.drv: Add missing DM_DISPLAYORIENTATION | DM_POSITION flags. win32u: Split EnumDisplaySettingsEx into CurrentDisplaySettings entry. wineandroid.drv: Return early on EnumDisplaySettingsEx error. winemac.drv: Split best display mode lookup to a separate helper. win32u: Ignore DM_POSITION mode fields for available modes.
From: R��mi Bernon rbernon@codeweavers.com
--- dlls/win32u/sysparams.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-)
diff --git a/dlls/win32u/sysparams.c b/dlls/win32u/sysparams.c index 0a453f937c3..7806f2f51a7 100644 --- a/dlls/win32u/sysparams.c +++ b/dlls/win32u/sysparams.c @@ -448,8 +448,11 @@ static BOOL write_adapter_mode( HKEY adapter_key, DWORD index, const DEVMODEW *m set_mode_field( flagsW, dmDisplayFlags, DM_DISPLAYFLAGS ); set_mode_field( orientationW, dmDisplayOrientation, DM_DISPLAYORIENTATION ); set_mode_field( fixed_outputW, dmDisplayFixedOutput, DM_DISPLAYFIXEDOUTPUT ); - set_mode_field( x_panningW, dmPosition.x, DM_POSITION ); - set_mode_field( y_panningW, dmPosition.y, DM_POSITION ); + if (index == ENUM_CURRENT_SETTINGS || index == ENUM_REGISTRY_SETTINGS) + { + set_mode_field( x_panningW, dmPosition.x, DM_POSITION ); + set_mode_field( y_panningW, dmPosition.y, DM_POSITION ); + } ret = set_reg_value( hkey, driver_extraW, REG_BINARY, mode + 1, mode->dmDriverExtra );
#undef set_mode_field @@ -487,8 +490,11 @@ static BOOL read_adapter_mode( HKEY adapter_key, DWORD index, DEVMODEW *mode ) query_mode_field( y_resolutionW, dmPelsHeight, DM_PELSHEIGHT ); query_mode_field( v_refreshW, dmDisplayFrequency, DM_DISPLAYFREQUENCY ); query_mode_field( flagsW, dmDisplayFlags, DM_DISPLAYFLAGS ); - query_mode_field( x_panningW, dmPosition.x, DM_POSITION ); - query_mode_field( y_panningW, dmPosition.y, DM_POSITION ); + if (index == ENUM_CURRENT_SETTINGS || index == ENUM_REGISTRY_SETTINGS) + { + query_mode_field( x_panningW, dmPosition.x, DM_POSITION ); + query_mode_field( y_panningW, dmPosition.y, DM_POSITION ); + } query_mode_field( orientationW, dmDisplayOrientation, DM_DISPLAYORIENTATION ); query_mode_field( fixed_outputW, dmDisplayFixedOutput, 0 );
From: R��mi Bernon rbernon@codeweavers.com
--- dlls/winemac.drv/display.c | 161 +++++++++++++++++++------------------ 1 file changed, 84 insertions(+), 77 deletions(-)
diff --git a/dlls/winemac.drv/display.c b/dlls/winemac.drv/display.c index 1350ffcede9..bc671dc9f1d 100644 --- a/dlls/winemac.drv/display.c +++ b/dlls/winemac.drv/display.c @@ -716,85 +716,14 @@ static BOOL is_detached_mode(const DEVMODEW *mode) mode->dmPelsHeight == 0; }
-/*********************************************************************** - * ChangeDisplaySettingsEx (MACDRV.@) - * - */ -LONG macdrv_ChangeDisplaySettingsEx(LPCWSTR devname, LPDEVMODEW devmode, - HWND hwnd, DWORD flags, LPVOID lpvoid) +static CGDisplayModeRef find_best_display_mode(DEVMODEW *devmode, CFArrayRef display_modes, int bpp, struct display_mode_descriptor *desc) { - WCHAR primary_adapter[CCHDEVICENAME]; - LONG ret = DISP_CHANGE_BADMODE; - DEVMODEW default_mode; - int bpp; - struct macdrv_display *displays; - int num_displays; - CFArrayRef display_modes; - struct display_mode_descriptor* desc; CFIndex count, i, best; CGDisplayModeRef best_display_mode; uint32_t best_io_flags; - BOOL best_is_original; - - TRACE("%s %p %p 0x%08x %p\n", debugstr_w(devname), devmode, hwnd, flags, lpvoid); - - init_original_display_mode(); - - if (!get_primary_adapter(primary_adapter)) - return DISP_CHANGE_FAILED; - - if (!devname && !devmode) - { - UNICODE_STRING str; - memset(&default_mode, 0, sizeof(default_mode)); - default_mode.dmSize = sizeof(default_mode); - RtlInitUnicodeString(&str, primary_adapter); - if (!NtUserEnumDisplaySettings(&str, ENUM_REGISTRY_SETTINGS, &default_mode, 0)) - { - ERR("Default mode not found for %s!\n", wine_dbgstr_w(primary_adapter)); - return DISP_CHANGE_BADMODE; - } - - devname = primary_adapter; - devmode = &default_mode; - } - - if (is_detached_mode(devmode)) - { - FIXME("Detaching adapters is currently unsupported.\n"); - return DISP_CHANGE_SUCCESSFUL; - } - - if (macdrv_get_displays(&displays, &num_displays)) - return DISP_CHANGE_FAILED; - - display_modes = copy_display_modes(displays[0].displayID, FALSE); - if (!display_modes) - { - macdrv_free_displays(displays); - return DISP_CHANGE_FAILED; - } - - pthread_mutex_lock(&modes_mutex); - bpp = get_default_bpp(); - pthread_mutex_unlock(&modes_mutex); - if ((devmode->dmFields & DM_BITSPERPEL) && devmode->dmBitsPerPel != bpp) - TRACE("using default %d bpp instead of caller's request %d bpp\n", bpp, devmode->dmBitsPerPel); - - TRACE("looking for %dx%dx%dbpp @%d Hz", - (devmode->dmFields & DM_PELSWIDTH ? devmode->dmPelsWidth : 0), - (devmode->dmFields & DM_PELSHEIGHT ? devmode->dmPelsHeight : 0), - bpp, - (devmode->dmFields & DM_DISPLAYFREQUENCY ? devmode->dmDisplayFrequency : 0)); - if (devmode->dmFields & DM_DISPLAYFIXEDOUTPUT) - TRACE(" %sstretched", devmode->dmDisplayFixedOutput == DMDFO_STRETCH ? "" : "un"); - if (devmode->dmFields & DM_DISPLAYFLAGS) - TRACE(" %sinterlaced", devmode->dmDisplayFlags & DM_INTERLACED ? "" : "non-"); - TRACE("\n"); - - desc = create_original_display_mode_descriptor(displays[0].displayID);
best_display_mode = NULL; + count = CFArrayGetCount(display_modes); for (i = 0; i < count; i++) { @@ -866,14 +795,92 @@ better: best_display_mode = display_mode; best = i; best_io_flags = io_flags; - best_is_original = is_original; }
if (best_display_mode) - { - /* we have a valid mode */ TRACE("Requested display settings match mode %ld\n", best);
+ return best_display_mode; +} + +/*********************************************************************** + * ChangeDisplaySettingsEx (MACDRV.@) + * + */ +LONG macdrv_ChangeDisplaySettingsEx(LPCWSTR devname, LPDEVMODEW devmode, + HWND hwnd, DWORD flags, LPVOID lpvoid) +{ + WCHAR primary_adapter[CCHDEVICENAME]; + LONG ret = DISP_CHANGE_BADMODE; + DEVMODEW default_mode; + int bpp; + struct macdrv_display *displays; + int num_displays; + CFArrayRef display_modes; + struct display_mode_descriptor *desc; + CGDisplayModeRef best_display_mode; + + TRACE("%s %p %p 0x%08x %p\n", debugstr_w(devname), devmode, hwnd, flags, lpvoid); + + init_original_display_mode(); + + if (!get_primary_adapter(primary_adapter)) + return DISP_CHANGE_FAILED; + + if (!devname && !devmode) + { + UNICODE_STRING str; + memset(&default_mode, 0, sizeof(default_mode)); + default_mode.dmSize = sizeof(default_mode); + RtlInitUnicodeString(&str, primary_adapter); + if (!NtUserEnumDisplaySettings(&str, ENUM_REGISTRY_SETTINGS, &default_mode, 0)) + { + ERR("Default mode not found for %s!\n", wine_dbgstr_w(primary_adapter)); + return DISP_CHANGE_BADMODE; + } + + devname = primary_adapter; + devmode = &default_mode; + } + + if (is_detached_mode(devmode)) + { + FIXME("Detaching adapters is currently unsupported.\n"); + return DISP_CHANGE_SUCCESSFUL; + } + + if (macdrv_get_displays(&displays, &num_displays)) + return DISP_CHANGE_FAILED; + + display_modes = copy_display_modes(displays[0].displayID, FALSE); + if (!display_modes) + { + macdrv_free_displays(displays); + return DISP_CHANGE_FAILED; + } + + pthread_mutex_lock(&modes_mutex); + bpp = get_default_bpp(); + pthread_mutex_unlock(&modes_mutex); + if ((devmode->dmFields & DM_BITSPERPEL) && devmode->dmBitsPerPel != bpp) + TRACE("using default %d bpp instead of caller's request %d bpp\n", bpp, devmode->dmBitsPerPel); + + TRACE("looking for %dx%dx%dbpp @%d Hz", + (devmode->dmFields & DM_PELSWIDTH ? devmode->dmPelsWidth : 0), + (devmode->dmFields & DM_PELSHEIGHT ? devmode->dmPelsHeight : 0), + bpp, + (devmode->dmFields & DM_DISPLAYFREQUENCY ? devmode->dmDisplayFrequency : 0)); + if (devmode->dmFields & DM_DISPLAYFIXEDOUTPUT) + TRACE(" %sstretched", devmode->dmDisplayFixedOutput == DMDFO_STRETCH ? "" : "un"); + if (devmode->dmFields & DM_DISPLAYFLAGS) + TRACE(" %sinterlaced", devmode->dmDisplayFlags & DM_INTERLACED ? "" : "non-"); + TRACE("\n"); + + desc = create_original_display_mode_descriptor(displays[0].displayID); + best_display_mode = find_best_display_mode(devmode, display_modes, bpp, desc); + + if (best_display_mode) + { if (flags & (CDS_TEST | CDS_NORESET)) ret = DISP_CHANGE_SUCCESSFUL; else if (wcsicmp(primary_adapter, devname)) { @@ -888,7 +895,7 @@ better:
macdrv_init_display_devices(TRUE);
- if (best_is_original && retina_enabled) + if (retina_enabled && display_mode_matches_descriptor(best_display_mode, desc)) { width *= 2; height *= 2;
From: R��mi Bernon rbernon@codeweavers.com
--- dlls/wineandroid.drv/init.c | 34 ++++++++++++++++------------------ 1 file changed, 16 insertions(+), 18 deletions(-)
diff --git a/dlls/wineandroid.drv/init.c b/dlls/wineandroid.drv/init.c index 04328346852..f6c8eec8c34 100644 --- a/dlls/wineandroid.drv/init.c +++ b/dlls/wineandroid.drv/init.c @@ -309,29 +309,27 @@ BOOL ANDROID_UpdateDisplayDevices( const struct gdi_device_manager *device_manag */ BOOL ANDROID_EnumDisplaySettingsEx( LPCWSTR name, DWORD n, LPDEVMODEW devmode, DWORD flags ) { + if (n > 0 && n != ENUM_CURRENT_SETTINGS) + { + TRACE( "mode %d -- not present\n", n ); + SetLastError( ERROR_NO_MORE_FILES ); + return FALSE; + } + devmode->u2.dmDisplayFlags = 0; - devmode->dmDisplayFrequency = 0; devmode->u1.s2.dmPosition.x = 0; devmode->u1.s2.dmPosition.y = 0; devmode->u1.s2.dmDisplayOrientation = 0; devmode->u1.s2.dmDisplayFixedOutput = 0; - - if (n == ENUM_CURRENT_SETTINGS) n = 0; - if (n == 0) - { - devmode->dmPelsWidth = screen_width; - devmode->dmPelsHeight = screen_height; - devmode->dmBitsPerPel = screen_bpp; - devmode->dmDisplayFrequency = 60; - devmode->dmFields = DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL | DM_DISPLAYFLAGS | DM_DISPLAYFREQUENCY; - TRACE( "mode %d -- %dx%d %d bpp @%d Hz\n", n, - devmode->dmPelsWidth, devmode->dmPelsHeight, - devmode->dmBitsPerPel, devmode->dmDisplayFrequency ); - return TRUE; - } - TRACE( "mode %d -- not present\n", n ); - SetLastError( ERROR_NO_MORE_FILES ); - return FALSE; + devmode->dmPelsWidth = screen_width; + devmode->dmPelsHeight = screen_height; + devmode->dmBitsPerPel = screen_bpp; + devmode->dmDisplayFrequency = 60; + devmode->dmFields = DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL | DM_DISPLAYFLAGS | DM_DISPLAYFREQUENCY; + TRACE( "mode %d -- %dx%d %d bpp @%d Hz\n", n, + devmode->dmPelsWidth, devmode->dmPelsHeight, + devmode->dmBitsPerPel, devmode->dmDisplayFrequency ); + return TRUE; }
From: R��mi Bernon rbernon@codeweavers.com
--- dlls/win32u/driver.c | 12 +++ dlls/win32u/sysparams.c | 3 +- dlls/wineandroid.drv/init.c | 25 ++++- dlls/winemac.drv/display.c | 183 ++++++++++++++++++++++-------------- dlls/winemac.drv/gdi.c | 1 + dlls/winemac.drv/macdrv.h | 1 + dlls/winex11.drv/display.c | 33 ++++--- dlls/winex11.drv/init.c | 1 + dlls/winex11.drv/x11drv.h | 1 + include/wine/gdi_driver.h | 1 + 10 files changed, 176 insertions(+), 85 deletions(-)
diff --git a/dlls/win32u/driver.c b/dlls/win32u/driver.c index 3d29453c2bf..1d8707fe5ba 100644 --- a/dlls/win32u/driver.c +++ b/dlls/win32u/driver.c @@ -759,6 +759,11 @@ static LONG nulldrv_ChangeDisplaySettingsEx( LPCWSTR name, LPDEVMODEW mode, HWND return DISP_CHANGE_FAILED; }
+static BOOL nulldrv_GetCurrentDisplaySettings( LPCWSTR name, LPDEVMODEW mode ) +{ + return FALSE; +} + static BOOL nulldrv_EnumDisplaySettingsEx( LPCWSTR name, DWORD num, LPDEVMODEW mode, DWORD flags ) { return FALSE; @@ -1072,6 +1077,11 @@ static LONG loaderdrv_ChangeDisplaySettingsEx( LPCWSTR name, LPDEVMODEW mode, HW return load_driver()->pChangeDisplaySettingsEx( name, mode, hwnd, flags, lparam ); }
+static BOOL loaderdrv_GetCurrentDisplaySettings( LPCWSTR name, LPDEVMODEW mode ) +{ + return load_driver()->pGetCurrentDisplaySettings( name, mode ); +} + static BOOL loaderdrv_EnumDisplaySettingsEx( LPCWSTR name, DWORD num, LPDEVMODEW mode, DWORD flags ) { return load_driver()->pEnumDisplaySettingsEx( name, num, mode, flags ); @@ -1178,6 +1188,7 @@ static const struct user_driver_funcs lazy_load_driver = loaderdrv_UpdateClipboard, /* display modes */ loaderdrv_ChangeDisplaySettingsEx, + loaderdrv_GetCurrentDisplaySettings, loaderdrv_EnumDisplaySettingsEx, loaderdrv_UpdateDisplayDevices, /* windowing functions */ @@ -1253,6 +1264,7 @@ void __wine_set_user_driver( const struct user_driver_funcs *funcs, UINT version SET_USER_FUNC(ClipboardWindowProc); SET_USER_FUNC(UpdateClipboard); SET_USER_FUNC(ChangeDisplaySettingsEx); + SET_USER_FUNC(GetCurrentDisplaySettings); SET_USER_FUNC(EnumDisplaySettingsEx); SET_USER_FUNC(UpdateDisplayDevices); SET_USER_FUNC(CreateDesktopWindow); diff --git a/dlls/win32u/sysparams.c b/dlls/win32u/sysparams.c index 7806f2f51a7..3518dabf11f 100644 --- a/dlls/win32u/sysparams.c +++ b/dlls/win32u/sysparams.c @@ -2155,7 +2155,8 @@ BOOL WINAPI NtUserEnumDisplaySettings( UNICODE_STRING *device, DWORD index, DEVM memset( &devmode->dmDriverExtra, 0, devmode->dmSize - offsetof(DEVMODEW, dmDriverExtra) );
if (index == ENUM_REGISTRY_SETTINGS) ret = read_registry_settings( adapter_path, devmode ); - else ret = user_driver->pEnumDisplaySettingsEx( device_name, index, devmode, flags ); + else if (index != ENUM_CURRENT_SETTINGS) ret = user_driver->pEnumDisplaySettingsEx( device_name, index, devmode, flags ); + else ret = user_driver->pGetCurrentDisplaySettings( device_name, devmode );
if (!ret) WARN( "Failed to query %s display settings.\n", debugstr_w(device_name) ); else TRACE( "position %dx%d, resolution %ux%u, frequency %u, depth %u, orientation %#x.\n", diff --git a/dlls/wineandroid.drv/init.c b/dlls/wineandroid.drv/init.c index f6c8eec8c34..6f88d0bc0b2 100644 --- a/dlls/wineandroid.drv/init.c +++ b/dlls/wineandroid.drv/init.c @@ -304,12 +304,34 @@ BOOL ANDROID_UpdateDisplayDevices( const struct gdi_device_manager *device_manag }
+/*********************************************************************** + * ANDROID_GetCurrentDisplaySettings + */ +BOOL ANDROID_GetCurrentDisplaySettings( LPCWSTR name, LPDEVMODEW devmode ) +{ + devmode->u2.dmDisplayFlags = 0; + devmode->u1.s2.dmPosition.x = 0; + devmode->u1.s2.dmPosition.y = 0; + devmode->u1.s2.dmDisplayOrientation = 0; + devmode->u1.s2.dmDisplayFixedOutput = 0; + devmode->dmPelsWidth = screen_width; + devmode->dmPelsHeight = screen_height; + devmode->dmBitsPerPel = screen_bpp; + devmode->dmDisplayFrequency = 60; + devmode->dmFields = DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL | DM_DISPLAYFLAGS | DM_DISPLAYFREQUENCY; + TRACE( "current mode -- %dx%d %d bpp @%d Hz\n", + devmode->dmPelsWidth, devmode->dmPelsHeight, + devmode->dmBitsPerPel, devmode->dmDisplayFrequency ); + return TRUE; +} + + /*********************************************************************** * ANDROID_EnumDisplaySettingsEx */ BOOL ANDROID_EnumDisplaySettingsEx( LPCWSTR name, DWORD n, LPDEVMODEW devmode, DWORD flags ) { - if (n > 0 && n != ENUM_CURRENT_SETTINGS) + if (n > 0) { TRACE( "mode %d -- not present\n", n ); SetLastError( ERROR_NO_MORE_FILES ); @@ -354,6 +376,7 @@ static const struct user_driver_funcs android_drv_funcs = .pVkKeyScanEx = ANDROID_VkKeyScanEx, .pSetCursor = ANDROID_SetCursor, .pChangeDisplaySettingsEx = ANDROID_ChangeDisplaySettingsEx, + .pGetCurrentDisplaySettings = ANDROID_GetCurrentDisplaySettings, .pEnumDisplaySettingsEx = ANDROID_EnumDisplaySettingsEx, .pUpdateDisplayDevices = ANDROID_UpdateDisplayDevices, .pCreateWindow = ANDROID_CreateWindow, diff --git a/dlls/winemac.drv/display.c b/dlls/winemac.drv/display.c index bc671dc9f1d..427701c1c7d 100644 --- a/dlls/winemac.drv/display.c +++ b/dlls/winemac.drv/display.c @@ -992,17 +992,71 @@ static DEVMODEW *display_get_modes(CGDirectDisplayID display_id, int *modes_coun return devmodes; }
+/*********************************************************************** + * GetCurrentDisplaySettings (MACDRV.@) + * + */ +BOOL macdrv_GetCurrentDisplaySettings(LPCWSTR devname, LPDEVMODEW devmode) +{ + struct macdrv_display *displays = NULL; + int num_displays; + CGDisplayModeRef display_mode; + + TRACE("%s, %p + %hu\n", debugstr_w(devname), devmode, devmode->dmSize); + + init_original_display_mode(); + + if (macdrv_get_displays(&displays, &num_displays)) + return FALSE; + + display_mode = CGDisplayCopyDisplayMode(displays[0].displayID); + + /* We currently only report modes for the primary display, so it's at (0, 0). */ + devmode->dmPosition.x = 0; + devmode->dmPosition.y = 0; + devmode->dmFields |= DM_POSITION; + + display_mode_to_devmode(displays[0].displayID, display_mode, devmode); + if (retina_enabled) + { + struct display_mode_descriptor *desc = create_original_display_mode_descriptor(displays[0].displayID); + if (display_mode_matches_descriptor(display_mode, desc)) + { + devmode->dmPelsWidth *= 2; + devmode->dmPelsHeight *= 2; + } + free_display_mode_descriptor(desc); + } + + CFRelease(display_mode); + macdrv_free_displays(displays); + + TRACE("current mode -- %dx%dx%dbpp @%d Hz", + devmode->dmPelsWidth, devmode->dmPelsHeight, devmode->dmBitsPerPel, + devmode->dmDisplayFrequency); + if (devmode->dmDisplayOrientation) + TRACE(" rotated %u degrees", devmode->dmDisplayOrientation * 90); + if (devmode->dmDisplayFixedOutput == DMDFO_STRETCH) + TRACE(" stretched"); + if (devmode->dmDisplayFlags & DM_INTERLACED) + TRACE(" interlaced"); + TRACE("\n"); + + return TRUE; +} + /*********************************************************************** * EnumDisplaySettingsEx (MACDRV.@) * */ -BOOL macdrv_EnumDisplaySettingsEx(LPCWSTR devname, DWORD mode, DEVMODEW *devmode, DWORD flags) +BOOL macdrv_EnumDisplaySettingsEx(LPCWSTR devname, DWORD mode, LPDEVMODEW devmode, DWORD flags) { struct macdrv_display *displays = NULL; int num_displays; CGDisplayModeRef display_mode; int display_mode_bpp; BOOL synthesized = FALSE; + DWORD count, i;
TRACE("%s, %u, %p + %hu, %08x\n", debugstr_w(devname), mode, devmode, devmode->dmSize, flags);
@@ -1011,99 +1065,88 @@ BOOL macdrv_EnumDisplaySettingsEx(LPCWSTR devname, DWORD mode, DEVMODEW *devmode if (macdrv_get_displays(&displays, &num_displays)) goto failed;
- if (mode == ENUM_CURRENT_SETTINGS) - { - TRACE("mode %d (current) -- getting current mode\n", mode); - display_mode = CGDisplayCopyDisplayMode(displays[0].displayID); - display_mode_bpp = display_mode_bits_per_pixel(display_mode); - } - else - { - DWORD count, i; + pthread_mutex_lock(&modes_mutex);
- pthread_mutex_lock(&modes_mutex); + if (mode == 0 || !modes) + { + if (modes) CFRelease(modes); + modes = copy_display_modes(displays[0].displayID, (flags & EDS_RAWMODE) != 0); + modes_has_8bpp = modes_has_16bpp = FALSE;
- if (mode == 0 || !modes) + if (modes) { - if (modes) CFRelease(modes); - modes = copy_display_modes(displays[0].displayID, (flags & EDS_RAWMODE) != 0); - modes_has_8bpp = modes_has_16bpp = FALSE; - - if (modes) + count = CFArrayGetCount(modes); + for (i = 0; i < count && !(modes_has_8bpp && modes_has_16bpp); i++) { - count = CFArrayGetCount(modes); - for (i = 0; i < count && !(modes_has_8bpp && modes_has_16bpp); i++) - { - CGDisplayModeRef mode = (CGDisplayModeRef)CFArrayGetValueAtIndex(modes, i); - int bpp = display_mode_bits_per_pixel(mode); - if (bpp == 8) - modes_has_8bpp = TRUE; - else if (bpp == 16) - modes_has_16bpp = TRUE; - } + CGDisplayModeRef mode = (CGDisplayModeRef)CFArrayGetValueAtIndex(modes, i); + int bpp = display_mode_bits_per_pixel(mode); + if (bpp == 8) + modes_has_8bpp = TRUE; + else if (bpp == 16) + modes_has_16bpp = TRUE; } } + }
- display_mode = NULL; - if (modes) + display_mode = NULL; + if (modes) + { + int default_bpp; + DWORD seen_modes = 0; + + count = CFArrayGetCount(modes); + for (i = 0; i < count; i++) { - int default_bpp; - DWORD seen_modes = 0; + CGDisplayModeRef candidate = (CGDisplayModeRef)CFArrayGetValueAtIndex(modes, i);
- count = CFArrayGetCount(modes); - for (i = 0; i < count; i++) + seen_modes++; + if (seen_modes > mode) { - CGDisplayModeRef candidate = (CGDisplayModeRef)CFArrayGetValueAtIndex(modes, i); - - seen_modes++; - if (seen_modes > mode) - { - display_mode = (CGDisplayModeRef)CFRetain(candidate); - display_mode_bpp = display_mode_bits_per_pixel(display_mode); - break; - } + display_mode = (CGDisplayModeRef)CFRetain(candidate); + display_mode_bpp = display_mode_bits_per_pixel(display_mode); + break; } + }
- default_bpp = get_default_bpp(); + default_bpp = get_default_bpp();
- /* If all the real modes are exhausted, synthesize lower bpp modes. */ - if (!display_mode && (!modes_has_16bpp || !modes_has_8bpp)) + /* If all the real modes are exhausted, synthesize lower bpp modes. */ + if (!display_mode && (!modes_has_16bpp || !modes_has_8bpp)) + { + /* We want to synthesize higher depths first. */ + int synth_bpps[] = { modes_has_16bpp ? 0 : 16, modes_has_8bpp ? 0 : 8 }; + size_t synth_bpp_idx; + for (synth_bpp_idx = 0; synth_bpp_idx < 2; synth_bpp_idx++) { - /* We want to synthesize higher depths first. */ - int synth_bpps[] = { modes_has_16bpp ? 0 : 16, modes_has_8bpp ? 0 : 8 }; - size_t synth_bpp_idx; - for (synth_bpp_idx = 0; synth_bpp_idx < 2; synth_bpp_idx++) + int synth_bpp = synth_bpps[synth_bpp_idx]; + if (synth_bpp == 0) + continue; + + for (i = 0; i < count; i++) { - int synth_bpp = synth_bpps[synth_bpp_idx]; - if (synth_bpp == 0) + CGDisplayModeRef candidate = (CGDisplayModeRef)CFArrayGetValueAtIndex(modes, i); + /* We only synthesize modes from those having the default bpp. */ + if (display_mode_bits_per_pixel(candidate) != default_bpp) continue;
- for (i = 0; i < count; i++) + seen_modes++; + if (seen_modes > mode) { - CGDisplayModeRef candidate = (CGDisplayModeRef)CFArrayGetValueAtIndex(modes, i); - /* We only synthesize modes from those having the default bpp. */ - if (display_mode_bits_per_pixel(candidate) != default_bpp) - continue; - - seen_modes++; - if (seen_modes > mode) - { - display_mode = (CGDisplayModeRef)CFRetain(candidate); - display_mode_bpp = synth_bpp; - synthesized = TRUE; - break; - } - } - - if (display_mode) + display_mode = (CGDisplayModeRef)CFRetain(candidate); + display_mode_bpp = synth_bpp; + synthesized = TRUE; break; + } } + + if (display_mode) + break; } } - - pthread_mutex_unlock(&modes_mutex); }
+ pthread_mutex_unlock(&modes_mutex); + if (!display_mode) goto failed;
diff --git a/dlls/winemac.drv/gdi.c b/dlls/winemac.drv/gdi.c index 7114835677b..11d8ad37707 100644 --- a/dlls/winemac.drv/gdi.c +++ b/dlls/winemac.drv/gdi.c @@ -275,6 +275,7 @@ static const struct user_driver_funcs macdrv_funcs = .pDesktopWindowProc = macdrv_DesktopWindowProc, .pDestroyCursorIcon = macdrv_DestroyCursorIcon, .pDestroyWindow = macdrv_DestroyWindow, + .pGetCurrentDisplaySettings = macdrv_GetCurrentDisplaySettings, .pEnumDisplaySettingsEx = macdrv_EnumDisplaySettingsEx, .pUpdateDisplayDevices = macdrv_UpdateDisplayDevices, .pGetCursorPos = macdrv_GetCursorPos, diff --git a/dlls/winemac.drv/macdrv.h b/dlls/winemac.drv/macdrv.h index 7cb1665a8fc..0e5822b0a2e 100644 --- a/dlls/winemac.drv/macdrv.h +++ b/dlls/winemac.drv/macdrv.h @@ -125,6 +125,7 @@ extern BOOL macdrv_ActivateKeyboardLayout(HKL hkl, UINT flags) DECLSPEC_HIDDEN; extern void macdrv_Beep(void) DECLSPEC_HIDDEN; extern LONG macdrv_ChangeDisplaySettingsEx(LPCWSTR devname, LPDEVMODEW devmode, HWND hwnd, DWORD flags, LPVOID lpvoid) DECLSPEC_HIDDEN; +extern BOOL macdrv_GetCurrentDisplaySettings(LPCWSTR name, LPDEVMODEW devmode) DECLSPEC_HIDDEN; extern BOOL macdrv_EnumDisplaySettingsEx(LPCWSTR devname, DWORD mode, LPDEVMODEW devmode, DWORD flags) DECLSPEC_HIDDEN; extern LRESULT macdrv_ClipboardWindowProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) DECLSPEC_HIDDEN; diff --git a/dlls/winex11.drv/display.c b/dlls/winex11.drv/display.c index 0af9ceeac08..590107685a3 100644 --- a/dlls/winex11.drv/display.c +++ b/dlls/winex11.drv/display.c @@ -316,6 +316,26 @@ static DWORD get_display_depth(ULONG_PTR display_id) return screen_bpp; }
+/*********************************************************************** + * GetCurrentDisplaySettings (X11DRV.@) + * + */ +BOOL X11DRV_GetCurrentDisplaySettings( LPCWSTR name, LPDEVMODEW devmode ) +{ + DEVMODEW mode; + ULONG_PTR id; + + if (!settings_handler.get_id( name, &id ) || !settings_handler.get_current_mode( id, &mode )) + { + ERR("Failed to get %s current display settings.\n", wine_dbgstr_w(name)); + return FALSE; + } + + memcpy( &devmode->dmFields, &mode.dmFields, devmode->dmSize - offsetof(DEVMODEW, dmFields) ); + if (!is_detached_mode( devmode )) devmode->dmBitsPerPel = get_display_depth( id ); + return TRUE; +} + /*********************************************************************** * EnumDisplaySettingsEx (X11DRV.@) * @@ -326,19 +346,6 @@ BOOL X11DRV_EnumDisplaySettingsEx( LPCWSTR name, DWORD n, LPDEVMODEW devmode, DW UINT mode_count; ULONG_PTR id;
- if (n == ENUM_CURRENT_SETTINGS) - { - if (!settings_handler.get_id( name, &id ) || !settings_handler.get_current_mode( id, &mode )) - { - ERR("Failed to get %s current display settings.\n", wine_dbgstr_w(name)); - return FALSE; - } - - memcpy( &devmode->dmFields, &mode.dmFields, devmode->dmSize - offsetof(DEVMODEW, dmFields) ); - if (!is_detached_mode( devmode )) devmode->dmBitsPerPel = get_display_depth( id ); - return TRUE; - } - pthread_mutex_lock( &settings_mutex ); if (n == 0 || wcsicmp(cached_device_name, name) || cached_flags != flags) { diff --git a/dlls/winex11.drv/init.c b/dlls/winex11.drv/init.c index 7c5a1acd7b6..435330fe21a 100644 --- a/dlls/winex11.drv/init.c +++ b/dlls/winex11.drv/init.c @@ -404,6 +404,7 @@ static const struct user_driver_funcs x11drv_funcs = .pSetCursorPos = X11DRV_SetCursorPos, .pClipCursor = X11DRV_ClipCursor, .pChangeDisplaySettingsEx = X11DRV_ChangeDisplaySettingsEx, + .pGetCurrentDisplaySettings = X11DRV_GetCurrentDisplaySettings, .pEnumDisplaySettingsEx = X11DRV_EnumDisplaySettingsEx, .pUpdateDisplayDevices = X11DRV_UpdateDisplayDevices, .pCreateDesktopWindow = X11DRV_CreateDesktopWindow, diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h index b8997455324..7d58b85589c 100644 --- a/dlls/winex11.drv/x11drv.h +++ b/dlls/winex11.drv/x11drv.h @@ -215,6 +215,7 @@ extern BOOL X11DRV_GetCursorPos( LPPOINT pos ) DECLSPEC_HIDDEN; extern BOOL X11DRV_ClipCursor( LPCRECT clip ) DECLSPEC_HIDDEN; extern LONG X11DRV_ChangeDisplaySettingsEx( LPCWSTR devname, LPDEVMODEW devmode, HWND hwnd, DWORD flags, LPVOID lpvoid ) DECLSPEC_HIDDEN; +extern BOOL X11DRV_GetCurrentDisplaySettings( LPCWSTR name, LPDEVMODEW devmode ) DECLSPEC_HIDDEN; extern BOOL X11DRV_EnumDisplaySettingsEx( LPCWSTR name, DWORD n, LPDEVMODEW devmode, DWORD flags ) DECLSPEC_HIDDEN; extern BOOL X11DRV_UpdateDisplayDevices( const struct gdi_device_manager *device_manager, diff --git a/include/wine/gdi_driver.h b/include/wine/gdi_driver.h index 58b6aa9f0b8..1c024a751bd 100644 --- a/include/wine/gdi_driver.h +++ b/include/wine/gdi_driver.h @@ -296,6 +296,7 @@ struct user_driver_funcs void (*pUpdateClipboard)(void); /* display modes */ LONG (*pChangeDisplaySettingsEx)(LPCWSTR,LPDEVMODEW,HWND,DWORD,LPVOID); + BOOL (*pGetCurrentDisplaySettings)(LPCWSTR,LPDEVMODEW); BOOL (*pEnumDisplaySettingsEx)(LPCWSTR,DWORD,LPDEVMODEW,DWORD); BOOL (*pUpdateDisplayDevices)(const struct gdi_device_manager *,BOOL,void*); /* windowing functions */
From: R��mi Bernon rbernon@codeweavers.com
--- dlls/wineandroid.drv/init.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/dlls/wineandroid.drv/init.c b/dlls/wineandroid.drv/init.c index 6f88d0bc0b2..0945f5ff4e1 100644 --- a/dlls/wineandroid.drv/init.c +++ b/dlls/wineandroid.drv/init.c @@ -318,7 +318,8 @@ BOOL ANDROID_GetCurrentDisplaySettings( LPCWSTR name, LPDEVMODEW devmode ) devmode->dmPelsHeight = screen_height; devmode->dmBitsPerPel = screen_bpp; devmode->dmDisplayFrequency = 60; - devmode->dmFields = DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL | DM_DISPLAYFLAGS | DM_DISPLAYFREQUENCY; + devmode->dmFields = DM_POSITION | DM_DISPLAYORIENTATION | DM_PELSWIDTH | DM_PELSHEIGHT | + DM_BITSPERPEL | DM_DISPLAYFLAGS | DM_DISPLAYFREQUENCY; TRACE( "current mode -- %dx%d %d bpp @%d Hz\n", devmode->dmPelsWidth, devmode->dmPelsHeight, devmode->dmBitsPerPel, devmode->dmDisplayFrequency ); @@ -347,7 +348,8 @@ BOOL ANDROID_EnumDisplaySettingsEx( LPCWSTR name, DWORD n, LPDEVMODEW devmode, D devmode->dmPelsHeight = screen_height; devmode->dmBitsPerPel = screen_bpp; devmode->dmDisplayFrequency = 60; - devmode->dmFields = DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL | DM_DISPLAYFLAGS | DM_DISPLAYFREQUENCY; + devmode->dmFields = DM_DISPLAYORIENTATION | DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL | + DM_DISPLAYFLAGS | DM_DISPLAYFREQUENCY; TRACE( "mode %d -- %dx%d %d bpp @%d Hz\n", n, devmode->dmPelsWidth, devmode->dmPelsHeight, devmode->dmBitsPerPel, devmode->dmDisplayFrequency );
From: R��mi Bernon rbernon@codeweavers.com
--- dlls/winemac.drv/display.c | 5 ----- 1 file changed, 5 deletions(-)
diff --git a/dlls/winemac.drv/display.c b/dlls/winemac.drv/display.c index 427701c1c7d..61df93d4654 100644 --- a/dlls/winemac.drv/display.c +++ b/dlls/winemac.drv/display.c @@ -1150,11 +1150,6 @@ BOOL macdrv_EnumDisplaySettingsEx(LPCWSTR devname, DWORD mode, LPDEVMODEW devmod if (!display_mode) goto failed;
- /* We currently only report modes for the primary display, so it's at (0, 0). */ - devmode->dmPosition.x = 0; - devmode->dmPosition.y = 0; - devmode->dmFields |= DM_POSITION; - display_mode_to_devmode(displays[0].displayID, display_mode, devmode); devmode->dmBitsPerPel = display_mode_bpp; if (devmode->dmBitsPerPel)
Huw Davies (@huw) commented about include/wine/gdi_driver.h:
void (*pUpdateClipboard)(void); /* display modes */ LONG (*pChangeDisplaySettingsEx)(LPCWSTR,LPDEVMODEW,HWND,DWORD,LPVOID);
- BOOL (*pGetCurrentDisplaySettings)(LPCWSTR,LPDEVMODEW); BOOL (*pEnumDisplaySettingsEx)(LPCWSTR,DWORD,LPDEVMODEW,DWORD); BOOL (*pUpdateDisplayDevices)(const struct gdi_device_manager *,BOOL,void*);
I know we're not consistent about this, but could we keep the `display modes` functions in alphabetical order?
This merge request was approved by Zhiyi Zhang.