commit 6356550dc2240195ba50c01fd1a335835fb51751
parent 0a2bebe3ace97462b8dfcbefb52c472b37df6d32
Author: Janne Veteläinen <janne.vetelainen@elisanet.fi>
Date: Wed, 22 May 2024 00:29:08 +0300
Update actions on signals
Diffstat:
5 files changed, 63 insertions(+), 39 deletions(-)
diff --git a/systray/Makefile b/systray/Makefile
@@ -17,6 +17,6 @@ install: all
dwlbtray: $(OBJS)
dwlbtray: CFLAGS+=$(shell pkg-config --cflags glib-2.0 gtk4 gtk4-layer-shell-0)
-dwlbtray: LDLIBS+=$(shell pkg-config --libs glib-2.0 gtk4 gtk4-layer-shell-0) -lrt
+dwlbtray: LDLIBS+=$(shell pkg-config --libs glib-2.0 gtk4 gtk4-layer-shell-0)
.PHONY: all clean install
diff --git a/systray/sndbusmenu.c b/systray/sndbusmenu.c
@@ -1,12 +1,14 @@
+#include "sndbusmenu.h"
+
#include <stdlib.h>
#include <stdint.h>
+#include <string.h>
#include <glib.h>
#include <glib-object.h>
#include <gio/gio.h>
#include "snitem.h"
-#include "sndbusmenu.h"
struct _SnDbusmenu {
@@ -14,16 +16,15 @@ struct _SnDbusmenu {
GMutex mutex;
- char *busname;
- char *busobj;
- SnItem *snitem;
+ char* busname;
+ char* busobj;
+ SnItem* snitem;
- GMenu *menu;
- GDBusProxy *proxy;
+ GMenu* menu;
+ GDBusProxy* proxy;
uint32_t revision;
gboolean reschedule;
- gboolean updating;
};
G_DEFINE_FINAL_TYPE(SnDbusmenu, sn_dbusmenu, G_TYPE_OBJECT)
@@ -46,7 +47,6 @@ enum
static GParamSpec *obj_properties[N_PROPERTIES] = { NULL, };
static uint signals[LAST_SIGNAL];
-
typedef struct {
uint32_t id;
GDBusProxy* proxy;
@@ -68,9 +68,9 @@ static void sn_dbusmenu_set_property (GObject *object,
static GMenu* create_menumodel (GVariant *data, SnDbusmenu *self);
-static GMenuItem* create_menuitem (int32_t id, GVariant *menu_data,
- GVariant *submenu_data,
- SnDbusmenu *self);
+static GMenuItem* create_menuitem (int32_t id, GVariant *menu_data,
+ GVariant *submenu_data,
+ SnDbusmenu *self);
static void
@@ -258,6 +258,7 @@ void layout_update(SnDbusmenu *self)
g_debug("Popover was visible, couldn't update menu %s", self->busname);
} else {
g_object_unref(self->menu);
+ sn_item_remove_all_actions(self->snitem);
self->menu = create_menumodel(menuitems, self);
sn_item_set_menu_model(self->snitem, self->menu);
}
@@ -326,7 +327,6 @@ find_menuid(GMenuModel *menu, int id, GVariant *menu_data, SnDbusmenu *self)
static void
props_removed_handler(GVariant *props, SnDbusmenu *self)
{
- g_print("props removed\n");
// a(ias)
GVariant *data;
GMenuModel *menu = G_MENU_MODEL(self->menu);
@@ -337,6 +337,9 @@ props_removed_handler(GVariant *props, SnDbusmenu *self)
while ((data = g_variant_iter_next_value(&iter))) {
g_variant_get_child(data, 0, "i", &id);
find_menuid(menu, id, NULL, self);
+ char *action_name = g_strdup_printf("menuitem.%i", id);
+ sn_item_remove_action(self->snitem, action_name);
+ g_free(action_name);
g_variant_unref(data);
}
}
@@ -345,8 +348,6 @@ static void
props_updated_handler(GVariant *props, SnDbusmenu *self)
{
// a(ia{sv})
- g_print("props updated\n");
- gboolean any_match = FALSE;
GVariant *data;
GMenuModel *menu = G_MENU_MODEL(self->menu);
int id;
@@ -357,14 +358,10 @@ props_updated_handler(GVariant *props, SnDbusmenu *self)
while ((data = g_variant_iter_next_value(&iter))) {
g_variant_get_child(data, 0, "i", &id);
menuitem_data = g_variant_get_child_value(data, 1);
- if (find_menuid(menu, id, menuitem_data, self))
- any_match = TRUE;
+ find_menuid(menu, id, menuitem_data, self);
g_variant_unref(menuitem_data);
g_variant_unref(data);
}
-
- if (!any_match)
- self->reschedule = TRUE;
}
static void
@@ -383,7 +380,8 @@ proxy_signal_handler(GDBusProxy *proxy,
uint32_t revision;
int32_t parentid;
g_variant_get(params, "(ui)", &revision, &parentid);
- if (self->revision == UINT32_MAX || revision >= self->revision) {
+ g_debug("%s got LayoutUpdated, revision %i, parentid %i", self->busname, revision, parentid);
+ if (!popover_visible && (self->revision == UINT32_MAX || self->revision < revision)) {
layout_update(self);
self->revision = revision;
} else if (popover_visible) {
@@ -391,8 +389,7 @@ proxy_signal_handler(GDBusProxy *proxy,
}
} else if (strcmp(signal, "ItemsPropertiesUpdated") == 0) {
- g_print("props update\n");
-
+ g_debug("%s got ItemsPropertiesUpdated", self->busname);
GVariant *removed_props = g_variant_get_child_value(params, 1);
GVariant *updated_props = g_variant_get_child_value(params, 0);
diff --git a/systray/snhost.c b/systray/snhost.c
@@ -1,14 +1,16 @@
+#include "snhost.h"
+
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
+#include <string.h>
#include <glib.h>
#include <glib-object.h>
#include <gio/gio.h>
#include <gtk/gtk.h>
-#include "snhost.h"
#include "snitem.h"
@@ -16,19 +18,20 @@ struct _SnHost
{
GtkWidget parent_instance;
- char *traymon;
+ GDBusConnection* conn;
+ char* traymon;
+ GSList* trayitems;
+
int iconsize;
int margins;
int spacing;
- GDBusConnection *conn;
int owner_id;
int obj_reg_id;
int sig_sub_id;
int nitems;
int curwidth;
- GSList *trayitems;
gboolean exiting;
};
diff --git a/systray/snitem.c b/systray/snitem.c
@@ -1,5 +1,8 @@
+#include "snitem.h"
+
#include <stdlib.h>
#include <stdint.h>
+#include <string.h>
#include <glib.h>
#include <glib-object.h>
@@ -8,7 +11,6 @@
#include <gdk-pixbuf/gdk-pixbuf.h>
#include <gtk/gtk.h>
-#include "snitem.h"
#include "sndbusmenu.h"
@@ -16,19 +18,19 @@ struct _SnItem
{
GtkWidget parent_instance;
- char *busname;
- char *busobj;
- int iconsize;
+ char* busname;
+ char* busobj;
- GDBusProxy *proxy;
- char *iconname;
- GVariant *iconpixmaps;
- SnDbusmenu *dbusmenu;
+ GDBusProxy* proxy;
+ char* iconname;
+ GVariant* iconpixmaps;
+ SnDbusmenu* dbusmenu;
- GtkWidget *image;
- GtkWidget *popovermenu;
- GSimpleActionGroup *actiongroup;
+ GtkWidget* image;
+ GtkWidget* popovermenu;
+ GSimpleActionGroup* actiongroup;
+ int iconsize;
gboolean ready;
gboolean exiting;
gboolean menu_visible;
@@ -337,7 +339,7 @@ sn_item_proxy_ready_handler(GObject *obj, GAsyncResult *res, void *data)
return;
}
- g_debug("Proxy created for snitem at: %s, obj path: %s",
+ g_debug("Created gdbusproxy for snitem %s %s",
g_dbus_proxy_get_name(proxy),
g_dbus_proxy_get_object_path(proxy));
@@ -754,6 +756,26 @@ sn_item_add_action(SnItem *self, GSimpleAction *action)
g_action_map_add_action(G_ACTION_MAP(self->actiongroup), G_ACTION(action));
}
+void
+sn_item_remove_action(SnItem *self, const char *action_name)
+{
+ g_action_map_remove_action(G_ACTION_MAP(self->actiongroup), action_name);
+}
+
+void
+sn_item_remove_all_actions(SnItem *self)
+{
+ GtkWidget *widget = GTK_WIDGET(self);
+
+ gtk_widget_insert_action_group(widget, "menuitem", NULL);
+ g_object_unref(self->actiongroup);
+ 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));
+}
+
char*
sn_item_get_busname(SnItem *self)
{
diff --git a/systray/snitem.h b/systray/snitem.h
@@ -17,6 +17,8 @@ void sn_item_set_menu_model (SnItem *widget, GMenu *menu);
void sn_item_add_action (SnItem *self, GSimpleAction *action);
char* sn_item_get_busname (SnItem *self);
gboolean sn_item_get_popover_visible (SnItem *self);
+void sn_item_remove_action (SnItem *self, const char *action_name);
+void sn_item_remove_all_actions (SnItem *self);
G_END_DECLS