commit 0f2cbc17e0e766be2cc4dde529e39c7e417f62d1
parent 6326826c0dbd3e81291adb9c9e0d5c4a125d6dee
Author: Janne Veteläinen <janne.vetelainen@elisanet.fi>
Date: Tue, 9 Jul 2024 04:27:34 +0300
Checkmark menuitem support
Diffstat:
| M | systray/sndbusmenu.c | | | 79 | +++++++++++++++++++++++++++++++++++-------------------------------------------- |
1 file changed, 35 insertions(+), 44 deletions(-)
diff --git a/systray/sndbusmenu.c b/systray/sndbusmenu.c
@@ -104,11 +104,16 @@ action_free(void *data, GClosure *closure)
}
static GSimpleAction*
-create_action(uint32_t id, SnDbusmenu *self)
+create_action(uint32_t id, gboolean ischeckmark, SnDbusmenu *self)
{
+ GSimpleAction *action;
char name[ACTION_NAME_MAX_LEN];
snprintf(name, sizeof(name), "%u", id);
- GSimpleAction *action = g_simple_action_new(name, NULL);
+
+ if (ischeckmark)
+ action = g_simple_action_new_stateful(name, NULL, g_variant_new("b", TRUE));
+ else
+ action = g_simple_action_new(name, NULL);
ActionCallbackData *data = g_malloc(sizeof(ActionCallbackData));
data->id = id;
@@ -129,83 +134,69 @@ create_menuitem(int32_t id, GVariant *menuitem_data, GVariant *submenuitem_data,
{
GActionMap *actionmap = G_ACTION_MAP(self->actiongroup);
- // a{sv]
- // GVariant *data
- GMenuItem *menuitem = NULL;
-
-
char detailed_name[ACTION_NAME_MAX_LEN];
const char *label = NULL;
- const char *type = NULL;
+ const char *type_s = NULL;
+ const char *toggle_type_s = NULL;
+ const char *has_submenu_s = NULL;
+
gboolean isenabled = TRUE;
gboolean isvisible = TRUE;
gboolean isseparator = FALSE;
+ gboolean ischeckmark = FALSE;
gboolean has_submenu = FALSE;
+ // gboolean isradio = FALSE;
- /*
- * gboolean ischeckmark = FALSE;
- * gboolean isradio = FALSE;
- * int32_t toggle_state = 99;
- * const char *toggle_type = NULL;
- */
+ gboolean checkmark_toggle_state = TRUE;
- const char *has_submenu_s = NULL;
GVariantDict dict;
g_variant_dict_init(&dict, menuitem_data);
g_variant_dict_lookup(&dict, "label", "&s", &label);
- g_variant_dict_lookup(&dict, "type", "&s", &type);
+ g_variant_dict_lookup(&dict, "type", "&s", &type_s);
g_variant_dict_lookup(&dict, "enabled", "b", &isenabled);
g_variant_dict_lookup(&dict, "visible", "b", &isvisible);
g_variant_dict_lookup(&dict, "children-display", "&s", &has_submenu_s);
-
- /*
- * g_variant_dict_lookup(&dict, "toggle-type", "&s", &toggle_type);
- * g_variant_dict_lookup(&dict, "toggle-state", "i", &toggle_state);
- */
-
+ g_variant_dict_lookup(&dict, "toggle-type", "&s", &toggle_type_s);
+ g_variant_dict_lookup(&dict, "toggle-state", "i", &checkmark_toggle_state);
g_variant_dict_clear(&dict);
if (has_submenu_s && strcmp(has_submenu_s, "submenu") == 0)
has_submenu = TRUE;
- if (type && strcmp(type, "separator") == 0) {
+ if (type_s && strcmp(type_s, "separator") == 0)
isseparator = TRUE;
- }
-
+ else if (toggle_type_s && strcmp(toggle_type_s, "checkmark") == 0)
+ ischeckmark = TRUE;
/*
- * if (toggle_type && strcmp(toggle_type, "checkmark") == 0)
- * ischeckmark = TRUE;
- * else if (toggle_type && strcmp(toggle_type, "radio") == 0)
- * isradio = TRUE;
- */
+ else if (toggle_type_s && strcmp(toggle_type_s, "radio") == 0)
+ isradio = TRUE;
+ */
if (!isvisible || isseparator)
return NULL;
- if (label && isenabled) {
- GSimpleAction *action = create_action(id, self);
- snprintf(detailed_name, sizeof(detailed_name), "%s.%u", actiongroup_pfx, id);
- g_action_map_add_action(actionmap, G_ACTION(action));
- menuitem = g_menu_item_new(label, detailed_name);
+ GSimpleAction *action = create_action(id, ischeckmark, self);
+ snprintf(detailed_name, sizeof(detailed_name), "%s.%u", actiongroup_pfx, id);
- g_object_unref(action);
+ GMenuItem *menuitem = g_menu_item_new(label, detailed_name);
- } else if (label && !isenabled) {
- GSimpleAction *action = create_action(id, self);
+ if (!isenabled)
g_simple_action_set_enabled(action, FALSE);
- snprintf(detailed_name, sizeof(detailed_name), "%s.%u", actiongroup_pfx, id);
- g_action_map_add_action(actionmap, G_ACTION(action));
- menuitem = g_menu_item_new(label, detailed_name);
- g_object_unref(action);
- }
+ if (ischeckmark)
+ g_simple_action_set_state(action,
+ g_variant_new("b",
+ checkmark_toggle_state));
- if (isvisible && has_submenu) {
+ if (has_submenu) {
GMenu *submenu = create_menumodel(submenuitem_data, self);
g_menu_item_set_submenu(menuitem, G_MENU_MODEL(submenu));
g_object_unref(submenu);
}
+ g_action_map_add_action(actionmap, G_ACTION(action));
+ g_object_unref(action);
+
return menuitem;
}