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:
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");