[gtk+] gtkwindow: Export our custom frame extents



commit 8818d8a19b1da6a0d22ecebb4008b44c8465bf19
Author: Jasper St. Pierre <jstpierre mecheye net>
Date:   Thu Aug 8 16:29:02 2013 -0400

    gtkwindow: Export our custom frame extents
    
    This allows CSD windows to be maximized, tiled, and constrained
    properly.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=705765

 gdk/x11/gdkwindow-x11.c |   39 +++++++++++++++++++++++++++++++++++++++
 gdk/x11/gdkx11window.h  |    6 ++++++
 gtk/gtkwindow.c         |   21 +++++++++++++++++++++
 3 files changed, 66 insertions(+), 0 deletions(-)
---
diff --git a/gdk/x11/gdkwindow-x11.c b/gdk/x11/gdkwindow-x11.c
index 7a99d30..d4ce45c 100644
--- a/gdk/x11/gdkwindow-x11.c
+++ b/gdk/x11/gdkwindow-x11.c
@@ -3602,6 +3602,45 @@ gdk_x11_window_set_hide_titlebar_when_maximized (GdkWindow *window,
 }
 
 /**
+ * gdk_x11_window_set_frame_extents:
+ * @window: (type GdkX11Window): a #GdkWindow
+ * @left: The left extent
+ * @right: The right extent
+ * @top: The top extent
+ * @bottom: The bottom extent
+ *
+ * Newer GTK+ windows using client-side decorations use extra geometry
+ * around their frames for effects like shadows and invisible borders.
+ * Window managers that want to maximize windows or snap to edges need
+ * to know where the extents of the actual frame lie, so that users
+ * don't feel like windows are snapping against random invisible edges.
+ *
+ * Note that this property is automatically updated by GTK+, so this
+ * function should only be used by applications which do not use GTK+
+ * to create toplevel windows.
+ *
+ * Since: 3.10
+ */
+void
+gdk_x11_window_set_frame_extents (GdkWindow *window,
+                                  int        left,
+                                  int        right,
+                                  int        top,
+                                  int        bottom)
+{
+  Atom frame_extents;
+  gulong data[4] = { left, right, top, bottom };
+
+  frame_extents = gdk_x11_get_xatom_by_name_for_display (gdk_window_get_display (window),
+                                                         "_GTK_FRAME_EXTENTS");
+  XChangeProperty (GDK_WINDOW_XDISPLAY (window),
+                   GDK_WINDOW_XID (window),
+                   frame_extents, XA_CARDINAL,
+                   32, PropModeReplace,
+                   (guchar *) &data, 4);
+}
+
+/**
  * gdk_x11_window_set_theme_variant:
  * @window: (type GdkX11Window): a #GdkWindow
  * @variant: the theme variant to export
diff --git a/gdk/x11/gdkx11window.h b/gdk/x11/gdkx11window.h
index 1503402..24bb853 100644
--- a/gdk/x11/gdkx11window.h
+++ b/gdk/x11/gdkx11window.h
@@ -65,6 +65,12 @@ void     gdk_x11_window_set_utf8_property    (GdkWindow *window,
 GDK_AVAILABLE_IN_3_2
 void     gdk_x11_window_set_theme_variant (GdkWindow   *window,
                                            char        *variant);
+GDK_AVAILABLE_IN_3_10
+void     gdk_x11_window_set_frame_extents (GdkWindow *window,
+                                           int        left,
+                                           int        right,
+                                           int        top,
+                                           int        bottom);
 GDK_AVAILABLE_IN_3_4
 void     gdk_x11_window_set_hide_titlebar_when_maximized (GdkWindow *window,
                                                           gboolean   hide_titlebar_when_maximized);
diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c
index eb5fc18..a0c0cc6 100644
--- a/gtk/gtkwindow.c
+++ b/gtk/gtkwindow.c
@@ -6390,6 +6390,24 @@ update_border_windows (GtkWindow *window)
     }
 }
 
+static void
+update_frame_extents (GtkWindow *window,
+                      GtkBorder *border)
+{
+#ifdef GDK_WINDOWING_X11
+  GdkWindow *gdk_window;
+
+  gdk_window = gtk_widget_get_window (GTK_WIDGET (window));
+
+  if (GDK_IS_X11_WINDOW (gdk_window))
+    gdk_x11_window_set_frame_extents (gdk_window,
+                                      border->left,
+                                      border->right,
+                                      border->top,
+                                      border->bottom);
+#endif
+}
+
 /* _gtk_window_set_allocation:
  * @window: a #GtkWindow
  * @allocation: the original allocation for the window
@@ -6435,6 +6453,9 @@ _gtk_window_set_allocation (GtkWindow           *window,
 
   priv->title_height = 0;
 
+  if (priv->client_decorated)
+    update_frame_extents (window, &window_border);
+
   if (priv->title_box != NULL &&
       priv->decorated &&
       !priv->fullscreen)


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]