[PATCH 1/3] user32: Move ChangeDisplaySettingsExW() common code to user32.

Zhiyi Zhang zzhang at codeweavers.com
Sun Feb 9 21:09:22 CST 2020


Signed-off-by: Zhiyi Zhang <zzhang at codeweavers.com>
---
 dlls/user32/sysparams.c     | 110 +++++++++++++++++++++++++++++++++++-
 dlls/winemac.drv/display.c  |  36 ------------
 dlls/winex11.drv/settings.c |  71 +----------------------
 3 files changed, 111 insertions(+), 106 deletions(-)

diff --git a/dlls/user32/sysparams.c b/dlls/user32/sysparams.c
index 2ff5b2f909..2523df6bf2 100644
--- a/dlls/user32/sysparams.c
+++ b/dlls/user32/sysparams.c
@@ -3200,6 +3200,71 @@ LONG WINAPI ChangeDisplaySettingsExA( LPCSTR devname, LPDEVMODEA devmode, HWND h
     return ret;
 }
 
+#define _X_FIELD(prefix, bits)                            \
+    if ((fields) & prefix##_##bits)                       \
+    {                                                     \
+        p += sprintf(p, "%s%s", first ? "" : ",", #bits); \
+        first = FALSE;                                    \
+    }
+
+static const CHAR *_CDS_flags(DWORD fields)
+{
+    BOOL first = TRUE;
+    CHAR buf[128];
+    CHAR *p = buf;
+
+    _X_FIELD(CDS, UPDATEREGISTRY)
+    _X_FIELD(CDS, TEST)
+    _X_FIELD(CDS, FULLSCREEN)
+    _X_FIELD(CDS, GLOBAL)
+    _X_FIELD(CDS, SET_PRIMARY)
+    _X_FIELD(CDS, RESET)
+    _X_FIELD(CDS, SETRECT)
+    _X_FIELD(CDS, NORESET)
+
+    *p = 0;
+    return wine_dbg_sprintf("%s", buf);
+}
+
+static const CHAR *_DM_fields(DWORD fields)
+{
+    BOOL first = TRUE;
+    CHAR buf[128];
+    CHAR *p = buf;
+
+    _X_FIELD(DM, BITSPERPEL)
+    _X_FIELD(DM, PELSWIDTH)
+    _X_FIELD(DM, PELSHEIGHT)
+    _X_FIELD(DM, DISPLAYFLAGS)
+    _X_FIELD(DM, DISPLAYFREQUENCY)
+    _X_FIELD(DM, POSITION)
+    _X_FIELD(DM, DISPLAYORIENTATION)
+
+    *p = 0;
+    return wine_dbg_sprintf("%s", buf);
+}
+
+#undef _X_FIELD
+
+static void trace_devmode(const DEVMODEW *devmode)
+{
+    TRACE("dmFields=%s ", _DM_fields(devmode->dmFields));
+    if (devmode->dmFields & DM_BITSPERPEL)
+        TRACE("dmBitsPerPel=%u ", devmode->dmBitsPerPel);
+    if (devmode->dmFields & DM_PELSWIDTH)
+        TRACE("dmPelsWidth=%u ", devmode->dmPelsWidth);
+    if (devmode->dmFields & DM_PELSHEIGHT)
+        TRACE("dmPelsHeight=%u ", devmode->dmPelsHeight);
+    if (devmode->dmFields & DM_DISPLAYFREQUENCY)
+        TRACE("dmDisplayFrequency=%u ", devmode->dmDisplayFrequency);
+    if (devmode->dmFields & DM_POSITION)
+        TRACE("dmPosition=(%d,%d) ", devmode->u1.s2.dmPosition.x, devmode->u1.s2.dmPosition.y);
+    if (devmode->dmFields & DM_DISPLAYFLAGS)
+        TRACE("dmDisplayFlags=%#x ", devmode->u2.dmDisplayFlags);
+    if (devmode->dmFields & DM_DISPLAYORIENTATION)
+        TRACE("dmDisplayOrientation=%u ", devmode->u1.s2.dmDisplayOrientation);
+    TRACE("\n");
+}
 
 /***********************************************************************
  *		ChangeDisplaySettingsExW (USER32.@)
@@ -3207,7 +3272,50 @@ LONG WINAPI ChangeDisplaySettingsExA( LPCSTR devname, LPDEVMODEA devmode, HWND h
 LONG WINAPI ChangeDisplaySettingsExW( LPCWSTR devname, LPDEVMODEW devmode, HWND hwnd,
                                       DWORD flags, LPVOID lparam )
 {
-    return USER_Driver->pChangeDisplaySettingsEx( devname, devmode, hwnd, flags, lparam );
+    BOOL def_mode = TRUE;
+    DEVMODEW dm;
+
+    TRACE("%s %p %p %#x %p\n", debugstr_w(devname), devmode, hwnd, flags, lparam);
+    TRACE("flags=%s\n", _CDS_flags(flags));
+
+    if (devmode)
+    {
+        trace_devmode(devmode);
+
+        /* This is the minimal dmSize that XP accepts */
+        if (devmode->dmSize < FIELD_OFFSET(DEVMODEW, dmFields))
+            return DISP_CHANGE_FAILED;
+
+        if (devmode->dmSize >= FIELD_OFFSET(DEVMODEW, dmFields) + sizeof(devmode->dmFields))
+        {
+            if (((devmode->dmFields & DM_BITSPERPEL) && devmode->dmBitsPerPel) ||
+                ((devmode->dmFields & DM_PELSWIDTH) && devmode->dmPelsWidth) ||
+                ((devmode->dmFields & DM_PELSHEIGHT) && devmode->dmPelsHeight) ||
+                ((devmode->dmFields & DM_DISPLAYFREQUENCY) && devmode->dmDisplayFrequency))
+                def_mode = FALSE;
+        }
+    }
+
+    if (def_mode)
+    {
+        dm.dmSize = sizeof(dm);
+        if (!EnumDisplaySettingsExW(devname, ENUM_REGISTRY_SETTINGS, &dm, 0))
+        {
+            ERR("Default mode not found!\n");
+            return DISP_CHANGE_BADMODE;
+        }
+
+        TRACE("Return to original display mode\n");
+        devmode = &dm;
+    }
+
+    if ((devmode->dmFields & (DM_PELSWIDTH | DM_PELSHEIGHT)) != (DM_PELSWIDTH | DM_PELSHEIGHT))
+    {
+        WARN("devmode doesn't specify the resolution: %#x\n", devmode->dmFields);
+        return DISP_CHANGE_BADMODE;
+    }
+
+    return USER_Driver->pChangeDisplaySettingsEx(devname, devmode, hwnd, flags, lparam);
 }
 
 
diff --git a/dlls/winemac.drv/display.c b/dlls/winemac.drv/display.c
index b58a9d172b..4c610c4573 100644
--- a/dlls/winemac.drv/display.c
+++ b/dlls/winemac.drv/display.c
@@ -755,8 +755,6 @@ LONG CDECL macdrv_ChangeDisplaySettingsEx(LPCWSTR devname, LPDEVMODEW devmode,
 {
     LONG ret = DISP_CHANGE_BADMODE;
     int bpp;
-    DEVMODEW dm;
-    BOOL def_mode = TRUE;
     struct macdrv_display *displays;
     int num_displays;
     CFArrayRef display_modes;
@@ -770,40 +768,6 @@ LONG CDECL macdrv_ChangeDisplaySettingsEx(LPCWSTR devname, LPDEVMODEW devmode,
 
     init_original_display_mode();
 
-    if (devmode)
-    {
-        /* this is the minimal dmSize that XP accepts */
-        if (devmode->dmSize < FIELD_OFFSET(DEVMODEW, dmFields))
-            return DISP_CHANGE_FAILED;
-
-        if (devmode->dmSize >= FIELD_OFFSET(DEVMODEW, dmFields) + sizeof(devmode->dmFields))
-        {
-            if (((devmode->dmFields & DM_BITSPERPEL) && devmode->dmBitsPerPel) ||
-                ((devmode->dmFields & DM_PELSWIDTH) && devmode->dmPelsWidth) ||
-                ((devmode->dmFields & DM_PELSHEIGHT) && devmode->dmPelsHeight) ||
-                ((devmode->dmFields & DM_DISPLAYFREQUENCY) && devmode->dmDisplayFrequency))
-                def_mode = FALSE;
-        }
-    }
-
-    if (def_mode)
-    {
-        if (!macdrv_EnumDisplaySettingsEx(devname, ENUM_REGISTRY_SETTINGS, &dm, 0))
-        {
-            ERR("Default mode not found!\n");
-            return DISP_CHANGE_BADMODE;
-        }
-
-        TRACE("Return to original display mode\n");
-        devmode = &dm;
-    }
-
-    if ((devmode->dmFields & (DM_PELSWIDTH | DM_PELSHEIGHT)) != (DM_PELSWIDTH | DM_PELSHEIGHT))
-    {
-        WARN("devmode doesn't specify the resolution: %04x\n", devmode->dmFields);
-        return DISP_CHANGE_BADMODE;
-    }
-
     if (macdrv_get_displays(&displays, &num_displays))
         return DISP_CHANGE_FAILED;
 
diff --git a/dlls/winex11.drv/settings.c b/dlls/winex11.drv/settings.c
index a4f172037c..24644db620 100644
--- a/dlls/winex11.drv/settings.c
+++ b/dlls/winex11.drv/settings.c
@@ -311,30 +311,6 @@ BOOL CDECL X11DRV_EnumDisplaySettingsEx( LPCWSTR name, DWORD n, LPDEVMODEW devmo
     return FALSE;
 }
 
-#define _X_FIELD(prefix, bits) if ((fields) & prefix##_##bits) {p+=sprintf(p, "%s%s", first ? "" : ",", #bits); first=FALSE;}
-static const char * _CDS_flags(DWORD fields)
-{
-    BOOL first = TRUE;
-    char buf[128];
-    char *p = buf;
-    _X_FIELD(CDS,UPDATEREGISTRY);_X_FIELD(CDS,TEST);_X_FIELD(CDS,FULLSCREEN);
-    _X_FIELD(CDS,GLOBAL);_X_FIELD(CDS,SET_PRIMARY);_X_FIELD(CDS,RESET);
-    _X_FIELD(CDS,SETRECT);_X_FIELD(CDS,NORESET);
-    *p = 0;
-    return wine_dbg_sprintf("%s", buf);
-}
-static const char * _DM_fields(DWORD fields)
-{
-    BOOL first = TRUE;
-    char buf[128];
-    char *p = buf;
-    _X_FIELD(DM,BITSPERPEL);_X_FIELD(DM,PELSWIDTH);_X_FIELD(DM,PELSHEIGHT);
-    _X_FIELD(DM,DISPLAYFLAGS);_X_FIELD(DM,DISPLAYFREQUENCY);_X_FIELD(DM,POSITION);
-    *p = 0;
-    return wine_dbg_sprintf("%s", buf);
-}
-#undef _X_FIELD
-
 /***********************************************************************
  *		ChangeDisplaySettingsEx  (X11DRV.@)
  *
@@ -342,57 +318,14 @@ static const char * _DM_fields(DWORD fields)
 LONG CDECL X11DRV_ChangeDisplaySettingsEx( LPCWSTR devname, LPDEVMODEW devmode,
                                            HWND hwnd, DWORD flags, LPVOID lpvoid )
 {
-    DWORD i, dwBpp = 0;
-    DEVMODEW dm;
-    BOOL def_mode = TRUE;
     char bpp_buffer[16], freq_buffer[18];
-
-    TRACE("(%s,%p,%p,0x%08x,%p)\n",debugstr_w(devname),devmode,hwnd,flags,lpvoid);
-    TRACE("flags=%s\n",_CDS_flags(flags));
-    if (devmode)
-    {
-        /* this is the minimal dmSize that XP accepts */
-        if (devmode->dmSize < FIELD_OFFSET(DEVMODEW, dmFields))
-            return DISP_CHANGE_FAILED;
-
-        TRACE("DM_fields=%s\n",_DM_fields(devmode->dmFields));
-        TRACE("width=%d height=%d bpp=%d freq=%d (%s)\n",
-              devmode->dmPelsWidth,devmode->dmPelsHeight,
-              devmode->dmBitsPerPel,devmode->dmDisplayFrequency, handler_name);
-
-        dwBpp = devmode->dmBitsPerPel;
-        if (devmode->dmFields & DM_BITSPERPEL) def_mode &= !dwBpp;
-        if (devmode->dmFields & DM_PELSWIDTH)  def_mode &= !devmode->dmPelsWidth;
-        if (devmode->dmFields & DM_PELSHEIGHT) def_mode &= !devmode->dmPelsHeight;
-        if (devmode->dmFields & DM_DISPLAYFREQUENCY) def_mode &= !devmode->dmDisplayFrequency;
-    }
-
-    if (def_mode || !dwBpp)
-    {
-        if (!X11DRV_EnumDisplaySettingsEx(devname, ENUM_REGISTRY_SETTINGS, &dm, 0))
-        {
-            ERR("Default mode not found!\n");
-            return DISP_CHANGE_BADMODE;
-        }
-        if (def_mode)
-        {
-            TRACE("Return to original display mode (%s)\n", handler_name);
-            devmode = &dm;
-        }
-        dwBpp = dm.dmBitsPerPel;
-    }
-
-    if ((devmode->dmFields & (DM_PELSWIDTH | DM_PELSHEIGHT)) != (DM_PELSWIDTH | DM_PELSHEIGHT))
-    {
-        WARN("devmode doesn't specify the resolution: %04x\n", devmode->dmFields);
-        return DISP_CHANGE_BADMODE;
-    }
+    DWORD i;
 
     for (i = 0; i < dd_mode_count; i++)
     {
         if (devmode->dmFields & DM_BITSPERPEL)
         {
-            if (dwBpp != dd_modes[i].bpp)
+            if (devmode->dmBitsPerPel != dd_modes[i].bpp)
                 continue;
         }
         if (devmode->dmFields & DM_PELSWIDTH)
-- 
2.20.1




More information about the wine-devel mailing list