]> git.saurik.com Git - wxWidgets.git/blobdiff - src/unix/displayx11.cpp
Possible crash fix from Ryan (patch #1194315).
[wxWidgets.git] / src / unix / displayx11.cpp
index 0a3a132c67353d5b5250a34c9105dba664354629..4736e995234fc3abec862cb18eca1e4889394e50 100644 (file)
@@ -5,7 +5,7 @@
 // Modified by:
 // Created:     12/05/02
 // RCS-ID:      $Id$
-// Copyright:   (c) wxWindows team
+// Copyright:   (c) wxWidgets team
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
@@ -21,6 +21,7 @@
 #endif
 
 #include "wx/display.h"
+#include "wx/intl.h"
 #include "wx/log.h"
 
 #ifndef WX_PRECOMP
@@ -38,7 +39,9 @@ extern "C" {
   #include <X11/Xlib.h>
   #include <X11/Xlibint.h>
   #include <X11/extensions/Xinerama.h>
+#ifdef HAVE_X11_EXTENSIONS_XF86VMODE_H
   #include <X11/extensions/xf86vmode.h>
+#endif
 }
 
 class wxDisplayUnixPriv
@@ -116,6 +119,7 @@ wxDisplay::wxDisplay(size_t index) : wxDisplayBase ( index ), m_priv( new wxDisp
     XineramaScreenInfo *screenarr;
     int numscreens;
     screenarr = XineramaQueryScreens(disp, &numscreens);
+
     m_priv->m_rect = wxRect(screenarr[index].x_org, screenarr[index].y_org,
                             screenarr[index].width, screenarr[index].height);
     m_priv->m_depth = DefaultDepth(disp, DefaultScreen(disp));
@@ -149,6 +153,9 @@ wxString wxDisplay::GetName() const
   return wxEmptyString;
 }
 
+
+#ifdef HAVE_X11_EXTENSIONS_XF86VMODE_H
+
 //
 //  See (http://www.xfree86.org/4.2.0/XF86VidModeDeleteModeLine.3.html) for more
 //  info about xf86 video mode extensions
@@ -157,7 +164,7 @@ wxString wxDisplay::GetName() const
 //free private data common to x (usually s3) servers
 #define wxClearXVM(vm)  if(vm.privsize) XFree(vm.c_private)
 
-//Correct res rate from GLFW, which probably has the perfect license :)
+// Correct res rate from GLFW
 #define wxCRR2(v,dc) (int) (((1000.0f * (float) dc) /*PIXELS PER SECOND */) / ((float) v.htotal * v.vtotal /*PIXELS PER FRAME*/) + 0.5f)
 #define wxCRR(v) wxCRR2(v,v.dotclock)
 #define wxCVM2(v, dc) wxVideoMode(v.hdisplay, v.vdisplay, DefaultDepth((Display*)wxGetDisplay(), DefaultScreen((Display*)wxGetDisplay())), wxCRR2(v,dc))
@@ -191,7 +198,7 @@ wxArrayVideoModes wxDisplay::GetModes(const wxVideoMode& mode) const
     }
     else //OOPS!
     {
-        wxLogSysError("XF86VidModeGetAllModeLines Failed in wxX11Display::GetModes()!");
+        wxLogSysError(_("Failed to enumerate video modes"));
     }
 
     return Modes;
@@ -209,55 +216,55 @@ wxVideoMode wxDisplay::GetCurrentMode() const
 
 bool wxDisplay::ChangeMode(const wxVideoMode& mode)
 {
-    //This gets kind of tricky AND complicated :) :\ :( :)
+    XF86VidModeModeInfo** ppXModes; //Enumerated Modes (Don't forget XFree() :))
+    int nNumModes; //Number of modes enumerated....
+
+    if( !XF86VidModeGetAllModeLines((Display*)wxGetDisplay(), DefaultScreen((Display*)wxGetDisplay()), &nNumModes, &ppXModes) )
+    {
+        wxLogSysError(_("Failed to change video mode"));
+        return false;
+    }
+
+    bool bRet = false;
+    if (mode == wxDefaultVideoMode)
     {
-        bool bRet = false;
-        //Some variables..
-        XF86VidModeModeInfo** ppXModes; //Enumerated Modes (Don't forget XFree() :))
-        int nNumModes; //Number of modes enumerated....
+        bRet = XF86VidModeSwitchToMode((Display*)wxGetDisplay(), DefaultScreen((Display*)wxGetDisplay()),
+                     ppXModes[0]) == TRUE;
 
-        if(XF86VidModeGetAllModeLines((Display*)wxGetDisplay(), DefaultScreen((Display*)wxGetDisplay()), &nNumModes, &ppXModes) == TRUE)
+        for (int i = 0; i < nNumModes; ++i)
         {
-            if (mode == wxDefaultVideoMode)
+            wxClearXVM((*ppXModes[i]));
+        //  XFree(ppXModes[i]); //supposed to free?
+        }
+    }
+    else
+    {
+        for (int i = 0; i < nNumModes; ++i)
+        {
+            if (!bRet &&
+                ppXModes[i]->hdisplay == mode.w &&
+                ppXModes[i]->vdisplay == mode.h &&
+                wxCRR((*ppXModes[i])) == mode.refresh)
             {
+                //switch!
                 bRet = XF86VidModeSwitchToMode((Display*)wxGetDisplay(), DefaultScreen((Display*)wxGetDisplay()),
-                             ppXModes[0]) == TRUE;
-
-                for (int i = 0; i < nNumModes; ++i)
-                {
-                    wxClearXVM((*ppXModes[i]));
-                //  XFree(ppXModes[i]); //supposed to free?
-                }
-                XFree(ppXModes);
-
-                return bRet;
+                         ppXModes[i]) == TRUE;
             }
-            for (int i = 0; i < nNumModes; ++i)
-            {
-                if (!bRet &&
-                    ppXModes[i]->hdisplay == mode.w &&
-                    ppXModes[i]->vdisplay == mode.h &&
-                    wxCRR((*ppXModes[i])) == mode.refresh)
-                {
-                    //switch!
-                    bRet = XF86VidModeSwitchToMode((Display*)wxGetDisplay(), DefaultScreen((Display*)wxGetDisplay()),
-                             ppXModes[i]) == TRUE;
-                }
-                wxClearXVM((*ppXModes[i]));
-            //  XFree(ppXModes[i]); //supposed to free?
-            }
-            XFree(ppXModes);
-
-            return bRet;
-        }
-        else //OOPS!
-        {
-            wxLogSysError("XF86VidModeGetAllModeLines Failed in wxX11Display::ChangeMode()!");
-            return false;
+            wxClearXVM((*ppXModes[i]));
+        //  XFree(ppXModes[i]); //supposed to free?
         }
     }
-    /*
-    //Brian Victor's patch (X11 can't change bit depth yet), here for reference
+
+    XFree(ppXModes);
+
+    return bRet;
+}
+
+
+#else // !HAVE_X11_EXTENSIONS_XF86VMODE_H
+
+wxArrayVideoModes wxDisplay::GetModes(const wxVideoMode& mode) const
+{
   Display *disp = (Display*)wxGetDisplay();
   int count_return;
   int* depths = XListDepths(disp, 0, &count_return);
@@ -271,8 +278,20 @@ bool wxDisplay::ChangeMode(const wxVideoMode& mode)
     }
   }
   return modes;
-    */
 }
 
-#endif /* wxUSE_DISPLAY */
+wxVideoMode wxDisplay::GetCurrentMode() const
+{
+    // Not implemented
+    return wxVideoMode();
+}
 
+bool wxDisplay::ChangeMode(const wxVideoMode& mode)
+{
+    // Not implemented
+    return false;
+}
+
+#endif // !HAVE_X11_EXTENSIONS_XF86VMODE_H
+
+#endif /* wxUSE_DISPLAY */