Francois Gouget : winex11.drv: Catch and report screen resolution change errors.

Alexandre Julliard julliard at wine.codeweavers.com
Fri Feb 23 05:28:16 CST 2007


Module: wine
Branch: master
Commit: 3e6aa432295a301c4e59ef1a217ab4cfea6ac5d3
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=3e6aa432295a301c4e59ef1a217ab4cfea6ac5d3

Author: Francois Gouget <fgouget at codeweavers.com>
Date:   Thu Feb 22 12:42:20 2007 +0100

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 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..1965e05 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 dc1d955..8f2c984 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 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)




More information about the wine-cvs mailing list