From 676c8c1d39a6b598fe32443c3517a66464ff8c5a Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Tue, 6 Nov 2007 22:27:15 +0000 Subject: [PATCH] implement wxGetCientDisplayRect() correctly for X11-based ports git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@49697 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- docs/changes.txt | 1 + src/gtk/utilsgtk.cpp | 11 ----- src/gtk1/utilsgtk.cpp | 11 ----- src/motif/utils.cpp | 12 ------ src/unix/displayx11.cpp | 90 +++++++++++++++++++++++++++++++++++++++++ src/x11/utils.cpp | 11 ----- 6 files changed, 91 insertions(+), 45 deletions(-) diff --git a/docs/changes.txt b/docs/changes.txt index da71f63bd3..0235372502 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -196,6 +196,7 @@ All (GUI): - Added wxBG_STYLE_TRANSPARENT background style (Julian Scheid) - Added XRCSIZERITEM() macro for obtaining sizers from XRC (Brian Vanderburg II) - New and improved wxFileCtrl (Diaa Sami and Marcin Wojdyr) +- Implemented wxGetClientDisplayRect() correctly for X11-based ports - Added wxEventBlocker class (Francesco Montorsi). - Added wxFile/DirPickerCtrl::Get/SetFile/DirName() (Francesco Montorsi). - Added wxSizerFlags::Top() and Bottom(). diff --git a/src/gtk/utilsgtk.cpp b/src/gtk/utilsgtk.cpp index 1abdee7f37..1e3df51b02 100644 --- a/src/gtk/utilsgtk.cpp +++ b/src/gtk/utilsgtk.cpp @@ -156,17 +156,6 @@ void wxDisplaySizeMM( int *width, int *height ) if (height) *height = gdk_screen_height_mm(); } -void wxClientDisplayRect(int *x, int *y, int *width, int *height) -{ - // This is supposed to return desktop dimensions minus any window - // manager panels, menus, taskbars, etc. If there is a way to do that - // for this platform please fix this function, otherwise it defaults - // to the entire desktop. - if (x) *x = 0; - if (y) *y = 0; - wxDisplaySize(width, height); -} - void wxGetMousePosition( int* x, int* y ) { gdk_window_get_pointer( (GdkWindow*) NULL, x, y, (GdkModifierType*) NULL ); diff --git a/src/gtk1/utilsgtk.cpp b/src/gtk1/utilsgtk.cpp index 7cd7c37ef9..2612f63f77 100644 --- a/src/gtk1/utilsgtk.cpp +++ b/src/gtk1/utilsgtk.cpp @@ -104,17 +104,6 @@ void wxDisplaySizeMM( int *width, int *height ) if (height) *height = gdk_screen_height_mm(); } -void wxClientDisplayRect(int *x, int *y, int *width, int *height) -{ - // This is supposed to return desktop dimensions minus any window - // manager panels, menus, taskbars, etc. If there is a way to do that - // for this platform please fix this function, otherwise it defaults - // to the entire desktop. - if (x) *x = 0; - if (y) *y = 0; - wxDisplaySize(width, height); -} - void wxGetMousePosition( int* x, int* y ) { gdk_window_get_pointer( (GdkWindow*) NULL, x, y, (GdkModifierType*) NULL ); diff --git a/src/motif/utils.cpp b/src/motif/utils.cpp index 73bbf916ea..35f8c16640 100644 --- a/src/motif/utils.cpp +++ b/src/motif/utils.cpp @@ -205,18 +205,6 @@ void wxDisplaySizeMM(int *width, int *height) *height = DisplayHeightMM(dpy, DefaultScreen (dpy)); } -void wxClientDisplayRect(int *x, int *y, int *width, int *height) -{ - // This is supposed to return desktop dimensions minus any window - // manager panels, menus, taskbars, etc. If there is a way to do that - // for this platform please fix this function, otherwise it defaults - // to the entire desktop. - if (x) *x = 0; - if (y) *y = 0; - wxDisplaySize(width, height); -} - - // Configurable display in wxX11 and wxMotif static WXDisplay *gs_currentDisplay = NULL; static wxString gs_displayName; diff --git a/src/unix/displayx11.cpp b/src/unix/displayx11.cpp index f08b0bdcae..edfd86baca 100644 --- a/src/unix/displayx11.cpp +++ b/src/unix/displayx11.cpp @@ -92,6 +92,14 @@ public: } virtual wxRect GetGeometry() const { return m_rect; } + virtual wxRect GetClientArea() const + { + // we intentionally don't cache the result here because the client + // display area may change (e.g. the user resized or hid a panel) and + // we don't currently react to its changes + return IsPrimary() ? wxGetClientDisplayRect() : m_rect; + } + virtual wxString GetName() const { return wxString(); } virtual wxArrayVideoModes GetModes(const wxVideoMode& mode) const; @@ -315,3 +323,85 @@ bool wxDisplayImplX11::ChangeMode(const wxVideoMode& WXUNUSED(mode)) } #endif /* wxUSE_DISPLAY */ + +#include "wx/utils.h" + +#include + +// TODO: make this a full-fledged class and move to a public header +class wxX11Ptr +{ +public: + wxX11Ptr(void *ptr = NULL) : m_ptr(ptr) { } + ~wxX11Ptr() { if ( m_ptr ) XFree(m_ptr); } + +private: + void *m_ptr; + + DECLARE_NO_COPY_CLASS(wxX11Ptr) +}; + +// NB: this function is implemented using X11 and not GDK calls as it's shared +// by wxGTK[12], wxX11 and wxMotif ports +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") ); + + const Atom atomWorkArea = XInternAtom(dpy, "_NET_WORKAREA", True); + if ( atomWorkArea ) + { + long *workareas = NULL; + unsigned long numItems; + unsigned long bytesRemaining; + Atom actualType; + int format; + + if ( XGetWindowProperty + ( + dpy, + XDefaultRootWindow(dpy), + atomWorkArea, + 0, // offset of data to retrieve + 4, // number of items to retrieve + False, // don't delete property + XA_CARDINAL, // type of the items to get + &actualType, + &format, + &numItems, + &bytesRemaining, + (unsigned char **)&workareas + ) == Success && workareas ) + { + wxX11Ptr x11ptr(workareas); // ensure it will be freed + + if ( actualType != XA_CARDINAL || + format != 32 || // FIXME: what is this 32? + numItems != 4 ) + { + wxLogDebug(_T("XGetWindowProperty(\"_NET_WORKAREA\") failed")); + return; + } + + if ( x ) + *x = workareas[0]; + if ( y ) + *y = workareas[1]; + if ( width ) + *width = workareas[2]; + if ( height ) + *height = workareas[3]; + + return; + } + } + + // 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); +} + diff --git a/src/x11/utils.cpp b/src/x11/utils.cpp index 117e7274b2..0bcfe8818a 100644 --- a/src/x11/utils.cpp +++ b/src/x11/utils.cpp @@ -235,17 +235,6 @@ void wxDisplaySizeMM(int *width, int *height) *height = DisplayHeightMM(dpy, DefaultScreen (dpy)); } -void wxClientDisplayRect(int *x, int *y, int *width, int *height) -{ - // This is supposed to return desktop dimensions minus any window - // manager panels, menus, taskbars, etc. If there is a way to do that - // for this platform please fix this function, otherwise it defaults - // to the entire desktop. - if (x) *x = 0; - if (y) *y = 0; - wxDisplaySize(width, height); -} - wxWindow* wxFindWindowAtPoint(const wxPoint& pt) { return wxGenericFindWindowAtPoint(pt); -- 2.45.2