]> git.saurik.com Git - wxWidgets.git/blobdiff - src/unix/displayx11.cpp
Don't crash in generic wxDataViewCtrl if selected column is removed.
[wxWidgets.git] / src / unix / displayx11.cpp
index 0aafee0a544be3e7ef84f1eb28896ba6311eb8c3..04c5f86218d81035cfd8b57cc03e96fdc9dc4da8 100644 (file)
 
 #include "wx/display_impl.h"
 
-/* These must be included after the wx files.  Otherwise the Data macro in
- * Xlibint.h conflicts with a function declaration in wx/list.h.  */
-extern "C"
-{
-    #include <X11/Xlib.h>
-    #include <X11/Xlibint.h>
+#ifdef __WXGTK20__
+    #include <gdk/gdk.h>
+    #include <gdk/gdkx.h>
+
+    // define the struct with the same fields as XineramaScreenInfo (except for
+    // screen number which we don't need) but which we can use without
+    // including Xinerama headers
+    struct ScreenInfo
+    {
+       short x_org;
+       short y_org;
+       short width;
+       short height;
+    };
+#else // use raw Xinerama functions
+    /* These must be included after the wx files.  Otherwise the Data macro in
+     * Xlibint.h conflicts with a function declaration in wx/list.h.  */
+    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
-}
+        #include <X11/extensions/Xinerama.h>
+    }
+
+    typedef XineramaScreenInfo ScreenInfo;
+#endif // GTK+/Xinerama
 
 // ----------------------------------------------------------------------------
-// helper class to automatically free XineramaQueryScreens() return value
+// helper class storing information about all screens
 // ----------------------------------------------------------------------------
 
-class ScreensInfo
+// the base class provides access to ScreenInfo array, derived class
+// initializes it using either GTK+ or Xinerama functions
+class ScreensInfoBase
+{
+public:
+    operator const ScreenInfo *() const { return m_screens; }
+
+    unsigned GetCount() const { return static_cast<unsigned>(m_num); }
+
+protected:
+    ScreenInfo *m_screens;
+    int m_num;
+};
+
+#ifdef __WXGTK20__
+
+class ScreensInfo : public ScreensInfoBase
 {
 public:
     ScreensInfo()
     {
-        m_screens = XineramaQueryScreens((Display *)wxGetDisplay(), &m_num);
+        GdkScreen * const screen = gdk_screen_get_default();
+
+        m_num = gdk_screen_get_n_monitors(screen);
+        m_screens = new ScreenInfo[m_num];
+        for ( int i = 0; i < m_num; i++ )
+        {
+            GdkRectangle rect;
+            gdk_screen_get_monitor_geometry(screen, i, &rect);
+            m_screens[i].x_org = rect.x;
+            m_screens[i].y_org = rect.y;
+            m_screens[i].width = rect.width;
+            m_screens[i].height = rect.height;
+        }
     }
 
     ~ScreensInfo()
     {
-        XFree(m_screens);
+        delete [] m_screens;
     }
+};
 
-    operator const XineramaScreenInfo *() const { return m_screens; }
+#else // Xinerama
 
-    unsigned GetCount() const { return static_cast<unsigned>(m_num); }
+class ScreensInfo : public ScreensInfoBase
+{
+public:
+    ScreensInfo()
+    {
+        m_screens = XineramaQueryScreens((Display *)wxGetDisplay(), &m_num);
+    }
 
-private:
-    XineramaScreenInfo *m_screens;
-    int m_num;
+    ~ScreensInfo()
+    {
+        XFree(m_screens);
+    }
 };
 
+#endif // GTK+/Xinerama
+
 // ----------------------------------------------------------------------------
 // display and display factory classes
 // ----------------------------------------------------------------------------
@@ -85,7 +138,7 @@ private:
 class WXDLLEXPORT wxDisplayImplX11 : public wxDisplayImpl
 {
 public:
-    wxDisplayImplX11(unsigned n, const XineramaScreenInfo& info)
+    wxDisplayImplX11(unsigned n, const ScreenInfo& info)
         : wxDisplayImpl(n),
           m_rect(info.x_org, info.y_org, info.width, info.height)
     {
@@ -142,7 +195,7 @@ int wxDisplayFactoryX11::GetFromPoint(const wxPoint& p)
     const unsigned numscreens(screens.GetCount());
     for ( unsigned i = 0; i < numscreens; ++i )
     {
-        const XineramaScreenInfo& s = screens[i];
+        const ScreenInfo& s = screens[i];
         if ( p.x >= s.x_org && p.x < s.x_org + s.width &&
                 p.y >= s.y_org && p.y < s.y_org + s.height )
         {
@@ -166,6 +219,8 @@ wxDisplayImpl *wxDisplayFactoryX11::CreateDisplay(unsigned n)
 
 #ifdef HAVE_X11_EXTENSIONS_XF86VMODE_H
 
+#include <X11/extensions/xf86vmode.h>
+
 //
 //  See (http://www.xfree86.org/4.2.0/XF86VidModeDeleteModeLine.3.html) for more
 //  info about xf86 video mode extensions
@@ -314,19 +369,20 @@ bool wxDisplayImplX11::ChangeMode(const wxVideoMode& WXUNUSED(mode))
 
 /* static */ wxDisplayFactory *wxDisplay::CreateFactory()
 {
-    if ( XineramaIsActive((Display*)wxGetDisplay()) )
-    {
-        return new wxDisplayFactoryX11;
-    }
+    // GTK+ screen functions are always available, no need to check for them
+#ifndef __WXGTK20__
+    if ( !XineramaIsActive((Display*)wxGetDisplay()) )
+        return new wxDisplayFactorySingle;
+#endif
 
-    return new wxDisplayFactorySingle;
+    return new wxDisplayFactoryX11;
 }
 
 #endif /* wxUSE_DISPLAY */
 
 #include "wx/utils.h"
 
-#if wxUSE_LIBHILDON
+#if wxUSE_LIBHILDON || wxUSE_LIBHILDON2
 
 void wxClientDisplayRect(int *x, int *y, int *width, int *height)
 {
@@ -341,7 +397,7 @@ void wxClientDisplayRect(int *x, int *y, int *width, int *height)
         *height = 396;
 }
 
-#else // !wxUSE_LIBHILDON
+#else // !wxUSE_LIBHILDON || !wxUSE_LIBHILDON2
 
 #include "wx/log.h"
 
@@ -366,7 +422,7 @@ private:
 void wxClientDisplayRect(int *x, int *y, int *width, int *height)
 {
     Display * const dpy = wxGetX11Display();
-    wxCHECK_RET( dpy, _T("can't be called before initializing the GUI") );
+    wxCHECK_RET( dpy, wxT("can't be called before initializing the GUI") );
 
     const Atom atomWorkArea = XInternAtom(dpy, "_NET_WORKAREA", True);
     if ( atomWorkArea )
@@ -402,7 +458,7 @@ void wxClientDisplayRect(int *x, int *y, int *width, int *height)
                     format != 32 ||
                         numItems != 4 )
             {
-                wxLogDebug(_T("XGetWindowProperty(\"_NET_WORKAREA\") failed"));
+                wxLogDebug(wxT("XGetWindowProperty(\"_NET_WORKAREA\") failed"));
                 return;
             }