summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaximiliano Sandoval R <msandova@gnome.org>2021-10-11 00:38:36 +0200
committerDavid King <amigadave@amigadave.com>2022-03-28 17:11:49 +0100
commitc1fa528be74d57429b4892017f2ec2432e042df6 (patch)
tree1803a6665a28e1ef8277b846b8a26da72c551c15
parent509bb76fe67f8de0f77afad03dc653bc5cf939bd (diff)
downloadgnome-logs-c1fa528be74d57429b4892017f2ec2432e042df6.tar.gz
categorylist: Subclass from GtkWidget
ListBox is a final class in GTK 4.
-rw-r--r--data/gl-categorylist.ui1
-rw-r--r--src/gl-categorylist.c44
-rw-r--r--src/gl-categorylist.h4
3 files changed, 35 insertions, 14 deletions
diff --git a/data/gl-categorylist.ui b/data/gl-categorylist.ui
index 1790bb5..9c79dde 100644
--- a/data/gl-categorylist.ui
+++ b/data/gl-categorylist.ui
@@ -5,7 +5,6 @@
<object class="GtkListBox" id="list_box">
<property name="selection-mode">browse</property>
<property name="visible">True</property>
- <signal name="row-selected" handler="on_gl_category_list_row_selected" />
<child>
<object class="GtkListBoxRow" id="important">
<property name="visible">True</property>
diff --git a/src/gl-categorylist.c b/src/gl-categorylist.c
index d17bb08..9a88514 100644
--- a/src/gl-categorylist.c
+++ b/src/gl-categorylist.c
@@ -42,21 +42,24 @@ typedef struct
GtkWidget *hardware;
GtkWidget *updates;
GtkWidget *usage;
+ GtkWidget *list_box;
GlCategoryListFilter category;
} GlCategoryListPrivate;
-G_DEFINE_TYPE_WITH_PRIVATE (GlCategoryList, gl_category_list, GTK_TYPE_LIST_BOX)
+G_DEFINE_TYPE_WITH_PRIVATE (GlCategoryList, gl_category_list, GTK_TYPE_WIDGET)
static GParamSpec *obj_properties[N_PROPERTIES] = { NULL, };
static gboolean
-gl_category_list_focus (GtkWidget *listbox, GtkDirectionType direction)
+gl_category_list_focus (GtkWidget *list, GtkDirectionType direction)
{
+ GlCategoryListPrivate *priv = gl_category_list_get_instance_private (GL_CATEGORY_LIST (list));
+
switch (direction)
{
case GTK_DIR_TAB_BACKWARD:
case GTK_DIR_TAB_FORWARD:
- if (gtk_container_get_focus_child (GTK_CONTAINER (listbox)))
+ if (gtk_widget_get_focus_child (GTK_WIDGET (priv->list_box)))
{
/* Force tab events which jump to another child to jump out of
* the category list. */
@@ -65,14 +68,14 @@ gl_category_list_focus (GtkWidget *listbox, GtkDirectionType direction)
else
{
/* Allow tab events to focus into the widget. */
- GTK_WIDGET_CLASS (gl_category_list_parent_class)->focus (listbox,
+ GTK_WIDGET_CLASS (gl_category_list_parent_class)->focus (priv->list_box,
direction);
return TRUE;
}
break;
/* Allow the widget to handle all other focus events. */
default:
- GTK_WIDGET_CLASS (gl_category_list_parent_class)->focus (listbox,
+ GTK_WIDGET_CLASS (gl_category_list_parent_class)->focus (priv->list_box,
direction);
return TRUE;
break;
@@ -80,15 +83,15 @@ gl_category_list_focus (GtkWidget *listbox, GtkDirectionType direction)
}
static void
-on_gl_category_list_row_selected (GlCategoryList *listbox,
- GtkListBoxRow *row,
- gpointer user_data)
+on_gl_category_list_row_selected (GtkListBox *listbox,
+ GtkListBoxRow *row,
+ GlCategoryList *list)
{
GlCategoryListPrivate *priv;
GEnumClass *eclass;
GEnumValue *evalue;
- priv = gl_category_list_get_instance_private (listbox);
+ priv = gl_category_list_get_instance_private (list);
eclass = g_type_class_ref (GL_TYPE_CATEGORY_LIST_FILTER);
if (row == GTK_LIST_BOX_ROW (priv->important))
@@ -140,7 +143,7 @@ on_gl_category_list_row_selected (GlCategoryList *listbox,
priv->category = evalue->value;
- g_object_notify_by_pspec (G_OBJECT (listbox),
+ g_object_notify_by_pspec (G_OBJECT (list),
obj_properties[PROP_CATEGORY]);
g_type_class_unref (eclass);
@@ -197,6 +200,17 @@ gl_category_list_set_property (GObject *object,
}
static void
+gl_category_list_dispose (GObject *object)
+{
+ GlCategoryList *list = GL_CATEGORY_LIST (object);
+ GlCategoryListPrivate *priv = gl_category_list_get_instance_private (list);
+
+ gtk_widget_unparent (priv->list_box);
+
+ G_OBJECT_CLASS (gl_category_list_parent_class)->dispose (object);
+}
+
+static void
gl_category_list_class_init (GlCategoryListClass *klass)
{
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
@@ -204,8 +218,11 @@ gl_category_list_class_init (GlCategoryListClass *klass)
gobject_class->get_property = gl_category_list_get_property;
gobject_class->set_property = gl_category_list_set_property;
+ gobject_class->dispose = gl_category_list_dispose;
widget_class->focus = gl_category_list_focus;
+ gtk_widget_class_set_layout_manager_type (widget_class, GTK_TYPE_BIN_LAYOUT);
+
obj_properties[PROP_CATEGORY] = g_param_spec_enum ("category", "Category",
"Filter events by",
GL_TYPE_CATEGORY_LIST_FILTER,
@@ -238,6 +255,8 @@ gl_category_list_class_init (GlCategoryListClass *klass)
updates);
gtk_widget_class_bind_template_child_private (widget_class, GlCategoryList,
usage);
+ gtk_widget_class_bind_template_child_private (widget_class, GlCategoryList,
+ list_box);
gtk_widget_class_bind_template_callback (widget_class,
on_gl_category_list_row_selected);
@@ -264,9 +283,12 @@ gl_category_list_init (GlCategoryList *list)
gtk_widget_init_template (GTK_WIDGET (list));
priv = gl_category_list_get_instance_private (list);
- gtk_list_box_set_header_func (GTK_LIST_BOX (list),
+ gtk_list_box_set_header_func (GTK_LIST_BOX (priv->list_box),
(GtkListBoxUpdateHeaderFunc)gl_category_list_header_func,
priv->applications, NULL);
+
+ g_signal_connect (priv->list_box, "row-selected",
+ G_CALLBACK (on_gl_category_list_row_selected), list);
}
GtkWidget *
diff --git a/src/gl-categorylist.h b/src/gl-categorylist.h
index 32f3b79..a180861 100644
--- a/src/gl-categorylist.h
+++ b/src/gl-categorylist.h
@@ -26,13 +26,13 @@ G_BEGIN_DECLS
typedef struct
{
/*< private >*/
- GtkListBox parent_instance;
+ GtkWidget parent_instance;
} GlCategoryList;
typedef struct
{
/*< private >*/
- GtkListBoxClass parent_class;
+ GtkWidgetClass parent_class;
} GlCategoryListClass;
/*