static GtkWidget * populate_menu_from_directory (GtkWidget *menu, MateMenuTreeDirectory *directory) { GList *children; GSList *l; GSList *items; gboolean add_separator; 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) { 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; } matemenu_tree_item_unref (item); } g_slist_free (items); return menu; }
static void add_drawers_from_dir (MateMenuTreeDirectory *directory, int pos, const char *toplevel_id) { const char *name; const char *icon; GSList *items; GSList *l; char *attached_toplevel_id; name = matemenu_tree_directory_get_name (directory); icon = matemenu_tree_directory_get_icon (directory); attached_toplevel_id = panel_drawer_create_with_id (toplevel_id, pos, icon, icon != NULL, name); 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; } matemenu_tree_item_unref (item); } g_slist_free (items); g_free (attached_toplevel_id); }
static void create_header (GtkWidget *menu, MateMenuTreeHeader *header) { MateMenuTreeDirectory *directory; GtkWidget *menuitem; directory = matemenu_tree_header_get_directory (header); menuitem = create_submenu_entry (menu, directory); matemenu_tree_item_unref (directory); g_object_set_data_full (G_OBJECT (menuitem), "panel-matemenu-tree.header", matemenu_tree_item_ref (header), (GDestroyNotify) matemenu_tree_item_unref); g_signal_connect (menuitem, "activate", G_CALLBACK (gtk_false), NULL); }
static GSList* get_all_applications(void) { MateMenuTree* tree; MateMenuTreeDirectory* root; GSList* retval; tree = matemenu_tree_lookup("mate-applications.menu", MATEMENU_TREE_FLAGS_NONE); matemenu_tree_set_sort_key(tree, MATEMENU_TREE_SORT_DISPLAY_NAME); root = matemenu_tree_get_root_directory(tree); retval = get_all_applications_from_dir(root, NULL); matemenu_tree_item_unref(root); matemenu_tree_unref(tree); retval = g_slist_sort(retval, (GCompareFunc) compare_applications); return retval; }
static void add_menudrawer_to_panel (GtkWidget *menuitem, MateMenuTreeEntry *entry) { MateMenuTreeDirectory *directory; PanelWidget *panel; PanelData *pd; int insertion_pos; directory = matemenu_tree_item_get_parent (MATEMENU_TREE_ITEM (entry)); panel = menu_get_panel (menuitem); pd = g_object_get_data (G_OBJECT (panel->toplevel), "PanelData"); insertion_pos = pd ? pd->insertion_pos : -1; add_drawers_from_dir (directory, insertion_pos, panel_profile_get_toplevel_id (panel->toplevel)); matemenu_tree_item_unref (directory); }
static GtkWidget * create_item_context_menu (GtkWidget *item, PanelWidget *panel_widget) { MateMenuTreeEntry *entry; MateMenuTreeDirectory *directory; MateMenuTree *tree; GtkWidget *menu; GtkWidget *submenu; GtkWidget *menuitem; const char *menu_filename; gboolean id_lists_writable; id_lists_writable = panel_profile_id_lists_are_writable (); entry = g_object_get_data (G_OBJECT (item), "panel-menu-tree-entry"); if (!entry) return NULL; directory = matemenu_tree_item_get_parent (MATEMENU_TREE_ITEM (entry)); if (!directory) return NULL; tree = matemenu_tree_directory_get_tree (directory); matemenu_tree_item_unref (directory); if (!tree) return NULL; menu_filename = matemenu_tree_get_menu_file (tree); matemenu_tree_unref (tree); if (!menu_filename) return NULL; menu = create_empty_menu (); g_object_set_data (G_OBJECT (item), "panel-item-context-menu", menu); g_object_set_data (G_OBJECT (menu), "menu_panel", panel_widget); g_signal_connect (item, "destroy", G_CALLBACK (menu_destroy_context_menu), menu); g_signal_connect (menu, "deactivate", G_CALLBACK (restore_grabs), item); menuitem = gtk_menu_item_new_with_mnemonic (_("Add this launcher to _panel")); g_signal_connect (menuitem, "activate", G_CALLBACK (add_app_to_panel), entry); gtk_widget_set_sensitive (menuitem, id_lists_writable); gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); gtk_widget_show (menuitem); menuitem = gtk_menu_item_new_with_mnemonic (_("Add this launcher to _desktop")); g_signal_connect (menuitem, "activate", G_CALLBACK (add_app_to_desktop), entry); gtk_widget_set_sensitive (menuitem, id_lists_writable); gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); gtk_widget_show (menuitem); submenu = create_empty_menu (); g_object_set_data (G_OBJECT (submenu), "menu_panel", panel_widget); menuitem = gtk_menu_item_new_with_mnemonic (_("_Entire menu")); gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu); gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); gtk_widget_show (menuitem); menuitem = gtk_menu_item_new_with_mnemonic (_("Add this as _drawer to panel")); g_signal_connect (menuitem, "activate", G_CALLBACK (add_menudrawer_to_panel), entry); gtk_widget_set_sensitive (menuitem, id_lists_writable); gtk_menu_shell_append (GTK_MENU_SHELL (submenu), menuitem); gtk_widget_show (menuitem); menuitem = gtk_menu_item_new_with_mnemonic (_("Add this as _menu to panel")); g_signal_connect (menuitem, "activate", G_CALLBACK (add_menu_to_panel), entry); gtk_widget_set_sensitive (menuitem, id_lists_writable); gtk_menu_shell_append (GTK_MENU_SHELL (submenu), menuitem); gtk_widget_show (menuitem); return menu; }
static gboolean panel_run_dialog_add_items_idle (PanelRunDialog *dialog) { GtkCellRenderer *renderer; GtkTreeViewColumn *column; GtkTreeModel *model_filter; GSList *all_applications; GSList *l; GSList *next; const char *prev_name; /* create list store */ dialog->program_list_store = gtk_list_store_new (NUM_COLUMNS, G_TYPE_ICON, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_BOOLEAN); all_applications = get_all_applications (); /* Strip duplicates */ prev_name = NULL; for (l = all_applications; l; l = next) { MateMenuTreeEntry *entry = l->data; const char *entry_name; next = l->next; entry_name = matemenu_tree_entry_get_display_name (entry); if (prev_name && entry_name && strcmp (entry_name, prev_name) == 0) { matemenu_tree_item_unref (entry); all_applications = g_slist_delete_link (all_applications, l); } else { prev_name = entry_name; } } for (l = all_applications; l; l = l->next) { MateMenuTreeEntry *entry = l->data; GtkTreeIter iter; const gchar *icon = matemenu_tree_entry_get_icon (entry); GIcon *gicon = panel_gicon_from_icon_name (icon); gtk_list_store_append (dialog->program_list_store, &iter); gtk_list_store_set (dialog->program_list_store, &iter, COLUMN_GICON, gicon, COLUMN_NAME, matemenu_tree_entry_get_display_name (entry), COLUMN_COMMENT, matemenu_tree_entry_get_comment (entry), COLUMN_EXEC, matemenu_tree_entry_get_exec (entry), COLUMN_PATH, matemenu_tree_entry_get_desktop_file_path (entry), COLUMN_VISIBLE, TRUE, -1); g_object_unref (gicon); matemenu_tree_item_unref (entry); } g_slist_free (all_applications); model_filter = gtk_tree_model_filter_new (GTK_TREE_MODEL (dialog->program_list_store), NULL); gtk_tree_model_filter_set_visible_column (GTK_TREE_MODEL_FILTER (model_filter), COLUMN_VISIBLE); gtk_tree_view_set_model (GTK_TREE_VIEW (dialog->program_list), model_filter); //FIXME use the same search than the fuzzy one? gtk_tree_view_set_search_column (GTK_TREE_VIEW (dialog->program_list), COLUMN_NAME); renderer = gtk_cell_renderer_pixbuf_new (); g_object_set (renderer, "stock-size", panel_menu_icon_get_size(), NULL); column = gtk_tree_view_column_new (); gtk_tree_view_column_pack_start (column, renderer, FALSE); gtk_tree_view_column_set_attributes (column, renderer, "gicon", COLUMN_GICON, NULL); renderer = gtk_cell_renderer_text_new (); gtk_tree_view_column_pack_start (column, renderer, TRUE); gtk_tree_view_column_set_attributes (column, renderer, "text", COLUMN_NAME, NULL); gtk_tree_view_append_column (GTK_TREE_VIEW (dialog->program_list), column); dialog->add_items_idle_id = 0; return G_SOURCE_REMOVE; }