kee

Offline IOU signer with QR as transport
git clone git://holbrook.no/kee-gtk4.git
Info | Log | Files | Refs | README | LICENSE

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:
Msrc/gtk/kee-entry-list.c | 8++++++--
Msrc/gtk/kee-entry.c | 15++++++++++++---
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)); }