dwlb

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

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:
Msystray/Makefile | 2+-
Msystray/sndbusmenu.c | 41+++++++++++++++++++----------------------
Msystray/snhost.c | 11+++++++----
Msystray/snitem.c | 46++++++++++++++++++++++++++++++++++------------
Msystray/snitem.h | 2++
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