winex11.drv: Catch and report screen resolution change errors.
Francois Gouget
fgouget at codeweavers.com
Wed Feb 7 09:24:34 CST 2007
---
dlls/winex11.drv/desktop.c | 8 +++++---
dlls/winex11.drv/settings.c | 24 +++++++++++++++++-------
dlls/winex11.drv/x11drv.h | 2 +-
dlls/winex11.drv/xrandr.c | 10 +++++++---
dlls/winex11.drv/xvidmode.c | 3 ++-
5 files changed, 32 insertions(+), 15 deletions(-)
diff --git a/dlls/winex11.drv/desktop.c b/dlls/winex11.drv/desktop.c
index 8863472..7f27566 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 03585ca..04fe69e 100644
--- a/dlls/winex11.drv/settings.c
+++ b/dlls/winex11.drv/settings.c
@@ -43,7 +43,7 @@ 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;
/*
@@ -52,7 +52,7 @@ static const char *handler_name;
*/
LPDDHALMODEINFO X11DRV_Settings_SetHandlers(const char *name,
int (*pNewGCM)(void),
- void (*pNewSCM)(int),
+ LONG (*pNewSCM)(int),
unsigned int nmodes,
int reserve_depths)
{
@@ -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 dc1d955..42c297f 100644
--- a/dlls/winex11.drv/x11drv.h
+++ b/dlls/winex11.drv/x11drv.h
@@ -701,7 +701,7 @@ 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),
+ LONG (*pNewSCM)(int),
unsigned int nmodes,
int reserve_depths);
diff --git a/dlls/winex11.drv/xrandr.c b/dlls/winex11.drv/xrandr.c
index 997fc72..be262dc 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 30b9324..3a0363c 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)
--
1.4.4.3
More information about the wine-patches
mailing list