[gtk+] gtkwindow: Export our custom frame extents
- From: Jasper St. Pierre <jstpierre src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] gtkwindow: Export our custom frame extents
- Date: Tue, 13 Aug 2013 14:39:04 +0000 (UTC)
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]