Use GTK+ functions for wxDisplay implementation.

There is no need to use Xinerama for what GDK can do itself (see #11053).

Also don't check for Xinerama in configure when using wxGTK2.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@64384 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2010-05-22 15:48:59 +00:00
parent e196db7b85
commit bfd62c8c2a
3 changed files with 213 additions and 145 deletions

View File

@@ -39,24 +39,86 @@
#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"
#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
}
typedef XineramaScreenInfo ScreenInfo;
#endif // GTK+/Xinerama
// ----------------------------------------------------------------------------
// helper class storing information about all screens
// ----------------------------------------------------------------------------
// the base class provides access to ScreenInfo array, derived class
// initializes it using either GTK+ or Xinerama functions
class ScreensInfoBase
{
#include <X11/Xlib.h>
#include <X11/Xlibint.h>
public:
operator const ScreenInfo *() const { return m_screens; }
#include <X11/extensions/Xinerama.h>
#ifdef HAVE_X11_EXTENSIONS_XF86VMODE_H
#include <X11/extensions/xf86vmode.h>
#endif
}
unsigned GetCount() const { return static_cast<unsigned>(m_num); }
// ----------------------------------------------------------------------------
// helper class to automatically free XineramaQueryScreens() return value
// ----------------------------------------------------------------------------
protected:
ScreenInfo *m_screens;
int m_num;
};
class ScreensInfo
#ifdef __WXGTK20__
class ScreensInfo : public ScreensInfoBase
{
public:
ScreensInfo()
{
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()
{
delete [] m_screens;
}
};
#else // Xinerama
class ScreensInfo : public ScreensInfoBase
{
public:
ScreensInfo()
@@ -68,16 +130,10 @@ public:
{
XFree(m_screens);
}
operator const XineramaScreenInfo *() const { return m_screens; }
unsigned GetCount() const { return static_cast<unsigned>(m_num); }
private:
XineramaScreenInfo *m_screens;
int m_num;
};
#endif // GTK+/Xinerama
// ----------------------------------------------------------------------------
// display and display factory classes
// ----------------------------------------------------------------------------
@@ -85,7 +141,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 +198,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 )
{
@@ -314,12 +370,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 */