X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/8f71e657f32c352ce11d05902bbd60f428249687..7d6a4d96961eac84d05db8bb24c64d39003f6e54:/src/gtk/toplevel.cpp diff --git a/src/gtk/toplevel.cpp b/src/gtk/toplevel.cpp index 21e0d8abcd..c394556271 100644 --- a/src/gtk/toplevel.cpp +++ b/src/gtk/toplevel.cpp @@ -31,26 +31,20 @@ #include "wx/app.h" #endif -#include "wx/gtk/private.h" #include "wx/evtloop.h" #include "wx/sysopt.h" #include #ifdef GDK_WINDOWING_X11 -#include + #include + #include // XA_CARDINAL + #include "wx/unix/utilsx11.h" #endif +#include "wx/gtk/private.h" +#include "wx/gtk/private/gtk2-compat.h" #include "wx/gtk/private/win_gtk.h" -#ifdef GDK_WINDOWING_X11 - -#include "wx/unix/utilsx11.h" - -// XA_CARDINAL -#include - -#endif // GDK_WINDOWING_X11 - #if wxUSE_LIBHILDON #include #include @@ -86,7 +80,7 @@ static int gs_requestFrameExtentsStatus; // RequestUserAttention related functions //----------------------------------------------------------------------------- -#ifndef __WXGTK30__ +#ifndef __WXGTK3__ static void wxgtk_window_set_urgency_hint (GtkWindow *win, gboolean setting) { @@ -310,7 +304,7 @@ void wxTopLevelWindowGTK::GTKHandleRealized() // GTK's shrinking/growing policy if ( !(m_gdkFunc & GDK_FUNC_RESIZE) ) gtk_window_set_resizable(GTK_WINDOW(m_widget), FALSE); -#if !GTK_CHECK_VERSION(3,0,0) && !defined(GTK_DISABLE_DEPRECATED) +#ifndef __WXGTK3__ else gtk_window_set_policy(GTK_WINDOW(m_widget), 1, 1, 1); #endif @@ -318,6 +312,16 @@ void wxTopLevelWindowGTK::GTKHandleRealized() const wxIconBundle& icons = GetIcons(); if (icons.GetIconCount()) SetIcons(icons); + +#ifdef __WXGTK3__ + if (gtk_window_get_has_resize_grip(GTK_WINDOW(m_widget))) + { + // Grip window can end up obscured, probably due to deferred show. + // Reset grip to ensure it is visible. + gtk_window_set_has_resize_grip(GTK_WINDOW(m_widget), false); + gtk_window_set_has_resize_grip(GTK_WINDOW(m_widget), true); + } +#endif } //----------------------------------------------------------------------------- @@ -351,7 +355,9 @@ gtk_frame_map_callback( GtkWidget*, } #if GTK_CHECK_VERSION(2,6,0) +#ifndef __WXGTK3__ if (!gtk_check_version(2,6,0)) +#endif { // restore focus-on-map setting in case ShowWithoutActivating() was called gtk_window_set_focus_on_map(GTK_WINDOW(win->m_widget), true); @@ -393,15 +399,15 @@ bool wxGetFrameExtents(GdkWindow* window, int* left, int* right, int* top, int* { #ifdef GDK_WINDOWING_X11 static GdkAtom property = gdk_atom_intern("_NET_FRAME_EXTENTS", false); - Atom xproperty = gdk_x11_atom_to_xatom_for_display( - gdk_drawable_get_display(window), property); + GdkDisplay* display = gdk_window_get_display(window); + Atom xproperty = gdk_x11_atom_to_xatom_for_display(display, property); Atom type; int format; gulong nitems, bytes_after; guchar* data; Status status = XGetWindowProperty( - gdk_x11_drawable_get_xdisplay(window), - gdk_x11_drawable_get_xid(window), + GDK_DISPLAY_XDISPLAY(display), + GDK_WINDOW_XID(window), xproperty, 0, 4, false, XA_CARDINAL, &type, &format, &nitems, &bytes_after, &data); @@ -615,7 +621,7 @@ bool wxTopLevelWindowGTK::Create( wxWindow *parent, PostCreation(); -#if !GTK_CHECK_VERSION(3,0,0) && !defined(GTK_DISABLE_DEPRECATED) +#ifndef __WXGTK3__ if ((m_x != -1) || (m_y != -1)) gtk_widget_set_uposition( m_widget, m_x, m_y ); #endif @@ -757,9 +763,9 @@ bool wxTopLevelWindowGTK::ShowFullScreen(bool show, long) m_fsIsShowing = show; #ifdef GDK_WINDOWING_X11 - wxX11FullScreenMethod method = - wxGetFullScreenMethodX11((WXDisplay*)GDK_DISPLAY(), - (WXWindow)GDK_ROOT_WINDOW()); + Display* xdpy = GDK_DISPLAY_XDISPLAY(gtk_widget_get_display(m_widget)); + Window xroot = GDK_WINDOW_XID(gtk_widget_get_root_window(m_widget)); + wxX11FullScreenMethod method = wxGetFullScreenMethodX11(xdpy, (WXWindow)xroot); // NB: gtk_window_fullscreen() uses freedesktop.org's WMspec extensions // to switch to fullscreen, which is not always available. We must @@ -777,14 +783,16 @@ bool wxTopLevelWindowGTK::ShowFullScreen(bool show, long) else { GdkWindow* window = gtk_widget_get_window(m_widget); + Window xid = GDK_WINDOW_XID(window); if (show) { GetPosition( &m_fsSaveFrame.x, &m_fsSaveFrame.y ); GetSize( &m_fsSaveFrame.width, &m_fsSaveFrame.height ); - int screen_width,screen_height; - wxDisplaySize( &screen_width, &screen_height ); + GdkScreen* screen = gtk_widget_get_screen(m_widget); + const int screen_width = gdk_screen_get_width(screen); + const int screen_height = gdk_screen_get_height(screen); gint client_x, client_y, root_x, root_y; gint width, height; @@ -796,14 +804,14 @@ bool wxTopLevelWindowGTK::ShowFullScreen(bool show, long) gdk_window_set_functions(window, (GdkWMFunction)0); gdk_window_get_origin(window, &root_x, &root_y); - gdk_window_get_geometry(window, &client_x, &client_y, &width, &height, NULL); + gdk_window_get_geometry(window, &client_x, &client_y, &width, &height); gdk_window_move_resize( window, -client_x, -client_y, screen_width + 1, screen_height + 1); - wxSetFullScreenStateX11((WXDisplay*)GDK_DISPLAY(), - (WXWindow)GDK_ROOT_WINDOW(), - (WXWindow)GDK_WINDOW_XWINDOW(window), + wxSetFullScreenStateX11(xdpy, + (WXWindow)xroot, + (WXWindow)xid, show, &m_fsSaveFrame, method); } else // hide @@ -813,9 +821,9 @@ bool wxTopLevelWindowGTK::ShowFullScreen(bool show, long) gdk_window_set_decorations(window, (GdkWMDecoration)m_gdkDecor); gdk_window_set_functions(window, (GdkWMFunction)m_gdkFunc); - wxSetFullScreenStateX11((WXDisplay*)GDK_DISPLAY(), - (WXWindow)GDK_ROOT_WINDOW(), - (WXWindow)GDK_WINDOW_XWINDOW(window), + wxSetFullScreenStateX11(xdpy, + (WXWindow)xroot, + (WXWindow)xid, show, &m_fsSaveFrame, method); SetSize(m_fsSaveFrame.x, m_fsSaveFrame.y, @@ -918,12 +926,12 @@ bool wxTopLevelWindowGTK::Show( bool show ) memset(&xevent, 0, sizeof(xevent)); xevent.type = ClientMessage; GdkWindow* window = gtk_widget_get_window(m_widget); - xevent.window = gdk_x11_drawable_get_xid(window); + xevent.window = GDK_WINDOW_XID(window); xevent.message_type = gdk_x11_atom_to_xatom_for_display( - gdk_drawable_get_display(window), + gdk_window_get_display(window), gdk_atom_intern("_NET_REQUEST_FRAME_EXTENTS", false)); xevent.format = 32; - Display* display = gdk_x11_drawable_get_xdisplay(window); + Display* display = GDK_DISPLAY_XDISPLAY(gdk_window_get_display(window)); XSendEvent(display, DefaultRootWindow(display), false, SubstructureNotifyMask | SubstructureRedirectMask, (XEvent*)&xevent); @@ -970,7 +978,9 @@ void wxTopLevelWindowGTK::ShowWithoutActivating() if (!m_isShown) { #if GTK_CHECK_VERSION(2,6,0) +#ifndef __WXGTK3__ if (!gtk_check_version(2,6,0)) +#endif gtk_window_set_focus_on_map(GTK_WINDOW(m_widget), false); #endif // GTK+ 2.6+ @@ -1054,6 +1064,8 @@ void wxTopLevelWindowGTK::DoSetSize( int x, int y, int width, int height, int si if (height >= 0) m_height = height; ConstrainSize(); + if (m_width < 1) m_width = 1; + if (m_height < 1) m_height = 1; if (m_width != oldSize.x || m_height != oldSize.y) { int w, h; @@ -1171,8 +1183,8 @@ void wxTopLevelWindowGTK::GTKUpdateDecorSize(const wxSize& decorSize) // adjust overall size to match change in frame extents m_width += diff.x; m_height += diff.y; - if (m_width < 0) m_width = 0; - if (m_height < 0) m_height = 0; + if (m_width < 1) m_width = 1; + if (m_height < 1) m_height = 1; m_oldClientWidth = 0; gtk_widget_queue_resize(m_wxwindow); } @@ -1433,6 +1445,9 @@ bool wxTopLevelWindowGTK::CanSetTransparent() return wxSystemOptions::GetOptionInt(SYSOPT_TRANSPARENT) != 0; } +#ifdef __WXGTK3__ + return gtk_widget_is_composited(m_widget) != 0; +#else #if GTK_CHECK_VERSION(2,10,0) if (!gtk_check_version(2,10,0)) { @@ -1443,6 +1458,7 @@ bool wxTopLevelWindowGTK::CanSetTransparent() { return false; } +#endif // !__WXGTK3__ #if 0 // Don't be optimistic here for the sake of wxAUI int opcode, event, error;