From 3e6aa432295a301c4e59ef1a217ab4cfea6ac5d3 Mon Sep 17 00:00:00 2001 From: Francois Gouget Date: Thu, 22 Feb 2007 12:42:20 +0100 Subject: [PATCH] winex11.drv: Catch and report screen resolution change errors. --- dlls/winex11.drv/desktop.c | 8 +++++--- dlls/winex11.drv/settings.c | 32 +++++++++++++++++++++----------- dlls/winex11.drv/x11drv.h | 8 ++++---- dlls/winex11.drv/xrandr.c | 10 +++++++--- dlls/winex11.drv/xvidmode.c | 3 ++- 5 files changed, 39 insertions(+), 22 deletions(-) diff --git a/dlls/winex11.drv/desktop.c b/dlls/winex11.drv/desktop.c index 88634726b63..7f2756635d2 100644 --- a/dlls/winex11.drv/desktop.c +++ b/dlls/winex11.drv/desktop.c @@ -117,16 +117,18 @@ static int X11DRV_desktop_GetCurrentMode(void) return 0; } -static void X11DRV_desktop_SetCurrentMode(int mode) +static LONG X11DRV_desktop_SetCurrentMode(int mode) { DWORD dwBpp = screen_depth; if (dwBpp == 24) dwBpp = 32; - TRACE("Resizing Wine desktop window to %dx%d\n", dd_modes[mode].dwWidth, dd_modes[mode].dwHeight); - X11DRV_resize_desktop(dd_modes[mode].dwWidth, dd_modes[mode].dwHeight); if (dwBpp != dd_modes[mode].dwBPP) { FIXME("Cannot change screen BPP from %d to %d\n", dwBpp, dd_modes[mode].dwBPP); + return DISP_CHANGE_BADMODE; } + TRACE("Resizing Wine desktop window to %dx%d\n", dd_modes[mode].dwWidth, dd_modes[mode].dwHeight); + X11DRV_resize_desktop(dd_modes[mode].dwWidth, dd_modes[mode].dwHeight); + return DISP_CHANGE_SUCCESSFUL; } /*********************************************************************** diff --git a/dlls/winex11.drv/settings.c b/dlls/winex11.drv/settings.c index 03585ca488c..1965e050b0e 100644 --- a/dlls/winex11.drv/settings.c +++ b/dlls/winex11.drv/settings.c @@ -43,17 +43,17 @@ static const unsigned int depths[] = {8, 16, 32}; /* pointers to functions that actually do the hard stuff */ static int (*pGetCurrentMode)(void); -static void (*pSetCurrentMode)(int mode); +static LONG (*pSetCurrentMode)(int mode); static const char *handler_name; -/* +/* * Set the handlers for resolution changing functions * and initialize the master list of modes */ -LPDDHALMODEINFO X11DRV_Settings_SetHandlers(const char *name, - int (*pNewGCM)(void), - void (*pNewSCM)(int), - unsigned int nmodes, +LPDDHALMODEINFO X11DRV_Settings_SetHandlers(const char *name, + int (*pNewGCM)(void), + LONG (*pNewSCM)(int), + unsigned int nmodes, int reserve_depths) { handler_name = name; @@ -144,9 +144,10 @@ static int X11DRV_nores_GetCurrentMode(void) { return 0; } -static void X11DRV_nores_SetCurrentMode(int mode) +static LONG X11DRV_nores_SetCurrentMode(int mode) { TRACE("Ignoring mode change request\n"); + return DISP_CHANGE_FAILED; } /* default handler only gets the current X desktop resolution */ void X11DRV_Settings_Init(void) @@ -297,7 +298,7 @@ LONG X11DRV_ChangeDisplaySettingsEx( LPCWSTR devname, LPDEVMODEW devmode, /* we have a valid mode */ TRACE("Requested display settings match mode %d (%s)\n", i, handler_name); if (!(flags & CDS_TEST)) - pSetCurrentMode(i); + return pSetCurrentMode(i); return DISP_CHANGE_SUCCESSFUL; } @@ -316,9 +317,18 @@ LONG X11DRV_ChangeDisplaySettingsEx( LPCWSTR devname, LPDEVMODEW devmode, static DWORD PASCAL X11DRV_Settings_SetMode(LPDDHAL_SETMODEDATA data) { TRACE("Mode %d requested by DDHAL (%s)\n", data->dwModeIndex, handler_name); - pSetCurrentMode(data->dwModeIndex); - X11DRV_DDHAL_SwitchMode(data->dwModeIndex, NULL, NULL); - data->ddRVal = DD_OK; + switch (pSetCurrentMode(data->dwModeIndex)) + { + case DISP_CHANGE_SUCCESSFUL: + X11DRV_DDHAL_SwitchMode(data->dwModeIndex, NULL, NULL); + data->ddRVal = DD_OK; + break; + case DISP_CHANGE_BADMODE: + data->ddRVal = DDERR_WRONGMODE; + break; + default: + data->ddRVal = DDERR_UNSUPPORTEDMODE; + } return DDHAL_DRIVER_HANDLED; } int X11DRV_Settings_CreateDriver(LPDDHALINFO info) diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h index dc1d9556443..8f2c9843d0f 100644 --- a/dlls/winex11.drv/x11drv.h +++ b/dlls/winex11.drv/x11drv.h @@ -699,10 +699,10 @@ extern LPDDHALMODEINFO X11DRV_Settings_CreateModes(unsigned int max_modes, int r unsigned int X11DRV_Settings_GetModeCount(void); void X11DRV_Settings_Init(void); extern void X11DRV_Settings_SetDefaultMode(int mode); -LPDDHALMODEINFO X11DRV_Settings_SetHandlers(const char *name, - int (*pNewGCM)(void), - void (*pNewSCM)(int), - unsigned int nmodes, +LPDDHALMODEINFO X11DRV_Settings_SetHandlers(const char *name, + int (*pNewGCM)(void), + LONG (*pNewSCM)(int), + unsigned int nmodes, int reserve_depths); extern void X11DRV_DDHAL_SwitchMode(DWORD dwModeIndex, LPVOID fb_addr, LPVIDMEM fb_mem); diff --git a/dlls/winex11.drv/xrandr.c b/dlls/winex11.drv/xrandr.c index 997fc72f03a..be262dc9f88 100644 --- a/dlls/winex11.drv/xrandr.c +++ b/dlls/winex11.drv/xrandr.c @@ -182,7 +182,7 @@ static int X11DRV_XRandR_GetCurrentMode(void) return res; } -static void X11DRV_XRandR_SetCurrentMode(int mode) +static LONG X11DRV_XRandR_SetCurrentMode(int mode) { SizeID size; Rotation rot; @@ -243,9 +243,13 @@ static void X11DRV_XRandR_SetCurrentMode(int mode) pXRRFreeScreenConfigInfo(sc); wine_tsx11_unlock(); if (stat == RRSetConfigSuccess) + { X11DRV_handle_desktop_resize( dd_modes[mode].dwWidth, dd_modes[mode].dwHeight ); - else - ERR("Resolution change not successful -- perhaps display has changed?\n"); + return DISP_CHANGE_SUCCESSFUL; + } + + ERR("Resolution change not successful -- perhaps display has changed?\n"); + return DISP_CHANGE_FAILED; } void X11DRV_XRandR_Init(void) diff --git a/dlls/winex11.drv/xvidmode.c b/dlls/winex11.drv/xvidmode.c index 30b9324c6ea..3a0363c12cf 100644 --- a/dlls/winex11.drv/xvidmode.c +++ b/dlls/winex11.drv/xvidmode.c @@ -111,7 +111,7 @@ static int X11DRV_XF86VM_GetCurrentMode(void) return 0; } -static void X11DRV_XF86VM_SetCurrentMode(int mode) +static LONG X11DRV_XF86VM_SetCurrentMode(int mode) { DWORD dwBpp = screen_depth; if (dwBpp == 24) dwBpp = 32; @@ -135,6 +135,7 @@ static void X11DRV_XF86VM_SetCurrentMode(int mode) wine_tsx11_unlock(); X11DRV_handle_desktop_resize( real_xf86vm_modes[mode]->hdisplay, real_xf86vm_modes[mode]->vdisplay ); + return DISP_CHANGE_SUCCESSFUL; } void X11DRV_XF86VM_Init(void)