1075
1076
menuitem = panel_image_menu_item_new ();
1077
panel_load_menu_image_deferred (menuitem,
1078
panel_menu_icon_get_size (),
1080
alias_directory ? gmenu_tree_directory_get_icon (alias_directory) :
1081
gmenu_tree_entry_get_icon (entry),
1082
PANEL_STOCK_DEFAULT_ICON);
1078
if (alias_directory)
1079
panel_load_menu_image_deferred (menuitem,
1080
panel_menu_icon_get_size (),
1082
gmenu_tree_directory_get_icon (alias_directory),
1086
panel_load_menu_image_deferred (menuitem,
1087
panel_menu_icon_get_size (),
1088
NULL, g_app_info_get_icon (G_APP_INFO (gmenu_tree_entry_get_app_info (entry))),
1084
1091
setup_menuitem (menuitem,
1085
1092
panel_menu_icon_get_size (),
1087
1094
alias_directory ? gmenu_tree_directory_get_name (alias_directory) :
1088
gmenu_tree_entry_get_display_name (entry));
1095
g_app_info_get_display_name (G_APP_INFO (gmenu_tree_entry_get_app_info (entry))));
1090
1097
if (alias_directory &&
1091
1098
gmenu_tree_directory_get_comment (alias_directory))
1092
1099
panel_util_set_tooltip_text (menuitem,
1093
1100
gmenu_tree_directory_get_comment (alias_directory));
1094
else if (!alias_directory &&
1095
gmenu_tree_entry_get_comment (entry))
1096
panel_util_set_tooltip_text (menuitem,
1097
gmenu_tree_entry_get_comment (entry));
1098
else if (!alias_directory &&
1099
gmenu_tree_entry_get_generic_name (entry))
1100
panel_util_set_tooltip_text (menuitem,
1101
gmenu_tree_entry_get_generic_name (entry));
1101
else if (!alias_directory) {
1102
const char *description = g_app_info_get_description (G_APP_INFO (gmenu_tree_entry_get_app_info (entry)));
1104
description = g_desktop_app_info_get_generic_name (gmenu_tree_entry_get_app_info (entry));
1106
panel_util_set_tooltip_text (menuitem,
1103
1110
g_signal_connect_after (menuitem, "button_press_event",
1104
1111
G_CALLBACK (menu_dummy_button_press_event), NULL);
1106
1113
if (!panel_lockdown_get_panels_locked_down_s ()) {
1107
1116
static GtkTargetEntry menu_item_targets[] = {
1108
1117
{ "text/uri-list", 0, 0 }
1113
1122
menu_item_targets, 1,
1114
1123
GDK_ACTION_COPY);
1116
if (gmenu_tree_entry_get_icon (entry) != NULL) {
1120
icon = gmenu_tree_entry_get_icon (entry);
1121
if (!g_path_is_absolute (icon)) {
1122
icon_no_ext = panel_xdg_icon_remove_extension (icon);
1123
gtk_drag_source_set_icon_name (menuitem,
1125
g_free (icon_no_ext);
1125
icon = g_app_info_get_icon (G_APP_INFO (gmenu_tree_entry_get_app_info (entry)));
1127
gtk_drag_source_set_icon_gicon (menuitem, icon);
1129
1129
g_signal_connect (G_OBJECT (menuitem), "drag_begin",
1130
1130
G_CALLBACK (drag_begin_menu_cb), NULL);
1146
1146
create_menuitem_from_alias (GtkWidget *menu,
1147
1147
GMenuTreeAlias *alias)
1149
GMenuTreeItem *aliased_item;
1151
aliased_item = gmenu_tree_alias_get_item (alias);
1153
switch (gmenu_tree_item_get_type (aliased_item)) {
1154
case GMENU_TREE_ITEM_DIRECTORY:
1149
GMenuTreeDirectory *src = gmenu_tree_alias_get_directory (alias);
1151
switch (gmenu_tree_alias_get_aliased_item_type (alias)) {
1152
case GMENU_TREE_ITEM_DIRECTORY: {
1153
GMenuTreeDirectory *directory = gmenu_tree_alias_get_aliased_directory (alias);
1155
1154
create_submenu (menu,
1156
GMENU_TREE_DIRECTORY (aliased_item),
1157
gmenu_tree_alias_get_directory (alias));
1157
gmenu_tree_item_unref (directory);
1160
case GMENU_TREE_ITEM_ENTRY:
1161
case GMENU_TREE_ITEM_ENTRY: {
1162
GMenuTreeEntry *entry = gmenu_tree_alias_get_aliased_entry (alias);
1161
1163
create_menuitem (menu,
1162
GMENU_TREE_ENTRY (aliased_item),
1163
gmenu_tree_alias_get_directory (alias));
1166
gmenu_tree_item_unref (entry);
1170
gmenu_tree_item_unref (aliased_item);
1174
gmenu_tree_item_unref (src);
1187
1192
"panel-menu-tree-directory",
1195
if (!gmenu_tree_load_sync (tree, &error)) {
1196
g_warning ("Failed to load applications: %s", error->message);
1197
g_clear_error (&error);
1190
1200
g_object_set_data (G_OBJECT (menu),
1191
1201
"panel-menu-needs-loading",
1192
1202
GUINT_TO_POINTER (TRUE));
1205
1215
remove_gmenu_tree_monitor (GtkWidget *menu,
1206
1216
GMenuTree *tree)
1208
gmenu_tree_remove_monitor (tree,
1209
(GMenuTreeChangedFunc) handle_gmenu_tree_changed,
1218
g_signal_handlers_disconnect_by_func (tree,
1219
G_CALLBACK (handle_gmenu_tree_changed),
1226
1237
"panel-menu-force-icon-for-categories",
1227
1238
GINT_TO_POINTER (TRUE));
1229
tree = gmenu_tree_lookup (menu_file, GMENU_TREE_FLAGS_NONE);
1230
gmenu_tree_set_sort_key (tree, GMENU_TREE_SORT_DISPLAY_NAME);
1240
tree = gmenu_tree_new (menu_file, GMENU_TREE_FLAGS_SORT_DISPLAY_NAME);
1242
if (!gmenu_tree_load_sync (tree, &error)) {
1243
g_warning ("Failed to load applications: %s", error->message);
1244
g_clear_error (&error);
1232
1248
g_object_set_data_full (G_OBJECT (menu),
1233
1249
"panel-menu-tree",
1234
gmenu_tree_ref (tree),
1235
(GDestroyNotify) gmenu_tree_unref);
1250
g_object_ref (tree),
1251
(GDestroyNotify) g_object_unref);
1237
1253
g_object_set_data_full (G_OBJECT (menu),
1238
1254
"panel-menu-tree-path",
1258
1274
g_signal_connect (menu, "button_press_event",
1259
1275
G_CALLBACK (menu_dummy_button_press_event), NULL);
1261
gmenu_tree_add_monitor (tree,
1262
(GMenuTreeChangedFunc) handle_gmenu_tree_changed,
1264
g_signal_connect (menu, "destroy",
1265
G_CALLBACK (remove_gmenu_tree_monitor), tree);
1277
g_signal_connect (tree, "changed", G_CALLBACK (handle_gmenu_tree_changed), menu);
1278
g_signal_connect (menu, "destroy", G_CALLBACK (remove_gmenu_tree_monitor), tree);
1267
gmenu_tree_unref (tree);
1280
g_object_unref (tree);
1274
1287
GMenuTreeDirectory *directory)
1276
1289
GList *children;
1279
1290
gboolean add_separator;
1291
GMenuTreeIter *iter;
1292
GMenuTreeItemType next_type;
1281
1294
children = gtk_container_get_children (GTK_CONTAINER (menu));
1282
1295
add_separator = (children != NULL);
1283
1296
g_list_free (children);
1285
items = gmenu_tree_directory_get_contents (directory);
1298
iter = gmenu_tree_directory_iter (directory);
1287
for (l = items; l; l = l->next) {
1288
GMenuTreeItem *item = l->data;
1300
while ((next_type = gmenu_tree_iter_next (iter)) != GMENU_TREE_ITEM_INVALID) {
1301
gpointer item = NULL;
1290
1303
if (add_separator ||
1291
gmenu_tree_item_get_type (item) == GMENU_TREE_ITEM_SEPARATOR) {
1304
next_type == GMENU_TREE_ITEM_SEPARATOR) {
1292
1305
add_menu_separator (menu);
1293
1306
add_separator = FALSE;
1296
switch (gmenu_tree_item_get_type (item)) {
1309
switch (next_type) {
1297
1310
case GMENU_TREE_ITEM_DIRECTORY:
1298
create_submenu (menu, GMENU_TREE_DIRECTORY (item), NULL);
1311
item = gmenu_tree_iter_get_directory (iter);
1312
create_submenu (menu, item, NULL);
1301
1315
case GMENU_TREE_ITEM_ENTRY:
1302
create_menuitem (menu, GMENU_TREE_ENTRY (item), NULL);
1316
item = gmenu_tree_iter_get_entry (iter);
1317
create_menuitem (menu, item, NULL);
1305
1320
case GMENU_TREE_ITEM_SEPARATOR :
1309
1324
case GMENU_TREE_ITEM_ALIAS:
1310
create_menuitem_from_alias (menu, GMENU_TREE_ALIAS (item));
1325
item = gmenu_tree_iter_get_alias (iter);
1326
create_menuitem_from_alias (menu, item);
1313
1329
case GMENU_TREE_ITEM_HEADER:
1314
create_header (menu, GMENU_TREE_HEADER (item));
1330
item = gmenu_tree_iter_get_header (iter);
1331
create_header (menu, item);
1321
gmenu_tree_item_unref (item);
1339
gmenu_tree_item_unref (item);
1324
g_slist_free (items);
1342
gmenu_tree_iter_unref (iter);