X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/426d19f1391a685de14a71b9fc4339bb929e441a..062dfc9a96dc9e796c53544f41ff92dc47f26e82:/src/unix/displayx11.cpp diff --git a/src/unix/displayx11.cpp b/src/unix/displayx11.cpp index db0f37b899..04c5f86218 100644 --- a/src/unix/displayx11.cpp +++ b/src/unix/displayx11.cpp @@ -39,45 +39,98 @@ #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 - #include +#ifdef __WXGTK20__ + #include + #include + + // 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 + #include - #include - #ifdef HAVE_X11_EXTENSIONS_XF86VMODE_H - #include - #endif -} + #include + } + + 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(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(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 + // // See (http://www.xfree86.org/4.2.0/XF86VidModeDeleteModeLine.3.html) for more // info about xf86 video mode extensions @@ -314,12 +369,13 @@ 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 */