dwlb

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

commit 1bb5070e109c023e719c0922bf1a4baa2d41b45a
parent fd426d39d83a03a4bf04e2d85f34e2157f6f1450
Author: Janne Veteläinen <janne.vetelainen@elisanet.fi>
Date:   Wed, 15 May 2024 16:42:26 +0300

Fix 2 leaks

Diffstat:
Msystray/sndbusmenu.c | 2--
Msystray/snhost.c | 3++-
Msystray/snitem.c | 28+++++++++++++++++++++-------
3 files changed, 23 insertions(+), 10 deletions(-)

diff --git a/systray/sndbusmenu.c b/systray/sndbusmenu.c @@ -531,8 +531,6 @@ sn_dbusmenu_constructed(GObject *obj) { SnDbusmenu *self = SN_DBUSMENU(obj); - g_object_ref(self->snitem); - GDBusNodeInfo *nodeinfo = g_dbus_node_info_new_for_xml(DBUSMENU_XML, NULL); g_dbus_proxy_new_for_bus(G_BUS_TYPE_SESSION, G_DBUS_PROXY_FLAGS_NONE, diff --git a/systray/snhost.c b/systray/snhost.c @@ -145,10 +145,11 @@ sn_host_unregister_item(SnHost *self, SnItem *snitem) char *busname = sn_item_get_busname(snitem); g_debug("Unregistering %s", busname); + self->trayitems = g_slist_remove(self->trayitems, snitem); + gtk_box_remove(GTK_BOX(self), GTK_WIDGET(snitem)); g_object_run_dispose(G_OBJECT(snitem)); - self->trayitems = g_slist_remove(self->trayitems, snitem); self->nitems = self->nitems - 1; dwlb_request_resize(self); diff --git a/systray/snitem.c b/systray/snitem.c @@ -28,6 +28,7 @@ struct _SnItem GSimpleActionGroup *actiongroup; gboolean ready; + gboolean exiting; }; G_DEFINE_FINAL_TYPE(SnItem, sn_item, GTK_TYPE_WIDGET) @@ -373,9 +374,9 @@ sn_item_proxy_ready_handler(GObject *obj, GAsyncResult *res, void *data) const char *menu_buspath = NULL; GVariant *menu_buspath_v = g_dbus_proxy_get_cached_property(self->proxy, "Menu"); - if (menu_buspath_v) { + if (menu_buspath_v && !self->exiting) { g_variant_get(menu_buspath_v, "&o", &menu_buspath); - SnDbusmenu *dbusmenu = sn_dbusmenu_new(self->busname, menu_buspath, self); + SnDbusmenu *dbusmenu = sn_dbusmenu_new(self->busname, menu_buspath, g_object_ref(self)); g_object_set(self, "dbusmenu", dbusmenu, NULL); g_variant_unref(menu_buspath_v); } @@ -524,10 +525,7 @@ sn_item_set_property(GObject *object, uint property_id, const GValue *value, GPa self->iconsize = g_value_get_int(value); break; case PROP_ACTIONGROUP: - self->actiongroup = g_simple_action_group_new(); - gtk_widget_insert_action_group(GTK_WIDGET(self), - "menuitem", - G_ACTION_GROUP(self->actiongroup)); + self->actiongroup = g_value_get_object(value); break; case PROP_DBUSMENU: self->dbusmenu = g_value_get_object(value); @@ -595,7 +593,6 @@ sn_item_class_init(SnItemClass *klass) obj_properties[PROP_ACTIONGROUP] = g_param_spec_object("actiongroup", NULL, NULL, G_TYPE_SIMPLE_ACTION_GROUP, - G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); @@ -629,6 +626,14 @@ sn_item_init(SnItem *self) { GtkWidget *widget = GTK_WIDGET(self); + self->exiting = FALSE; + GSimpleActionGroup *actiongroup = g_simple_action_group_new(); + g_object_set(self, "actiongroup", actiongroup, NULL); + + gtk_widget_insert_action_group(GTK_WIDGET(self), + "menuitem", + G_ACTION_GROUP(self->actiongroup)); + gtk_widget_set_hexpand(widget, TRUE); gtk_widget_set_vexpand(widget, TRUE); @@ -681,6 +686,7 @@ static void sn_item_dispose(GObject *obj) { SnItem *self = SN_ITEM(obj); + self->exiting = TRUE; g_debug("Disposing snitem %s %s", self->busname, self->busobj); @@ -689,6 +695,13 @@ sn_item_dispose(GObject *obj) self->dbusmenu = NULL; } + if (self->proxy) { + g_object_unref(self->proxy); + self->proxy = NULL; + } + + gtk_widget_insert_action_group(GTK_WIDGET(self), "menuitem", NULL); + G_OBJECT_CLASS(sn_item_parent_class)->dispose(obj); } @@ -697,6 +710,7 @@ sn_item_finalize(GObject *object) { SnItem *self = SN_ITEM(object); + g_object_unref(self->actiongroup); gtk_widget_unparent(self->popovermenu); gtk_widget_unparent(self->image);