From 263157786e7881f1c98f0a6d839447d8f0c57dbd Mon Sep 17 00:00:00 2001 From: yetist Date: Fri, 27 Apr 2018 15:20:40 +0800 Subject: Support new mate-menus api --- mate-panel/menu.c | 289 +++++++++++++++++++++++++++++------------------------- 1 file changed, 153 insertions(+), 136 deletions(-) (limited to 'mate-panel/menu.c') diff --git a/mate-panel/menu.c b/mate-panel/menu.c index 28c588ac..975eeb38 100644 --- a/mate-panel/menu.c +++ b/mate-panel/menu.c @@ -265,28 +265,28 @@ static void add_drawers_from_alias (MateMenuTreeAlias *alias, const char *toplevel_id) { - MateMenuTreeItem *aliased_item; + gpointer item; - aliased_item = matemenu_tree_alias_get_item (alias); - - switch (matemenu_tree_item_get_type (aliased_item)) { + switch (matemenu_tree_alias_get_aliased_item_type (alias)) { case MATEMENU_TREE_ITEM_DIRECTORY: - add_drawers_from_dir (MATEMENU_TREE_DIRECTORY (aliased_item), + item = matemenu_tree_alias_get_directory (alias); + add_drawers_from_dir (item, G_MAXINT/2, toplevel_id); + matemenu_tree_item_unref (item); break; case MATEMENU_TREE_ITEM_ENTRY: + item = matemenu_tree_alias_get_aliased_entry (alias); panel_launcher_create_with_id (toplevel_id, G_MAXINT/2, - matemenu_tree_entry_get_desktop_file_path (MATEMENU_TREE_ENTRY (aliased_item))); + matemenu_tree_entry_get_desktop_file_path (item)); + matemenu_tree_item_unref (item); break; default: break; } - - matemenu_tree_item_unref (aliased_item); } static void @@ -295,10 +295,10 @@ add_drawers_from_dir (MateMenuTreeDirectory *directory, const char *toplevel_id) { const char *name; - const char *icon; - GSList *items; - GSList *l; + GIcon *icon; char *attached_toplevel_id; + MateMenuTreeIter *iter; + MateMenuTreeItemType type; name = matemenu_tree_directory_get_name (directory); icon = matemenu_tree_directory_get_icon (directory); @@ -311,36 +311,36 @@ add_drawers_from_dir (MateMenuTreeDirectory *directory, if (!attached_toplevel_id) return; - items = matemenu_tree_directory_get_contents (directory); - for (l = items; l; l = l->next) { - MateMenuTreeItem *item = l->data; - - switch (matemenu_tree_item_get_type (item)) { - case MATEMENU_TREE_ITEM_ENTRY: - panel_launcher_create_with_id (attached_toplevel_id, - G_MAXINT/2, - matemenu_tree_entry_get_desktop_file_path (MATEMENU_TREE_ENTRY (item))); - break; - - case MATEMENU_TREE_ITEM_DIRECTORY: - add_drawers_from_dir (MATEMENU_TREE_DIRECTORY (item), - G_MAXINT/2, - attached_toplevel_id); - break; - - case MATEMENU_TREE_ITEM_ALIAS: - add_drawers_from_alias (MATEMENU_TREE_ALIAS (item), attached_toplevel_id); - break; - - default: - break; + iter = matemenu_tree_directory_iter (directory); + while ((type = matemenu_tree_iter_next (iter)) != MATEMENU_TREE_ITEM_INVALID) { + gpointer item; + switch (type) { + case MATEMENU_TREE_ITEM_ENTRY: + item = matemenu_tree_iter_get_entry (iter); + panel_launcher_create_with_id (attached_toplevel_id, + G_MAXINT/2, + matemenu_tree_entry_get_desktop_file_path (item)); + matemenu_tree_item_unref (item); + break; + + case MATEMENU_TREE_ITEM_DIRECTORY: + item = matemenu_tree_iter_get_directory (iter); + add_drawers_from_dir (item, + G_MAXINT/2, + attached_toplevel_id); + matemenu_tree_item_unref (item); + break; + + case MATEMENU_TREE_ITEM_ALIAS: + item = matemenu_tree_iter_get_alias (iter); + add_drawers_from_alias (item, attached_toplevel_id); + matemenu_tree_item_unref (item); + break; + default: + break; } - - matemenu_tree_item_unref (item); } - - g_slist_free (items); - + matemenu_tree_iter_unref (iter); g_free (attached_toplevel_id); } @@ -354,7 +354,7 @@ add_menudrawer_to_panel (GtkWidget *menuitem, PanelData *pd; int insertion_pos; - directory = matemenu_tree_item_get_parent (MATEMENU_TREE_ITEM (entry)); + directory = matemenu_tree_entry_get_parent (entry); panel = menu_get_panel (menuitem); @@ -380,7 +380,7 @@ add_menu_to_panel (GtkWidget *menuitem, char *menu_path; const char *menu_filename; - directory = matemenu_tree_item_get_parent (MATEMENU_TREE_ITEM (entry)); + directory = matemenu_tree_entry_get_parent (entry); if (!directory) { g_warning ("Cannot find the filename for the menu: no directory"); return; @@ -393,8 +393,8 @@ add_menu_to_panel (GtkWidget *menuitem, return; } - menu_filename = matemenu_tree_get_menu_file (tree); - matemenu_tree_unref (tree); + menu_filename = matemenu_tree_get_canonical_menu_path (tree); + g_object_unref (tree); if (!menu_filename) { matemenu_tree_item_unref (directory); g_warning ("Cannot find the filename for the menu: no filename"); @@ -476,7 +476,7 @@ create_item_context_menu (GtkWidget *item, if (!entry) return NULL; - directory = matemenu_tree_item_get_parent (MATEMENU_TREE_ITEM (entry)); + directory = matemenu_tree_entry_get_parent (entry); if (!directory) return NULL; @@ -485,8 +485,8 @@ create_item_context_menu (GtkWidget *item, if (!tree) return NULL; - menu_filename = matemenu_tree_get_menu_file (tree); - matemenu_tree_unref (tree); + menu_filename = matemenu_tree_get_canonical_menu_path(tree); + g_object_unref (tree); if (!menu_filename) return NULL; @@ -726,7 +726,7 @@ setup_menuitem_with_icon (GtkWidget *menuitem, icon = panel_gicon_from_icon_name (image_filename); gtk_image_set_from_gicon (GTK_IMAGE(image), icon, icon_size); - g_object_unref (icon); + g_clear_object (&icon); gtk_widget_show (image); @@ -980,8 +980,8 @@ create_submenu_entry (GtkWidget *menu, setup_menuitem_with_icon (menuitem, panel_menu_icon_get_size (), - NULL, matemenu_tree_directory_get_icon (directory), + NULL, matemenu_tree_directory_get_name (directory)); gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); @@ -1051,7 +1051,7 @@ create_menuitem (GtkWidget *menu, matemenu_tree_item_ref (entry), (GDestroyNotify) matemenu_tree_item_unref); - if (alias_directory) + if (alias_directory) { //FIXME: we should probably use this data when we do dnd or //context menu for this menu item g_object_set_data_full (G_OBJECT (menuitem), @@ -1059,26 +1059,35 @@ create_menuitem (GtkWidget *menu, matemenu_tree_item_ref (alias_directory), (GDestroyNotify) matemenu_tree_item_unref); - setup_menuitem_with_icon (menuitem, - panel_menu_icon_get_size (), - NULL, - alias_directory ? matemenu_tree_directory_get_icon (alias_directory) : - matemenu_tree_entry_get_icon (entry), - alias_directory ? matemenu_tree_directory_get_name (alias_directory) : - matemenu_tree_entry_get_display_name (entry)); - - if (alias_directory && - matemenu_tree_directory_get_comment (alias_directory)) - panel_util_set_tooltip_text (menuitem, - matemenu_tree_directory_get_comment (alias_directory)); - else if (!alias_directory && - matemenu_tree_entry_get_comment (entry)) - panel_util_set_tooltip_text (menuitem, - matemenu_tree_entry_get_comment (entry)); - else if (!alias_directory && - matemenu_tree_entry_get_generic_name (entry)) - panel_util_set_tooltip_text (menuitem, - matemenu_tree_entry_get_generic_name (entry)); + setup_menuitem_with_icon (menuitem, + panel_menu_icon_get_size (), + matemenu_tree_directory_get_icon (alias_directory), + NULL, + matemenu_tree_directory_get_name (alias_directory)); + if (matemenu_tree_directory_get_comment (alias_directory)) { + panel_util_set_tooltip_text (menuitem, matemenu_tree_directory_get_comment (alias_directory)); + } + } else { + GDesktopAppInfo *ginfo; + const gchar* desc; + const gchar* gename; + + ginfo = matemenu_tree_entry_get_app_info (entry); + desc= g_app_info_get_description(G_APP_INFO(ginfo)); + gename = g_desktop_app_info_get_generic_name(ginfo); + + setup_menuitem_with_icon (menuitem, + panel_menu_icon_get_size (), + g_app_info_get_icon(G_APP_INFO(ginfo)), + NULL, + g_app_info_get_name(G_APP_INFO(ginfo))); + + if (desc != NULL) { + panel_util_set_tooltip_text (menuitem, desc); + } else if ( gename != NULL) { + panel_util_set_tooltip_text (menuitem, gename); + } + } g_signal_connect_after (menuitem, "button_press_event", G_CALLBACK (menuitem_button_press_event), NULL); @@ -1093,12 +1102,12 @@ create_menuitem (GtkWidget *menu, menu_item_targets, 1, GDK_ACTION_COPY); - if (matemenu_tree_entry_get_icon (entry) != NULL) { - const char *icon; + GDesktopAppInfo *ginfo; + ginfo = matemenu_tree_entry_get_app_info (entry); + if (g_app_info_get_icon (G_APP_INFO(ginfo)) != NULL) { GIcon *gicon; - icon = matemenu_tree_entry_get_icon (entry); - gicon = panel_gicon_from_icon_name (icon); + gicon = g_app_info_get_icon (G_APP_INFO(ginfo)); if (gicon != NULL) { gtk_drag_source_set_icon_gicon (menuitem, gicon); } @@ -1124,34 +1133,33 @@ static void create_menuitem_from_alias (GtkWidget *menu, MateMenuTreeAlias *alias) { - MateMenuTreeItem *aliased_item; - - aliased_item = matemenu_tree_alias_get_item (alias); + gpointer item, entry; - switch (matemenu_tree_item_get_type (aliased_item)) { + switch (matemenu_tree_alias_get_aliased_item_type (alias)) { case MATEMENU_TREE_ITEM_DIRECTORY: - create_submenu (menu, - MATEMENU_TREE_DIRECTORY (aliased_item), - matemenu_tree_alias_get_directory (alias)); + item = matemenu_tree_alias_get_directory (alias); + create_submenu (menu, item, item); + matemenu_tree_item_unref (item); break; case MATEMENU_TREE_ITEM_ENTRY: - create_menuitem (menu, - MATEMENU_TREE_ENTRY (aliased_item), - matemenu_tree_alias_get_directory (alias)); + entry = matemenu_tree_alias_get_aliased_entry(alias); + item = matemenu_tree_alias_get_directory (alias); + create_menuitem (menu, entry, item); + matemenu_tree_item_unref (entry); + matemenu_tree_item_unref (item); break; default: break; } - - matemenu_tree_item_unref (aliased_item); } static void handle_matemenu_tree_changed (MateMenuTree *tree, GtkWidget *menu) { + GError *error = NULL; guint idle_id; GList *list, *l; @@ -1160,6 +1168,11 @@ handle_matemenu_tree_changed (MateMenuTree *tree, gtk_widget_destroy (l->data); g_list_free (list); + if (! matemenu_tree_load_sync (tree, &error)) { + g_warning("Menu tree reload got error:%s\n", error->message); + g_error_free(error); + } + g_object_set_data_full (G_OBJECT (menu), "panel-menu-tree-directory", NULL, NULL); @@ -1180,11 +1193,11 @@ handle_matemenu_tree_changed (MateMenuTree *tree, static void remove_matemenu_tree_monitor (GtkWidget *menu, - MateMenuTree *tree) + MateMenuTree *tree) { - matemenu_tree_remove_monitor (tree, - (MateMenuTreeChangedFunc) handle_matemenu_tree_changed, - menu); + g_signal_handlers_disconnect_by_func (tree, + G_CALLBACK (handle_matemenu_tree_changed), + menu); } GtkWidget * @@ -1195,6 +1208,7 @@ create_applications_menu (const char *menu_file, MateMenuTree *tree; GtkWidget *menu; guint idle_id; + GError *error = NULL; menu = create_empty_menu (); @@ -1203,13 +1217,18 @@ create_applications_menu (const char *menu_file, "panel-menu-force-icon-for-categories", GINT_TO_POINTER (TRUE)); - tree = matemenu_tree_lookup (menu_file, MATEMENU_TREE_FLAGS_NONE); - matemenu_tree_set_sort_key (tree, MATEMENU_TREE_SORT_DISPLAY_NAME); + tree = matemenu_tree_new (menu_file, MATEMENU_TREE_FLAGS_SORT_DISPLAY_NAME); + if (! matemenu_tree_load_sync (tree, &error)) { + g_warning("Menu tree loading got error:%s\n", error->message); + g_error_free(error); + g_object_unref(tree); + tree = NULL; + } g_object_set_data_full (G_OBJECT (menu), "panel-menu-tree", - matemenu_tree_ref (tree), - (GDestroyNotify) matemenu_tree_unref); + g_object_ref(tree), + (GDestroyNotify) g_object_unref); g_object_set_data_full (G_OBJECT (menu), "panel-menu-tree-path", @@ -1235,13 +1254,10 @@ create_applications_menu (const char *menu_file, g_signal_connect (menu, "button_press_event", G_CALLBACK (menu_dummy_button_press_event), NULL); - matemenu_tree_add_monitor (tree, - (MateMenuTreeChangedFunc) handle_matemenu_tree_changed, - menu); - g_signal_connect (menu, "destroy", - G_CALLBACK (remove_matemenu_tree_monitor), tree); + g_signal_connect (tree, "changed", G_CALLBACK (handle_matemenu_tree_changed), menu); + g_signal_connect (menu, "destroy", G_CALLBACK (remove_matemenu_tree_monitor), tree); - matemenu_tree_unref (tree); + g_object_unref(tree); /*HACK Fix any failures of compiz/other wm's to communicate with gtk for transparency */ GtkWidget *toplevel = gtk_widget_get_toplevel (menu); @@ -1257,54 +1273,55 @@ populate_menu_from_directory (GtkWidget *menu, MateMenuTreeDirectory *directory) { GList *children; - GSList *l; - GSList *items; gboolean add_separator; + MateMenuTreeIter *iter; + MateMenuTreeItemType type; children = gtk_container_get_children (GTK_CONTAINER (menu)); add_separator = (children != NULL); g_list_free (children); - items = matemenu_tree_directory_get_contents (directory); - - for (l = items; l; l = l->next) { - MateMenuTreeItem *item = l->data; - - if (add_separator || - matemenu_tree_item_get_type (item) == MATEMENU_TREE_ITEM_SEPARATOR) { + iter = matemenu_tree_directory_iter (directory); + while ((type = matemenu_tree_iter_next (iter)) != MATEMENU_TREE_ITEM_INVALID) { + gpointer item; + if (add_separator || type == MATEMENU_TREE_ITEM_SEPARATOR) { add_menu_separator (menu); add_separator = FALSE; } - - switch (matemenu_tree_item_get_type (item)) { - case MATEMENU_TREE_ITEM_DIRECTORY: - create_submenu (menu, MATEMENU_TREE_DIRECTORY (item), NULL); - break; - - case MATEMENU_TREE_ITEM_ENTRY: - create_menuitem (menu, MATEMENU_TREE_ENTRY (item), NULL); - break; - - case MATEMENU_TREE_ITEM_SEPARATOR : - /* already added */ - break; - - case MATEMENU_TREE_ITEM_ALIAS: - create_menuitem_from_alias (menu, MATEMENU_TREE_ALIAS (item)); - break; - - case MATEMENU_TREE_ITEM_HEADER: - create_header (menu, MATEMENU_TREE_HEADER (item)); - break; - - default: - break; + switch (type) { + case MATEMENU_TREE_ITEM_DIRECTORY: + item = matemenu_tree_iter_get_directory(iter); + create_submenu (menu, item, NULL); + matemenu_tree_item_unref (item); + break; + + case MATEMENU_TREE_ITEM_ENTRY: + item = matemenu_tree_iter_get_entry (iter); + create_menuitem (menu, item, NULL); + matemenu_tree_item_unref (item); + break; + + case MATEMENU_TREE_ITEM_SEPARATOR : + /* already added */ + break; + + case MATEMENU_TREE_ITEM_ALIAS: + item = matemenu_tree_iter_get_alias(iter); + create_menuitem_from_alias (menu, item); + matemenu_tree_item_unref (item); + break; + + case MATEMENU_TREE_ITEM_HEADER: + item = matemenu_tree_iter_get_header(iter); + create_header (menu, item); + matemenu_tree_item_unref (item); + break; + + default: + break; } - - matemenu_tree_item_unref (item); } - - g_slist_free (items); + matemenu_tree_iter_unref (iter); return menu; } -- cgit v1.2.1