Skip to content

Commit dd1f933

Browse files
committed
Importer: Truly force toplevel items enabled.
1 parent 7628da6 commit dd1f933

File tree

4 files changed

+31
-20
lines changed

4 files changed

+31
-20
lines changed

lib/dbusmenu-importer/definitions.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
#define HAS_ICON_NAME "has-icon-name"
2929

3030
typedef enum {
31+
DBUS_MENU_ACTION_SECTION,
3132
DBUS_MENU_ACTION_NORMAL,
3233
DBUS_MENU_ACTION_CHECKMARK,
3334
DBUS_MENU_ACTION_RADIO,

lib/dbusmenu-importer/item.c

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ G_GNUC_INTERNAL DBusMenuItem *dbus_menu_item_new_first_section(u_int32_t id,
4242
{
4343
DBusMenuItem *item = g_slice_new0(DBusMenuItem);
4444
item->id = id;
45-
item->is_section = true;
45+
item->action_type = DBUS_MENU_ACTION_SECTION;
4646
item->enabled = false;
4747
item->toggled = false;
4848
item->attributes =
@@ -63,10 +63,9 @@ G_GNUC_INTERNAL DBusMenuItem *dbus_menu_item_new(u_int32_t id, DBusMenuModel *pa
6363
const char *prop;
6464
GVariant *value;
6565
item_set_magic(item);
66-
item->is_section = false;
67-
item->enabled = true;
68-
item->toggled = false;
69-
item->id = id;
66+
item->enabled = true;
67+
item->toggled = false;
68+
item->id = id;
7069
item->attributes =
7170
g_hash_table_new_full(g_str_hash, g_str_equal, g_free, (GDestroyNotify)g_variant_unref);
7271
item->links =
@@ -135,7 +134,8 @@ G_GNUC_INTERNAL DBusMenuItem *dbus_menu_item_new(u_int32_t id, DBusMenuModel *pa
135134
const char *type = g_variant_get_string(value, NULL);
136135
if (!g_strcmp0(type, DBUS_MENU_TYPE_SEPARATOR))
137136
{
138-
item->is_section = true;
137+
item->action_type = DBUS_MENU_ACTION_SECTION;
138+
action_creator_found = true;
139139
}
140140
else if (!g_strcmp0(type, DBUS_MENU_TYPE_NORMAL))
141141
{
@@ -150,10 +150,11 @@ G_GNUC_INTERNAL DBusMenuItem *dbus_menu_item_new(u_int32_t id, DBusMenuModel *pa
150150
}
151151
else if (g_strcmp0(prop, "x-kde-title") == 0)
152152
{
153-
item->is_section = true;
153+
item->action_type = DBUS_MENU_ACTION_SECTION;
154154
g_hash_table_insert(item->attributes,
155155
g_strdup(G_MENU_ATTRIBUTE_LABEL),
156156
value);
157+
action_creator_found = true;
157158
}
158159
else if (!action_creator_found)
159160
{
@@ -185,7 +186,6 @@ G_GNUC_INTERNAL void dbus_menu_item_free(gpointer data)
185186
G_GNUC_INTERNAL DBusMenuItem *dbus_menu_item_copy(DBusMenuItem *src)
186187
{
187188
DBusMenuItem *dst = g_slice_new0(DBusMenuItem);
188-
dst->is_section = src->is_section;
189189
dst->id = src->id;
190190
dst->action_type = src->action_type;
191191
dst->enabled = src->enabled;
@@ -211,7 +211,7 @@ static bool check_and_update_mutable_attribute(DBusMenuItem *item, const char *k
211211
return false;
212212
}
213213

214-
static bool dbus_menu_item_update_enabled(DBusMenuItem *item, bool enabled)
214+
G_GNUC_INTERNAL bool dbus_menu_item_update_enabled(DBusMenuItem *item, bool enabled)
215215
{
216216
bool updated = false;
217217
if (item->action_type == DBUS_MENU_ACTION_SUBMENU && !item->toggled)
@@ -272,8 +272,6 @@ G_GNUC_INTERNAL void dbus_menu_item_preload(DBusMenuItem *item)
272272
if (DBUS_MENU_IS_MODEL(submenu))
273273
dbus_menu_model_update_layout(submenu);
274274
}
275-
dbus_menu_item_update_enabled(item, true);
276-
item->toggled = true;
277275
}
278276

279277
G_GNUC_INTERNAL bool dbus_menu_item_copy_attributes(DBusMenuItem *src, DBusMenuItem *dst)
@@ -427,7 +425,7 @@ G_GNUC_INTERNAL bool dbus_menu_item_update_props(DBusMenuItem *item, GVariant *p
427425
else if (g_strcmp0(prop, "visible") == 0)
428426
{
429427
bool vis = g_variant_get_boolean(value);
430-
if (item->is_section)
428+
if (item->action_type == DBUS_MENU_ACTION_SECTION)
431429
{
432430
item->toggled = !vis;
433431
continue;
@@ -554,8 +552,6 @@ G_GNUC_INTERNAL bool dbus_menu_item_compare_immutable(DBusMenuItem *a, DBusMenuI
554552
{
555553
if (a->id != b->id)
556554
return false;
557-
if (a->is_section != b->is_section)
558-
return false;
559555
if (a->referenced_action_group != b->referenced_action_group)
560556
return false;
561557
if (a->action_type != b->action_type)
@@ -569,12 +565,12 @@ G_GNUC_INTERNAL void dbus_menu_item_copy_submenu(DBusMenuItem *src, DBusMenuItem
569565
DBusMenuXml *xml;
570566
DBusMenuModel *submenu = NULL;
571567
g_object_get(parent, "xml", &xml, NULL);
572-
if (dst->toggled)
573-
dst->enabled = true;
574568
if (src == NULL)
575569
{
576570
if (dst->action_type == DBUS_MENU_ACTION_SUBMENU)
577571
{
572+
if (dst->toggled)
573+
dst->enabled = true;
578574
submenu =
579575
dbus_menu_model_new(dst->id, parent, xml, dst->referenced_action_group);
580576
g_hash_table_insert(dst->links,
@@ -587,6 +583,8 @@ G_GNUC_INTERNAL void dbus_menu_item_copy_submenu(DBusMenuItem *src, DBusMenuItem
587583
if (dst->action_type == DBUS_MENU_ACTION_SUBMENU &&
588584
src->action_type == DBUS_MENU_ACTION_SUBMENU)
589585
{
586+
if (src->toggled || dst->toggled)
587+
dst->enabled = dst->toggled = true;
590588
submenu =
591589
DBUS_MENU_MODEL(g_hash_table_lookup(src->links,
592590
src->enabled ? G_MENU_LINK_SUBMENU
@@ -601,6 +599,8 @@ G_GNUC_INTERNAL void dbus_menu_item_copy_submenu(DBusMenuItem *src, DBusMenuItem
601599

602600
G_GNUC_INTERNAL void dbus_menu_item_generate_action(DBusMenuItem *item, DBusMenuModel *parent)
603601
{
602+
if (item->action_type == DBUS_MENU_ACTION_SECTION)
603+
return;
604604
DBusMenuXml *xml;
605605
DBusMenuModel *submenu =
606606
g_hash_table_lookup(item->links,

lib/dbusmenu-importer/item.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ G_BEGIN_DECLS
3131
typedef struct
3232
{
3333
u_int32_t id;
34-
bool is_section;
3534
GActionGroup *referenced_action_group;
3635
// FIXME: Cannot have activatable submenu item.
3736
GAction *referenced_action;
@@ -50,6 +49,8 @@ G_GNUC_INTERNAL DBusMenuItem *dbus_menu_item_new_first_section(u_int32_t id,
5049

5150
G_GNUC_INTERNAL void dbus_menu_item_free(gpointer data);
5251

52+
G_GNUC_INTERNAL bool dbus_menu_item_update_enabled(DBusMenuItem *item, bool enabled);
53+
5354
G_GNUC_INTERNAL bool dbus_menu_item_update_props(DBusMenuItem *item, GVariant *props);
5455

5556
G_GNUC_INTERNAL bool dbus_menu_item_remove_props(DBusMenuItem *item, GVariant *props);
@@ -62,6 +63,7 @@ G_GNUC_INTERNAL void dbus_menu_item_copy_submenu(DBusMenuItem *src, DBusMenuItem
6263
DBusMenuModel *parent);
6364

6465
G_GNUC_INTERNAL void dbus_menu_item_generate_action(DBusMenuItem *item, DBusMenuModel *parent);
66+
6567
G_GNUC_INTERNAL void dbus_menu_item_preload(DBusMenuItem *item);
6668

6769
G_GNUC_INTERNAL int dbus_menu_item_id_compare_func(const DBusMenuItem *a, gconstpointer b,

lib/dbusmenu-importer/model.c

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,7 @@ static void layout_parse(DBusMenuModel *menu, GVariant *layout)
213213
DBusMenuItem *old = NULL;
214214
DBusMenuItem *new_item = dbus_menu_item_new(cid, menu, cprops);
215215
// We receive a section (separator or x-kde-title)
216-
if (new_item->is_section)
216+
if (new_item->action_type == DBUS_MENU_ACTION_SECTION)
217217
{
218218
bool is_valid_section = !new_item->toggled;
219219
// Section is valid, so, parse it
@@ -291,11 +291,15 @@ static void layout_parse(DBusMenuModel *menu, GVariant *layout)
291291
dbus_menu_item_copy_submenu(NULL, new_item, menu);
292292
dbus_menu_item_generate_action(new_item, menu);
293293
if (menu->parent_id == 0)
294+
{
295+
dbus_menu_item_update_enabled(new_item, true);
296+
new_item->toggled = true;
294297
g_timeout_add_full(100,
295298
300,
296299
(GSourceFunc)preload_idle,
297300
new_item,
298301
NULL);
302+
}
299303
current_iter = g_sequence_insert_before(current_iter, new_item);
300304
added++;
301305
}
@@ -313,11 +317,15 @@ static void layout_parse(DBusMenuModel *menu, GVariant *layout)
313317
dbus_menu_item_generate_action(new_item, menu);
314318
// if it is root, preload submenu
315319
if (menu->parent_id == 0)
320+
{
321+
dbus_menu_item_update_enabled(new_item, true);
322+
new_item->toggled = true;
316323
g_timeout_add_full(100,
317324
300,
318325
(GSourceFunc)preload_idle,
319326
new_item,
320327
NULL);
328+
}
321329
g_sequence_set(current_iter, new_item);
322330
}
323331
else
@@ -522,7 +530,7 @@ static void items_properties_updated_cb(DBusMenuXml *proxy, GVariant *updated_pr
522530
if (item != NULL)
523531
{
524532
// It is the best what we can do to update a section
525-
if (item->is_section)
533+
if (item->action_type == DBUS_MENU_ACTION_SECTION)
526534
{
527535
// dbus_menu_model_update_layout(menu);
528536
}
@@ -548,7 +556,7 @@ static void items_properties_updated_cb(DBusMenuXml *proxy, GVariant *updated_pr
548556
if (item != NULL)
549557
{
550558
// It is the best what we can do to update a section
551-
if (item->is_section)
559+
if (item->action_type == DBUS_MENU_ACTION_SECTION)
552560
{
553561
// dbus_menu_model_update_layout(menu);
554562
}

0 commit comments

Comments
 (0)