dwlb

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

commit 043d5fe8b6b92fd09ef678278cd0e8e6a718fdc1
parent 18ecda2dae7d0c1b9d1cd0be256b144f7406c434
Author: Janne Veteläinen <janne.vetelainen@elisanet.fi>
Date:   Thu, 18 Apr 2024 21:41:46 +0300

Box owns the popover

Diffstat:
Mdbusmenu.c | 24+++++++++++++++++++++---
Mdwlbtray.h | 2+-
Mstatusnotifierhost.c | 8++++++--
Mstatusnotifieritem.c | 8--------
4 files changed, 28 insertions(+), 14 deletions(-)

diff --git a/dbusmenu.c b/dbusmenu.c @@ -105,6 +105,9 @@ create_menuitem(GVariant *data, StatusNotifierItem *snitem) // GVariant *data GMenuItem *menuitem = NULL; + char *actiongroupname = g_strdelimit(g_strdup(snitem->busname), ".", '_'); + actiongroupname = g_strdelimit(actiongroupname, ":", '_'); + int32_t id; // a{sv] GVariant *menu_data; @@ -153,7 +156,7 @@ create_menuitem(GVariant *data, StatusNotifierItem *snitem) if ((label && isvisible && isenabled) && !(type && strcmp(type, "separator") == 0)) { GSimpleAction *action = create_action(id, snitem); - char *action_name = g_strdup_printf("%s.%u", "menuitem", id); + char *action_name = g_strdup_printf("%s.%u", actiongroupname, id); g_action_map_add_action(G_ACTION_MAP(snitem->actiongroup), G_ACTION(action)); menuitem = g_menu_item_new(label, action_name); @@ -164,7 +167,7 @@ create_menuitem(GVariant *data, StatusNotifierItem *snitem) } else if ((label && !(type && strcmp(type, "separator") == 0))) { GSimpleAction *action = create_action(id, snitem); g_simple_action_set_enabled(action, FALSE); - char *action_name = g_strdup_printf("%s.%u", "menuitem", id); + char *action_name = g_strdup_printf("%s.%u", actiongroupname, id); g_action_map_add_action(G_ACTION_MAP(snitem->actiongroup), G_ACTION(action)); menuitem = g_menu_item_new(label, action_name); @@ -182,6 +185,7 @@ create_menuitem(GVariant *data, StatusNotifierItem *snitem) } g_variant_unref(menu_data); + g_free(actiongroupname); return menuitem; } @@ -270,7 +274,7 @@ on_menulayout_ready(GDBusProxy *proxy, GAsyncResult *res, StatusNotifierItem *sn GtkWidget *popovermenu = gtk_popover_menu_new_from_model(NULL); gtk_popover_set_has_arrow(GTK_POPOVER(popovermenu), FALSE); gtk_popover_menu_set_menu_model(GTK_POPOVER_MENU(popovermenu), G_MENU_MODEL(menu)); - gtk_widget_set_parent(popovermenu, snitem->icon); + gtk_widget_set_parent(popovermenu, snitem->host->box); snitem->popovermenu = popovermenu; @@ -394,6 +398,20 @@ create_menu(GObject *obj, GAsyncResult *res, StatusNotifierItem *snitem) snitem->menuproxy = proxy; snitem->menurevision = UINT32_MAX; + GSimpleActionGroup *actiongroup; + + char *actiongroupname = g_strdelimit(g_strdup(snitem->busname), ".", '_'); + actiongroupname = g_strdelimit(actiongroupname, ":", '_'); + + actiongroup = g_simple_action_group_new(); + gtk_widget_insert_action_group(snitem->host->box, + actiongroupname, + G_ACTION_GROUP(actiongroup)); + snitem->actiongroup = actiongroup; + + g_free(actiongroupname); + + if (err) { g_warning("%s\n", err->message); g_error_free(err); diff --git a/dwlbtray.h b/dwlbtray.h @@ -34,9 +34,9 @@ typedef struct StatusNotifierHost { typedef struct StatusNotifierItem { + GSimpleActionGroup *actiongroup; GDBusProxy *menuproxy; GDBusProxy *proxy; - GSimpleActionGroup *actiongroup; GVariant *iconpixmap_v; GdkPaintable *paintable; GtkWidget *icon; diff --git a/statusnotifierhost.c b/statusnotifierhost.c @@ -162,13 +162,17 @@ unregister_statusnotifieritem(StatusNotifierItem *snitem) snitem->popovermenu = NULL; } + char *actiongroupname = g_strdelimit(g_strdup(snitem->busname), ".", '_'); + actiongroupname = g_strdelimit(actiongroupname, ":", '_'); + if (snitem->icon) { - gtk_widget_insert_action_group(snitem->icon, "menuitem", NULL); - g_object_unref(snitem->actiongroup); + gtk_widget_insert_action_group(snitem->icon, actiongroupname, NULL); gtk_box_remove(GTK_BOX(snitem->host->box), snitem->icon); snitem->icon = NULL; } + g_free(actiongroupname); + g_dbus_connection_emit_signal(snitem->host->conn, NULL, "/StatusNotifierWatcher", diff --git a/statusnotifieritem.c b/statusnotifieritem.c @@ -393,7 +393,6 @@ create_trayitem(GObject *obj, GAsyncResult *res, StatusNotifierItem *snitem) GtkGesture *rightclick; GVariant *menu_buspath_v; const char *menu_buspath; - GSimpleActionGroup *actiongroup; GtkWidget *icon; g_signal_connect(proxy, "g-signal", G_CALLBACK(trayitem_signal_handler), snitem); @@ -417,15 +416,8 @@ create_trayitem(GObject *obj, GAsyncResult *res, StatusNotifierItem *snitem) gtk_gesture_single_set_button(GTK_GESTURE_SINGLE(rightclick), 3); g_signal_connect(rightclick, "pressed", G_CALLBACK(on_rightclick_cb), snitem); - actiongroup = g_simple_action_group_new(); - snitem->actiongroup = actiongroup; - gtk_widget_add_controller(icon, GTK_EVENT_CONTROLLER(leftclick)); gtk_widget_add_controller(icon, GTK_EVENT_CONTROLLER(rightclick)); - gtk_widget_insert_action_group(icon, - "menuitem", - G_ACTION_GROUP(actiongroup)); - gtk_box_append(GTK_BOX(snitem->host->box), icon); menu_buspath_v = g_dbus_proxy_get_cached_property(proxy, "Menu");