commit f8f9c6afd008e6054a4292617fd209e63493ab3a
parent 037f2787c3a3c06d0bbfad023eff9d24bee15bdc
Author: lash <dev@holbrook.no>
Date: Tue, 25 Feb 2025 16:07:22 +0000
Avoid segfault on list item select
Diffstat:
2 files changed, 18 insertions(+), 5 deletions(-)
diff --git a/src/gtk/kee-entry-list.c b/src/gtk/kee-entry-list.c
@@ -23,6 +23,8 @@ static void kee_entry_list_handle_select(GtkListView *view, guint i, KeeMenu *me
GtkSingleSelection *sel;
KeeEntry *o;
+ debug_log(DEBUG_DEBUG, "handle select");
+
sel = GTK_SINGLE_SELECTION(gtk_list_view_get_model(view));
o = KEE_ENTRY(gtk_single_selection_get_selected_item(sel));
@@ -33,13 +35,14 @@ static void kee_entry_list_handle_select(GtkListView *view, guint i, KeeMenu *me
kee_menu_set(menu, GTK_WIDGET(o));
}
- g_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "list item selected %d", i);
+ //debug_log(DEBUG_DEBUG, "list item selected %d", i);
+ debug_log(DEBUG_DEBUG, "list item selected");
}
/// \todo first member is probably not entry list
static void kee_entry_list_handle_setup(GtkListItemFactory* o, GtkListItem *item) {
- g_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "entry list setup");
+ debug_log(DEBUG_DEBUG, "entry list setup");
}
static void kee_entry_list_handle_bind(GtkListItemFactory *o, GtkListItem *item) {
@@ -87,6 +90,7 @@ GtkWidget* kee_entry_list_new(GListModel *model, KeeMenu *win) {
sel = gtk_single_selection_new(model);
view = gtk_list_view_new(GTK_SELECTION_MODEL(sel), o->factory);
+ gtk_list_view_set_single_click_activate(GTK_LIST_VIEW(view), 1);
g_signal_connect(view, "activate", G_CALLBACK(kee_entry_list_handle_select), win);
gtk_box_append(GTK_BOX(o), view);
diff --git a/src/gtk/kee-entry.c b/src/gtk/kee-entry.c
@@ -249,6 +249,10 @@ static void kee_entry_handle_add(GtkButton *butt, KeeEntry *o) {
g_action_activate(act, transport_data);
}
+static void kee_entry_handle_item_select(GtkListView *view, guint i, void *v) {
+ debug_log(DEBUG_DEBUG, "entry item selected");
+}
+
static void kee_entry_handle_item_setup(GtkListItemFactory* o, GtkListItem *item) {
GtkWidget *box;
@@ -260,16 +264,20 @@ static void kee_entry_handle_item_bind(GtkListItemFactory *o, GtkListItem *item
GtkWidget *box;
GtkWidget *box_item;
+ debug_log(DEBUG_DEBUG, "handle item bind");
+
box = gtk_list_item_get_child(item);
box_item = gtk_list_item_get_item(item);
+ if (gtk_widget_get_parent(box_item) != NULL) {
+ return;
+ }
g_object_take_ref(G_OBJECT(box_item));
gtk_box_append(GTK_BOX(box), box_item);
-
}
/// \todo free reference to self from parent box necessary..?
static void kee_entry_dispose(GObject *o) {
- g_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "disposing entry");
+ debug_log(DEBUG_DEBUG, "disposing entry");
}
static void kee_entry_finalize(GObject *o) {
@@ -283,7 +291,7 @@ static void kee_entry_finalize(GObject *o) {
free(entry->form);
}
- g_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "tearing down entry");
+ debug_log(DEBUG_DEBUG, "tearing down entry");
//G_OBJECT_CLASS(kee_entry_parent_class)->finalize(o);
}
@@ -447,6 +455,7 @@ static void kee_entry_init_list_widget(KeeEntry *o) {
model = kee_entry_item_store_new(o->db, &o->ledger, o->resolver);
sel = gtk_single_selection_new(G_LIST_MODEL(model));
view = gtk_list_view_new(GTK_SELECTION_MODEL(sel), GTK_LIST_ITEM_FACTORY(factory));
+ g_signal_connect(view, "activate", G_CALLBACK(kee_entry_handle_item_select), NULL);
gtk_box_append(GTK_BOX(o->display), GTK_WIDGET(view));
}