Merge lp:~ted/appmenu-gtk/dbusmenu-parser into lp:appmenu-gtk/0.4

Proposed by Ted Gould
Status: Merged
Merged at revision: 108
Proposed branch: lp:~ted/appmenu-gtk/dbusmenu-parser
Merge into: lp:appmenu-gtk/0.4
Prerequisite: lp:~mterry/appmenu-gtk/misc-fixes
Diff against target: 732 lines (+44/-612)
1 file modified
src/bridge.c (+44/-612)
To merge this branch: bzr merge lp:~ted/appmenu-gtk/dbusmenu-parser
Reviewer Review Type Date Requested Status
Mikkel Kamstrup Erlandsen (community) Approve
Review via email: mp+47623@code.launchpad.net

Description of the change

Switch to using the dbusmenu parser for parsing menu items.

To post a comment you must log in.
Revision history for this message
Mikkel Kamstrup Erlandsen (kamstrup) wrote :

 review approve

This looks good at least, but I must confess that I didn't test it and
could give some serious breakage if not working properly. So please
triple check the functionality before merging :-)

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'src/bridge.c'
--- src/bridge.c 2011-01-27 02:01:27 +0000
+++ src/bridge.c 2011-01-27 02:01:27 +0000
@@ -28,6 +28,7 @@
28#include <gio/gio.h>28#include <gio/gio.h>
2929
30#include <libdbusmenu-gtk/menuitem.h>30#include <libdbusmenu-gtk/menuitem.h>
31#include <libdbusmenu-gtk/parser.h>
31#include <libdbusmenu-glib/menuitem.h>32#include <libdbusmenu-glib/menuitem.h>
32#include <libdbusmenu-glib/server.h>33#include <libdbusmenu-glib/server.h>
3334
@@ -65,7 +66,6 @@
65{66{
66 GtkWidget *window;67 GtkWidget *window;
67 DbusmenuServer *server;68 DbusmenuServer *server;
68 DbusmenuMenuitem *root;
69 gchar *path;69 gchar *path;
70 gboolean registered;70 gboolean registered;
71 AppMenuBridge *bridge;71 AppMenuBridge *bridge;
@@ -171,12 +171,6 @@
171 context->path = NULL;171 context->path = NULL;
172 }172 }
173173
174 if (context->root != NULL)
175 {
176 g_object_unref (context->root);
177 context->root = NULL;
178 }
179
180 if (context->server != NULL)174 if (context->server != NULL)
181 {175 {
182 g_object_unref (context->server);176 g_object_unref (context->server);
@@ -335,7 +329,7 @@
335 }329 }
336 }330 }
337331
338 if (!context->registered && context->server != NULL && context->root != NULL && GTK_IS_WINDOW (widget) && bridge->priv->appmenuproxy != NULL)332 if (!context->registered && context->server != NULL && GTK_IS_WINDOW (widget) && bridge->priv->appmenuproxy != NULL)
339 {333 {
340 g_dbus_proxy_call(bridge->priv->appmenuproxy,334 g_dbus_proxy_call(bridge->priv->appmenuproxy,
341 "RegisterWindow",335 "RegisterWindow",
@@ -443,584 +437,6 @@
443 return;437 return;
444}438}
445439
446
447static GtkWidget *
448find_menu_label (GtkWidget *widget)
449{
450 GtkWidget *label = NULL;
451
452 if (GTK_IS_LABEL (widget))
453 return widget;
454
455 if (GTK_IS_CONTAINER (widget))
456 {
457 GList *children;
458 GList *l;
459
460 children = gtk_container_get_children (GTK_CONTAINER (widget));
461
462 for (l = children; l; l = l->next)
463 {
464 label = find_menu_label (l->data);
465
466 if (label)
467 break;
468 }
469
470 g_list_free (children);
471 }
472
473 return label;
474}
475
476static void
477item_activated (DbusmenuMenuitem *item, guint timestamp, gpointer user_data)
478{
479 GtkWidget *child;
480
481 if (user_data != NULL)
482 {
483 child = (GtkWidget *)user_data;
484
485 if (GTK_IS_MENU_ITEM (child))
486 {
487 gtk_menu_item_activate (GTK_MENU_ITEM (child));
488 }
489 }
490}
491
492static gboolean
493item_about_to_show (DbusmenuMenuitem *item, gpointer user_data)
494{
495 GtkWidget *child;
496
497 if (user_data != NULL)
498 {
499 child = (GtkWidget *)user_data;
500
501 if (GTK_IS_MENU_ITEM (child))
502 {
503 // Only called for items with submens. So we activate it here in
504 // case the program dynamically creates menus (like empathy does)
505 gtk_menu_item_activate (GTK_MENU_ITEM (child));
506 }
507 }
508
509 return TRUE;
510}
511
512static gboolean
513should_show_image (GtkImage *image)
514{
515 GtkWidget *item;
516
517 item = gtk_widget_get_ancestor (GTK_WIDGET (image),
518 GTK_TYPE_IMAGE_MENU_ITEM);
519
520 if (item)
521 {
522 GtkSettings *settings;
523 gboolean gtk_menu_images;
524
525 settings = gtk_widget_get_settings (item);
526
527 g_object_get (settings, "gtk-menu-images", &gtk_menu_images, NULL);
528
529 if (gtk_menu_images)
530 return TRUE;
531
532 return gtk_image_menu_item_get_always_show_image (GTK_IMAGE_MENU_ITEM (item));
533 }
534
535 return FALSE;
536}
537
538static gboolean
539update_stock_item (DbusmenuMenuitem *menuitem,
540 GtkWidget *widget)
541{
542 GtkStockItem stock;
543 GtkImage *image;
544
545 g_return_val_if_fail (GTK_IS_IMAGE (widget), FALSE);
546
547 image = GTK_IMAGE (widget);
548
549 if (gtk_image_get_storage_type (image) != GTK_IMAGE_STOCK)
550 return FALSE;
551
552 gtk_stock_lookup (image->data.stock.stock_id, &stock);
553
554 if (should_show_image (image))
555 dbusmenu_menuitem_property_set (menuitem,
556 DBUSMENU_MENUITEM_PROP_ICON_NAME,
557 image->data.stock.stock_id);
558 else
559 dbusmenu_menuitem_property_remove (menuitem,
560 DBUSMENU_MENUITEM_PROP_ICON_NAME);
561
562 const gchar *label = dbusmenu_menuitem_property_get (menuitem,
563 DBUSMENU_MENUITEM_PROP_LABEL);
564
565 if (stock.label != NULL && label != NULL)
566 {
567 dbusmenu_menuitem_property_set (menuitem,
568 DBUSMENU_MENUITEM_PROP_LABEL,
569 stock.label);
570
571 return TRUE;
572 }
573
574 return FALSE;
575}
576
577static void
578update_icon_name (DbusmenuMenuitem *menuitem,
579 GtkWidget *widget)
580{
581 GtkImage *image;
582
583 g_return_if_fail (GTK_IS_IMAGE (widget));
584
585 image = GTK_IMAGE (widget);
586
587 if (gtk_image_get_storage_type (image) != GTK_IMAGE_ICON_NAME)
588 return;
589
590 if (should_show_image (image))
591 dbusmenu_menuitem_property_set (menuitem,
592 DBUSMENU_MENUITEM_PROP_ICON_NAME,
593 image->data.name.icon_name);
594 else
595 dbusmenu_menuitem_property_remove (menuitem,
596 DBUSMENU_MENUITEM_PROP_ICON_NAME);
597}
598
599static void
600widget_notify_cb (GtkWidget *widget,
601 GParamSpec *pspec,
602 gpointer data)
603{
604 DbusmenuMenuitem *child = (DbusmenuMenuitem *)data;
605
606 if (pspec->name == g_intern_static_string ("sensitive"))
607 {
608 dbusmenu_menuitem_property_set_bool (child,
609 DBUSMENU_MENUITEM_PROP_ENABLED,
610 gtk_widget_get_sensitive (widget));
611 }
612 else if (pspec->name == g_intern_static_string ("label"))
613 {
614 dbusmenu_menuitem_property_set (child,
615 DBUSMENU_MENUITEM_PROP_LABEL,
616 gtk_menu_item_get_label (GTK_MENU_ITEM (widget)));
617 }
618 else if (pspec->name == g_intern_static_string ("visible"))
619 {
620 dbusmenu_menuitem_property_set_bool (child,
621 DBUSMENU_MENUITEM_PROP_VISIBLE,
622 gtk_widget_get_visible (widget));
623 }
624 else if (pspec->name == g_intern_static_string ("stock"))
625 {
626 update_stock_item (child, widget);
627 }
628 else if (pspec->name == g_intern_static_string ("icon-name"))
629 {
630 update_icon_name (child, widget);
631 }
632 else if (pspec->name == g_intern_static_string ("parent"))
633 {
634 /*
635 * We probably should have added a 'remove' method to the
636 * UbuntuMenuProxy early on, but it's late in the cycle now.
637 */
638 if (gtk_widget_get_parent (widget) == NULL)
639 {
640 g_signal_handlers_disconnect_by_func (widget,
641 G_CALLBACK (widget_notify_cb),
642 child);
643
644 DbusmenuMenuitem *parent = g_object_get_data (G_OBJECT (child), "dbusmenu-parent");
645
646 if (DBUSMENU_IS_MENUITEM (parent) && DBUSMENU_IS_MENUITEM (child))
647 {
648 dbusmenu_menuitem_child_delete (parent, child);
649 }
650 }
651 }
652}
653
654static void
655label_notify_cb (GtkWidget *widget,
656 GParamSpec *pspec,
657 gpointer data)
658{
659 DbusmenuMenuitem *child = (DbusmenuMenuitem *)data;
660
661 if (pspec->name == g_intern_static_string ("label"))
662 {
663 dbusmenu_menuitem_property_set (child,
664 DBUSMENU_MENUITEM_PROP_LABEL,
665 gtk_label_get_text (GTK_LABEL (widget)));
666 }
667}
668
669static void
670menuitem_notify_cb (GtkWidget *widget,
671 GParamSpec *pspec,
672 gpointer data)
673{
674 if (pspec->name == g_intern_static_string ("visible"))
675 {
676 AppWindowContext *context = (AppWindowContext *)data;
677 GtkWidget *toplevel = gtk_widget_get_toplevel (widget);
678 GtkWidget *window = NULL;
679
680 if (context != NULL)
681 window = context->window;
682
683 if (toplevel == window)
684 {
685 rebuild (context->bridge, window);
686 }
687
688 /* We only care about this once, so let's disconnect now. */
689 g_signal_handlers_disconnect_by_func (widget,
690 G_CALLBACK (menuitem_notify_cb),
691 data);
692 }
693}
694
695static void
696checkbox_toggled (GtkWidget *widget, DbusmenuMenuitem *mi)
697{
698 dbusmenu_menuitem_property_set_int (mi,
699 DBUSMENU_MENUITEM_PROP_TOGGLE_STATE,
700 gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (widget)) ? DBUSMENU_MENUITEM_TOGGLE_STATE_CHECKED : DBUSMENU_MENUITEM_TOGGLE_STATE_UNCHECKED);
701}
702
703static void
704accel_changed (GtkWidget *widget,
705 gpointer data)
706{
707 DbusmenuMenuitem *mi = (DbusmenuMenuitem *)data;
708 dbusmenu_menuitem_property_set_shortcut_menuitem (mi, GTK_MENU_ITEM (widget));
709}
710
711static void
712action_notify_cb (GtkAction *action,
713 GParamSpec *pspec,
714 gpointer data)
715{
716 DbusmenuMenuitem *mi = (DbusmenuMenuitem *)data;
717
718 if (pspec->name == g_intern_static_string ("sensitive"))
719 {
720 dbusmenu_menuitem_property_set_bool (mi,
721 DBUSMENU_MENUITEM_PROP_ENABLED,
722 gtk_action_is_sensitive (action));
723 }
724 else if (pspec->name == g_intern_static_string ("visible"))
725 {
726 dbusmenu_menuitem_property_set_bool (mi,
727 DBUSMENU_MENUITEM_PROP_VISIBLE,
728 gtk_action_is_visible (action));
729 }
730 else if (pspec->name == g_intern_static_string ("active"))
731 {
732 dbusmenu_menuitem_property_set_bool (mi,
733 DBUSMENU_MENUITEM_PROP_TOGGLE_STATE,
734 gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)));
735 }
736 else if (pspec->name == g_intern_static_string ("label"))
737 {
738 dbusmenu_menuitem_property_set (mi,
739 DBUSMENU_MENUITEM_PROP_LABEL,
740 gtk_action_get_label (action));
741 }
742}
743
744static DbusmenuMenuitem *
745construct_dbusmenu_for_widget (GtkWidget *widget)
746{
747 DbusmenuMenuitem *mi = dbusmenu_menuitem_new ();
748
749 if (GTK_IS_MENU_ITEM (widget))
750 {
751 gboolean visible = FALSE;
752 gboolean sensitive = FALSE;
753 if (GTK_IS_SEPARATOR_MENU_ITEM (widget))
754 {
755 dbusmenu_menuitem_property_set (mi,
756 "type",
757 "separator");
758
759 visible = gtk_widget_get_visible (widget);
760 sensitive = gtk_widget_get_sensitive (widget);
761 }
762 else
763 {
764 gboolean label_set = FALSE;
765
766 g_signal_connect (widget,
767 "accel-closures-changed",
768 G_CALLBACK (accel_changed),
769 mi);
770
771 if (GTK_IS_CHECK_MENU_ITEM (widget))
772 {
773 dbusmenu_menuitem_property_set (mi,
774 DBUSMENU_MENUITEM_PROP_TOGGLE_TYPE,
775 gtk_check_menu_item_get_draw_as_radio (GTK_CHECK_MENU_ITEM (widget)) ? DBUSMENU_MENUITEM_TOGGLE_RADIO : DBUSMENU_MENUITEM_TOGGLE_CHECK);
776
777 dbusmenu_menuitem_property_set_int (mi,
778 DBUSMENU_MENUITEM_PROP_TOGGLE_STATE,
779 gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (widget)) ? DBUSMENU_MENUITEM_TOGGLE_STATE_CHECKED : DBUSMENU_MENUITEM_TOGGLE_STATE_UNCHECKED);
780
781 g_signal_connect (widget,
782 "activate",
783 G_CALLBACK (checkbox_toggled),
784 mi);
785 }
786
787 if (GTK_IS_IMAGE_MENU_ITEM (widget))
788 {
789 GtkWidget *image;
790 GtkImageType image_type;
791
792 image = gtk_image_menu_item_get_image (GTK_IMAGE_MENU_ITEM (widget));
793
794 if (GTK_IS_IMAGE (image))
795 {
796 image_type = gtk_image_get_storage_type (GTK_IMAGE (image));
797
798 if (image_type == GTK_IMAGE_STOCK)
799 {
800 label_set = update_stock_item (mi, image);
801 }
802 else if (image_type == GTK_IMAGE_ICON_NAME)
803 {
804 update_icon_name (mi, image);
805 }
806 else if (image_type == GTK_IMAGE_PIXBUF)
807 {
808 dbusmenu_menuitem_property_set_image (mi,
809 DBUSMENU_MENUITEM_PROP_ICON_DATA,
810 gtk_image_get_pixbuf (GTK_IMAGE (image)));
811 }
812 }
813 }
814
815 GtkWidget *label = find_menu_label (widget);
816
817 dbusmenu_menuitem_property_set (mi,
818 "label",
819 label ? gtk_label_get_text (GTK_LABEL (label)) : NULL);
820
821 if (label)
822 {
823 // Sometimes, an app will directly find and modify the label
824 // (like empathy), so watch the label especially for that.
825 g_signal_connect (G_OBJECT (label),
826 "notify",
827 G_CALLBACK (label_notify_cb),
828 mi);
829 }
830
831 if (GTK_IS_ACTIVATABLE (widget))
832 {
833 GtkActivatable *activatable = GTK_ACTIVATABLE (widget);
834
835 if (gtk_activatable_get_use_action_appearance (activatable))
836 {
837 GtkAction *action = gtk_activatable_get_related_action (activatable);
838
839 if (action)
840 {
841 visible = gtk_action_is_visible (action);
842 sensitive = gtk_action_is_sensitive (action);
843
844 g_signal_connect_object (action, "notify",
845 G_CALLBACK (action_notify_cb),
846 mi,
847 G_CONNECT_AFTER);
848 }
849 }
850 }
851
852 if (!g_object_get_data (G_OBJECT (widget), "gtk-empty-menu-item") && !GTK_IS_TEAROFF_MENU_ITEM (widget))
853 {
854 visible = gtk_widget_get_visible (widget);
855 sensitive = gtk_widget_get_sensitive (widget);
856 }
857
858 dbusmenu_menuitem_property_set_shortcut_menuitem (mi, GTK_MENU_ITEM (widget));
859
860 g_signal_connect (G_OBJECT (mi),
861 DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED,
862 G_CALLBACK (item_activated),
863 widget);
864
865 g_signal_connect (G_OBJECT (mi),
866 DBUSMENU_MENUITEM_SIGNAL_ABOUT_TO_SHOW,
867 G_CALLBACK (item_about_to_show),
868 widget);
869 }
870
871 dbusmenu_menuitem_property_set_bool (mi,
872 DBUSMENU_MENUITEM_PROP_VISIBLE,
873 visible);
874
875 dbusmenu_menuitem_property_set_bool (mi,
876 DBUSMENU_MENUITEM_PROP_ENABLED,
877 sensitive);
878
879 g_signal_connect (widget,
880 "notify",
881 G_CALLBACK (widget_notify_cb),
882 mi);
883 }
884
885 return mi;
886}
887
888static void
889rebuild_item (GtkWidget *widget,
890 RecurseContext *recurse)
891{
892 if (GTK_IS_CONTAINER (widget))
893 {
894 gboolean increment = GTK_IS_MENU_BAR (widget) || GTK_IS_MENU_ITEM (widget);
895
896 if (increment)
897 recurse->count++;
898
899 /* Okay, this is a little janky and all.. but some applications update some
900 * menuitem properties such as sensitivity on the activate callback. This
901 * seems a little weird, but it's not our place to judge when all this code
902 * is so crazy. So we're going to get ever crazier and activate all the
903 * menus that are directly below the menubar and force the applications to
904 * update their sensitivity. The menus won't actually popup in the app
905 * window due to our gtk+ patches.
906 *
907 * Note that this will not force menuitems in submenus to be updated as well.
908 */
909 if (recurse->count == 0 && GTK_IS_MENU_BAR (widget))
910 {
911 GList *children = gtk_container_get_children (GTK_CONTAINER (widget));
912
913 for (; children != NULL; children = children->next)
914 {
915 gtk_menu_shell_activate_item (GTK_MENU_SHELL (widget),
916 children->data,
917 TRUE);
918 }
919
920 g_list_free (children);
921 }
922
923 if (recurse->count > -1 && increment)
924 {
925 DbusmenuMenuitem *dmi = g_hash_table_lookup (recurse->context->lookup, widget);
926 if (dmi != NULL)
927 {
928 if (increment)
929 recurse->count--;
930
931 return;
932 }
933 else
934 {
935 recurse->stack[recurse->count] = construct_dbusmenu_for_widget (widget);
936 g_hash_table_insert (recurse->context->lookup, widget, recurse->stack[recurse->count]);
937 }
938
939 if (!gtk_widget_get_visible (widget))
940 {
941 g_signal_connect (G_OBJECT (widget),
942 "notify",
943 G_CALLBACK (menuitem_notify_cb),
944 recurse->context);
945 }
946
947 if (GTK_IS_TEAROFF_MENU_ITEM (widget))
948 {
949 dbusmenu_menuitem_property_set_bool (recurse->stack[recurse->count],
950 DBUSMENU_MENUITEM_PROP_VISIBLE,
951 FALSE);
952 }
953
954 if (recurse->count > 0)
955 {
956 GList *children = NULL;
957 GList *peek = NULL;
958
959 if (recurse->stack[recurse->count - 1])
960 {
961 children = dbusmenu_menuitem_get_children (recurse->stack[recurse->count - 1]);
962
963 if (children)
964 {
965 peek = g_list_find (children, recurse->stack[recurse->count]);
966 }
967
968 if (!peek)
969 {
970 /* Should we set a weak ref on the parent? */
971 g_object_set_data (G_OBJECT (recurse->stack[recurse->count]),
972 "dbusmenu-parent",
973 recurse->stack[recurse->count - 1]);
974 dbusmenu_menuitem_child_append (recurse->stack[recurse->count - 1],
975 recurse->stack[recurse->count]);
976 }
977 }
978 else
979 {
980 DbusmenuMenuitem *item = g_hash_table_lookup (recurse->context->lookup,
981 gtk_widget_get_parent (widget));
982
983 if (item)
984 {
985 children = dbusmenu_menuitem_get_children (item);
986
987 if (children)
988 {
989 peek = g_list_find (children, recurse->stack[recurse->count]);
990 }
991
992 if (!peek)
993 {
994 g_object_set_data (G_OBJECT (recurse->stack[recurse->count]),
995 "dbusmenu-parent",
996 recurse->stack[recurse->count - 1]);
997
998 dbusmenu_menuitem_child_append (item, recurse->stack[recurse->count]);
999 }
1000 }
1001 }
1002 }
1003 }
1004
1005 gtk_container_foreach (GTK_CONTAINER (widget),
1006 (GtkCallback)rebuild_item,
1007 recurse);
1008
1009 if (GTK_IS_MENU_ITEM (widget))
1010 {
1011 GtkWidget *menu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (widget));
1012
1013 if (menu != NULL)
1014 {
1015 rebuild_item (menu, recurse);
1016 }
1017 }
1018
1019 if (increment)
1020 recurse->count--;
1021 }
1022}
1023
1024typedef struct _RebuildData {440typedef struct _RebuildData {
1025 AppMenuBridge *bridge;441 AppMenuBridge *bridge;
1026 GtkWidget *widget;442 GtkWidget *widget;
@@ -1076,15 +492,48 @@
1076 g_hash_table_insert (rebuild_ids, toplevel, GUINT_TO_POINTER (id));492 g_hash_table_insert (rebuild_ids, toplevel, GUINT_TO_POINTER (id));
1077}493}
1078494
495static DbusmenuMenuitem * find_menu_bar (GtkWidget * widget);
496
497static void
498find_menu_bar_helper (GtkWidget * widget, gpointer data)
499{
500 DbusmenuMenuitem ** mi = (DbusmenuMenuitem **)data;
501
502 /* We've already found a menu, let's get through the
503 foreach as quickly as possible */
504 if (*mi != NULL) {
505 return;
506 }
507
508 *mi = find_menu_bar(widget);
509 return;
510}
511
512static DbusmenuMenuitem *
513find_menu_bar (GtkWidget * widget)
514{
515 if (GTK_IS_MENU_BAR(widget) || GTK_IS_MENU_ITEM(widget)) {
516 return dbusmenu_gtk_parse_menu_structure(widget);
517 }
518
519 if (GTK_IS_CONTAINER(widget)) {
520 DbusmenuMenuitem * mi = NULL;
521
522 gtk_container_foreach(GTK_CONTAINER(widget), find_menu_bar_helper, &mi);
523
524 return mi;
525 }
526
527 return NULL;
528}
529
530
1079static void531static void
1080rebuild_window_items (AppMenuBridge *bridge,532rebuild_window_items (AppMenuBridge *bridge,
1081 GtkWidget *toplevel)533 GtkWidget *toplevel)
1082{534{
1083 XID xid;535 XID xid;
1084 AppWindowContext *context = NULL;536 AppWindowContext *context = NULL;
1085 RecurseContext recurse;
1086
1087 memset (&recurse, 0, sizeof (RecurseContext));
1088537
1089 if (!GTK_IS_WINDOW (toplevel))538 if (!GTK_IS_WINDOW (toplevel))
1090 {539 {
@@ -1147,14 +596,6 @@
1147 context->bridge = bridge;596 context->bridge = bridge;
1148 context->lookup = g_hash_table_new (g_direct_hash, g_direct_equal);597 context->lookup = g_hash_table_new (g_direct_hash, g_direct_equal);
1149 bridge->priv->windows = g_list_prepend (bridge->priv->windows, context);598 bridge->priv->windows = g_list_prepend (bridge->priv->windows, context);
1150
1151 recurse.previous = FALSE;
1152 recurse.count = -1;
1153 }
1154 else
1155 {
1156 recurse.previous = TRUE;
1157 recurse.count = 0;
1158 }599 }
1159600
1160 if (context->window)601 if (context->window)
@@ -1183,24 +624,15 @@
1183 if (!context->server)624 if (!context->server)
1184 context->server = dbusmenu_server_new (context->path);625 context->server = dbusmenu_server_new (context->path);
1185626
1186 recurse.bridge = bridge;627 DbusmenuMenuitem * mi = find_menu_bar(toplevel);
1187 recurse.context = context;628 dbusmenu_server_set_root(context->server, mi);
1188629 if (mi != NULL) {
1189 gtk_container_foreach (GTK_CONTAINER (toplevel),630 g_object_unref(G_OBJECT(mi));
1190 (GtkCallback)rebuild_item,631 }
1191 &recurse);
1192
1193 if (recurse.stack[0] != NULL && DBUSMENU_IS_MENUITEM (recurse.stack[0]))
1194 {
1195 context->root = recurse.stack[0];
1196
1197 dbusmenu_server_set_root (context->server, context->root);
1198 }
1199632
1200 register_application_windows (bridge);633 register_application_windows (bridge);
1201}634}
1202635
1203
1204static void636static void
1205toplevel_realized (GtkWidget *widget,637toplevel_realized (GtkWidget *widget,
1206 gpointer user_data)638 gpointer user_data)
@@ -1316,7 +748,7 @@
1316748
1317 if (mi != NULL)749 if (mi != NULL)
1318 {750 {
1319 DbusmenuMenuitem *child_dmi = construct_dbusmenu_for_widget (child);751 DbusmenuMenuitem *child_dmi = dbusmenu_gtk_parse_menu_structure (child);
1320752
1321 g_object_set_data (G_OBJECT (child_dmi), "dbusmenu-parent", mi);753 g_object_set_data (G_OBJECT (child_dmi), "dbusmenu-parent", mi);
1322 dbusmenu_menuitem_child_add_position (mi,754 dbusmenu_menuitem_child_add_position (mi,

Subscribers

People subscribed via source and target branches