summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2014-04-26 02:14:15 -0400
committerMatthias Clasen <mclasen@redhat.com>2014-10-22 17:22:04 -0400
commit6c613562965665731b749f8d5efa912bb6d30629 (patch)
tree557d7249cf57040b8be090df11d3af9a0eda2323
parent39ad83f7c4e9a103eb099ab35232e5237f321051 (diff)
downloadglade-6c613562965665731b749f8d5efa912bb6d30629.tar.gz
Support CSD windows
This patch adds support for the titlebar slot in GtkWindow. The rendering of windows with csd titlebar is somewhat broken in glade. https://bugzilla.gnome.org/show_bug.cgi?id=700914
-rw-r--r--plugins/gtk+/glade-gtk-window.c135
-rw-r--r--plugins/gtk+/gtk+.xml.in11
2 files changed, 146 insertions, 0 deletions
diff --git a/plugins/gtk+/glade-gtk-window.c b/plugins/gtk+/glade-gtk-window.c
index 8b3767e3..3e1d2b7e 100644
--- a/plugins/gtk+/glade-gtk-window.c
+++ b/plugins/gtk+/glade-gtk-window.c
@@ -36,6 +36,49 @@
#define GLADE_TAG_ACCEL_GROUPS "accel-groups"
#define GLADE_TAG_ACCEL_GROUP "group"
+#if !GTK_CHECK_VERSION (3,15,0)
+static void check_titlebar (GtkWidget *widget, gpointer data)
+{
+ GtkWidget **titlebar = data;
+ if (gtk_style_context_has_class (gtk_widget_get_style_context (widget), "titlebar"))
+ *titlebar = widget;
+}
+
+static GtkWidget *
+gtk_window_get_titlebar (GtkWindow *window)
+{
+ GtkWidget *titlebar = NULL;
+ gtk_container_forall (GTK_CONTAINER (window), check_titlebar, &titlebar);
+ return titlebar;
+}
+#endif
+
+static void
+glade_gtk_window_parse_finished (GladeProject * project, GObject * object)
+{
+ glade_widget_property_set (glade_widget_get_from_gobject (object),
+ "use-csd", gtk_window_get_titlebar(GTK_WINDOW (object)) != NULL);
+}
+
+void
+glade_gtk_window_post_create (GladeWidgetAdaptor * adaptor,
+ GObject * object, GladeCreateReason reason)
+{
+ GladeWidget *parent = glade_widget_get_from_gobject (object);
+ GladeProject *project = glade_widget_get_project (parent);
+
+ if (reason == GLADE_CREATE_LOAD)
+ {
+ g_signal_connect (project, "parse-finished",
+ G_CALLBACK (glade_gtk_window_parse_finished),
+ object);
+ }
+ else if (reason == GLADE_CREATE_USER)
+ {
+ gtk_container_add (GTK_CONTAINER (object), glade_placeholder_new ());
+ }
+}
+
static void
glade_gtk_window_read_accel_groups (GladeWidget * widget, GladeXmlNode * node)
{
@@ -205,6 +248,98 @@ glade_gtk_window_set_property (GladeWidgetAdaptor * adaptor,
else
glade_widget_property_set_sensitive (gwidget, "icon", TRUE, NULL);
}
+ else if (!strcmp (id, "use-csd"))
+ {
+ if (g_value_get_boolean (value))
+ {
+ GtkWidget *titlebar;
+
+ titlebar = gtk_window_get_titlebar (GTK_WINDOW (object));
+ if (!titlebar)
+ titlebar = glade_placeholder_new ();
+ g_object_set_data (G_OBJECT (titlebar), "special-child-type", "titlebar");
+ gtk_window_set_titlebar (GTK_WINDOW (object), titlebar);
+ }
+ else
+ gtk_window_set_titlebar (GTK_WINDOW (object), NULL);
+ }
else
GWA_GET_CLASS (GTK_TYPE_CONTAINER)->set_property (adaptor, object, id, value);
}
+
+void
+glade_gtk_window_replace_child (GladeWidgetAdaptor * adaptor,
+ GtkWidget * container,
+ GtkWidget * current, GtkWidget * new_widget)
+{
+ gchar *special_child_type;
+
+ special_child_type = g_object_get_data (G_OBJECT (current), "special-child-type");
+
+ if (special_child_type && !strcmp (special_child_type, "titlebar"))
+ {
+ g_object_set_data (G_OBJECT (new_widget), "special-child-type", "titlebar");
+ gtk_window_set_titlebar (GTK_WINDOW (container), new_widget);
+ return;
+ }
+
+ /* Chain Up */
+ GWA_GET_CLASS
+ (GTK_TYPE_CONTAINER)->replace_child (adaptor,
+ G_OBJECT (container),
+ G_OBJECT (current),
+ G_OBJECT (new_widget));
+}
+
+void
+glade_gtk_window_add_child (GladeWidgetAdaptor * adaptor,
+ GObject * object, GObject * child)
+{
+ GtkWidget *bin_child;
+ gchar *special_child_type;
+
+ special_child_type = g_object_get_data (child, "special-child-type");
+
+ if (special_child_type && !strcmp (special_child_type, "titlebar"))
+ {
+ gtk_window_set_titlebar (GTK_WINDOW (object), GTK_WIDGET (child));
+ }
+ else
+ {
+ /* Get a placeholder out of the way before adding the child */
+ bin_child = gtk_bin_get_child (GTK_BIN (object));
+ if (bin_child)
+ {
+ if (GLADE_IS_PLACEHOLDER (bin_child))
+ gtk_container_remove (GTK_CONTAINER (object), bin_child);
+ else
+ {
+ g_critical ("Cant add more than one widget to a GtkWindow");
+ return;
+ }
+ }
+ gtk_container_add (GTK_CONTAINER (object), GTK_WIDGET (child));
+ }
+
+}
+
+void
+glade_gtk_window_remove_child (GladeWidgetAdaptor * adaptor,
+ GObject * object, GObject * child)
+{
+ gchar *special_child_type;
+ GtkWidget *placeholder;
+
+ placeholder = glade_placeholder_new ();
+ special_child_type = g_object_get_data (child, "special-child-type");
+ if (special_child_type && !strcmp (special_child_type, "titlebar"))
+ {
+ g_object_set_data (G_OBJECT (placeholder), "special-child-type", "titlebar");
+ gtk_window_set_titlebar (GTK_WINDOW (object), placeholder);
+ }
+ else
+ {
+ gtk_container_remove (GTK_CONTAINER (object), GTK_WIDGET (child));
+ gtk_container_add (GTK_CONTAINER (object), placeholder);
+ }
+}
diff --git a/plugins/gtk+/gtk+.xml.in b/plugins/gtk+/gtk+.xml.in
index bf5b0067..4608f88b 100644
--- a/plugins/gtk+/gtk+.xml.in
+++ b/plugins/gtk+/gtk+.xml.in
@@ -686,10 +686,15 @@
</glade-widget-class>
<glade-widget-class name="GtkWindow" generic-name="window" _title="Window" toplevel="True" default-width="440" default-height="250">
+ <post-create-function>glade_gtk_window_post_create</post-create-function>
<read-widget-function>glade_gtk_window_read_widget</read-widget-function>
<write-widget-function>glade_gtk_window_write_widget</write-widget-function>
<create-editable-function>glade_gtk_window_create_editable</create-editable-function>
<set-property-function>glade_gtk_window_set_property</set-property-function>
+ <add-child-function>glade_gtk_window_add_child</add-child-function>
+ <remove-child-function>glade_gtk_window_remove_child</remove-child-function>
+ <replace-child-function>glade_gtk_window_replace_child</replace-child-function>
+ <special-child-type>type</special-child-type>
<properties>
<!-- Virtual accel-groups property to record accel groups -->
@@ -700,6 +705,12 @@
</parameter-spec>
<_tooltip>A list of accel groups to be added to this window</_tooltip>
</property>
+ <!-- Virtual csd mode property -->
+ <property id="use-csd" name="CSD" visible="True" save="False">
+ <parameter-spec>
+ <type>GParamBoolean</type>
+ </parameter-spec>
+ </property>
<property id="attached-to" since="3.4" ignore="True" custom-layout="True"/>
<property id="startup-id" since="2.12" custom-layout="True"/>
<property id="deletable" since="2.10" custom-layout="True"/>