stackswitcher: Inherit from GtkWidget
authorTimm Bäder <mail@baedert.org>
Sat, 12 Oct 2019 16:09:12 +0000 (18:09 +0200)
committerTimm Bäder <mail@baedert.org>
Sat, 12 Oct 2019 16:12:58 +0000 (18:12 +0200)
gtk/gtkshortcutssection.c
gtk/gtkstackswitcher.c
gtk/gtkstackswitcher.h

index c3c758d7eea4b7800af66fbccbd89d4f1a969d8f..677e92d496f0b1262fa8d0cee83c04dbedd54daf 100644 (file)
@@ -20,6 +20,7 @@
 
 #include "gtkshortcutssection.h"
 
+#include "gtkbox.h"
 #include "gtkshortcutsgroup.h"
 #include "gtkbutton.h"
 #include "gtklabel.h"
@@ -429,7 +430,6 @@ gtk_shortcuts_section_init (GtkShortcutsSection *self)
   self->switcher = g_object_new (GTK_TYPE_STACK_SWITCHER,
                                  "halign", GTK_ALIGN_CENTER,
                                  "stack", self->stack,
-                                 "spacing", 12,
                                  "visible", FALSE,
                                  NULL);
 
@@ -563,18 +563,6 @@ gtk_shortcuts_section_filter_groups (GtkShortcutsSection *self)
                           gtk_widget_get_visible (GTK_WIDGET (self->switcher)));
 }
 
-static void
-adjust_page_buttons (GtkWidget *widget,
-                     gpointer   data)
-{
-  GtkWidget *label;
-
-  gtk_style_context_add_class (gtk_widget_get_style_context (widget), "circular");
-
-  label = gtk_bin_get_child (GTK_BIN (widget));
-  gtk_label_set_use_underline (GTK_LABEL (label), TRUE);
-}
-
 static void
 gtk_shortcuts_section_reflow_groups (GtkShortcutsSection *self)
 {
@@ -738,11 +726,26 @@ gtk_shortcuts_section_reflow_groups (GtkShortcutsSection *self)
     }
 
   /* fix up stack switcher */
-  gtk_container_foreach (GTK_CONTAINER (self->switcher), adjust_page_buttons, NULL);
-  gtk_widget_set_visible (GTK_WIDGET (self->switcher), (n_pages > 1));
-  gtk_widget_set_visible (gtk_widget_get_parent (GTK_WIDGET (self->switcher)),
-                          gtk_widget_get_visible (GTK_WIDGET (self->show_all)) ||
-                          gtk_widget_get_visible (GTK_WIDGET (self->switcher)));
+  {
+    GtkWidget *w;
+
+    for (w = gtk_widget_get_first_child (GTK_WIDGET (self->switcher));
+         w != NULL;
+         w = gtk_widget_get_next_sibling (w))
+      {
+        GtkWidget *label;
+
+        gtk_style_context_add_class (gtk_widget_get_style_context (w), "circular");
+
+        label = gtk_bin_get_child (GTK_BIN (w));
+        gtk_label_set_use_underline (GTK_LABEL (label), TRUE);
+      }
+
+    gtk_widget_set_visible (GTK_WIDGET (self->switcher), (n_pages > 1));
+    gtk_widget_set_visible (gtk_widget_get_parent (GTK_WIDGET (self->switcher)),
+                            gtk_widget_get_visible (GTK_WIDGET (self->show_all)) ||
+                            gtk_widget_get_visible (GTK_WIDGET (self->switcher)));
+  }
 
   /* clean up */
   g_list_free (groups);
index 21969f156b2918544985c150490f2429b8d82d9d..00bd50ece56d4623066b1399434b58ffd92f5bbd 100644 (file)
 
 #include "gtkstackswitcher.h"
 
+#include "gtkboxlayout.h"
 #include "gtkdnd.h"
 #include "gtkdragdest.h"
 #include "gtkimage.h"
 #include "gtkintl.h"
 #include "gtklabel.h"
-#include "gtkorientable.h"
 #include "gtkprivate.h"
 #include "gtkradiobutton.h"
 #include "gtkselectionmodel.h"
@@ -71,12 +71,12 @@ typedef struct _GtkStackSwitcherPrivate GtkStackSwitcherPrivate;
 
 struct _GtkStackSwitcher
 {
-  GtkBox widget;
+  GtkWidget parent_instance;
 };
 
 struct _GtkStackSwitcherClass
 {
-  GtkBoxClass parent_class;
+  GtkWidgetClass parent_class;
 };
 
 struct _GtkStackSwitcherPrivate
@@ -93,23 +93,19 @@ enum {
   PROP_STACK
 };
 
-G_DEFINE_TYPE_WITH_PRIVATE (GtkStackSwitcher, gtk_stack_switcher, GTK_TYPE_BOX)
+G_DEFINE_TYPE_WITH_PRIVATE (GtkStackSwitcher, gtk_stack_switcher, GTK_TYPE_WIDGET)
 
 static void
 gtk_stack_switcher_init (GtkStackSwitcher *switcher)
 {
+  GtkStackSwitcherPrivate *priv = gtk_stack_switcher_get_instance_private (switcher);
   GtkStyleContext *context;
-  GtkStackSwitcherPrivate *priv;
-
-  priv = gtk_stack_switcher_get_instance_private (switcher);
 
   priv->buttons = g_hash_table_new_full (g_direct_hash, g_direct_equal, g_object_unref, NULL);
 
   context = gtk_widget_get_style_context (GTK_WIDGET (switcher));
   gtk_style_context_add_class (context, GTK_STYLE_CLASS_LINKED);
 
-  gtk_orientable_set_orientation (GTK_ORIENTABLE (switcher), GTK_ORIENTATION_HORIZONTAL);
-
   gtk_drag_dest_set (GTK_WIDGET (switcher), 0, NULL, 0);
   gtk_drag_dest_set_track_motion (GTK_WIDGET (switcher), TRUE);
 }
@@ -317,7 +313,7 @@ add_child (guint             position,
   page = g_list_model_get_item (G_LIST_MODEL (priv->pages), position);
   update_button (self, page, button);
 
-  gtk_container_add (GTK_CONTAINER (self), button);
+  gtk_widget_set_parent (button, GTK_WIDGET (self));
 
   g_object_set_data (G_OBJECT (button), "child-index", GUINT_TO_POINTER (position));
   selected = gtk_selection_model_is_selected (priv->pages, position);
@@ -352,7 +348,7 @@ clear_switcher (GtkStackSwitcher *self)
   g_hash_table_iter_init (&iter, priv->buttons);
   while (g_hash_table_iter_next (&iter, (gpointer *)&page, (gpointer *)&button))
     {
-      gtk_container_remove (GTK_CONTAINER (self), button);
+      gtk_widget_unparent (button);
       g_signal_handlers_disconnect_by_func (page, on_page_updated, self);
       g_hash_table_iter_remove (&iter);
     }
@@ -576,6 +572,7 @@ gtk_stack_switcher_class_init (GtkStackSwitcherClass *class)
                                                         GTK_PARAM_READWRITE |
                                                         G_PARAM_CONSTRUCT));
 
+  gtk_widget_class_set_layout_manager_type (widget_class, GTK_TYPE_BOX_LAYOUT);
   gtk_widget_class_set_css_name (widget_class, I_("stackswitcher"));
 }
 
index 28922c3e354bb36f1886289e0a89b16936dae825..bb8e5277d8dcda2a1b99d4fdcc57dcf572717119 100644 (file)
@@ -24,7 +24,6 @@
 #error "Only <gtk/gtk.h> can be included directly."
 #endif
 
-#include <gtk/gtkbox.h>
 #include <gtk/gtkstack.h>
 
 G_BEGIN_DECLS