36
37
#include "cairo-dock-icons.h"
37
38
#include "cairo-dock-callbacks.h"
38
39
#include "cairo-dock-applications-manager.h"
40
#include "cairo-dock-application-facility.h"
39
41
#include "cairo-dock-desktop-file-factory.h"
40
#include "cairo-dock-launcher-factory.h"
42
#include "cairo-dock-launcher-manager.h"
41
43
#include "cairo-dock-modules.h"
42
44
#include "cairo-dock-dock-factory.h"
43
45
#include "cairo-dock-dock-facility.h"
44
46
#include "cairo-dock-themes-manager.h"
47
#include "cairo-dock-gui-themes.h"
45
48
#include "cairo-dock-notifications.h"
46
#include "cairo-dock-dialogs.h"
49
#include "cairo-dock-dialog-manager.h"
47
50
#include "cairo-dock-file-manager.h"
48
51
#include "cairo-dock-log.h"
49
#include "cairo-dock-desklet.h"
52
#include "cairo-dock-desklet-factory.h"
50
53
#include "cairo-dock-X-utilities.h"
51
54
#include "cairo-dock-dock-manager.h"
52
55
#include "cairo-dock-class-manager.h"
53
56
#include "cairo-dock-gui-factory.h"
54
57
#include "cairo-dock-gui-manager.h"
55
58
#include "cairo-dock-internal-accessibility.h"
59
#include "cairo-dock-internal-taskbar.h"
56
60
#include "cairo-dock-internal-icons.h"
57
61
#include "cairo-dock-container.h"
58
62
#include "cairo-dock-keyfile-utilities.h"
59
#include "cairo-dock-renderer-manager.h"
63
#include "cairo-dock-backends-manager.h"
64
#include "cairo-dock-X-manager.h"
60
65
#include "cairo-dock-menu.h"
62
#define CAIRO_DOCK_CONF_PANEL_WIDTH 800
67
#define CAIRO_DOCK_CONF_PANEL_WIDTH 1000
63
68
#define CAIRO_DOCK_CONF_PANEL_HEIGHT 600
64
69
#define CAIRO_DOCK_LAUNCHER_PANEL_WIDTH 600
65
70
#define CAIRO_DOCK_LAUNCHER_PANEL_HEIGHT 350
197
203
GtkWidget *pLink = gtk_link_button_new_with_label (CAIRO_DOCK_SITE_URL, "Cairo-Dock (2007-2010)\n version "CAIRO_DOCK_VERSION);
198
204
gtk_box_pack_start (GTK_BOX (pVBox), pLink, FALSE, FALSE, 0);
200
pLink = gtk_link_button_new_with_label (CAIRO_DOCK_FORUM_URL, _("Community's site"));
201
gtk_widget_set_tooltip_text (pLink, _("A problem ? A suggestion ? Want to talk to us ? You're welcome !"));
206
pLink = gtk_link_button_new_with_label (CAIRO_DOCK_FORUM_URL, _("Community site"));
207
gtk_widget_set_tooltip_text (pLink, _("Problems? Suggestions? Just want to talk to us? Come on over!"));
202
208
gtk_box_pack_start (GTK_BOX (pVBox), pLink, FALSE, FALSE, 0);
204
pLink = gtk_link_button_new_with_label (CAIRO_DOCK_FILE_HOST_URL, _("Development's site"));
205
gtk_widget_set_tooltip_text (pLink, _("Find out the latest version of Cairo-Dock here !."));
210
pLink = gtk_link_button_new_with_label (CAIRO_DOCK_FILE_HOST_URL, _("Development site"));
211
gtk_widget_set_tooltip_text (pLink, _("Find the latest version of Cairo-Dock here !"));
206
212
gtk_box_pack_start (GTK_BOX (pVBox), pLink, FALSE, FALSE, 0);
208
214
pLink = gtk_link_button_new_with_label (CAIRO_DOCK_PLUGINS_EXTRAS_URL, _("Cairo-Dock-Plug-ins-Extras"));
209
gtk_widget_set_tooltip_text (pLink, _("Get more applets !"));
215
gtk_widget_set_tooltip_text (pLink, _("Other applets"));
210
216
gtk_box_pack_start (GTK_BOX (pVBox), pLink, FALSE, FALSE, 0);
212
/*gchar *cImagePath = g_strdup_printf ("%s/%s", CAIRO_DOCK_SHARE_DATA_DIR, CAIRO_DOCK_LOGO);
213
GtkWidget *pImage = gtk_image_new_from_file (cImagePath);
215
#if GTK_MINOR_VERSION >= 12
216
gtk_message_dialog_set_image (GTK_MESSAGE_DIALOG (pDialog), pImage);
218
218
GtkWidget *pNoteBook = gtk_notebook_new ();
219
219
gtk_notebook_set_scrollable (GTK_NOTEBOOK (pNoteBook), TRUE);
220
220
gtk_notebook_popup_enable (GTK_NOTEBOOK (pNoteBook));
221
//gtk_container_add (GTK_CONTAINER (GTK_DIALOG(pDialog)->vbox), pNoteBook);
222
221
gtk_box_pack_start (GTK_BOX (pContentBox), pNoteBook, TRUE, TRUE, 0);
224
223
_cairo_dock_add_about_page (pNoteBook,
225
224
_("Development"),
226
225
"<b>Main developer :</b>\n Fabounet (Fabrice Rey)\n\
227
226
<b>Original idea/first development :</b>\n Mac Slow\n\
228
<b>Applets :</b>\n Fabounet\n Necropotame\n Ctaf\n ChAnGFu\n Tofe\n Paradoxxx_Zero\n Mav\n Nochka85\n Ours_en_pluche\n\
227
<b>Applets :</b>\n Fabounet\n Necropotame\n Ctaf\n ChAnGFu\n Tofe\n Paradoxxx_Zero\n Mav\n Nochka85\n Ours_en_pluche\n Eduardo Mucelli\n\
229
228
<b>Patchs :</b>\n Special thanks to Augur for his great help with OpenGL\n Ctaf\n M.Tasaka\n Matttbe\n Necropotame\n Robrob\n Smidgey\n Tshirtman\n");
230
229
_cairo_dock_add_about_page (pNoteBook,
334
334
if (! cairo_dock_is_locked ())
336
pMenuItem = cairo_dock_add_in_menu_with_stock_and_data (_("Configure"),
337
GTK_STOCK_PREFERENCES,
338
(GFunc)_cairo_dock_edit_and_reload_conf,
341
gtk_widget_set_tooltip_text (pMenuItem, _("Configure the behaviour, appearance, and applets."));
343
336
if (CAIRO_DOCK_IS_DOCK (pContainer) && ! CAIRO_DOCK (pContainer)->bIsMainDock && CAIRO_DOCK (pContainer)->iRefCount == 0)
345
pMenuItem = cairo_dock_add_in_menu_with_stock_and_data (_("Set up this dock"),
338
pMenuItem = cairo_dock_add_in_menu_with_stock_and_data (_("Configure this dock"),
346
339
GTK_STOCK_EXECUTE,
347
(GFunc)_cairo_dock_configure_root_dock_position,
340
(GFunc)_cairo_dock_configure_root_dock,
349
342
CAIRO_DOCK (pContainer));
350
gtk_widget_set_tooltip_text (pMenuItem, _("Set up the position of this main dock."));
343
gtk_widget_set_tooltip_text (pMenuItem, _("Customize the position, visibility and appearance of this main dock."));
346
pMenuItem = cairo_dock_add_in_menu_with_stock_and_data (_("Configure"),
347
GTK_STOCK_PREFERENCES,
348
(GFunc)_cairo_dock_edit_and_reload_conf,
351
gtk_widget_set_tooltip_text (pMenuItem, _("Configure behaviour, appearance, and applets."));
353
353
pMenuItem = cairo_dock_add_in_menu_with_stock_and_data (_("Manage themes"),
354
354
CAIRO_DOCK_SHARE_DATA_DIR"/icon-appearance.svg",
355
355
(GFunc)_cairo_dock_initiate_theme_management,
358
gtk_widget_set_tooltip_text (pMenuItem, _("Choose amongst many themes on the server, and save your current theme."));
358
gtk_widget_set_tooltip_text (pMenuItem, _("Choose from amongst many themes on the server or save your current theme."));
360
360
pMenuItem = gtk_separator_menu_item_new ();
361
361
gtk_menu_shell_append (GTK_MENU_SHELL (pSubMenu), pMenuItem);
363
pMenuItem = cairo_dock_add_in_menu_with_stock_and_data (myAccessibility.bLockIcons ? _("unlock icons") : _("lock icons"),
363
pMenuItem = cairo_dock_add_in_menu_with_stock_and_data (myAccessibility.bLockIcons ? _("Unlock icons") : _("Lock icons"),
364
364
CAIRO_DOCK_SHARE_DATA_DIR"/icon-lock-icons.svg",
365
365
(GFunc)_cairo_dock_lock_icons,
480
500
fOrder = CAIRO_DOCK_LAST_ORDER;
482
//\___________________ On cree un fichier de lanceur avec des valeurs par defaut.
483
GError *erreur = NULL;
484
const gchar *cDockName = cairo_dock_search_dock_name (pDock);
485
gchar *cNewDesktopFileName;
486
switch (iLauncherType)
488
case CAIRO_DOCK_DESKTOP_FILE_FOR_CONTAINER :
489
cNewDesktopFileName = cairo_dock_add_desktop_file_for_container (cDockName, fOrder, pDock, &erreur);
491
case CAIRO_DOCK_DESKTOP_FILE_FOR_LAUNCHER :
492
cNewDesktopFileName = cairo_dock_add_desktop_file_for_launcher (cDockName, fOrder, pDock, &erreur);
494
case CAIRO_DOCK_DESKTOP_FILE_FOR_SEPARATOR :
495
cNewDesktopFileName = cairo_dock_add_desktop_file_for_separator (cDockName, fOrder, pDock, &erreur);
502
cd_warning ("while trying to create a new launcher : %s\nCheck that you have writing permissions on ~/.config/cairo-dock", erreur->message);
503
g_error_free (erreur);
507
//\___________________ On cree l'icone et on l'insere.
508
cairo_t* pCairoContext = cairo_dock_create_drawing_context_generic (CAIRO_CONTAINER (pDock));
509
Icon *pNewIcon = cairo_dock_create_icon_from_desktop_file (cNewDesktopFileName, pCairoContext);
510
cairo_destroy (pCairoContext);
512
if (iLauncherType == CAIRO_DOCK_DESKTOP_FILE_FOR_SEPARATOR)
513
pNewIcon->iType = (icon ? icon->iType : CAIRO_DOCK_LAUNCHER);
514
else if (pNewIcon->cName == NULL)
515
pNewIcon->cName = g_strdup (_("Undefined"));
517
CairoDock *pParentDock = cairo_dock_search_dock_from_name (pNewIcon->cParentDockName); // existe forcement puique a ete cree au besoin.
518
cairo_dock_insert_icon_in_dock (pNewIcon, pParentDock, CAIRO_DOCK_UPDATE_DOCK_SIZE, CAIRO_DOCK_ANIMATE_ICON);
520
cairo_dock_launch_animation (CAIRO_CONTAINER (pParentDock));
521
cairo_dock_mark_theme_as_modified (TRUE);
523
g_free (cNewDesktopFileName);
502
//\___________________ On cree et on charge l'icone a partir d'un des templates.
503
Icon *pNewIcon = cairo_dock_add_new_launcher_by_type (iLauncherType, pDock, fOrder, (icon ? icon->iType : CAIRO_DOCK_LAUNCHER));
504
if (pNewIcon == NULL)
506
cd_warning ("Couldn't create create the icon.\nCheck that you have writing permissions on ~/.config/cairo-dock and its sub-folders");
525
510
//\___________________ On ouvre automatiquement l'IHM pour permettre de modifier ses champs.
526
511
if (iLauncherType != CAIRO_DOCK_DESKTOP_FILE_FOR_SEPARATOR) // inutile pour un separateur.
570
561
Icon *pIcon = g_object_get_data (G_OBJECT (pMenuItem), "launcher");
563
//\_________________________ on cree si besoin le fichier de conf d'un nouveau dock racine.
572
564
gchar *cValidDockName;
573
565
if (cDockName == NULL) // nouveau dock
575
cValidDockName = cairo_dock_get_unique_dock_name ("dock");
577
// on cree le fichier de conf des maintenant pour pouvoir placer le nouveau dock a l'oppose du main dock.
578
gchar *cCommand = g_strdup_printf ("cp '%s/%s' '%s/%s.conf'", CAIRO_DOCK_SHARE_DATA_DIR, CAIRO_DOCK_MAIN_DOCK_CONF_FILE, g_cCurrentThemePath, cValidDockName);
579
int r = system (cCommand);
582
gchar *cDesktopFilePath = g_strdup_printf ("%s/%s.conf", g_cCurrentThemePath, cValidDockName);
583
cairo_dock_update_conf_file (cDesktopFilePath,
587
(g_pMainDock->container.bIsHorizontal ?
588
(g_pMainDock->container.bDirectionUp ? 1 : 0) :
589
(g_pMainDock->container.bDirectionUp ? 3 : 2)),
591
g_free (cDesktopFilePath);
567
cValidDockName = cairo_dock_add_root_dock_config ();
595
571
cValidDockName = g_strdup (cDockName);
574
//\_________________________ on met a jour le fichier de conf de l'icone.
575
gchar *cCurrentDockName = pIcon->cParentDockName;
576
pIcon->cParentDockName = NULL;
577
cairo_dock_update_icon_s_container_name (pIcon, cValidDockName);
578
g_free (pIcon->cParentDockName);
579
pIcon->cParentDockName = cCurrentDockName;
581
//\_________________________ on recharge l'icone, ce qui va creer le dock.
598
582
if (CAIRO_DOCK_IS_STORED_LAUNCHER (pIcon))
600
gchar *cDesktopFilePath = g_strdup_printf ("%s/%s", g_cCurrentLaunchersPath, pIcon->cDesktopFileName);
601
cairo_dock_update_conf_file (cDesktopFilePath,
602
G_TYPE_STRING, "Desktop Entry", "Container", cValidDockName,
604
g_free (cDesktopFilePath);
605
584
cairo_dock_reload_launcher (pIcon);
607
586
else if (CAIRO_DOCK_IS_APPLET (pIcon))
609
cairo_dock_update_conf_file (pIcon->pModuleInstance->cConfFilePath,
610
G_TYPE_STRING, "Icon", "dock name", cValidDockName,
612
588
cairo_dock_reload_module_instance (pIcon->pModuleInstance, TRUE); // TRUE <=> reload config.
591
CairoDock *pNewDock = cairo_dock_search_dock_from_name (cValidDockName);
592
if (pNewDock && pNewDock->icons && pNewDock->icons->next == NULL) // le dock vient d'etre cree avec cette icone.
593
cairo_dock_show_general_message (_("The new dock has been created.\nYou can customize it by right-clicking on it -> cairo-dock -> configure this dock."), 8000); // on le place pas sur le nouveau dock, car sa fenetre n'est pas encore bien placee (0,0).
614
594
g_free (cValidDockName);
616
597
static void _add_one_dock_to_menu (const gchar *cName, CairoDock *pDock, GtkWidget *pMenu)
618
599
// on elimine les sous-dock d'appli, d'applets, ou de repertoire.
631
612
g_object_set_data (G_OBJECT (pMenuItem), "launcher", pIcon);
634
///////////////////////////////////////////////////////////////////
635
/////////// LES OPERATIONS SUR LES FICHIERS ///////////////////////
636
///////////////////////////////////////////////////////////////////
638
static void _cairo_dock_show_file_properties (GtkMenuItem *pMenuItem, gpointer *data)
640
Icon *icon = data[0];
641
CairoDock *pDock = data[1];
642
//g_print ("%s (%s)\n", __func__, icon->cName);
645
time_t iLastModificationTime = 0;
646
gchar *cMimeType = NULL;
647
int iUID=0, iGID=0, iPermissionsMask=0;
648
if (cairo_dock_fm_get_file_properties (icon->cCommand, &iSize, &iLastModificationTime, &cMimeType, &iUID, &iGID, &iPermissionsMask))
650
GtkWidget *pDialog = gtk_message_dialog_new (GTK_WINDOW (pDock->container.pWidget),
651
GTK_DIALOG_DESTROY_WITH_PARENT,
656
GString *sInfo = g_string_new ("");
657
g_string_printf (sInfo, "<b>%s</b>", icon->cName);
659
GtkWidget *pLabel= gtk_label_new (NULL);
660
gtk_label_set_use_markup (GTK_LABEL (pLabel), TRUE);
661
gtk_label_set_markup (GTK_LABEL (pLabel), sInfo->str);
663
GtkWidget *pFrame = gtk_frame_new (NULL);
664
gtk_container_set_border_width (GTK_CONTAINER (pFrame), 3);
665
gtk_frame_set_label_widget (GTK_FRAME (pFrame), pLabel);
666
gtk_frame_set_shadow_type (GTK_FRAME (pFrame), GTK_SHADOW_OUT);
667
gtk_container_add (GTK_CONTAINER (GTK_DIALOG (pDialog)->vbox), pFrame);
669
GtkWidget *pVBox = gtk_vbox_new (FALSE, 3);
670
gtk_container_add (GTK_CONTAINER (pFrame), pVBox);
672
pLabel = gtk_label_new (NULL);
673
gtk_label_set_use_markup (GTK_LABEL (pLabel), TRUE);
674
g_string_printf (sInfo, "<u>Size</u> : %lld bytes", iSize);
675
if (iSize > 1024*1024)
676
g_string_append_printf (sInfo, " (%.1f Mo)", 1. * iSize / 1024 / 1024);
677
else if (iSize > 1024)
678
g_string_append_printf (sInfo, " (%.1f Ko)", 1. * iSize / 1024);
679
gtk_label_set_markup (GTK_LABEL (pLabel), sInfo->str);
680
gtk_container_add (GTK_CONTAINER (pVBox), pLabel);
682
pLabel = gtk_label_new (NULL);
683
gtk_label_set_use_markup (GTK_LABEL (pLabel), TRUE);
685
localtime_r (&iLastModificationTime, &epoch_tm); // et non pas gmtime_r.
686
gchar *cTimeChain = g_new0 (gchar, 100);
687
strftime (cTimeChain, 100, "%F, %T", &epoch_tm);
688
g_string_printf (sInfo, "<u>Last Modification</u> : %s", cTimeChain);
690
gtk_label_set_markup (GTK_LABEL (pLabel), sInfo->str);
691
gtk_container_add (GTK_CONTAINER (pVBox), pLabel);
693
if (cMimeType != NULL)
695
pLabel = gtk_label_new (NULL);
696
gtk_label_set_use_markup (GTK_LABEL (pLabel), TRUE);
697
g_string_printf (sInfo, "<u>Mime Type</u> : %s", cMimeType);
698
gtk_label_set_markup (GTK_LABEL (pLabel), sInfo->str);
699
gtk_container_add (GTK_CONTAINER (pVBox), pLabel);
702
GtkWidget *pSeparator = gtk_hseparator_new ();
703
gtk_container_add (GTK_CONTAINER (pVBox), pSeparator);
705
pLabel = gtk_label_new (NULL);
706
gtk_label_set_use_markup (GTK_LABEL (pLabel), TRUE);
707
g_string_printf (sInfo, "<u>User ID</u> : %d / <u>Group ID</u> : %d", iUID, iGID);
708
gtk_label_set_markup (GTK_LABEL (pLabel), sInfo->str);
709
gtk_container_add (GTK_CONTAINER (pVBox), pLabel);
711
pLabel = gtk_label_new (NULL);
712
gtk_label_set_use_markup (GTK_LABEL (pLabel), TRUE);
713
int iOwnerPermissions = iPermissionsMask >> 6; // 8*8.
714
int iGroupPermissions = (iPermissionsMask - (iOwnerPermissions << 6)) >> 3;
715
int iOthersPermissions = (iPermissionsMask % 8);
716
g_string_printf (sInfo, "<u>Permissions</u> : %d / %d / %d", iOwnerPermissions, iGroupPermissions, iOthersPermissions);
717
gtk_label_set_markup (GTK_LABEL (pLabel), sInfo->str);
718
gtk_container_add (GTK_CONTAINER (pVBox), pLabel);
720
gtk_widget_show_all (GTK_DIALOG (pDialog)->vbox);
721
gtk_window_set_position (GTK_WINDOW (pDialog), GTK_WIN_POS_CENTER_ALWAYS);
722
int answer = gtk_dialog_run (GTK_DIALOG (pDialog));
723
gtk_widget_destroy (pDialog);
725
g_string_free (sInfo, TRUE);
730
static void _cairo_dock_mount_unmount (GtkMenuItem *pMenuItem, gpointer *data)
732
Icon *icon = data[0];
733
CairoDock *pDock = data[1];
734
cd_message ("%s (%s / %s)\n", __func__, icon->cName, icon->cBaseURI);
736
gboolean bIsMounted = FALSE;
737
gchar *cActivationURI = cairo_dock_fm_is_mounted (icon->cBaseURI, &bIsMounted);
738
cd_message (" cActivationURI : %s; bIsMounted : %d\n", cActivationURI, bIsMounted);
739
g_free (cActivationURI);
743
cairo_dock_fm_mount (icon, CAIRO_CONTAINER (pDock));
746
cairo_dock_fm_unmount (icon, CAIRO_CONTAINER (pDock));
749
static void _cairo_dock_eject (GtkMenuItem *pMenuItem, gpointer *data)
751
Icon *icon = data[0];
752
CairoDock *pDock = data[1];
753
cd_message ("%s (%s / %s)\n", __func__, icon->cName, icon->cCommand);
754
cairo_dock_fm_eject_drive (icon->cCommand);
758
static void _cairo_dock_delete_file (GtkMenuItem *pMenuItem, gpointer *data)
760
Icon *icon = data[0];
761
CairoDock *pDock = data[1];
762
cd_message ("%s (%s)\n", __func__, icon->cName);
764
gchar *question = g_strdup_printf (_("You're about deleting this file\n (%s)\nfrom your hard-disk. Sure ?"), icon->cCommand);
765
int answer = cairo_dock_ask_question_and_wait (question, icon, CAIRO_CONTAINER (pDock));
767
if (answer == GTK_RESPONSE_YES)
769
gboolean bSuccess = cairo_dock_fm_delete_file (icon->cCommand);
772
cd_warning ("couldn't delete this file.\nCheck that you have writing rights on this file.\n");
773
gchar *cMessage = g_strdup_printf (_("Attention : couldn't delete this file.\nCheck that you have writing rights on it."));
774
cairo_dock_show_temporary_dialog_with_default_icon (cMessage, icon, CAIRO_CONTAINER (pDock), 4000);
777
///cairo_dock_remove_icon_from_dock (pDock, icon);
778
///cairo_dock_update_dock_size (pDock);
780
if (icon->cDesktopFileName != NULL)
782
gchar *icon_path = g_strdup_printf ("%s/%s", g_cCurrentLaunchersPath, icon->cDesktopFileName);
783
g_remove (icon_path);
787
///cairo_dock_free_icon (icon);
791
static void _cairo_dock_rename_file (GtkMenuItem *pMenuItem, gpointer *data)
793
Icon *icon = data[0];
794
CairoDock *pDock = data[1];
795
cd_message ("%s (%s)", __func__, icon->cName);
797
gchar *cNewName = cairo_dock_show_demand_and_wait (_("Rename to :"), icon, CAIRO_CONTAINER (pDock), icon->cName);
798
if (cNewName != NULL && *cNewName != '\0')
800
gboolean bSuccess = cairo_dock_fm_rename_file (icon->cCommand, cNewName);
803
cd_warning ("couldn't rename this file.\nCheck that you have writing rights, and that the new name does not already exist.");
804
cairo_dock_show_temporary_dialog_with_icon_printf (_("Attention : couldn't rename %s.\nCheck that you have writing rights,\n and that the new name does not already exist."), icon, CAIRO_CONTAINER (pDock), 5000, NULL, icon->cCommand);
810
615
//////////////////////////////////////////////////////////////////
811
616
/////////// LES OPERATIONS SUR LES APPLETS ///////////////////////
812
617
//////////////////////////////////////////////////////////////////
815
619
static void _cairo_dock_initiate_config_module (GtkMenuItem *pMenuItem, gpointer *data)
817
g_print ("%s ()\n", __func__);
621
cd_debug ("%s ()\n", __func__);
818
622
Icon *icon = data[0];
819
623
CairoContainer *pContainer= data[1];
820
624
if (CAIRO_DOCK_IS_DESKLET (pContainer))
1136
950
///////////////// LES OPERATIONS SUR LES DESKLETS /////////////////
1137
951
///////////////////////////////////////////////////////////////////
953
static inline void _cairo_dock_set_desklet_accessibility (CairoDesklet *pDesklet, CairoDeskletVisibility iVisibility)
955
cairo_dock_set_desklet_accessibility (pDesklet, iVisibility, TRUE); // TRUE <=> save state in conf.
1139
957
static void _cairo_dock_keep_below (GtkCheckMenuItem *pMenuItem, gpointer *data)
1141
Icon *icon = data[0];
1142
959
CairoDesklet *pDesklet = data[1];
1143
if (icon == NULL) // cas de l'applet Terminal par exemple.
1144
icon = pDesklet->pIcon;
1146
gboolean bBelow = gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (pMenuItem));
1147
g_print (" %s (%d)\n", __func__, bBelow);
1148
gtk_window_set_keep_below (GTK_WINDOW(pDesklet->container.pWidget), bBelow);
1149
if (CAIRO_DOCK_IS_APPLET (icon) && bBelow)
1150
cairo_dock_update_conf_file (icon->pModuleInstance->cConfFilePath,
1151
G_TYPE_INT, "Desklet", "accessibility", CAIRO_DESKLET_KEEP_BELOW,
960
if (gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (pMenuItem)))
961
_cairo_dock_set_desklet_accessibility (pDesklet, CAIRO_DESKLET_KEEP_BELOW);
1155
964
static void _cairo_dock_keep_normal (GtkCheckMenuItem *pMenuItem, gpointer *data)
1157
Icon *icon = data[0];
1158
966
CairoDesklet *pDesklet = data[1];
1159
if (icon == NULL) // cas de l'applet Terminal par exemple.
1160
icon = pDesklet->pIcon;
1162
gboolean bNormal = gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (pMenuItem));
1163
g_print (" %s (%d)\n", __func__, bNormal);
1164
if (CAIRO_DOCK_IS_APPLET (icon) && bNormal)
1165
cairo_dock_update_conf_file (icon->pModuleInstance->cConfFilePath,
1166
G_TYPE_INT, "Desklet", "accessibility", CAIRO_DESKLET_NORMAL,
967
if (gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (pMenuItem)))
968
_cairo_dock_set_desklet_accessibility (pDesklet, CAIRO_DESKLET_NORMAL);
1170
971
static void _cairo_dock_keep_above (GtkCheckMenuItem *pMenuItem, gpointer *data)
1172
Icon *icon = data[0];
1173
973
CairoDesklet *pDesklet = data[1];
1174
if (icon == NULL) // cas de l'applet Terminal par exemple.
1175
icon = pDesklet->pIcon;
1177
gboolean bAbove = gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (pMenuItem));
1178
g_print (" %s (%d)\n", __func__, bAbove);
1179
gtk_window_set_keep_above (GTK_WINDOW(pDesklet->container.pWidget), bAbove);
1180
if (CAIRO_DOCK_IS_APPLET (icon) && bAbove)
1181
cairo_dock_update_conf_file (icon->pModuleInstance->cConfFilePath,
1182
G_TYPE_INT, "Desklet", "accessibility", CAIRO_DESKLET_KEEP_ABOVE,
974
if (gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (pMenuItem)))
975
_cairo_dock_set_desklet_accessibility (pDesklet, CAIRO_DESKLET_KEEP_ABOVE);
1186
//for compiz fusion "widget layer"
1187
//set behaviour in compiz to: (class=Cairo-dock & type=utility)
1188
978
static void _cairo_dock_keep_on_widget_layer (GtkMenuItem *pMenuItem, gpointer *data)
1190
Icon *icon = data[0];
1191
980
CairoDesklet *pDesklet = data[1];
1192
if (icon == NULL) // cas de l'applet Terminal par exemple.
1193
icon = pDesklet->pIcon;
1195
cairo_dock_hide_desklet (pDesklet);
1196
Window Xid = GDK_WINDOW_XID (pDesklet->container.pWidget->window);
1198
gboolean bOnCompizWidgetLayer = gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (pMenuItem));
1199
g_print (" %s (%d)\n", __func__, bOnCompizWidgetLayer);
1200
if (bOnCompizWidgetLayer)
1201
cairo_dock_set_xwindow_type_hint (Xid, "_NET_WM_WINDOW_TYPE_UTILITY");
1202
//gtk_window_set_type_hint(GTK_WINDOW(pDock->container.pWidget), GDK_WINDOW_TYPE_HINT_UTILITY);
1204
cairo_dock_set_xwindow_type_hint (Xid, "_NET_WM_WINDOW_TYPE_NORMAL");
1205
//gtk_window_set_type_hint(GTK_WINDOW(pDock->container.pWidget), GDK_WINDOW_TYPE_HINT_NORMAL);
1206
cairo_dock_show_desklet (pDesklet);
1208
if (CAIRO_DOCK_IS_APPLET (icon) && bOnCompizWidgetLayer)
1209
cairo_dock_update_conf_file (icon->pModuleInstance->cConfFilePath,
1210
G_TYPE_INT, "Desklet", "accessibility", CAIRO_DESKLET_ON_WIDGET_LAYER,
1213
if (bOnCompizWidgetLayer) // on verifie que la regle de Compiz est correcte.
1215
// on recupere la regle
1216
gchar *cDbusAnswer = cairo_dock_launch_command_sync ("dbus-send --print-reply --type=method_call --dest=org.freedesktop.compiz /org/freedesktop/compiz/widget/screen0/match org.freedesktop.compiz.get");
1217
g_print ("cDbusAnswer : '%s'\n", cDbusAnswer);
1218
gchar *cRule = NULL;
1219
gchar *str = strchr (cDbusAnswer, '\n');
1225
if (strncmp (str, "string", 6) == 0)
1233
gchar *ptr = strrchr (str, '"');
1237
cRule = g_strdup (str);
1242
g_free (cDbusAnswer);
1243
g_print ("got rule : '%s'\n", cRule);
1245
/// gerer le cas ou Compiz n'est pas lance : comment le distinguer d'une regle vide ?...
1248
cd_warning ("couldn't get Widget Layer rule from Compiz");
1251
// on complete la regle si necessaire.
1252
if (cRule == NULL || *cRule == '\0' || (g_strstr_len (cRule, -1, "class=Cairo-dock & type=utility") == NULL && g_strstr_len (cRule, -1, "(class=Cairo-dock) & (type=utility)") == NULL && g_strstr_len (cRule, -1, "name=cairo-dock & type=utility") == NULL))
1254
gchar *cNewRule = (cRule == NULL || *cRule == '\0' ?
1255
g_strdup ("(class=Cairo-dock & type=utility)") :
1256
g_strdup_printf ("(%s) | (class=Cairo-dock & type=utility)", cRule));
1257
g_print ("set rule : %s\n", cNewRule);
1258
gchar *cCommand = g_strdup_printf ("dbus-send --print-reply --type=method_call --dest=org.freedesktop.compiz /org/freedesktop/compiz/widget/screen0/match org.freedesktop.compiz.set string:\"%s\"", cNewRule);
1259
cairo_dock_launch_command_sync (cCommand);
981
if (gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (pMenuItem)))
982
_cairo_dock_set_desklet_accessibility (pDesklet, CAIRO_DESKLET_ON_WIDGET_LAYER);
1267
985
static void _cairo_dock_keep_space (GtkCheckMenuItem *pMenuItem, gpointer *data)
1269
Icon *icon = data[0];
1270
987
CairoDesklet *pDesklet = data[1];
1271
if (icon == NULL) // cas de l'applet Terminal par exemple.
1272
icon = pDesklet->pIcon;
1274
gboolean bReserveSpace = gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (pMenuItem));
1275
g_print (" %s (%d)\n", __func__, bReserveSpace);
1277
Window Xid = GDK_WINDOW_XID (pDesklet->container.pWidget->window);
1278
pDesklet->bSpaceReserved = bReserveSpace;
1279
//cairo_dock_set_xwindow_type_hint (Xid, bReserveSpace ? "_NET_WM_WINDOW_TYPE_DOCK" : "_NET_WM_WINDOW_TYPE_NORMAL");
1280
cairo_dock_reserve_space_for_desklet (pDesklet, bReserveSpace);
1282
if (CAIRO_DOCK_IS_APPLET (icon) && bReserveSpace)
1283
cairo_dock_update_conf_file (icon->pModuleInstance->cConfFilePath,
1284
G_TYPE_INT, "Desklet", "accessibility", CAIRO_DESKLET_RESERVE_SPACE,
988
if (gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (pMenuItem)))
989
_cairo_dock_set_desklet_accessibility (pDesklet, CAIRO_DESKLET_RESERVE_SPACE);
1288
992
static void _cairo_dock_set_on_all_desktop (GtkCheckMenuItem *pMenuItem, gpointer *data)
1290
Icon *icon = data[0];
1291
994
CairoDesklet *pDesklet = data[1];
1292
if (icon == NULL) // cas de l'applet Terminal par exemple.
1293
icon = pDesklet->pIcon;
1295
995
gboolean bSticky = gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (pMenuItem));
1296
g_print ("%s (%d)\n", __func__, bSticky);
1300
gtk_window_stick (GTK_WINDOW (pDesklet->container.pWidget));
1305
gtk_window_unstick (GTK_WINDOW (pDesklet->container.pWidget));
1306
int iCurrentDesktop, iCurrentViewportX, iCurrentViewportY;
1307
cairo_dock_get_current_desktop_and_viewport (&iCurrentDesktop, &iCurrentViewportX, &iCurrentViewportY);
1308
iNumDesktop = iCurrentDesktop * g_iNbViewportX * g_iNbViewportY + iCurrentViewportX * g_iNbViewportY + iCurrentViewportY;
1309
g_print (">>> on colle ce desklet sur le bureau %d\n", iNumDesktop);
1311
if (CAIRO_DOCK_IS_APPLET (icon))
1312
cairo_dock_update_conf_file (icon->pModuleInstance->cConfFilePath,
1313
G_TYPE_BOOLEAN, "Desklet", "sticky", bSticky,
1314
G_TYPE_INT, "Desklet", "num desktop", iNumDesktop,
996
cairo_dock_set_desklet_sticky (pDesklet, bSticky);
1318
999
static void _cairo_dock_lock_position (GtkMenuItem *pMenuItem, gpointer *data)
1320
Icon *icon = data[0];
1321
1001
CairoDesklet *pDesklet = data[1];
1322
if (icon == NULL) // cas de l'applet Terminal par exemple.
1323
icon = pDesklet->pIcon;
1325
pDesklet->bPositionLocked = ! pDesklet->bPositionLocked;
1326
if (CAIRO_DOCK_IS_APPLET (icon))
1327
cairo_dock_update_conf_file (icon->pModuleInstance->cConfFilePath,
1328
G_TYPE_BOOLEAN, "Desklet", "locked", pDesklet->bPositionLocked,
1002
gboolean bLocked = gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (pMenuItem));
1003
cairo_dock_lock_desklet_position (pDesklet, bLocked);
1335
1009
static gpointer *s_pDesktopData = NULL;
1336
1010
GtkWidget *pMenuItem, *image;
1338
if (g_iNbDesktops > 1 || g_iNbViewportX > 1 || g_iNbViewportY > 1)
1012
if (g_desktopGeometry.iNbDesktops > 1 || g_desktopGeometry.iNbViewportX > 1 || g_desktopGeometry.iNbViewportY > 1)
1340
1014
int i, j, k, iDesktopCode;
1341
1015
const gchar *cLabel;
1342
if (g_iNbDesktops > 1 && (g_iNbViewportX > 1 || g_iNbViewportY > 1))
1016
if (g_desktopGeometry.iNbDesktops > 1 && (g_desktopGeometry.iNbViewportX > 1 || g_desktopGeometry.iNbViewportY > 1))
1343
1017
cLabel = bAll ? _("Move all to desktop %d - face %d") : _("Move to desktop %d - face %d");
1344
else if (g_iNbDesktops > 1)
1018
else if (g_desktopGeometry.iNbDesktops > 1)
1345
1019
cLabel = bAll ? _("Move all to desktop %d") : _("Move to desktop %d");
1347
1021
cLabel = bAll ? _("Move all to face %d") : _("Move to face %d");
1348
1022
GString *sDesktop = g_string_new ("");
1349
1023
g_free (s_pDesktopData);
1350
s_pDesktopData = g_new0 (gpointer, 4 * g_iNbDesktops * g_iNbViewportX * g_iNbViewportY);
1024
s_pDesktopData = g_new0 (gpointer, 4 * g_desktopGeometry.iNbDesktops * g_desktopGeometry.iNbViewportX * g_desktopGeometry.iNbViewportY);
1351
1025
gpointer *user_data;
1353
for (i = 0; i < g_iNbDesktops; i ++) // on range par bureau.
1027
for (i = 0; i < g_desktopGeometry.iNbDesktops; i ++) // on range par bureau.
1355
for (j = 0; j < g_iNbViewportY; j ++) // puis par rangee.
1029
for (j = 0; j < g_desktopGeometry.iNbViewportY; j ++) // puis par rangee.
1357
for (k = 0; k < g_iNbViewportX; k ++)
1031
for (k = 0; k < g_desktopGeometry.iNbViewportX; k ++)
1359
if (g_iNbDesktops > 1 && (g_iNbViewportX > 1 || g_iNbViewportY > 1))
1360
g_string_printf (sDesktop, cLabel, i+1, j*g_iNbViewportX+k+1);
1361
else if (g_iNbDesktops > 1)
1033
if (g_desktopGeometry.iNbDesktops > 1 && (g_desktopGeometry.iNbViewportX > 1 || g_desktopGeometry.iNbViewportY > 1))
1034
g_string_printf (sDesktop, cLabel, i+1, j*g_desktopGeometry.iNbViewportX+k+1);
1035
else if (g_desktopGeometry.iNbDesktops > 1)
1362
1036
g_string_printf (sDesktop, cLabel, i+1);
1364
g_string_printf (sDesktop, cLabel, j*g_iNbViewportX+k+1);
1365
iDesktopCode = i * g_iNbViewportY * g_iNbViewportX + j * g_iNbViewportY + k;
1038
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;
1366
1040
user_data = &s_pDesktopData[4*iDesktopCode];
1367
1041
user_data[0] = data;
1368
1042
user_data[1] = GINT_TO_POINTER (i);
1393
1089
if (! cairo_dock_is_locked ())
1395
pMenuItem = gtk_separator_menu_item_new ();
1396
gtk_menu_shell_append (GTK_MENU_SHELL (menu), pMenuItem);
1398
pMenuItem = _add_entry_in_menu (_("Add"), GTK_STOCK_ADD, NULL, menu);
1399
GtkWidget *pSubMenuAdd = gtk_menu_new ();
1400
gtk_menu_item_set_submenu (GTK_MENU_ITEM (pMenuItem), pSubMenuAdd);
1402
_add_entry_in_menu (_("Add a sub-dock"), GTK_STOCK_ADD, cairo_dock_add_container, pSubMenuAdd);
1404
_add_entry_in_menu (_("Add a separator"), GTK_STOCK_ADD, cairo_dock_add_separator, pSubMenuAdd);
1406
pMenuItem = _add_entry_in_menu (_("Add a custom launcher"), GTK_STOCK_ADD, cairo_dock_add_launcher, pSubMenuAdd);
1407
gtk_widget_set_tooltip_text (pMenuItem, _("Usually you would drag a launcher from the menu and drop it into the dock."));
1091
_add_add_entry (menu, data, FALSE, TRUE);
1409
1093
return CAIRO_DOCK_LET_PASS_NOTIFICATION;
1412
//\_________________________ On rajoute des actions suivant le type de l'icone.
1413
///if (CAIRO_DOCK_IS_LAUNCHER (icon) || CAIRO_DOCK_IS_USER_SEPARATOR (icon) || (icon != NULL && icon->cDesktopFileName != NULL)) // le dernier cas est la pour les cas ou l'utilisateur aurait par megarde efface la commande du lanceur (cas qui ne devrait plus arriver).
1096
//\_________________________ On rajoute des actions de modifications sur le dock.
1097
if (! cairo_dock_is_locked () && CAIRO_DOCK_IS_DOCK (pContainer) && icon && (cairo_dock_get_icon_order (icon) == cairo_dock_get_group_order (CAIRO_DOCK_LAUNCHER) || cairo_dock_get_icon_order (icon) == cairo_dock_get_group_order (CAIRO_DOCK_APPLET)))
1415
//\_________________________ On rajoute les actions sur les icones de fichiers.
1416
if (CAIRO_DOCK_IS_URI_LAUNCHER (icon))
1418
if (icon->iVolumeID > 0)
1420
gboolean bIsMounted = FALSE;
1421
cd_message ("%s (%s / %s)\n", __func__, icon->cName, icon->cCommand);
1422
gchar *cActivationURI = cairo_dock_fm_is_mounted (icon->cBaseURI, &bIsMounted);
1423
cd_message (" cActivationURI : %s; bIsMounted : %d\n", cActivationURI, bIsMounted);
1424
g_free (cActivationURI);
1426
pMenuItem = gtk_menu_item_new_with_label (bIsMounted ? _("Unmount") : _("Mount"));
1427
gtk_menu_shell_append (GTK_MENU_SHELL (menu), pMenuItem);
1428
g_signal_connect (G_OBJECT (pMenuItem), "activate", G_CALLBACK(_cairo_dock_mount_unmount), data);
1430
if (cairo_dock_fm_can_eject (icon->cCommand))
1432
pMenuItem = gtk_menu_item_new_with_label (_("Eject"));
1433
gtk_menu_shell_append (GTK_MENU_SHELL (menu), pMenuItem);
1434
g_signal_connect (G_OBJECT (pMenuItem), "activate", G_CALLBACK(_cairo_dock_eject), data);
1439
pMenuItem = gtk_menu_item_new_with_label (_("Delete this file"));
1440
gtk_menu_shell_append (GTK_MENU_SHELL (menu), pMenuItem);
1441
g_signal_connect (G_OBJECT (pMenuItem), "activate", G_CALLBACK(_cairo_dock_delete_file), data);
1443
pMenuItem = gtk_menu_item_new_with_label (_("Rename this file"));
1444
gtk_menu_shell_append (GTK_MENU_SHELL (menu), pMenuItem);
1445
g_signal_connect (G_OBJECT (pMenuItem), "activate", G_CALLBACK(_cairo_dock_rename_file), data);
1447
pMenuItem = gtk_menu_item_new_with_label (_("Properties"));
1448
gtk_menu_shell_append (GTK_MENU_SHELL (menu), pMenuItem);
1449
g_signal_connect (G_OBJECT (pMenuItem), "activate", G_CALLBACK(_cairo_dock_show_file_properties), data);
1451
if (icon->cDesktopFileName == NULL) // un lanceur sans fichier .desktop, on est donc dans un sous-dock ou l'on ne peut pas faire d'autre action.
1452
return CAIRO_DOCK_LET_PASS_NOTIFICATION;
1455
//\_________________________ On rajoute des actions de modifications sur le dock.
1456
if (! cairo_dock_is_locked () && CAIRO_DOCK_IS_DOCK (pContainer) && icon && cairo_dock_get_icon_order (icon) == cairo_dock_get_group_order (CAIRO_DOCK_LAUNCHER))
1458
pMenuItem = gtk_separator_menu_item_new ();
1459
gtk_menu_shell_append (GTK_MENU_SHELL (menu), pMenuItem);
1461
pMenuItem = _add_entry_in_menu (_("Add"), GTK_STOCK_ADD, NULL, menu);
1462
GtkWidget *pSubMenuAdd = gtk_menu_new ();
1463
gtk_menu_item_set_submenu (GTK_MENU_ITEM (pMenuItem), pSubMenuAdd);
1465
_add_entry_in_menu (_("Add a sub-dock"), GTK_STOCK_ADD, cairo_dock_add_container, pSubMenuAdd);
1467
_add_entry_in_menu (_("Add a separator"), GTK_STOCK_ADD, cairo_dock_add_separator, pSubMenuAdd);
1469
pMenuItem = _add_entry_in_menu (_("Add a custom launcher"), GTK_STOCK_ADD, cairo_dock_add_launcher, pSubMenuAdd);
1470
gtk_widget_set_tooltip_text (pMenuItem, _("Usually you would drag a launcher from the menu and drop it into the dock."));
1099
Icon *pPointingIcon = cairo_dock_search_icon_pointing_on_dock (CAIRO_DOCK (pContainer), NULL);
1100
if (!pPointingIcon || CAIRO_DOCK_IS_CONTAINER_LAUNCHER (pPointingIcon))
1102
_add_add_entry (menu, data, ! CAIRO_DOCK_IS_SEPARATOR (icon), cairo_dock_get_icon_order (icon) == cairo_dock_get_group_order (CAIRO_DOCK_LAUNCHER));
1472
1104
if (icon->cDesktopFileName != NULL && icon->cParentDockName != NULL) // possede un .desktop.
1474
1106
pMenuItem = gtk_separator_menu_item_new ();
1475
1107
gtk_menu_shell_append (GTK_MENU_SHELL (menu), pMenuItem);
1109
_add_entry_in_menu (CAIRO_DOCK_IS_USER_SEPARATOR (icon) ? _("Modify this separator") : _("Modify this launcher"), GTK_STOCK_EDIT, _cairo_dock_modify_launcher, menu);
1477
1111
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);
1478
gtk_widget_set_tooltip_text (pMenuItem, _("You can remove a launcher by dragging it with the mouse out of the dock."));
1480
_add_entry_in_menu (CAIRO_DOCK_IS_USER_SEPARATOR (icon) ? _("Modify this separator") : _("Modify this launcher"), GTK_STOCK_EDIT, _cairo_dock_modify_launcher, menu);
1112
gtk_widget_set_tooltip_text (pMenuItem, _("You can remove a launcher by dragging it out of the dock with the mouse ."));
1482
1114
pMenuItem = _add_entry_in_menu (_("Move to another dock"), GTK_STOCK_JUMP_TO, NULL, menu);
1483
1115
GtkWidget *pSubMenuDocks = gtk_menu_new ();
1484
1116
gtk_menu_item_set_submenu (GTK_MENU_ITEM (pMenuItem), pSubMenuDocks);
1485
1117
g_object_set_data (G_OBJECT (pSubMenuDocks), "launcher", icon);
1486
pMenuItem = cairo_dock_add_in_menu_with_stock_and_data (_("A new main dock"), GTK_STOCK_NEW, (GFunc)_cairo_dock_move_launcher_to_dock, pSubMenuDocks, NULL);
1118
pMenuItem = cairo_dock_add_in_menu_with_stock_and_data (_("New main dock"), GTK_STOCK_NEW, (GFunc)_cairo_dock_move_launcher_to_dock, pSubMenuDocks, NULL);
1487
1119
g_object_set_data (G_OBJECT (pMenuItem), "launcher", icon);
1488
1120
cairo_dock_foreach_docks ((GHFunc) _add_one_dock_to_menu, pSubMenuDocks);
1125
//\_________________________ On rajoute les actions sur les applis.
1493
1126
if (CAIRO_DOCK_IS_APPLI (icon))
1495
1128
pMenuItem = gtk_separator_menu_item_new ();
1687
1340
return CAIRO_DOCK_LET_PASS_NOTIFICATION;
1692
static void _cairo_dock_delete_menu (GtkMenuShell *menu, CairoDock *pDock)
1694
g_return_if_fail (CAIRO_DOCK_IS_DOCK (pDock));
1695
pDock->bMenuVisible = FALSE;
1697
cd_message ("on force a quitter");
1698
pDock->container.bInside = TRUE;
1699
///pDock->bAtBottom = FALSE;
1700
cairo_dock_emit_leave_signal (pDock);
1701
/*cairo_dock_on_leave_notify (pDock->container.pWidget,
1705
void cairo_dock_popup_menu_on_container (GtkWidget *menu, CairoContainer *pContainer)
1707
if (CAIRO_DOCK_IS_DOCK (pContainer))
1709
if (g_signal_handler_find (menu,
1710
G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA,
1714
_cairo_dock_delete_menu,
1715
pContainer) == 0) // on evite de connecter 2 fois ce signal, donc la fonction est appelable plusieurs fois.
1717
g_signal_connect (G_OBJECT (menu),
1719
G_CALLBACK (_cairo_dock_delete_menu),
1722
CAIRO_DOCK (pContainer)->bMenuVisible = TRUE;
1725
gtk_widget_show_all (menu);
1727
gtk_menu_popup (GTK_MENU (menu),
1733
gtk_get_current_event_time ());
1737
GtkWidget *cairo_dock_add_in_menu_with_stock_and_data (const gchar *cLabel, const gchar *gtkStock, GFunc pFunction, GtkWidget *pMenu, gpointer pData)
1739
GtkWidget *pMenuItem = gtk_image_menu_item_new_with_label (cLabel);
1742
GtkWidget *image = NULL;
1743
if (*gtkStock == '/')
1745
GdkPixbuf *pixbuf = gdk_pixbuf_new_from_file_at_size (gtkStock, 16, 16, NULL);
1746
image = gtk_image_new_from_pixbuf (pixbuf);
1747
g_object_unref (pixbuf);
1751
image = gtk_image_new_from_stock (gtkStock, GTK_ICON_SIZE_MENU);
1753
gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (pMenuItem), image);
1755
gtk_menu_shell_append (GTK_MENU_SHELL (pMenu), pMenuItem);
1757
g_signal_connect (G_OBJECT (pMenuItem), "activate", G_CALLBACK (pFunction), pData);
1762
GtkWidget *cairo_dock_build_menu (Icon *icon, CairoContainer *pContainer)
1764
static GtkWidget *s_pMenu = NULL;
1765
if (s_pMenu != NULL)
1767
gtk_widget_destroy (s_pMenu);
1770
g_return_val_if_fail (pContainer != NULL, NULL);
1772
//\_________________________ On construit le menu.
1773
GtkWidget *menu = gtk_menu_new ();
1776
//\_________________________ On passe la main a ceux qui veulent y rajouter des choses.
1777
cairo_dock_notify (CAIRO_DOCK_BUILD_CONTAINER_MENU, pContainer, menu);
1779
cairo_dock_notify (CAIRO_DOCK_BUILD_ICON_MENU, icon, pContainer, menu);