X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/bfd62c8c2a9c982fc0b07e3081673d87050fa12f..ad653fa23069c5d9378247084f03c9a718c3ad62:/src/unix/displayx11.cpp diff --git a/src/unix/displayx11.cpp b/src/unix/displayx11.cpp index a6c294d5e2..fa51f6707e 100644 --- a/src/unix/displayx11.cpp +++ b/src/unix/displayx11.cpp @@ -62,9 +62,6 @@ #include #include - #ifdef HAVE_X11_EXTENSIONS_XF86VMODE_H - #include - #endif } typedef XineramaScreenInfo ScreenInfo; @@ -222,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 @@ -383,7 +382,7 @@ bool wxDisplayImplX11::ChangeMode(const wxVideoMode& WXUNUSED(mode)) #include "wx/utils.h" -#if wxUSE_LIBHILDON || wxUSE_LIBHILDON2 +#if wxUSE_LIBHILDON || wxUSE_LIBHILDON2 || !defined(GDK_WINDOWING_X11) void wxClientDisplayRect(int *x, int *y, int *width, int *height) { @@ -425,6 +424,8 @@ void wxClientDisplayRect(int *x, int *y, int *width, int *height) Display * const dpy = wxGetX11Display(); wxCHECK_RET( dpy, wxT("can't be called before initializing the GUI") ); + wxRect rectClient; + const Atom atomWorkArea = XInternAtom(dpy, "_NET_WORKAREA", True); if ( atomWorkArea ) { @@ -460,29 +461,46 @@ void wxClientDisplayRect(int *x, int *y, int *width, int *height) numItems != 4 ) { wxLogDebug(wxT("XGetWindowProperty(\"_NET_WORKAREA\") failed")); - return; } + else + { + rectClient = wxRect(workareas[0], workareas[1], + workareas[2], workareas[3]); + } + } + } - if ( x ) - *x = workareas[0]; - if ( y ) - *y = workareas[1]; - if ( width ) - *width = workareas[2]; - if ( height ) - *height = workareas[3]; + // Although _NET_WORKAREA is supposed to return the client size of the + // screen, not all implementations are conforming, apparently, see #14419, + // so make sure we return a subset of the primary display. + wxRect rectFull; +#if wxUSE_DISPLAY + ScreensInfo screens; + const ScreenInfo& info = screens[0]; + rectFull = wxRect(info.x_org, info.y_org, info.width, info.height); +#else + wxDisplaySize(&rectFull.width, &rectFull.height); +#endif - return; - } + if ( !rectClient.width || !rectClient.height ) + { + // _NET_WORKAREA not available or didn't work, fall back to the total + // display size. + rectClient = rectFull; + } + else + { + rectClient = rectClient.Intersect(rectFull); } - // if we get here, _NET_WORKAREA is not supported so return the entire - // screen size as fall back - if (x) - *x = 0; - if (y) - *y = 0; - wxDisplaySize(width, height); + if ( x ) + *x = rectClient.x; + if ( y ) + *y = rectClient.y; + if ( width ) + *width = rectClient.width; + if ( height ) + *height = rectClient.height; } #endif // wxUSE_LIBHILDON/!wxUSE_LIBHILDON