~ubuntu-branches/ubuntu/oneiric/cairo-dock/oneiric

« back to all changes in this revision

Viewing changes to src/cairo-dock-menu.c

  • Committer: Bazaar Package Importer
  • Author(s): Matthieu Baerts (matttbe)
  • Date: 2010-09-07 20:31:25 UTC
  • mto: (18.1.1 cairo-dock) (19.1.1 cairo-dock)
  • mto: This revision was merged to the branch mainline in revision 14.
  • Revision ID: james.westby@ubuntu.com-20100907203125-a91ch8odv2r6ziic
Tags: upstream-2.2.0~0rc1
ImportĀ upstreamĀ versionĀ 2.2.0~0rc1

Show diffs side-by-side

added added

removed removed

Lines of Context:
62
62
#include "cairo-dock-keyfile-utilities.h"
63
63
#include "cairo-dock-backends-manager.h"
64
64
#include "cairo-dock-X-manager.h"
 
65
#include "cairo-dock-user-interaction.h"  // set_custom_icon_on_appli
65
66
#include "cairo-dock-menu.h"
66
67
 
67
68
#define CAIRO_DOCK_CONF_PANEL_WIDTH 1000
318
319
 
319
320
gboolean cairo_dock_notification_build_container_menu (gpointer *pUserData, Icon *icon, CairoContainer *pContainer, GtkWidget *menu, gboolean *bDiscardMenu)
320
321
{
321
 
        //\_________________________ On ajoute le sous-menu Cairo-Dock, toujours present.
 
322
        if (CAIRO_DOCK_IS_DOCK (pContainer) && CAIRO_DOCK (pContainer)->iRefCount > 0)  // pas sur les sous-docks
 
323
                return CAIRO_DOCK_LET_PASS_NOTIFICATION;
 
324
        
 
325
        //\_________________________ On ajoute le sous-menu Cairo-Dock.
322
326
        GtkWidget *pMenuItem, *image;
323
327
        GdkPixbuf *pixbuf;
324
328
        pMenuItem = gtk_image_menu_item_new_with_label ("Cairo-Dock");
327
331
        g_object_unref (pixbuf);
328
332
        gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (pMenuItem), image);
329
333
        gtk_menu_shell_append  (GTK_MENU_SHELL (menu), pMenuItem);
330
 
 
 
334
        
331
335
        GtkWidget *pSubMenu = gtk_menu_new ();
332
336
        gtk_menu_item_set_submenu (GTK_MENU_ITEM (pMenuItem), pSubMenu);
333
 
 
 
337
        
334
338
        if (! cairo_dock_is_locked ())
335
339
        {
336
340
                if (CAIRO_DOCK_IS_DOCK (pContainer) && ! CAIRO_DOCK (pContainer)->bIsMainDock && CAIRO_DOCK (pContainer)->iRefCount == 0)
350
354
                        NULL);
351
355
                gtk_widget_set_tooltip_text (pMenuItem, _("Configure behaviour, appearance, and applets."));
352
356
                
353
 
                pMenuItem = cairo_dock_add_in_menu_with_stock_and_data (_("Manage themes"), 
 
357
                pMenuItem = cairo_dock_add_in_menu_with_stock_and_data (_("Manage themes"),
354
358
                        CAIRO_DOCK_SHARE_DATA_DIR"/icon-appearance.svg",
355
359
                        (GFunc)_cairo_dock_initiate_theme_management,
356
360
                        pSubMenu,
429
433
                        pSubMenu,
430
434
                        pContainer);
431
435
        }
 
436
        return CAIRO_DOCK_LET_PASS_NOTIFICATION;
432
437
}
433
438
 
434
439
 
679
684
        if (CAIRO_DOCK_IS_APPLI (icon))
680
685
                cairo_dock_close_xwindow (icon->Xid);
681
686
}
 
687
static void _show_image_preview (GtkFileChooser *pFileChooser, GtkImage *pPreviewImage)
 
688
{
 
689
        gchar *cFileName = gtk_file_chooser_get_preview_filename (pFileChooser);
 
690
        if (cFileName == NULL)
 
691
                return ;
 
692
        GdkPixbuf *pixbuf = gdk_pixbuf_new_from_file_at_size (cFileName, 64, 64, NULL);
 
693
        g_free (cFileName);
 
694
        if (pixbuf != NULL)
 
695
        {
 
696
                gtk_image_set_from_pixbuf (pPreviewImage, pixbuf);
 
697
                gdk_pixbuf_unref (pixbuf);
 
698
                gtk_file_chooser_set_preview_widget_active (pFileChooser, TRUE);
 
699
        }
 
700
        else
 
701
                gtk_file_chooser_set_preview_widget_active (pFileChooser, FALSE);
 
702
}
 
703
static void _cairo_dock_set_custom_appli_icon (GtkMenuItem *pMenuItem, gpointer *data)
 
704
{
 
705
        Icon *icon = data[0];
 
706
        CairoDock *pDock = data[1];
 
707
        if (! CAIRO_DOCK_IS_APPLI (icon))
 
708
                return;
 
709
        
 
710
        GtkWidget* pFileChooserDialog = gtk_file_chooser_dialog_new (
 
711
                "Pick up an image",
 
712
                GTK_WINDOW (pDock->container.pWidget),
 
713
                GTK_FILE_CHOOSER_ACTION_OPEN,
 
714
                GTK_STOCK_OK,
 
715
                GTK_RESPONSE_OK,
 
716
                GTK_STOCK_CANCEL,
 
717
                GTK_RESPONSE_CANCEL,
 
718
                NULL);
 
719
        gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (pFileChooserDialog), "~/.config/cairo-dock/current_theme/icons");
 
720
        gtk_file_chooser_set_select_multiple (GTK_FILE_CHOOSER (pFileChooserDialog), FALSE);
 
721
        
 
722
        GtkWidget *pPreviewImage = gtk_image_new ();
 
723
        gtk_file_chooser_set_preview_widget (GTK_FILE_CHOOSER (pFileChooserDialog), pPreviewImage);
 
724
        g_signal_connect (GTK_FILE_CHOOSER (pFileChooserDialog), "update-preview", G_CALLBACK (_show_image_preview), pPreviewImage);
 
725
        
 
726
        gtk_widget_show (pFileChooserDialog);
 
727
        int answer = gtk_dialog_run (GTK_DIALOG (pFileChooserDialog));
 
728
        if (answer == GTK_RESPONSE_OK)
 
729
        {
 
730
                gchar *cFilePath = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (pFileChooserDialog));
 
731
                cairo_dock_set_custom_icon_on_appli (cFilePath, icon, CAIRO_CONTAINER (pDock));
 
732
                g_free (cFilePath);
 
733
        }
 
734
        gtk_widget_destroy (pFileChooserDialog);
 
735
}
682
736
static void _cairo_dock_remove_custom_appli_icon (GtkMenuItem *pMenuItem, gpointer *data)
683
737
{
684
738
        Icon *icon = data[0];
1036
1090
                                                g_string_printf (sDesktop, cLabel, i+1);
1037
1091
                                        else
1038
1092
                                                g_string_printf (sDesktop, cLabel, j*g_desktopGeometry.iNbViewportX+k+1);
1039
 
                                        iDesktopCode = i * g_desktopGeometry.iNbViewportY * g_desktopGeometry.iNbViewportX + j * g_desktopGeometry.iNbViewportY + k;
 
1093
                                        iDesktopCode = i * g_desktopGeometry.iNbViewportY * g_desktopGeometry.iNbViewportX + j * g_desktopGeometry.iNbViewportX + k;
1040
1094
                                        user_data = &s_pDesktopData[4*iDesktopCode];
1041
1095
                                        user_data[0] = data;
1042
1096
                                        user_data[1] = GINT_TO_POINTER (i);
1082
1136
        data[1] = pContainer;
1083
1137
        data[2] = menu;
1084
1138
        GtkWidget *pMenuItem, *image;
1085
 
 
 
1139
        
 
1140
        gboolean bAddSeparator = ! (CAIRO_DOCK_IS_DOCK (pContainer) && CAIRO_DOCK (pContainer)->iRefCount > 0);  // pas sur les sous-docks.
 
1141
        
1086
1142
        //\_________________________ Si pas d'icone dans un dock, on s'arrete la.
1087
1143
        if (CAIRO_DOCK_IS_DOCK (pContainer) && (icon == NULL || CAIRO_DOCK_IS_AUTOMATIC_SEPARATOR (icon)))
1088
1144
        {
1089
1145
                if (! cairo_dock_is_locked ())
1090
1146
                {
1091
 
                        _add_add_entry (menu, data, FALSE, TRUE);
 
1147
                        Icon *pPointingIcon = cairo_dock_search_icon_pointing_on_dock (CAIRO_DOCK (pContainer), NULL);
 
1148
                        if (CAIRO_DOCK_ICON_TYPE_IS_CONTAINER (pPointingIcon))
 
1149
                                _add_add_entry (menu, data, FALSE, TRUE);
1092
1150
                }
1093
1151
                return CAIRO_DOCK_LET_PASS_NOTIFICATION;
1094
1152
        }
1103
1161
                
1104
1162
                        if (icon->cDesktopFileName != NULL && icon->cParentDockName != NULL)  // possede un .desktop.
1105
1163
                        {
1106
 
                                pMenuItem = gtk_separator_menu_item_new ();
1107
 
                                gtk_menu_shell_append (GTK_MENU_SHELL (menu), pMenuItem);
1108
 
                        
 
1164
                                if (bAddSeparator)
 
1165
                                {
 
1166
                                        pMenuItem = gtk_separator_menu_item_new ();
 
1167
                                        gtk_menu_shell_append (GTK_MENU_SHELL (menu), pMenuItem);
 
1168
                                }
 
1169
                                bAddSeparator = TRUE;
 
1170
                                
1109
1171
                                _add_entry_in_menu (CAIRO_DOCK_IS_USER_SEPARATOR (icon) ? _("Modify this separator") : _("Modify this launcher"), GTK_STOCK_EDIT, _cairo_dock_modify_launcher, menu);
1110
1172
                                
1111
1173
                                pMenuItem = _add_entry_in_menu (CAIRO_DOCK_IS_USER_SEPARATOR (icon) ? _("Remove this separator") : _("Remove this launcher"), GTK_STOCK_REMOVE, _cairo_dock_remove_launcher, menu);
1125
1187
        //\_________________________ On rajoute les actions sur les applis.
1126
1188
        if (CAIRO_DOCK_IS_APPLI (icon))
1127
1189
        {
1128
 
                pMenuItem = gtk_separator_menu_item_new ();
1129
 
                gtk_menu_shell_append (GTK_MENU_SHELL (menu), pMenuItem);
 
1190
                if (bAddSeparator)
 
1191
                {
 
1192
                        pMenuItem = gtk_separator_menu_item_new ();
 
1193
                        gtk_menu_shell_append (GTK_MENU_SHELL (menu), pMenuItem);
 
1194
                }
 
1195
                bAddSeparator = TRUE;
1130
1196
                
1131
1197
                //\_________________________ On rajoute les actions supplementaires sur les icones d'applis.
1132
1198
                pMenuItem = gtk_menu_item_new_with_label (_("Other actions"));
1156
1222
                
1157
1223
                _add_desktops_entry (pSubMenuOtherActions, FALSE, data);
1158
1224
                
1159
 
                if (myTaskBar.bOverWriteXIcons)
 
1225
                if (CAIRO_DOCK_ICON_TYPE_IS_APPLI (icon))
1160
1226
                {
1161
 
                        gchar *cCustomIcon = g_strdup_printf ("%s/%s.png", g_cCurrentIconsPath, icon->cClass);
1162
 
                        if (!g_file_test (cCustomIcon, G_FILE_TEST_EXISTS))
 
1227
                        if (myTaskBar.bOverWriteXIcons)
1163
1228
                        {
1164
 
                                g_free (cCustomIcon);
1165
 
                                cCustomIcon = g_strdup_printf ("%s/%s.svg", g_cCurrentIconsPath, icon->cClass);
 
1229
                                gchar *cCustomIcon = g_strdup_printf ("%s/%s.png", g_cCurrentIconsPath, icon->cClass);
1166
1230
                                if (!g_file_test (cCustomIcon, G_FILE_TEST_EXISTS))
1167
1231
                                {
1168
1232
                                        g_free (cCustomIcon);
1169
 
                                        cCustomIcon = NULL;
1170
 
                                }
1171
 
                        }
1172
 
                        if (cCustomIcon != NULL)
1173
 
                        {
1174
 
                                _add_entry_in_menu (_("Remove custom icon"), GTK_STOCK_REMOVE, _cairo_dock_remove_custom_appli_icon, pSubMenuOtherActions);
1175
 
                        }
 
1233
                                        cCustomIcon = g_strdup_printf ("%s/%s.svg", g_cCurrentIconsPath, icon->cClass);
 
1234
                                        if (!g_file_test (cCustomIcon, G_FILE_TEST_EXISTS))
 
1235
                                        {
 
1236
                                                g_free (cCustomIcon);
 
1237
                                                cCustomIcon = NULL;
 
1238
                                        }
 
1239
                                }
 
1240
                                if (cCustomIcon != NULL)
 
1241
                                {
 
1242
                                        _add_entry_in_menu (_("Remove custom icon"), GTK_STOCK_REMOVE, _cairo_dock_remove_custom_appli_icon, pSubMenuOtherActions);
 
1243
                                }
 
1244
                        }
 
1245
                        
 
1246
                        _add_entry_in_menu (_("Set a custom icon"), GTK_STOCK_SELECT_COLOR, _cairo_dock_set_custom_appli_icon, pSubMenuOtherActions);
1176
1247
                }
1177
1248
                
1178
1249
                _add_entry_in_menu (_("Kill"), GTK_STOCK_CANCEL, _cairo_dock_kill_appli, pSubMenuOtherActions);
1199
1270
        }
1200
1271
        else if (CAIRO_DOCK_IS_MULTI_APPLI (icon))
1201
1272
        {
1202
 
                pMenuItem = gtk_separator_menu_item_new ();
1203
 
                gtk_menu_shell_append (GTK_MENU_SHELL (menu), pMenuItem);
 
1273
                if (bAddSeparator)
 
1274
                {
 
1275
                        pMenuItem = gtk_separator_menu_item_new ();
 
1276
                        gtk_menu_shell_append (GTK_MENU_SHELL (menu), pMenuItem);
 
1277
                }
 
1278
                bAddSeparator = TRUE;
1204
1279
                
1205
1280
                //\_________________________ On rajoute les actions supplementaires sur la classe.
1206
1281
                pMenuItem = gtk_menu_item_new_with_label (_("Other actions"));
1238
1313
                //\_________________________ On rajoute les actions propres a un module.
1239
1314
                if (! cairo_dock_is_locked () && CAIRO_DOCK_IS_APPLET (pIconModule))
1240
1315
                {
1241
 
                        pMenuItem = gtk_separator_menu_item_new ();
1242
 
                        gtk_menu_shell_append (GTK_MENU_SHELL (menu), pMenuItem);
 
1316
                        if (bAddSeparator)
 
1317
                        {
 
1318
                                pMenuItem = gtk_separator_menu_item_new ();
 
1319
                                gtk_menu_shell_append (GTK_MENU_SHELL (menu), pMenuItem);
 
1320
                        }
 
1321
                        bAddSeparator = TRUE;
1243
1322
                        
1244
1323
                        _add_entry_in_menu (_("Configure this applet"), GTK_STOCK_PROPERTIES, _cairo_dock_initiate_config_module, menu);
1245
1324
        
1271
1350
        //\_________________________ On rajoute les actions de positionnement d'un desklet.
1272
1351
        if (! cairo_dock_is_locked () && CAIRO_DOCK_IS_DESKLET (pContainer))
1273
1352
        {
1274
 
                pMenuItem = gtk_separator_menu_item_new ();
1275
 
                gtk_menu_shell_append (GTK_MENU_SHELL (menu), pMenuItem);
 
1353
                if (bAddSeparator)
 
1354
                {
 
1355
                        pMenuItem = gtk_separator_menu_item_new ();
 
1356
                        gtk_menu_shell_append (GTK_MENU_SHELL (menu), pMenuItem);
 
1357
                }
 
1358
                bAddSeparator = TRUE;
1276
1359
                
1277
1360
                pMenuItem = gtk_menu_item_new_with_label (_("Visibility"));
1278
1361
                gtk_menu_shell_append  (GTK_MENU_SHELL (menu), pMenuItem);