From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winex11.drv/display.c | 14 ++++------- dlls/winex11.drv/x11drv.h | 3 --- dlls/winex11.drv/xrandr.c | 12 ---------- dlls/winex11.drv/xvidmode.c | 47 ++++++++++++++----------------------- 4 files changed, 21 insertions(+), 55 deletions(-)
diff --git a/dlls/winex11.drv/display.c b/dlls/winex11.drv/display.c index f817c599383..5151a68f431 100644 --- a/dlls/winex11.drv/display.c +++ b/dlls/winex11.drv/display.c @@ -90,11 +90,6 @@ static BOOL nores_get_modes( x11drv_settings_id id, DWORD flags, DEVMODEW **new_ return TRUE; }
-static void nores_free_modes(DEVMODEW *modes) -{ - free(modes); -} - static BOOL nores_get_current_mode(x11drv_settings_id id, DEVMODEW *mode) { RECT primary = get_host_primary_monitor_rect(); @@ -140,7 +135,6 @@ void X11DRV_Settings_Init(void) nores_handler.priority = 1; nores_handler.get_id = nores_get_id; nores_handler.get_modes = nores_get_modes; - nores_handler.free_modes = nores_free_modes; nores_handler.get_current_mode = nores_get_current_mode; nores_handler.set_current_mode = nores_set_current_mode; X11DRV_Settings_SetHandler(&nores_handler); @@ -184,18 +178,18 @@ static DEVMODEW *get_full_mode(x11drv_settings_id id, DEVMODEW *dev_mode)
if (!found_mode || mode_idx == mode_count) { - settings_handler.free_modes(modes); + free( modes ); return NULL; }
if (!(full_mode = malloc(sizeof(*found_mode) + found_mode->dmDriverExtra))) { - settings_handler.free_modes(modes); + free( modes ); return NULL; }
memcpy(full_mode, found_mode, sizeof(*found_mode) + found_mode->dmDriverExtra); - settings_handler.free_modes(modes); + free( modes );
full_mode->dmFields |= DM_POSITION; full_mode->dmPosition = dev_mode->dmPosition; @@ -456,7 +450,7 @@ UINT X11DRV_UpdateDisplayDevices( const struct gdi_device_manager *device_manage if (settings_handler.get_modes( settings_id, EDS_ROTATEDMODE, &modes, &mode_count, FALSE )) { device_manager->add_modes( ¤t_mode, mode_count, modes, param ); - settings_handler.free_modes( modes ); + free( modes ); } }
diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h index a71607e9e97..6513dca9468 100644 --- a/dlls/winex11.drv/x11drv.h +++ b/dlls/winex11.drv/x11drv.h @@ -783,9 +783,6 @@ struct x11drv_settings_handler * 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);
- /* free_modes() will be called to free the mode list returned from get_modes() */ - void (*free_modes)(DEVMODEW *modes); - /* get_current_mode() will be called to get the current display mode of the device of id * * Following fields in DEVMODE must be valid: diff --git a/dlls/winex11.drv/xrandr.c b/dlls/winex11.drv/xrandr.c index 979cbc8645f..87bddd07cf5 100644 --- a/dlls/winex11.drv/xrandr.c +++ b/dlls/winex11.drv/xrandr.c @@ -317,11 +317,6 @@ static BOOL xrandr10_get_modes( x11drv_settings_id id, DWORD flags, DEVMODEW **n return TRUE; }
-static void xrandr10_free_modes( DEVMODEW *modes ) -{ - free( modes ); -} - static BOOL xrandr10_get_current_mode( x11drv_settings_id id, DEVMODEW *mode ) { XRRScreenConfiguration *screen_config; @@ -1475,11 +1470,6 @@ done: return ret; }
-static void xrandr14_free_modes( DEVMODEW *modes ) -{ - free( modes ); -} - static BOOL xrandr14_get_current_mode( x11drv_settings_id id, DEVMODEW *mode ) { struct current_mode *mode_ptr = NULL; @@ -1724,7 +1714,6 @@ void X11DRV_XRandR_Init(void) settings_handler.priority = 200; settings_handler.get_id = xrandr10_get_id; settings_handler.get_modes = xrandr10_get_modes; - settings_handler.free_modes = xrandr10_free_modes; settings_handler.get_current_mode = xrandr10_get_current_mode; settings_handler.set_current_mode = xrandr10_set_current_mode; X11DRV_Settings_SetHandler( &settings_handler ); @@ -1782,7 +1771,6 @@ void X11DRV_XRandR_Init(void) settings_handler.priority = 300; settings_handler.get_id = xrandr14_get_id; settings_handler.get_modes = xrandr14_get_modes; - settings_handler.free_modes = xrandr14_free_modes; settings_handler.get_current_mode = xrandr14_get_current_mode; settings_handler.set_current_mode = xrandr14_set_current_mode; X11DRV_Settings_SetHandler( &settings_handler ); diff --git a/dlls/winex11.drv/xvidmode.c b/dlls/winex11.drv/xvidmode.c index f2313d88090..c333fa4dc7e 100644 --- a/dlls/winex11.drv/xvidmode.c +++ b/dlls/winex11.drv/xvidmode.c @@ -94,7 +94,7 @@ static BOOL xf86vm_get_id(const WCHAR *device_name, BOOL is_primary, x11drv_sett static void add_xf86vm_mode( DEVMODEW *mode, DWORD depth, const XF86VidModeModeInfo *mode_info, BOOL full ) { mode->dmSize = sizeof(*mode); - mode->dmDriverExtra = full ? sizeof(mode_info) : 0; + mode->dmDriverExtra = full ? sizeof(*mode_info) : 0; mode->dmFields = DM_DISPLAYORIENTATION | DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT | DM_DISPLAYFLAGS; if (mode_info->htotal && mode_info->vtotal) { @@ -106,7 +106,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) memcpy( mode + 1, &mode_info, sizeof(mode_info) ); + if (full) + { + XF86VidModeModeInfo extra = *mode_info; + 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 ) @@ -115,8 +121,6 @@ static BOOL xf86vm_get_modes( x11drv_settings_id id, DWORD flags, DEVMODEW **new XF86VidModeModeInfo **xf86vm_modes; UINT depth_idx, mode_idx = 0; DEVMODEW *modes, *mode; - SIZE_T size; - BYTE *ptr; Bool ret;
X11DRV_expect_error(gdi_display, XVidModeErrorHandler, NULL); @@ -124,21 +128,15 @@ static BOOL xf86vm_get_modes( x11drv_settings_id id, DWORD flags, DEVMODEW **new if (X11DRV_check_error() || !ret || !xf86vm_mode_count) return FALSE;
- /* Put a XF86VidModeModeInfo ** at the start to store the XF86VidMode modes pointer */ - size = sizeof(XF86VidModeModeInfo **); /* Display modes in different color depth, with a XF86VidModeModeInfo * at the end of each * DEVMODEW as driver private data */ - size += (xf86vm_mode_count * DEPTH_COUNT) * (sizeof(DEVMODEW) + sizeof(XF86VidModeModeInfo *)); - ptr = calloc(1, size); - if (!ptr) + if (!(modes = calloc( 1, (xf86vm_mode_count * DEPTH_COUNT) * (sizeof(DEVMODEW) + sizeof(XF86VidModeModeInfo)) ))) { RtlSetLastWin32Error( ERROR_NOT_ENOUGH_MEMORY ); + XFree( xf86vm_modes ); return FALSE; }
- memcpy(ptr, &xf86vm_modes, sizeof(xf86vm_modes)); - modes = (DEVMODEW *)(ptr + sizeof(xf86vm_modes)); - for (depth_idx = 0, mode = modes; depth_idx < DEPTH_COUNT; ++depth_idx) { for (xf86vm_mode_idx = 0; xf86vm_mode_idx < xf86vm_mode_count; ++xf86vm_mode_idx) @@ -151,20 +149,9 @@ static BOOL xf86vm_get_modes( x11drv_settings_id id, DWORD flags, DEVMODEW **new
*new_modes = modes; *mode_count = mode_idx; - return TRUE; -} - -static void xf86vm_free_modes(DEVMODEW *modes) -{ - XF86VidModeModeInfo **xf86vm_modes;
- if (modes) - { - BYTE *ptr = (BYTE *)modes - sizeof(xf86vm_modes); - memcpy(&xf86vm_modes, ptr, sizeof(xf86vm_modes)); - XFree(xf86vm_modes); - free(ptr); - } + XFree( xf86vm_modes ); + return TRUE; }
static BOOL xf86vm_get_current_mode(x11drv_settings_id id, DEVMODEW *mode) @@ -210,7 +197,7 @@ static BOOL xf86vm_get_current_mode(x11drv_settings_id id, DEVMODEW *mode)
static LONG xf86vm_set_current_mode(x11drv_settings_id id, const DEVMODEW *mode) { - XF86VidModeModeInfo *xf86vm_mode; + XF86VidModeModeInfo xf86vm_mode; Bool ret;
if (id.id != 1) @@ -229,10 +216,11 @@ static LONG xf86vm_set_current_mode(x11drv_settings_id id, const DEVMODEW *mode) WARN("Cannot change screen bit depth from %dbits to %dbits!\n", screen_bpp, mode->dmBitsPerPel);
- assert(mode->dmDriverExtra == sizeof(XF86VidModeModeInfo *)); - memcpy(&xf86vm_mode, (BYTE *)mode + sizeof(*mode), sizeof(xf86vm_mode)); + assert( mode->dmDriverExtra == sizeof(XF86VidModeModeInfo) ); + memcpy( &xf86vm_mode, (BYTE *)mode + sizeof(*mode), sizeof(xf86vm_mode) ); + X11DRV_expect_error(gdi_display, XVidModeErrorHandler, NULL); - ret = pXF86VidModeSwitchToMode(gdi_display, DefaultScreen(gdi_display), xf86vm_mode); + ret = pXF86VidModeSwitchToMode( gdi_display, DefaultScreen(gdi_display), &xf86vm_mode ); if (X11DRV_check_error() || !ret) return DISP_CHANGE_FAILED; #if 0 /* it is said that SetViewPort causes problems with some X servers */ @@ -307,7 +295,6 @@ void X11DRV_XF86VM_Init(void) xf86vm_handler.priority = 100; xf86vm_handler.get_id = xf86vm_get_id; xf86vm_handler.get_modes = xf86vm_get_modes; - xf86vm_handler.free_modes = xf86vm_free_modes; xf86vm_handler.get_current_mode = xf86vm_get_current_mode; xf86vm_handler.set_current_mode = xf86vm_set_current_mode; X11DRV_Settings_SetHandler(&xf86vm_handler);