~ubuntu-branches/ubuntu/oneiric/gnome-panel/oneiric

« back to all changes in this revision

Viewing changes to gnome-panel/menu.c

  • Committer: Bazaar Package Importer
  • Author(s): Jeremy Bicha
  • Date: 2011-08-17 21:57:14 UTC
  • mfrom: (1.13.11 upstream)
  • Revision ID: james.westby@ubuntu.com-20110817215714-mr18pl4hqedmprd7
Tags: 1:3.1.5-0ubuntu1
* New upstream release.
* debian/control: Bump gnome-menus dependencies
* debian/libpanel-applet-4-dev.install: No longer any *.a files to install
* debian/patches/09_default_icons.patch: Disabled until it can be ported
* debian/patches/90_build_fixes.patch: Dropped, applied upstream

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/*
 
1
/* -*- c-basic-offset: 8; indent-tabs-mode: t -*-
2
2
 * Copyright (C) 1997 - 2000 The Free Software Foundation
3
3
 * Copyright (C) 2000 Helix Code, Inc.
4
4
 * Copyright (C) 2000 Eazel, Inc.
1008
1008
 
1009
1009
        panel_load_menu_image_deferred (menuitem,
1010
1010
                                        panel_menu_icon_get_size (),
1011
 
                                        NULL, NULL,
 
1011
                                        NULL,
1012
1012
                                        gmenu_tree_directory_get_icon (directory),
 
1013
                                        NULL,
1013
1014
                                        PANEL_ICON_FOLDER);
1014
1015
 
1015
1016
        setup_menuitem (menuitem,
1074
1075
        
1075
1076
        menuitem = panel_image_menu_item_new ();
1076
1077
 
1077
 
        panel_load_menu_image_deferred (menuitem,
1078
 
                                        panel_menu_icon_get_size (),
1079
 
                                        NULL, NULL,
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 (),
 
1081
                                                NULL,
 
1082
                                                gmenu_tree_directory_get_icon (alias_directory),
 
1083
                                                NULL,
 
1084
                                                NULL);
 
1085
        else
 
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))),
 
1089
                                                NULL, NULL);
1083
1090
 
1084
1091
        setup_menuitem (menuitem,
1085
1092
                        panel_menu_icon_get_size (),
1086
1093
                        NULL,
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))));
1089
1096
 
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)));
 
1103
                if (!description)
 
1104
                        description = g_desktop_app_info_get_generic_name (gmenu_tree_entry_get_app_info (entry));
 
1105
                if (description)
 
1106
                        panel_util_set_tooltip_text (menuitem,
 
1107
                                                     description);
 
1108
        }
1102
1109
 
1103
1110
        g_signal_connect_after (menuitem, "button_press_event",
1104
1111
                                G_CALLBACK (menu_dummy_button_press_event), NULL);
1105
1112
 
1106
1113
        if (!panel_lockdown_get_panels_locked_down_s ()) {
 
1114
                GIcon *icon;
 
1115
 
1107
1116
                static GtkTargetEntry menu_item_targets[] = {
1108
1117
                        { "text/uri-list", 0, 0 }
1109
1118
                };
1113
1122
                                     menu_item_targets, 1,
1114
1123
                                     GDK_ACTION_COPY);
1115
1124
 
1116
 
                if (gmenu_tree_entry_get_icon (entry) != NULL) {
1117
 
                        const char *icon;
1118
 
                        char       *icon_no_ext;
1119
 
 
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,
1124
 
                                                               icon_no_ext);
1125
 
                                g_free (icon_no_ext);
1126
 
                        }
1127
 
                }
 
1125
                icon = g_app_info_get_icon (G_APP_INFO (gmenu_tree_entry_get_app_info (entry)));
 
1126
                if (icon != NULL)
 
1127
                        gtk_drag_source_set_icon_gicon (menuitem, icon);
1128
1128
 
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)
1148
1148
{
1149
 
        GMenuTreeItem *aliased_item;
1150
 
 
1151
 
        aliased_item = gmenu_tree_alias_get_item (alias);
1152
 
 
1153
 
        switch (gmenu_tree_item_get_type (aliased_item)) {
1154
 
        case GMENU_TREE_ITEM_DIRECTORY:
 
1149
        GMenuTreeDirectory *src = gmenu_tree_alias_get_directory (alias);
 
1150
 
 
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));
 
1155
                                directory,
 
1156
                                src);
 
1157
                gmenu_tree_item_unref (directory);
1158
1158
                break;
 
1159
        }
1159
1160
 
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));
 
1164
                                 entry,
 
1165
                                 src);
 
1166
                gmenu_tree_item_unref (entry);
1164
1167
                break;
 
1168
        }
1165
1169
 
1166
1170
        default:
1167
1171
                break;
1168
1172
        }
1169
1173
 
1170
 
        gmenu_tree_item_unref (aliased_item);
 
1174
        gmenu_tree_item_unref (src);
1171
1175
}
1172
1176
 
1173
1177
static void
1176
1180
{
1177
1181
        guint idle_id;
1178
1182
        GList *list, *l;
 
1183
        GError *error = NULL;
1179
1184
 
1180
1185
        /* Remove existing items */
1181
1186
        list = gtk_container_get_children (GTK_CONTAINER (menu));
1187
1192
                                "panel-menu-tree-directory",
1188
1193
                                NULL, NULL);
1189
1194
 
 
1195
        if (!gmenu_tree_load_sync (tree, &error)) {
 
1196
                g_warning ("Failed to load applications: %s", error->message);
 
1197
                g_clear_error (&error);
 
1198
        }
 
1199
 
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)
1207
1217
{
1208
 
        gmenu_tree_remove_monitor (tree,
1209
 
                                  (GMenuTreeChangedFunc) handle_gmenu_tree_changed,
1210
 
                                  menu);
 
1218
        g_signal_handlers_disconnect_by_func (tree,
 
1219
                                              G_CALLBACK (handle_gmenu_tree_changed),
 
1220
                                              menu);
1211
1221
}
1212
1222
 
1213
1223
GtkWidget *
1218
1228
        GMenuTree *tree;
1219
1229
        GtkWidget *menu;
1220
1230
        guint      idle_id;
 
1231
        GError *error = NULL;
1221
1232
 
1222
1233
        menu = create_empty_menu ();
1223
1234
 
1226
1237
                                   "panel-menu-force-icon-for-categories",
1227
1238
                                   GINT_TO_POINTER (TRUE));
1228
1239
 
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);
 
1241
 
 
1242
        if (!gmenu_tree_load_sync (tree, &error)) {
 
1243
                g_warning ("Failed to load applications: %s", error->message);
 
1244
                g_clear_error (&error);
 
1245
                return menu;
 
1246
        }
1231
1247
 
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);
1236
1252
 
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);
1260
1276
 
1261
 
        gmenu_tree_add_monitor (tree,
1262
 
                               (GMenuTreeChangedFunc) handle_gmenu_tree_changed,
1263
 
                               menu);
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);
1266
1279
 
1267
 
        gmenu_tree_unref (tree);
 
1280
        g_object_unref (tree);
1268
1281
 
1269
1282
        return menu;
1270
1283
}
1274
1287
                              GMenuTreeDirectory *directory)
1275
1288
{       
1276
1289
        GList    *children;
1277
 
        GSList   *l;
1278
 
        GSList   *items;
1279
1290
        gboolean  add_separator;
 
1291
        GMenuTreeIter *iter;
 
1292
        GMenuTreeItemType next_type;
1280
1293
 
1281
1294
        children = gtk_container_get_children (GTK_CONTAINER (menu));
1282
1295
        add_separator = (children != NULL);
1283
1296
        g_list_free (children);
1284
1297
 
1285
 
        items = gmenu_tree_directory_get_contents (directory);
 
1298
        iter = gmenu_tree_directory_iter (directory);
1286
1299
 
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;
1289
1302
 
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;
1294
1307
                }
1295
1308
 
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);
1299
1313
                        break;
1300
1314
 
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);
1303
1318
                        break;
1304
1319
 
1305
1320
                case GMENU_TREE_ITEM_SEPARATOR :
1307
1322
                        break;
1308
1323
 
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);
1311
1327
                        break;
1312
1328
 
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);
1315
1332
                        break;
1316
1333
 
1317
1334
                default:
1318
1335
                        break;
1319
1336
                }
1320
1337
 
1321
 
                gmenu_tree_item_unref (item);
 
1338
                if (item)
 
1339
                        gmenu_tree_item_unref (item);
1322
1340
        }
1323
1341
 
1324
 
        g_slist_free (items);
 
1342
        gmenu_tree_iter_unref (iter);
1325
1343
 
1326
1344
        return menu;
1327
1345
}