From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winex11.drv/display.c | 20 +++++++++++++++++--- dlls/winex11.drv/x11drv.h | 2 +- dlls/winex11.drv/xrandr.c | 22 +++++++++++----------- dlls/winex11.drv/xvidmode.c | 21 ++++++++++----------- 4 files changed, 39 insertions(+), 26 deletions(-)
diff --git a/dlls/winex11.drv/display.c b/dlls/winex11.drv/display.c index 5151a68f431..f063dabcbb5 100644 --- a/dlls/winex11.drv/display.c +++ b/dlls/winex11.drv/display.c @@ -62,7 +62,7 @@ static BOOL nores_get_id(const WCHAR *device_name, BOOL is_primary, x11drv_setti return TRUE; }
-static BOOL nores_get_modes( x11drv_settings_id id, DWORD flags, DEVMODEW **new_modes, UINT *mode_count, BOOL full ) +static BOOL nores_get_modes( x11drv_settings_id id, DWORD flags, DEVMODEW **new_modes, UINT *mode_count ) { RECT primary = get_host_primary_monitor_rect(); DEVMODEW *modes; @@ -140,6 +140,19 @@ void X11DRV_Settings_Init(void) X11DRV_Settings_SetHandler(&nores_handler); }
+static void strip_driver_extra( DEVMODEW *modes, UINT count ) +{ + DEVMODEW *mode, *next; + UINT i; + + for (i = 0, mode = modes; i < count; i++, mode = next) + { + next = NEXT_DEVMODEW(mode); + mode->dmDriverExtra = 0; + memcpy( modes + i, mode, sizeof(*mode) ); + } +} + BOOL is_detached_mode(const DEVMODEW *mode) { return mode->dmFields & DM_POSITION && @@ -168,7 +181,7 @@ static DEVMODEW *get_full_mode(x11drv_settings_id id, DEVMODEW *dev_mode) if (is_detached_mode(dev_mode)) return dev_mode;
- if (!settings_handler.get_modes( id, EDS_ROTATEDMODE, &modes, &mode_count, TRUE )) return NULL; + if (!settings_handler.get_modes( id, EDS_ROTATEDMODE, &modes, &mode_count )) return NULL;
for (mode_idx = 0; mode_idx < mode_count; ++mode_idx) { @@ -447,8 +460,9 @@ UINT X11DRV_UpdateDisplayDevices( const struct gdi_device_manager *device_manage if (!settings_handler.get_id( devname, is_primary, &settings_id )) break;
settings_handler.get_current_mode( settings_id, ¤t_mode ); - if (settings_handler.get_modes( settings_id, EDS_ROTATEDMODE, &modes, &mode_count, FALSE )) + if (settings_handler.get_modes( settings_id, EDS_ROTATEDMODE, &modes, &mode_count )) { + strip_driver_extra( modes, mode_count ); device_manager->add_modes( ¤t_mode, mode_count, modes, param ); free( modes ); } diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h index 6513dca9468..a92ffb6428e 100644 --- a/dlls/winex11.drv/x11drv.h +++ b/dlls/winex11.drv/x11drv.h @@ -781,7 +781,7 @@ struct x11drv_settings_handler * dmDisplayFlags and dmDisplayFrequency * * Return FALSE on failure with parameters unchanged and error code set. Return TRUE on success */ - BOOL (*get_modes)(x11drv_settings_id id, DWORD flags, DEVMODEW **modes, UINT *mode_count, BOOL full); + BOOL (*get_modes)(x11drv_settings_id id, DWORD flags, DEVMODEW **modes, UINT *mode_count);
/* get_current_mode() will be called to get the current display mode of the device of id * diff --git a/dlls/winex11.drv/xrandr.c b/dlls/winex11.drv/xrandr.c index 87bddd07cf5..8b675ec355b 100644 --- a/dlls/winex11.drv/xrandr.c +++ b/dlls/winex11.drv/xrandr.c @@ -239,10 +239,10 @@ static BOOL xrandr10_get_id( const WCHAR *device_name, BOOL is_primary, x11drv_s }
static void add_xrandr10_mode( DEVMODEW *mode, DWORD depth, DWORD width, DWORD height, - DWORD frequency, SizeID size_id, BOOL full ) + DWORD frequency, SizeID size_id ) { mode->dmSize = sizeof(*mode); - mode->dmDriverExtra = full ? sizeof(SizeID) : 0; + mode->dmDriverExtra = sizeof(SizeID); mode->dmFields = DM_DISPLAYORIENTATION | DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT | DM_DISPLAYFLAGS; if (frequency) @@ -255,10 +255,10 @@ static void add_xrandr10_mode( DEVMODEW *mode, DWORD depth, DWORD width, DWORD h mode->dmPelsWidth = width; mode->dmPelsHeight = height; mode->dmDisplayFlags = 0; - if (full) memcpy( mode + 1, &size_id, sizeof(size_id) ); + memcpy( mode + 1, &size_id, sizeof(size_id) ); }
-static BOOL xrandr10_get_modes( x11drv_settings_id id, DWORD flags, DEVMODEW **new_modes, UINT *new_mode_count, BOOL full ) +static BOOL xrandr10_get_modes( x11drv_settings_id id, DWORD flags, DEVMODEW **new_modes, UINT *new_mode_count ) { INT size_idx, depth_idx, rate_idx, mode_idx = 0; INT size_count, rate_count, mode_count = 0; @@ -296,7 +296,7 @@ static BOOL xrandr10_get_modes( x11drv_settings_id id, DWORD flags, DEVMODEW **n if (!rate_count) { add_xrandr10_mode( mode, depths[depth_idx], sizes[size_idx].width, - sizes[size_idx].height, 0, size_idx, full ); + sizes[size_idx].height, 0, size_idx ); mode = NEXT_DEVMODEW( mode ); mode_idx++; continue; @@ -305,7 +305,7 @@ static BOOL xrandr10_get_modes( x11drv_settings_id id, DWORD flags, DEVMODEW **n for (rate_idx = 0; rate_idx < rate_count; ++rate_idx) { add_xrandr10_mode( mode, depths[depth_idx], sizes[size_idx].width, - sizes[size_idx].height, rates[rate_idx], size_idx, full ); + sizes[size_idx].height, rates[rate_idx], size_idx ); mode = NEXT_DEVMODEW( mode ); mode_idx++; } @@ -1331,10 +1331,10 @@ static BOOL xrandr14_get_id( const WCHAR *device_name, BOOL is_primary, x11drv_s }
static void add_xrandr14_mode( DEVMODEW *mode, XRRModeInfo *info, DWORD depth, DWORD frequency, - DWORD orientation, BOOL full ) + DWORD orientation ) { mode->dmSize = sizeof(*mode); - mode->dmDriverExtra = full ? sizeof(RRMode) : 0; + mode->dmDriverExtra = sizeof(RRMode); mode->dmFields = DM_DISPLAYORIENTATION | DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT | DM_DISPLAYFLAGS; if (frequency) @@ -1355,10 +1355,10 @@ static void add_xrandr14_mode( DEVMODEW *mode, XRRModeInfo *info, DWORD depth, D mode->dmDisplayOrientation = orientation; mode->dmBitsPerPel = depth; mode->dmDisplayFlags = 0; - if (full) memcpy( mode + 1, &info->id, sizeof(info->id) ); + memcpy( mode + 1, &info->id, sizeof(info->id) ); }
-static BOOL xrandr14_get_modes( x11drv_settings_id id, DWORD flags, DEVMODEW **new_modes, UINT *mode_count, BOOL full ) +static BOOL xrandr14_get_modes( x11drv_settings_id id, DWORD flags, DEVMODEW **new_modes, UINT *mode_count ) { DWORD frequency, orientation, orientation_count; XRRScreenResources *screen_resources; @@ -1447,7 +1447,7 @@ static BOOL xrandr14_get_modes( x11drv_settings_id id, DWORD flags, DEVMODEW **n if (!((1 << orientation) & rotations)) continue;
- add_xrandr14_mode( mode, mode_info, depths[depth_idx], frequency, orientation, full ); + add_xrandr14_mode( mode, mode_info, depths[depth_idx], frequency, orientation ); mode = NEXT_DEVMODEW( mode ); ++mode_idx; } diff --git a/dlls/winex11.drv/xvidmode.c b/dlls/winex11.drv/xvidmode.c index c333fa4dc7e..7af34689dda 100644 --- a/dlls/winex11.drv/xvidmode.c +++ b/dlls/winex11.drv/xvidmode.c @@ -91,10 +91,12 @@ static BOOL xf86vm_get_id(const WCHAR *device_name, BOOL is_primary, x11drv_sett return TRUE; }
-static void add_xf86vm_mode( DEVMODEW *mode, DWORD depth, const XF86VidModeModeInfo *mode_info, BOOL full ) +static void add_xf86vm_mode( DEVMODEW *mode, DWORD depth, const XF86VidModeModeInfo *mode_info ) { + XF86VidModeModeInfo extra = *mode_info; + mode->dmSize = sizeof(*mode); - mode->dmDriverExtra = full ? sizeof(*mode_info) : 0; + mode->dmDriverExtra = sizeof(*mode_info); mode->dmFields = DM_DISPLAYORIENTATION | DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT | DM_DISPLAYFLAGS; if (mode_info->htotal && mode_info->vtotal) { @@ -106,16 +108,13 @@ static void add_xf86vm_mode( DEVMODEW *mode, DWORD depth, const XF86VidModeModeI mode->dmPelsWidth = mode_info->hdisplay; mode->dmPelsHeight = mode_info->vdisplay; mode->dmDisplayFlags = 0; - if (full) - { - XF86VidModeModeInfo extra = *mode_info; - extra.private = NULL; - extra.privsize = 0; - memcpy( mode + 1, &extra, sizeof(extra) ); - } + + extra.private = NULL; + extra.privsize = 0; + memcpy( mode + 1, &extra, sizeof(extra) ); }
-static BOOL xf86vm_get_modes( x11drv_settings_id id, DWORD flags, DEVMODEW **new_modes, UINT *mode_count, BOOL full ) +static BOOL xf86vm_get_modes( x11drv_settings_id id, DWORD flags, DEVMODEW **new_modes, UINT *mode_count ) { INT xf86vm_mode_idx, xf86vm_mode_count; XF86VidModeModeInfo **xf86vm_modes; @@ -141,7 +140,7 @@ static BOOL xf86vm_get_modes( x11drv_settings_id id, DWORD flags, DEVMODEW **new { for (xf86vm_mode_idx = 0; xf86vm_mode_idx < xf86vm_mode_count; ++xf86vm_mode_idx) { - add_xf86vm_mode( mode, depths[depth_idx], xf86vm_modes[xf86vm_mode_idx], full ); + add_xf86vm_mode( mode, depths[depth_idx], xf86vm_modes[xf86vm_mode_idx] ); mode = NEXT_DEVMODEW( mode ); mode_idx++; }