summaryrefslogtreecommitdiff
path: root/mate-panel/menu.c
diff options
context:
space:
mode:
Diffstat (limited to 'mate-panel/menu.c')
-rw-r--r--mate-panel/menu.c289
1 files changed, 153 insertions, 136 deletions
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;
}