Zhiyi Zhang : winex11.drv: Store a full display mode in registry.
Alexandre Julliard
julliard at winehq.org
Wed Aug 26 15:24:44 CDT 2020
Module: wine
Branch: master
Commit: 1aa7c9af90c340f45e03c6b94525704ad19eb657
URL: https://source.winehq.org/git/wine.git/?a=commit;h=1aa7c9af90c340f45e03c6b94525704ad19eb657
Author: Zhiyi Zhang <zzhang at codeweavers.com>
Date: Tue Aug 25 15:12:09 2020 +0800
winex11.drv: Store a full display mode in registry.
Signed-off-by: Zhiyi Zhang <zzhang at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/user32/tests/monitor.c | 11 +++--------
dlls/winex11.drv/settings.c | 48 ++++++++++++++++++++++++++++-----------------
2 files changed, 33 insertions(+), 26 deletions(-)
diff --git a/dlls/user32/tests/monitor.c b/dlls/user32/tests/monitor.c
index 7cd41145ea..9a7efb8e9b 100644
--- a/dlls/user32/tests/monitor.c
+++ b/dlls/user32/tests/monitor.c
@@ -749,8 +749,8 @@ static void test_ChangeDisplaySettingsEx(void)
"Expected dmPelsWidth %u, got %u.\n", dm3.dmPelsWidth, dm.dmPelsWidth);
ok(dm.dmPelsHeight == dm3.dmPelsHeight || broken(dm.dmPelsHeight == dm2.dmPelsHeight), /* Win10 */
"Expected dmPelsHeight %u, got %u.\n", dm3.dmPelsHeight, dm.dmPelsHeight);
- todo_wine ok(dm.dmBitsPerPel, "Expected dmBitsPerPel not zero.\n");
- todo_wine ok(dm.dmDisplayFrequency, "Expected dmDisplayFrequency not zero.\n");
+ ok(dm.dmBitsPerPel, "Expected dmBitsPerPel not zero.\n");
+ ok(dm.dmDisplayFrequency, "Expected dmDisplayFrequency not zero.\n");
}
else
{
@@ -758,12 +758,7 @@ static void test_ChangeDisplaySettingsEx(void)
}
res = ChangeDisplaySettingsExA(devices[device].name, NULL, NULL, 0, NULL);
- todo_wine ok(res == DISP_CHANGE_SUCCESSFUL, "ChangeDisplaySettingsExA %s returned %d.\n", devices[device].name, res);
- if (res != DISP_CHANGE_SUCCESSFUL)
- {
- skip("ChangeDisplaySettingsExA %s returned %d.\n", devices[device].name, res);
- continue;
- }
+ ok(res == DISP_CHANGE_SUCCESSFUL, "ChangeDisplaySettingsExA %s returned %d.\n", devices[device].name, res);
flush_events();
res = EnumDisplaySettingsA(devices[device].name, ENUM_REGISTRY_SETTINGS, &dm);
diff --git a/dlls/winex11.drv/settings.c b/dlls/winex11.drv/settings.c
index c4929e9b58..7827ede656 100644
--- a/dlls/winex11.drv/settings.c
+++ b/dlls/winex11.drv/settings.c
@@ -456,12 +456,15 @@ BOOL is_detached_mode(const DEVMODEW *mode)
}
/* Get the full display mode with all the necessary fields set.
- * Return NULL on failure. Caller should free the returned mode. */
-static DEVMODEW *get_full_mode(ULONG_PTR id, const DEVMODEW *dev_mode)
+ * Return NULL on failure. Caller should call free_full_mode() to free the returned mode. */
+static DEVMODEW *get_full_mode(ULONG_PTR id, DEVMODEW *dev_mode)
{
DEVMODEW *modes, *full_mode, *found_mode = NULL;
UINT mode_count, mode_idx;
+ if (is_detached_mode(dev_mode))
+ return dev_mode;
+
if (!handler.get_modes(id, 0, &modes, &mode_count))
return NULL;
@@ -500,9 +503,18 @@ static DEVMODEW *get_full_mode(ULONG_PTR id, const DEVMODEW *dev_mode)
memcpy(full_mode, found_mode, sizeof(*found_mode) + found_mode->dmDriverExtra);
handler.free_modes(modes);
+
+ full_mode->dmFields |= DM_POSITION;
+ full_mode->u1.s2.dmPosition = dev_mode->u1.s2.dmPosition;
return full_mode;
}
+static void free_full_mode(DEVMODEW *mode)
+{
+ if (!is_detached_mode(mode))
+ heap_free(mode);
+}
+
static LONG get_display_settings(struct x11drv_display_setting **new_displays,
INT *new_display_count, const WCHAR *dev_name, DEVMODEW *dev_mode)
{
@@ -781,19 +793,9 @@ static LONG apply_display_settings(struct x11drv_display_setting *displays, INT
if ((attached_mode && !do_attach) || (!attached_mode && do_attach))
continue;
- if (attached_mode)
- {
- full_mode = get_full_mode(displays[display_idx].id, &displays[display_idx].desired_mode);
- if (!full_mode)
- return DISP_CHANGE_BADMODE;
-
- full_mode->dmFields |= DM_POSITION;
- full_mode->u1.s2.dmPosition = displays[display_idx].desired_mode.u1.s2.dmPosition;
- }
- else
- {
- full_mode = &displays[display_idx].desired_mode;
- }
+ full_mode = get_full_mode(displays[display_idx].id, &displays[display_idx].desired_mode);
+ if (!full_mode)
+ return DISP_CHANGE_BADMODE;
TRACE("handler:%s changing %s to position:(%d,%d) resolution:%ux%u frequency:%uHz "
"depth:%ubits orientation:%#x.\n", handler.name,
@@ -803,8 +805,7 @@ static LONG apply_display_settings(struct x11drv_display_setting *displays, INT
full_mode->u1.s2.dmDisplayOrientation);
ret = handler.set_current_mode(displays[display_idx].id, full_mode);
- if (attached_mode)
- heap_free(full_mode);
+ free_full_mode(full_mode);
if (ret != DISP_CHANGE_SUCCESSFUL)
return ret;
}
@@ -834,6 +835,7 @@ LONG CDECL X11DRV_ChangeDisplaySettingsEx( LPCWSTR devname, LPDEVMODEW devmode,
{
struct x11drv_display_setting *displays;
INT display_idx, display_count;
+ DEVMODEW *full_mode;
LONG ret;
ret = get_display_settings(&displays, &display_count, devname, devmode);
@@ -846,12 +848,22 @@ LONG CDECL X11DRV_ChangeDisplaySettingsEx( LPCWSTR devname, LPDEVMODEW devmode,
{
if (!lstrcmpiW(displays[display_idx].desired_mode.dmDeviceName, devname))
{
- if (!write_registry_settings(devname, &displays[display_idx].desired_mode))
+ full_mode = get_full_mode(displays[display_idx].id, &displays[display_idx].desired_mode);
+ if (!full_mode)
+ {
+ heap_free(displays);
+ return DISP_CHANGE_BADMODE;
+ }
+
+ if (!write_registry_settings(devname, full_mode))
{
ERR("Failed to write %s display settings to registry.\n", wine_dbgstr_w(devname));
+ free_full_mode(full_mode);
heap_free(displays);
return DISP_CHANGE_NOTUPDATED;
}
+
+ free_full_mode(full_mode);
break;
}
}
More information about the wine-cvs
mailing list