]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/toplevel.cpp
Fix deprecating warning introduced in r72446.
[wxWidgets.git] / src / gtk / toplevel.cpp
index 21e0d8abcd6bc62874d150b12611b6c91673bdfb..1bcc3ce8e94f80b39cde3679237efbbc634a6ef3 100644 (file)
     #include "wx/app.h"
 #endif
 
-#include "wx/gtk/private.h"
 #include "wx/evtloop.h"
 #include "wx/sysopt.h"
 
 #include <gtk/gtk.h>
 #ifdef GDK_WINDOWING_X11
-#include <gdk/gdkx.h>
+    #include <gdk/gdkx.h>
+    #include <X11/Xatom.h>  // 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 <X11/Xatom.h>
-
-#endif // GDK_WINDOWING_X11
-
 #if wxUSE_LIBHILDON
     #include <hildon-widgets/hildon-program.h>
     #include <hildon-widgets/hildon-window.h>
@@ -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
 }
 
 //-----------------------------------------------------------------------------
@@ -350,13 +354,8 @@ gtk_frame_map_callback( GtkWidget*,
         win->GetEventHandler()->ProcessEvent(eventShow);
     }
 
-#if GTK_CHECK_VERSION(2,6,0)
-    if (!gtk_check_version(2,6,0))
-    {
-        // restore focus-on-map setting in case ShowWithoutActivating() was called
-        gtk_window_set_focus_on_map(GTK_WINDOW(win->m_widget), true);
-    }
-#endif // GTK+ 2.6+
+    // restore focus-on-map setting in case ShowWithoutActivating() was called
+    gtk_window_set_focus_on_map(GTK_WINDOW(win->m_widget), true);
 
     return false;
 }
@@ -393,15 +392,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);
@@ -422,6 +421,7 @@ bool wxGetFrameExtents(GdkWindow* window, int* left, int* right, int* top, int*
 #endif
 }
 
+#ifdef GDK_WINDOWING_X11
 //-----------------------------------------------------------------------------
 // "property_notify_event" from m_widget
 //-----------------------------------------------------------------------------
@@ -470,6 +470,7 @@ static gboolean request_frame_extents_timeout(void* data)
     return false;
 }
 }
+#endif // GDK_WINDOWING_X11
 
 // ----------------------------------------------------------------------------
 // wxTopLevelWindowGTK creation
@@ -615,7 +616,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
@@ -639,9 +640,16 @@ bool wxTopLevelWindowGTK::Create( wxWindow *parent,
     g_signal_connect_after (m_widget, "focus_out_event",
                       G_CALLBACK (gtk_frame_focus_out_callback), this);
 
-    gtk_widget_add_events(m_widget, GDK_PROPERTY_CHANGE_MASK);
-    g_signal_connect(m_widget, "property_notify_event",
-        G_CALLBACK(property_notify_event), this);
+#ifdef GDK_WINDOWING_X11
+#ifdef __WXGTK3__
+    if (GDK_IS_X11_SCREEN(gtk_window_get_screen(GTK_WINDOW(m_widget))))
+#endif
+    {
+        gtk_widget_add_events(m_widget, GDK_PROPERTY_CHANGE_MASK);
+        g_signal_connect(m_widget, "property_notify_event",
+            G_CALLBACK(property_notify_event), this);
+    }
+#endif // GDK_WINDOWING_X11
 
     // translate wx decorations styles into Motif WM hints (they are recognized
     // by other WMs as well)
@@ -757,9 +765,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 +785,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 +806,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 +823,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,
@@ -853,28 +863,22 @@ bool wxTopLevelWindowGTK::Show( bool show )
 {
     wxASSERT_MSG( (m_widget != NULL), wxT("invalid frame") );
 
+#ifdef GDK_WINDOWING_X11
     bool deferShow = show && !m_isShown && m_deferShow;
     if (deferShow)
     {
-        deferShow = gs_requestFrameExtentsStatus != 2 &&
-            m_deferShowAllowed && !gtk_widget_get_realized(m_widget);
-        if (deferShow)
-        {
-            deferShow = g_signal_handler_find(m_widget,
+        deferShow = m_deferShowAllowed && gs_requestFrameExtentsStatus != 2 &&
+            !gtk_widget_get_realized(m_widget) &&
+            g_signal_handler_find(m_widget,
                 GSignalMatchType(G_SIGNAL_MATCH_ID | G_SIGNAL_MATCH_DATA),
                 g_signal_lookup("property_notify_event", GTK_TYPE_WIDGET),
-                0, NULL, NULL, this) != 0;
-        }
-        GdkScreen* screen = NULL;
+                0, NULL, NULL, this);
         if (deferShow)
         {
-#ifdef GDK_WINDOWING_X11
-            screen = gtk_widget_get_screen(m_widget);
+            GdkScreen* screen = gtk_widget_get_screen(m_widget);
             GdkAtom atom = gdk_atom_intern("_NET_REQUEST_FRAME_EXTENTS", false);
             deferShow = gdk_x11_screen_supports_net_wm_hint(screen, atom) != 0;
-#else
-            deferShow = false;
-#endif
+
             // If _NET_REQUEST_FRAME_EXTENTS not supported, don't allow changes
             // to m_decorSize, it breaks saving/restoring window size with
             // GetSize()/SetSize() because it makes window bigger between each
@@ -912,22 +916,20 @@ bool wxTopLevelWindowGTK::Show( bool show )
             gtk_widget_set_allocation(m_widget, &alloc);
         }
 
-#ifdef GDK_WINDOWING_X11
         // send _NET_REQUEST_FRAME_EXTENTS
         XClientMessageEvent xevent;
         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);
-#endif // GDK_WINDOWING_X11
 
         if (gs_requestFrameExtentsStatus == 0)
         {
@@ -941,6 +943,7 @@ bool wxTopLevelWindowGTK::Show( bool show )
         m_isShown = true;
         return true;
     }
+#endif // GDK_WINDOWING_X11
 
     if (show && !gtk_widget_get_realized(m_widget))
     {
@@ -969,11 +972,7 @@ void wxTopLevelWindowGTK::ShowWithoutActivating()
 {
     if (!m_isShown)
     {
-#if GTK_CHECK_VERSION(2,6,0)
-        if (!gtk_check_version(2,6,0))
-            gtk_window_set_focus_on_map(GTK_WINDOW(m_widget), false);
-#endif // GTK+ 2.6+
-
+        gtk_window_set_focus_on_map(GTK_WINDOW(m_widget), false);
         Show(true);
     }
 }
@@ -1023,8 +1022,6 @@ void wxTopLevelWindowGTK::DoSetSize( int x, int y, int width, int height, int si
 {
     wxCHECK_RET( m_widget, wxT("invalid frame") );
 
-    m_deferShowAllowed = true;
-
     // deal with the position first
     int old_x = m_x;
     int old_y = m_y;
@@ -1054,8 +1051,12 @@ 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)
     {
+        m_deferShowAllowed = true;
+
         int w, h;
         GTKDoGetSize(&w, &h);
         gtk_window_resize(GTK_WINDOW(m_widget), w, h);
@@ -1140,6 +1141,7 @@ void wxTopLevelWindowGTK::DoSetSizeHints( int minW, int minH,
         (GtkWindow*)m_widget, NULL, &hints, (GdkWindowHints)hints_mask);
 }
 
+#ifdef GDK_WINDOWING_X11
 void wxTopLevelWindowGTK::GTKUpdateDecorSize(const wxSize& decorSize)
 {
     if (!IsMaximized() && !IsFullScreen())
@@ -1171,8 +1173,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);
         }
@@ -1193,6 +1195,7 @@ void wxTopLevelWindowGTK::GTKUpdateDecorSize(const wxSize& decorSize)
         HandleWindowEvent(showEvent);
     }
 }
+#endif // GDK_WINDOWING_X11
 
 wxSize& wxTopLevelWindowGTK::GetCachedDecorSize()
 {
@@ -1433,6 +1436,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 +1449,7 @@ bool wxTopLevelWindowGTK::CanSetTransparent()
     {
         return false;
     }
+#endif // !__WXGTK3__
 
 #if 0 // Don't be optimistic here for the sake of wxAUI
     int opcode, event, error;