From 981d59264f7002ddc445414c42bea2c705f1dbb0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?R=C3=A9mi=20Bernon?= <rbernon@codeweavers.com>
Date: Fri, 9 Sep 2022 11:48:52 +0200
Subject: [PATCH] win32u: Move enumeration of available modes out of graphics
 drivers.

---
 dlls/win32u/driver.c        |  12 ---
 dlls/win32u/sysparams.c     |  41 +++++++--
 dlls/wineandroid.drv/init.c |  31 -------
 dlls/winemac.drv/display.c  | 162 ------------------------------------
 dlls/winemac.drv/gdi.c      |   1 -
 dlls/winemac.drv/macdrv.h   |   2 -
 dlls/winex11.drv/display.c  |  99 ----------------------
 dlls/winex11.drv/init.c     |   1 -
 dlls/winex11.drv/x11drv.h   |   2 -
 include/wine/gdi_driver.h   |   1 -
 10 files changed, 36 insertions(+), 316 deletions(-)

diff --git a/dlls/win32u/driver.c b/dlls/win32u/driver.c
index b4ed3f8cb4e..ee4a6534b50 100644
--- a/dlls/win32u/driver.c
+++ b/dlls/win32u/driver.c
@@ -759,11 +759,6 @@ static LONG nulldrv_ChangeDisplaySettings( LPDEVMODEW displays, HWND hwnd,
     return DISP_CHANGE_FAILED;
 }
 
-static BOOL nulldrv_EnumDisplaySettingsEx( LPCWSTR name, DWORD num, LPDEVMODEW mode, DWORD flags )
-{
-    return FALSE;
-}
-
 static BOOL nulldrv_GetCurrentDisplaySettings( LPCWSTR name, LPDEVMODEW mode )
 {
     return FALSE;
@@ -1077,11 +1072,6 @@ static LONG loaderdrv_ChangeDisplaySettings( LPDEVMODEW displays, HWND hwnd,
     return load_driver()->pChangeDisplaySettings( displays, hwnd, flags, lparam );
 }
 
-static BOOL loaderdrv_EnumDisplaySettingsEx( LPCWSTR name, DWORD num, LPDEVMODEW mode, DWORD flags )
-{
-    return load_driver()->pEnumDisplaySettingsEx( name, num, mode, flags );
-}
-
 static BOOL loaderdrv_GetCurrentDisplaySettings( LPCWSTR name, LPDEVMODEW mode )
 {
     return load_driver()->pGetCurrentDisplaySettings( name, mode );
@@ -1188,7 +1178,6 @@ static const struct user_driver_funcs lazy_load_driver =
     loaderdrv_UpdateClipboard,
     /* display modes */
     loaderdrv_ChangeDisplaySettings,
-    loaderdrv_EnumDisplaySettingsEx,
     loaderdrv_GetCurrentDisplaySettings,
     loaderdrv_UpdateDisplayDevices,
     /* windowing functions */
@@ -1264,7 +1253,6 @@ void __wine_set_user_driver( const struct user_driver_funcs *funcs, UINT version
     SET_USER_FUNC(ClipboardWindowProc);
     SET_USER_FUNC(UpdateClipboard);
     SET_USER_FUNC(ChangeDisplaySettings);
-    SET_USER_FUNC(EnumDisplaySettingsEx);
     SET_USER_FUNC(GetCurrentDisplaySettings);
     SET_USER_FUNC(UpdateDisplayDevices);
     SET_USER_FUNC(CreateDesktopWindow);
diff --git a/dlls/win32u/sysparams.c b/dlls/win32u/sysparams.c
index f06be99f936..3c47205cc32 100644
--- a/dlls/win32u/sysparams.c
+++ b/dlls/win32u/sysparams.c
@@ -2498,6 +2498,39 @@ LONG WINAPI NtUserChangeDisplaySettings( UNICODE_STRING *devname, DEVMODEW *devm
     return ret;
 }
 
+static BOOL adapter_enum_display_settings( const struct adapter *adapter, DWORD index, DEVMODEW *devmode, DWORD flags )
+{
+    DEVMODEW current_mode = {.dmSize = sizeof(DEVMODEW)};
+    const DEVMODEW *adapter_mode;
+
+    if (!(flags & EDS_ROTATEDMODE) && !user_driver->pGetCurrentDisplaySettings( adapter->dev.device_name, &current_mode ))
+    {
+        WARN( "Failed to query current display mode for EDS_ROTATEDMODE flag.\n" );
+        return FALSE;
+    }
+
+    for (adapter_mode = adapter->modes; adapter_mode->dmSize; adapter_mode = NEXT_DEVMODEW(adapter_mode))
+    {
+        if (!(flags & EDS_ROTATEDMODE) && (adapter_mode->dmFields & DM_DISPLAYORIENTATION) &&
+            adapter_mode->dmDisplayOrientation != current_mode.dmDisplayOrientation)
+            continue;
+        if (!(flags & EDS_RAWMODE) && (adapter_mode->dmFields & DM_DISPLAYFLAGS) &&
+            (adapter_mode->dmDisplayFlags & WINE_DM_UNSUPPORTED))
+            continue;
+        if (!index--)
+        {
+            memcpy( &devmode->dmFields, &adapter_mode->dmFields, devmode->dmSize - FIELD_OFFSET(DEVMODEW, dmFields) );
+            devmode->dmDisplayFlags &= ~WINE_DM_UNSUPPORTED;
+            return TRUE;
+        }
+    }
+
+    WARN( "device %s, index %#x, flags %#x display mode not found.\n",
+          debugstr_w( adapter->dev.device_name ), index, flags );
+    RtlSetLastWin32Error( ERROR_NO_MORE_FILES );
+    return FALSE;
+}
+
 /***********************************************************************
  *	     NtUserEnumDisplaySettings    (win32u.@)
  */
@@ -2522,15 +2555,13 @@ BOOL WINAPI NtUserEnumDisplaySettings( UNICODE_STRING *device, DWORD index, DEVM
     devmode->dmSpecVersion = DM_SPECVERSION;
     devmode->dmDriverVersion = DM_SPECVERSION;
     devmode->dmSize = offsetof(DEVMODEW, dmICMMethod);
-    memset( &devmode->dmDriverExtra, 0, devmode->dmSize - offsetof(DEVMODEW, dmDriverExtra) );
+    devmode->dmDriverExtra = 0;
 
     if (index == ENUM_REGISTRY_SETTINGS) ret = adapter_get_registry_settings( adapter, devmode );
-    else if (index != ENUM_CURRENT_SETTINGS) ret = user_driver->pEnumDisplaySettingsEx( adapter->dev.device_name, index, devmode, flags );
-    else ret = user_driver->pGetCurrentDisplaySettings( adapter->dev.device_name, devmode );
+    else if (index == ENUM_CURRENT_SETTINGS) ret = user_driver->pGetCurrentDisplaySettings( adapter->dev.device_name, devmode );
+    else ret = adapter_enum_display_settings( adapter, index, devmode, flags );
     adapter_release( adapter );
 
-    devmode->dmDisplayFlags &= ~WINE_DM_UNSUPPORTED;
-
     if (!ret) WARN( "Failed to query %s display settings.\n", debugstr_us(device) );
     else TRACE( "position %dx%d, resolution %ux%u, frequency %u, depth %u, orientation %#x.\n",
                 devmode->dmPosition.x, devmode->dmPosition.y, devmode->dmPelsWidth, devmode->dmPelsHeight,
diff --git a/dlls/wineandroid.drv/init.c b/dlls/wineandroid.drv/init.c
index 2cd01bd3f50..6011e20c8ce 100644
--- a/dlls/wineandroid.drv/init.c
+++ b/dlls/wineandroid.drv/init.c
@@ -303,36 +303,6 @@ BOOL ANDROID_UpdateDisplayDevices( const struct gdi_device_manager *device_manag
 }
 
 
-/***********************************************************************
- *           ANDROID_EnumDisplaySettingsEx
- */
-BOOL ANDROID_EnumDisplaySettingsEx( LPCWSTR name, DWORD n, LPDEVMODEW devmode, DWORD flags )
-{
-    if (n > 0)
-    {
-        TRACE( "mode %d -- not present\n", n );
-        RtlSetLastWin32Error( ERROR_NO_MORE_FILES );
-        return FALSE;
-    }
-
-    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_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 );
-    return TRUE;
-}
-
-
 /***********************************************************************
  *           ANDROID_GetCurrentDisplaySettings
  */
@@ -377,7 +347,6 @@ static const struct user_driver_funcs android_drv_funcs =
     .pVkKeyScanEx = ANDROID_VkKeyScanEx,
     .pSetCursor = ANDROID_SetCursor,
     .pChangeDisplaySettings = ANDROID_ChangeDisplaySettings,
-    .pEnumDisplaySettingsEx = ANDROID_EnumDisplaySettingsEx,
     .pGetCurrentDisplaySettings = ANDROID_GetCurrentDisplaySettings,
     .pUpdateDisplayDevices = ANDROID_UpdateDisplayDevices,
     .pCreateWindow = ANDROID_CreateWindow,
diff --git a/dlls/winemac.drv/display.c b/dlls/winemac.drv/display.c
index def291508be..b981aa12e35 100644
--- a/dlls/winemac.drv/display.c
+++ b/dlls/winemac.drv/display.c
@@ -51,10 +51,6 @@ static const WCHAR initial_mode_keyW[] = {'I','n','i','t','i','a','l',' ','D','i
     ' ','M','o','d','e'};
 static const WCHAR pixelencodingW[] = {'P','i','x','e','l','E','n','c','o','d','i','n','g',0};
 
-static CFArrayRef cached_modes;
-static DWORD cached_modes_flags;
-static CGDirectDisplayID cached_modes_display_id;
-static BOOL cached_modes_has_8bpp, cached_modes_has_16bpp;
 static int cached_default_mode_bpp;
 static pthread_mutex_t cached_modes_mutex = PTHREAD_MUTEX_INITIALIZER;
 
@@ -936,164 +932,6 @@ static DEVMODEW *display_get_modes(CGDirectDisplayID display_id, int *modes_coun
     return devmodes;
 }
 
-/***********************************************************************
- *              EnumDisplaySettingsEx  (MACDRV.@)
- *
- */
-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, display_idx;
-    BOOL synthesized = FALSE;
-    CGDirectDisplayID display_id;
-    DWORD count, i;
-    WCHAR *end;
-
-    TRACE("%s, %u, %p + %hu, %08x\n", debugstr_w(devname), mode, devmode, devmode->dmSize, flags);
-
-    init_original_display_mode();
-
-    if (macdrv_get_displays(&displays, &num_displays))
-        goto failed;
-
-    display_idx = wcstol(devname + 11, &end, 10) - 1;
-    if (display_idx >= num_displays)
-    {
-        macdrv_free_displays(displays);
-        return FALSE;
-    }
-
-    display_id = displays[display_idx].displayID;
-
-    pthread_mutex_lock(&cached_modes_mutex);
-
-    if (mode == 0 || !cached_modes || flags != cached_modes_flags || display_id != cached_modes_display_id)
-    {
-        if (cached_modes) CFRelease(cached_modes);
-        cached_modes = copy_display_modes(display_id, (flags & EDS_RAWMODE) != 0);
-        cached_modes_has_8bpp = cached_modes_has_16bpp = FALSE;
-        cached_modes_display_id = display_id;
-        cached_modes_flags = flags;
-
-        if (cached_modes)
-        {
-            count = CFArrayGetCount(cached_modes);
-            for (i = 0; i < count && !(cached_modes_has_8bpp && cached_modes_has_16bpp); i++)
-            {
-                CGDisplayModeRef mode = (CGDisplayModeRef)CFArrayGetValueAtIndex(cached_modes, i);
-                int bpp = display_mode_bits_per_pixel(mode);
-                if (bpp == 8)
-                    cached_modes_has_8bpp = TRUE;
-                else if (bpp == 16)
-                    cached_modes_has_16bpp = TRUE;
-            }
-        }
-    }
-
-    display_mode = NULL;
-    if (cached_modes)
-    {
-        int default_bpp;
-        DWORD seen_modes = 0;
-
-        count = CFArrayGetCount(cached_modes);
-        for (i = 0; i < count; i++)
-        {
-            CGDisplayModeRef candidate = (CGDisplayModeRef)CFArrayGetValueAtIndex(cached_modes, i);
-
-            seen_modes++;
-            if (seen_modes > mode)
-            {
-                display_mode = (CGDisplayModeRef)CFRetain(candidate);
-                display_mode_bpp = display_mode_bits_per_pixel(display_mode);
-                break;
-            }
-        }
-
-        default_bpp = get_default_bpp();
-
-        /* If all the real modes are exhausted, synthesize lower bpp modes. */
-        if (!display_mode && (!cached_modes_has_16bpp || !cached_modes_has_8bpp))
-        {
-            /* We want to synthesize higher depths first. */
-            int synth_bpps[] = { cached_modes_has_16bpp ? 0 : 16, cached_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++)
-                {
-                    CGDisplayModeRef candidate = (CGDisplayModeRef)CFArrayGetValueAtIndex(cached_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)
-                    break;
-            }
-        }
-    }
-
-    pthread_mutex_unlock(&cached_modes_mutex);
-
-    if (!display_mode)
-        goto failed;
-
-    display_mode_to_devmode(display_id, display_mode, devmode);
-    devmode->dmBitsPerPel = display_mode_bpp;
-    if (devmode->dmBitsPerPel)
-        devmode->dmFields |= DM_BITSPERPEL;
-    if (retina_enabled)
-    {
-        struct display_mode_descriptor* desc = create_original_display_mode_descriptor(display_id);
-        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("mode %d -- %dx%dx%dbpp @%d Hz", mode,
-          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");
-    if (synthesized)
-        TRACE(" (synthesized)");
-    TRACE("\n");
-
-    return TRUE;
-
-failed:
-    TRACE("mode %d -- not present\n", mode);
-    if (displays) macdrv_free_displays(displays);
-    RtlSetLastWin32Error(ERROR_NO_MORE_FILES);
-    return FALSE;
-}
-
 /***********************************************************************
  *              GetCurrentDisplaySettings  (MACDRV.@)
  *
diff --git a/dlls/winemac.drv/gdi.c b/dlls/winemac.drv/gdi.c
index c3e3fa6cdb7..193a3f4bbd2 100644
--- a/dlls/winemac.drv/gdi.c
+++ b/dlls/winemac.drv/gdi.c
@@ -275,7 +275,6 @@ static const struct user_driver_funcs macdrv_funcs =
     .pDesktopWindowProc = macdrv_DesktopWindowProc,
     .pDestroyCursorIcon = macdrv_DestroyCursorIcon,
     .pDestroyWindow = macdrv_DestroyWindow,
-    .pEnumDisplaySettingsEx = macdrv_EnumDisplaySettingsEx,
     .pGetCurrentDisplaySettings = macdrv_GetCurrentDisplaySettings,
     .pUpdateDisplayDevices = macdrv_UpdateDisplayDevices,
     .pGetCursorPos = macdrv_GetCursorPos,
diff --git a/dlls/winemac.drv/macdrv.h b/dlls/winemac.drv/macdrv.h
index ada7ca35587..683fd1851a3 100644
--- a/dlls/winemac.drv/macdrv.h
+++ b/dlls/winemac.drv/macdrv.h
@@ -124,8 +124,6 @@ static inline RECT rect_from_cgrect(CGRect cgrect)
 extern BOOL macdrv_ActivateKeyboardLayout(HKL hkl, UINT flags) DECLSPEC_HIDDEN;
 extern void macdrv_Beep(void) DECLSPEC_HIDDEN;
 extern LONG macdrv_ChangeDisplaySettings(LPDEVMODEW displays, HWND hwnd, DWORD flags, LPVOID lpvoid) DECLSPEC_HIDDEN;
-extern BOOL macdrv_EnumDisplaySettingsEx(LPCWSTR devname, DWORD mode,
-                                         LPDEVMODEW devmode, DWORD flags) DECLSPEC_HIDDEN;
 extern BOOL macdrv_GetCurrentDisplaySettings(LPCWSTR name, LPDEVMODEW devmode) DECLSPEC_HIDDEN;
 extern LRESULT macdrv_ClipboardWindowProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) DECLSPEC_HIDDEN;
 extern BOOL macdrv_UpdateDisplayDevices( const struct gdi_device_manager *device_manager,
diff --git a/dlls/winex11.drv/display.c b/dlls/winex11.drv/display.c
index 55dfcceb6e3..534615f64c8 100644
--- a/dlls/winex11.drv/display.c
+++ b/dlls/winex11.drv/display.c
@@ -51,12 +51,6 @@ static const unsigned int depths_24[]  = {8, 16, 24};
 static const unsigned int depths_32[]  = {8, 16, 32};
 const unsigned int *depths;
 
-/* Cached display modes for a device, protected by modes_section */
-static WCHAR cached_device_name[CCHDEVICENAME];
-static DWORD cached_flags;
-static DEVMODEW *cached_modes;
-static UINT cached_mode_count;
-
 static pthread_mutex_t settings_mutex = PTHREAD_MUTEX_INITIALIZER;
 
 void X11DRV_Settings_SetHandler(const struct x11drv_settings_handler *new_handler)
@@ -220,54 +214,6 @@ BOOL get_primary_adapter(WCHAR *name)
     return FALSE;
 }
 
-static int mode_compare(const void *p1, const void *p2)
-{
-    DWORD a_width, a_height, b_width, b_height;
-    const DEVMODEW *a = p1, *b = p2;
-
-    /* Use the width and height in landscape mode for comparison */
-    if (a->dmDisplayOrientation == DMDO_DEFAULT || a->dmDisplayOrientation == DMDO_180)
-    {
-        a_width = a->dmPelsWidth;
-        a_height = a->dmPelsHeight;
-    }
-    else
-    {
-        a_width = a->dmPelsHeight;
-        a_height = a->dmPelsWidth;
-    }
-
-    if (b->dmDisplayOrientation == DMDO_DEFAULT || b->dmDisplayOrientation == DMDO_180)
-    {
-        b_width = b->dmPelsWidth;
-        b_height = b->dmPelsHeight;
-    }
-    else
-    {
-        b_width = b->dmPelsHeight;
-        b_height = b->dmPelsWidth;
-    }
-
-    /* Depth in descending order */
-    if (a->dmBitsPerPel != b->dmBitsPerPel)
-        return b->dmBitsPerPel - a->dmBitsPerPel;
-
-    /* Width in ascending order */
-    if (a_width != b_width)
-        return a_width - b_width;
-
-    /* Height in ascending order */
-    if (a_height != b_height)
-        return a_height - b_height;
-
-    /* Frequency in descending order */
-    if (a->dmDisplayFrequency != b->dmDisplayFrequency)
-        return b->dmDisplayFrequency - a->dmDisplayFrequency;
-
-    /* Orientation in ascending order */
-    return a->dmDisplayOrientation - b->dmDisplayOrientation;
-}
-
 static void set_display_depth(ULONG_PTR display_id, DWORD depth)
 {
     struct x11drv_display_depth *display_depth;
@@ -316,51 +262,6 @@ static DWORD get_display_depth(ULONG_PTR display_id)
     return screen_bpp;
 }
 
-/***********************************************************************
- *      EnumDisplaySettingsEx  (X11DRV.@)
- *
- */
-BOOL X11DRV_EnumDisplaySettingsEx( LPCWSTR name, DWORD n, LPDEVMODEW devmode, DWORD flags)
-{
-    DEVMODEW *modes, mode;
-    UINT mode_count;
-    ULONG_PTR id;
-
-    pthread_mutex_lock( &settings_mutex );
-    if (n == 0 || wcsicmp(cached_device_name, name) || cached_flags != flags)
-    {
-        if (!settings_handler.get_id(name, &id) || !settings_handler.get_modes(id, flags, &modes, &mode_count))
-        {
-            ERR("Failed to get %s supported display modes.\n", wine_dbgstr_w(name));
-            pthread_mutex_unlock( &settings_mutex );
-            return FALSE;
-        }
-
-        qsort(modes, mode_count, sizeof(*modes) + modes[0].dmDriverExtra, mode_compare);
-
-        if (cached_modes)
-            settings_handler.free_modes(cached_modes);
-        lstrcpyW(cached_device_name, name);
-        cached_flags = flags;
-        cached_modes = modes;
-        cached_mode_count = mode_count;
-    }
-
-    if (n >= cached_mode_count)
-    {
-        pthread_mutex_unlock( &settings_mutex );
-        WARN("handler:%s device:%s mode index:%#x not found.\n", settings_handler.name, wine_dbgstr_w(name), n);
-        RtlSetLastWin32Error( ERROR_NO_MORE_FILES );
-        return FALSE;
-    }
-
-    mode = *(DEVMODEW *)((BYTE *)cached_modes + (sizeof(*cached_modes) + cached_modes[0].dmDriverExtra) * n);
-    pthread_mutex_unlock( &settings_mutex );
-
-    memcpy( &devmode->dmFields, &mode.dmFields, devmode->dmSize - offsetof(DEVMODEW, dmFields) );
-    return TRUE;
-}
-
 /***********************************************************************
  *      GetCurrentDisplaySettings  (X11DRV.@)
  *
diff --git a/dlls/winex11.drv/init.c b/dlls/winex11.drv/init.c
index 5d688c27114..4ebe3a16367 100644
--- a/dlls/winex11.drv/init.c
+++ b/dlls/winex11.drv/init.c
@@ -404,7 +404,6 @@ static const struct user_driver_funcs x11drv_funcs =
     .pSetCursorPos = X11DRV_SetCursorPos,
     .pClipCursor = X11DRV_ClipCursor,
     .pChangeDisplaySettings = X11DRV_ChangeDisplaySettings,
-    .pEnumDisplaySettingsEx = X11DRV_EnumDisplaySettingsEx,
     .pGetCurrentDisplaySettings = X11DRV_GetCurrentDisplaySettings,
     .pUpdateDisplayDevices = X11DRV_UpdateDisplayDevices,
     .pCreateDesktopWindow = X11DRV_CreateDesktopWindow,
diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h
index 8721360536f..f5064978fb5 100644
--- a/dlls/winex11.drv/x11drv.h
+++ b/dlls/winex11.drv/x11drv.h
@@ -214,8 +214,6 @@ extern BOOL X11DRV_SetCursorPos( INT x, INT y ) DECLSPEC_HIDDEN;
 extern BOOL X11DRV_GetCursorPos( LPPOINT pos ) DECLSPEC_HIDDEN;
 extern BOOL X11DRV_ClipCursor( LPCRECT clip ) DECLSPEC_HIDDEN;
 extern LONG X11DRV_ChangeDisplaySettings( LPDEVMODEW displays, HWND hwnd, DWORD flags, LPVOID lpvoid ) DECLSPEC_HIDDEN;
-extern BOOL X11DRV_EnumDisplaySettingsEx( LPCWSTR name, DWORD n, LPDEVMODEW devmode,
-                                          DWORD flags ) DECLSPEC_HIDDEN;
 extern BOOL X11DRV_GetCurrentDisplaySettings( LPCWSTR name, LPDEVMODEW devmode ) DECLSPEC_HIDDEN;
 extern BOOL X11DRV_UpdateDisplayDevices( const struct gdi_device_manager *device_manager,
                                          BOOL force, void *param ) DECLSPEC_HIDDEN;
diff --git a/include/wine/gdi_driver.h b/include/wine/gdi_driver.h
index 9863a4a36ea..596d27156af 100644
--- a/include/wine/gdi_driver.h
+++ b/include/wine/gdi_driver.h
@@ -298,7 +298,6 @@ struct user_driver_funcs
     void    (*pUpdateClipboard)(void);
     /* display modes */
     LONG    (*pChangeDisplaySettings)(LPDEVMODEW,HWND,DWORD,LPVOID);
-    BOOL    (*pEnumDisplaySettingsEx)(LPCWSTR,DWORD,LPDEVMODEW,DWORD);
     BOOL    (*pGetCurrentDisplaySettings)(LPCWSTR,LPDEVMODEW);
     BOOL    (*pUpdateDisplayDevices)(const struct gdi_device_manager *,BOOL,void*);
     /* windowing functions */
-- 
GitLab