diff options
author | Matthias Clasen <mclasen@redhat.com> | 2014-04-26 02:14:15 -0400 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2014-10-22 17:22:04 -0400 |
commit | 6c613562965665731b749f8d5efa912bb6d30629 (patch) | |
tree | 557d7249cf57040b8be090df11d3af9a0eda2323 | |
parent | 39ad83f7c4e9a103eb099ab35232e5237f321051 (diff) | |
download | glade-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.c | 135 | ||||
-rw-r--r-- | plugins/gtk+/gtk+.xml.in | 11 |
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"/> |