Rémi Bernon : winemac.drv: Split best display mode lookup to a separate helper.
Alexandre Julliard
julliard at winehq.org
Mon Aug 8 15:17:50 CDT 2022
Module: wine
Branch: master
Commit: 7b376555da097e6d4f244b5da08c89df368f50c7
URL: https://gitlab.winehq.org/wine/wine/-/commit/7b376555da097e6d4f244b5da08c89df368f50c7
Author: Rémi Bernon <rbernon at codeweavers.com>
Date: Fri Jul 29 16:02:08 2022 +0200
winemac.drv: Split best display mode lookup to a separate helper.
---
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;
More information about the wine-cvs
mailing list