/** * This file is a part of the Cairo-Dock project * * Copyright : (C) see the 'copyright' file. * E-mail : see the 'copyright' file. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 3 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #define __USE_POSIX 1 #include #include #include #include #include #include #include #include "config.h" #include "cairo-dock-config.h" #include "cairo-dock-draw.h" #include "cairo-dock-animations.h" #include "cairo-dock-icon-facility.h" #include "cairo-dock-callbacks.h" #include "cairo-dock-applications-manager.h" #include "cairo-dock-application-facility.h" #include "cairo-dock-desktop-file-factory.h" #include "cairo-dock-launcher-manager.h" #include "cairo-dock-module-manager.h" #include "cairo-dock-module-factory.h" #include "cairo-dock-dock-factory.h" #include "cairo-dock-dock-facility.h" #include "cairo-dock-themes-manager.h" #include "cairo-dock-gui-themes.h" #include "cairo-dock-notifications.h" #include "cairo-dock-dialog-manager.h" #include "cairo-dock-file-manager.h" // cairo_dock_copy_file #include "cairo-dock-log.h" #include "cairo-dock-desklet-factory.h" #include "cairo-dock-X-utilities.h" #include "cairo-dock-dock-manager.h" #include "cairo-dock-class-manager.h" #include "cairo-dock-gui-factory.h" #include "cairo-dock-gui-manager.h" #include "cairo-dock-container.h" #include "cairo-dock-keyfile-utilities.h" #include "cairo-dock-backends-manager.h" #include "cairo-dock-X-manager.h" #include "cairo-dock-user-interaction.h" // set_custom_icon_on_appli #include "cairo-dock-gui-backend.h" #include "cairo-dock-gui-commons.h" #include "cairo-dock-menu.h" #define CAIRO_DOCK_CONF_PANEL_WIDTH 1000 #define CAIRO_DOCK_CONF_PANEL_HEIGHT 600 #define CAIRO_DOCK_ABOUT_WIDTH 600 #define CAIRO_DOCK_ABOUT_HEIGHT 600 #define CAIRO_DOCK_FILE_HOST_URL "https://launchpad.net/cairo-dock" // https://developer.berlios.de/project/showfiles.php?group_id=8724 #define CAIRO_DOCK_SITE_URL "http://glx-dock.org" // http://cairo-dock.vef.fr #define CAIRO_DOCK_FORUM_URL "http://forum.glx-dock.org" // http://cairo-dock.vef.fr/bg_forumlist.php #define CAIRO_DOCK_PLUGINS_EXTRAS_URL "http://extras.glx-dock.org" extern CairoDock *g_pMainDock; extern CairoDockDesktopGeometry g_desktopGeometry; extern gchar *g_cConfFile; extern gchar *g_cCurrentLaunchersPath; extern gchar *g_cCurrentThemePath; extern gchar *g_cCurrentIconsPath; extern int g_iMajorVersion, g_iMinorVersion, g_iMicroVersion; extern gboolean g_bLocked; extern gboolean g_bForceCairo; extern gboolean g_bEasterEggs; #define cairo_dock_icons_are_locked(...) (myDocksParam.bLockIcons || myDocksParam.bLockAll || g_bLocked) #define cairo_dock_is_locked(...) (myDocksParam.bLockAll || g_bLocked) static void _cairo_dock_edit_and_reload_conf (GtkMenuItem *pMenuItem, gpointer data) { cairo_dock_show_main_gui (); } static GtkWidget *s_pRootDockConfigWindow = NULL; static gboolean on_apply_config_root_dock (const gchar *cDockName) { CairoDock *pDock = cairo_dock_search_dock_from_name (cDockName); cairo_dock_reload_one_root_dock (cDockName, pDock); return FALSE; // FALSE <=> ne pas recharger. } static void on_destroy_root_dock (gchar *cInitConfFile) { s_pRootDockConfigWindow = NULL; } static void _cairo_dock_configure_root_dock (GtkMenuItem *pMenuItem, CairoDock *pDock) { g_return_if_fail (pDock->iRefCount == 0 && ! pDock->bIsMainDock); cairo_dock_show_items_gui (NULL, CAIRO_CONTAINER (pDock), NULL, 0); } static void _cairo_dock_delete_dock (GtkMenuItem *pMenuItem, CairoDock *pDock) { g_return_if_fail (pDock->iRefCount == 0 && ! pDock->bIsMainDock); Icon *pIcon = cairo_dock_get_dialogless_icon_full (pDock); int answer = cairo_dock_ask_question_and_wait (_("Delete this dock?"), pIcon, CAIRO_CONTAINER (pDock)); if (answer != GTK_RESPONSE_YES) return ; cairo_dock_remove_icons_from_dock (pDock, NULL, NULL); const gchar *cDockName = cairo_dock_search_dock_name (pDock); cairo_dock_destroy_dock (pDock, cDockName); } static void _cairo_dock_initiate_theme_management (GtkMenuItem *pMenuItem, gpointer data) { cairo_dock_manage_themes (); } static void _cairo_dock_add_about_page (GtkWidget *pNoteBook, const gchar *cPageLabel, const gchar *cAboutText) { GtkWidget *pVBox, *pScrolledWindow; GtkWidget *pPageLabel, *pAboutLabel; pPageLabel = gtk_label_new (cPageLabel); pVBox = gtk_vbox_new (FALSE, 0); pScrolledWindow = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (pScrolledWindow), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (pScrolledWindow), pVBox); gtk_notebook_append_page (GTK_NOTEBOOK (pNoteBook), pScrolledWindow, pPageLabel); pAboutLabel = gtk_label_new (NULL); gtk_label_set_use_markup (GTK_LABEL (pAboutLabel), TRUE); gtk_box_pack_start (GTK_BOX (pVBox), pAboutLabel, FALSE, FALSE, 0); gtk_label_set_markup (GTK_LABEL (pAboutLabel), cAboutText); } static void _cairo_dock_lock_icons (GtkMenuItem *pMenuItem, gpointer data) { myDocksParam.bLockIcons = ! myDocksParam.bLockIcons; cairo_dock_update_conf_file (g_cConfFile, G_TYPE_BOOLEAN, "Accessibility", "lock icons", myDocksParam.bLockIcons, G_TYPE_INVALID); } static void _cairo_dock_lock_all (GtkMenuItem *pMenuItem, gpointer data) { myDocksParam.bLockAll = ! myDocksParam.bLockAll; cairo_dock_update_conf_file (g_cConfFile, G_TYPE_BOOLEAN, "Accessibility", "lock all", myDocksParam.bLockAll, G_TYPE_INVALID); } static void _cairo_dock_about (GtkMenuItem *pMenuItem, CairoContainer *pContainer) { // build dialog GtkWidget *pDialog = gtk_dialog_new_with_buttons (_("About Cairo-Dock"), GTK_WINDOW (pContainer->pWidget), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, NULL); // the dialog box is destroyed when the user responds g_signal_connect_swapped (pDialog, "response", G_CALLBACK (gtk_widget_destroy), pDialog); #if (GTK_MAJOR_VERSION > 2 || GTK_MINOR_VERSION >= 14) GtkWidget *pContentBox = gtk_dialog_get_content_area (GTK_DIALOG(pDialog)); #else GtkWidget *pContentBox = GTK_DIALOG(pDialog)->vbox; #endif // logo + links GtkWidget *pHBox = gtk_hbox_new (FALSE, 0); gtk_box_pack_start (GTK_BOX (pContentBox), pHBox, FALSE, FALSE, 0); const gchar *cImagePath = CAIRO_DOCK_SHARE_DATA_DIR"/"CAIRO_DOCK_LOGO; GtkWidget *pImage = gtk_image_new_from_file (cImagePath); gtk_box_pack_start (GTK_BOX (pHBox), pImage, FALSE, FALSE, 0); GtkWidget *pVBox = gtk_vbox_new (FALSE, 0); gtk_box_pack_start (GTK_BOX (pHBox), pVBox, FALSE, FALSE, 0); GtkWidget *pLink = gtk_link_button_new_with_label (CAIRO_DOCK_SITE_URL, "Cairo-Dock (2007-2011)\n version "CAIRO_DOCK_VERSION); gtk_box_pack_start (GTK_BOX (pVBox), pLink, FALSE, FALSE, 0); pLink = gtk_link_button_new_with_label (CAIRO_DOCK_FORUM_URL, _("Community site")); gtk_widget_set_tooltip_text (pLink, _("Problems? Suggestions? Just want to talk to us? Come on over!")); gtk_box_pack_start (GTK_BOX (pVBox), pLink, FALSE, FALSE, 0); pLink = gtk_link_button_new_with_label (CAIRO_DOCK_FILE_HOST_URL, _("Development site")); gtk_widget_set_tooltip_text (pLink, _("Find the latest version of Cairo-Dock here !")); gtk_box_pack_start (GTK_BOX (pVBox), pLink, FALSE, FALSE, 0); gchar *cAdress = g_strdup_printf (CAIRO_DOCK_PLUGINS_EXTRAS_URL"/%d.%d.%d", g_iMajorVersion, g_iMinorVersion, g_iMicroVersion); pLink = gtk_link_button_new_with_label (cAdress, _("More applets")); g_free (cAdress); gtk_box_pack_start (GTK_BOX (pVBox), pLink, FALSE, FALSE, 0); // notebook GtkWidget *pNoteBook = gtk_notebook_new (); gtk_notebook_set_scrollable (GTK_NOTEBOOK (pNoteBook), TRUE); gtk_notebook_popup_enable (GTK_NOTEBOOK (pNoteBook)); gtk_box_pack_start (GTK_BOX (pContentBox), pNoteBook, TRUE, TRUE, 0); _cairo_dock_add_about_page (pNoteBook, _("Development"), "Main developer:\n Fabounet (Fabrice Rey)\n\ Original idea / first development:\n Mac Slow\n\ Applets:\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\ Patches:\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"); _cairo_dock_add_about_page (pNoteBook, _("Artwork"), "Themes:\n Fabounet\n Chilperik\n Djoole\n Glattering\n Vilraleur\n Lord Northam\n Paradoxxx_Zero\n Coz\n Benoit2600\n Nochka85\n Taiebot65\n Lylambda\n MastroPino\n Matttbe\n\ Translations:\n Fabounet\n Ppmt \n Jiro Kawada (Kawaji)\n BiAji\n Mattia Tavernini (Maathias)\n Peter Thornqvist\n Yannis Kaskamanidis\n Eduardo Mucelli\n"); _cairo_dock_add_about_page (pNoteBook, _("Support"), "Installation script and web hosting:\n Mav\n\ Site (glx-dock.org):\n Necropotame\n Matttbe\n Tdey\n\ LaunchPad:\n Matttbe\n Mav\n\ Suggestions / Comments / Beta-Testers:\n AuraHxC\n Chilperik\n Cybergoll\n Damster\n Djoole\n Glattering\n Franksuse64\n Mav\n Necropotame\n Nochka85\n Ppmt\n RavanH\n Rhinopierroce\n Rom1\n Sombrero\n Vilraleur"); gtk_widget_show_all (pDialog); gtk_window_resize (GTK_WINDOW (pDialog), MIN (CAIRO_DOCK_ABOUT_WIDTH, g_desktopGeometry.iXScreenWidth[CAIRO_DOCK_HORIZONTAL]), MIN (CAIRO_DOCK_ABOUT_HEIGHT, g_desktopGeometry.iXScreenHeight[CAIRO_DOCK_HORIZONTAL] - (g_pMainDock && g_pMainDock->container.bIsHorizontal ? g_pMainDock->iMaxDockHeight : 0))); gtk_window_set_keep_above (GTK_WINDOW (pDialog), TRUE); //don't use gtk_dialog_run(), as we don't want to block the dock } static void _launch_url (const gchar *cURL) { if (! cairo_dock_fm_launch_uri (cURL)) { gchar *cCommand = g_strdup_printf ("\ which xdg-open > /dev/null && xdg-open %s || \ which firefox > /dev/null && firefox %s || \ which konqueror > /dev/null && konqueror %s || \ which iceweasel > /dev/null && konqueror %s || \ which opera > /dev/null && opera %s ", cURL, cURL, cURL, cURL, cURL); // pas super beau mais efficace ^_^ int r = system (cCommand); g_free (cCommand); } } static void _cairo_dock_show_third_party_applets (GtkMenuItem *pMenuItem, gpointer data) { gchar *cAdress = g_strdup_printf (CAIRO_DOCK_PLUGINS_EXTRAS_URL"/%d.%d.%d", g_iMajorVersion, g_iMinorVersion, g_iMicroVersion); _launch_url (cAdress); g_free (cAdress); } static void _cairo_dock_present_help (GtkMenuItem *pMenuItem, gpointer data) { cairo_dock_show_module_gui ("Help"); } static void _cairo_dock_quick_hide (GtkMenuItem *pMenuItem, CairoDock *pDock) { //g_print ("%s ()\n", __func__); pDock->bMenuVisible = FALSE; cairo_dock_quick_hide_all_docks (); } static void _cairo_dock_add_autostart (GtkMenuItem *pMenuItem, gpointer data) { gchar *cCairoAutoStartDirPath = g_strdup_printf ("%s/.config/autostart", g_getenv ("HOME")); if (! g_file_test (cCairoAutoStartDirPath, G_FILE_TEST_IS_DIR)) { if (g_mkdir (cCairoAutoStartDirPath, 7*8*8+5*8+5) != 0) { cd_warning ("couldn't create directory %s", cCairoAutoStartDirPath); g_free (cCairoAutoStartDirPath); return ; } } cairo_dock_copy_file ("/usr/share/applications/cairo-dock.desktop", cCairoAutoStartDirPath); /**gchar *cCommand = g_strdup_printf ("cp '/usr/share/applications/cairo-dock%s.desktop' '%s'", (g_bForceCairo ? "-cairo" : ""), cCairoAutoStartDirPath); int r = system (cCommand); g_free (cCommand);*/ g_free (cCairoAutoStartDirPath); } static void _cairo_dock_quit (GtkMenuItem *pMenuItem, CairoContainer *pContainer) { //cairo_dock_on_delete (pDock->container.pWidget, NULL, pDock); Icon *pIcon = NULL; if (CAIRO_DOCK_IS_DOCK (pContainer)) pIcon = cairo_dock_get_dialogless_icon (CAIRO_DOCK (pContainer)); else if (CAIRO_DOCK_IS_DESKLET (pContainer)) pIcon = CAIRO_DESKLET (pContainer)->pIcon; int answer = cairo_dock_ask_question_and_wait (_("Quit Cairo-Dock?"), pIcon, pContainer); cd_debug ("quit : %d (yes:%d)\n", answer, GTK_RESPONSE_YES); if (answer == GTK_RESPONSE_YES) gtk_main_quit (); } gboolean cairo_dock_notification_build_container_menu (gpointer *pUserData, Icon *icon, CairoContainer *pContainer, GtkWidget *menu, gboolean *bDiscardMenu) { if (CAIRO_DOCK_IS_DOCK (pContainer) && CAIRO_DOCK (pContainer)->iRefCount > 0) // pas sur les sous-docks return CAIRO_DOCK_LET_PASS_NOTIFICATION; if (CAIRO_DOCK_IS_DESKLET (pContainer) && ! CAIRO_DOCK_ICON_TYPE_IS_APPLET (icon)) // pas sur les icones d'un desklet qui sont des sous-icones d'une applet (sur un desklet, on peut facilement cliquer a cote des icones) return CAIRO_DOCK_LET_PASS_NOTIFICATION; //\_________________________ On ajoute le sous-menu Cairo-Dock. GtkWidget *pMenuItem, *image; GdkPixbuf *pixbuf; GtkWidget *pSubMenu = cairo_dock_create_sub_menu ("Cairo-Dock", menu, CAIRO_DOCK_SHARE_DATA_DIR"/"CAIRO_DOCK_ICON); /**pMenuItem = gtk_image_menu_item_new_with_label ("Cairo-Dock"); pixbuf = gdk_pixbuf_new_from_file_at_size (CAIRO_DOCK_SHARE_DATA_DIR"/"CAIRO_DOCK_ICON, 32, 32, NULL); image = gtk_image_new_from_pixbuf (pixbuf); g_object_unref (pixbuf); gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (pMenuItem), image); gtk_menu_shell_append (GTK_MENU_SHELL (menu), pMenuItem); GtkWidget *pSubMenu = gtk_menu_new (); gtk_menu_item_set_submenu (GTK_MENU_ITEM (pMenuItem), pSubMenu);*/ if (! cairo_dock_is_locked ()) { pMenuItem = cairo_dock_add_in_menu_with_stock_and_data (_("Configure"), GTK_STOCK_PREFERENCES, (GFunc)_cairo_dock_edit_and_reload_conf, pSubMenu, NULL); gtk_widget_set_tooltip_text (pMenuItem, _("Configure behaviour, appearance, and applets.")); if (CAIRO_DOCK_IS_DOCK (pContainer) && ! CAIRO_DOCK (pContainer)->bIsMainDock && CAIRO_DOCK (pContainer)->iRefCount == 0) { pMenuItem = cairo_dock_add_in_menu_with_stock_and_data (_("Configure this dock"), GTK_STOCK_EXECUTE, (GFunc)_cairo_dock_configure_root_dock, pSubMenu, CAIRO_DOCK (pContainer)); gtk_widget_set_tooltip_text (pMenuItem, _("Customize the position, visibility and appearance of this main dock.")); cairo_dock_add_in_menu_with_stock_and_data (_("Delete this dock"), GTK_STOCK_DELETE, (GFunc)_cairo_dock_delete_dock, pSubMenu, CAIRO_DOCK (pContainer)); } if (! cairo_dock_theme_manager_is_integrated ()) { pMenuItem = cairo_dock_add_in_menu_with_stock_and_data (_("Manage themes"), CAIRO_DOCK_SHARE_DATA_DIR"/icon-appearance.svg", (GFunc)_cairo_dock_initiate_theme_management, pSubMenu, NULL); gtk_widget_set_tooltip_text (pMenuItem, _("Choose from amongst many themes on the server or save your current theme.")); } pMenuItem = gtk_separator_menu_item_new (); gtk_menu_shell_append (GTK_MENU_SHELL (pSubMenu), pMenuItem); pMenuItem = cairo_dock_add_in_menu_with_stock_and_data (myDocksParam.bLockIcons ? _("Unlock icons") : _("Lock icons"), CAIRO_DOCK_SHARE_DATA_DIR"/icon-lock-icons.svg", (GFunc)_cairo_dock_lock_icons, pSubMenu, NULL); gtk_widget_set_tooltip_text (pMenuItem, _("This will (un)lock the position of the icons.")); } if (! g_bLocked) { pMenuItem = cairo_dock_add_in_menu_with_stock_and_data (myDocksParam.bLockAll ? _("Unlock dock") : _("Lock dock"), CAIRO_DOCK_SHARE_DATA_DIR"/icon-lock-icons.svg", (GFunc)_cairo_dock_lock_all, pSubMenu, NULL); gtk_widget_set_tooltip_text (pMenuItem, _("This will (un)lock the whole dock.")); } if (CAIRO_DOCK_IS_DOCK (pContainer) && ! CAIRO_DOCK (pContainer)->bAutoHide) { pMenuItem = cairo_dock_add_in_menu_with_stock_and_data (_("Quick-Hide"), GTK_STOCK_GOTO_BOTTOM, (GFunc)_cairo_dock_quick_hide, pSubMenu, CAIRO_DOCK (pContainer)); gtk_widget_set_tooltip_text (pMenuItem, _("This will hide the dock until you hover over it with the mouse.")); } gchar *cCairoAutoStartDirPath = g_strdup_printf ("%s/.config/autostart", g_getenv ("HOME")); gchar *cCairoAutoStartEntryPath = g_strdup_printf ("%s/cairo-dock.desktop", cCairoAutoStartDirPath); gchar *cCairoAutoStartEntryPath2 = g_strdup_printf ("%s/cairo-dock-cairo.desktop", cCairoAutoStartDirPath); if (! g_file_test (cCairoAutoStartEntryPath, G_FILE_TEST_EXISTS) && ! g_file_test (cCairoAutoStartEntryPath2, G_FILE_TEST_EXISTS)) { cairo_dock_add_in_menu_with_stock_and_data (_("Launch Cairo-Dock on startup"), GTK_STOCK_ADD, (GFunc)_cairo_dock_add_autostart, pSubMenu, NULL); } g_free (cCairoAutoStartEntryPath); g_free (cCairoAutoStartEntryPath2); g_free (cCairoAutoStartDirPath); pMenuItem = cairo_dock_add_in_menu_with_stock_and_data (_("Get more applets!"), GTK_STOCK_ADD, (GFunc)_cairo_dock_show_third_party_applets, pSubMenu, NULL); gtk_widget_set_tooltip_text (pMenuItem, _("Third-party applets provide integration with many programs, like Pidgin")); pMenuItem = cairo_dock_add_in_menu_with_stock_and_data (_("Help"), GTK_STOCK_HELP, (GFunc)_cairo_dock_present_help, pSubMenu, NULL); gtk_widget_set_tooltip_text (pMenuItem, _("There are no problems, only solutions (and a lot of useful hints!)")); cairo_dock_add_in_menu_with_stock_and_data (_("About"), GTK_STOCK_ABOUT, (GFunc)_cairo_dock_about, pSubMenu, pContainer); if (! g_bLocked) { cairo_dock_add_in_menu_with_stock_and_data (_("Quit"), GTK_STOCK_QUIT, (GFunc)_cairo_dock_quit, pSubMenu, pContainer); } return CAIRO_DOCK_LET_PASS_NOTIFICATION; } /////////////////////////////////////////////////////////////////// /////////// LES OPERATIONS SUR LES LANCEURS /////////////////////// /////////////////////////////////////////////////////////////////// #define _add_entry_in_menu(cLabel, gtkStock, pCallBack, pSubMenu) cairo_dock_add_in_menu_with_stock_and_data (cLabel, gtkStock, (GFunc) (pCallBack), pSubMenu, data) static void _cairo_dock_remove_launcher (GtkMenuItem *pMenuItem, gpointer *data) { Icon *icon = data[0]; CairoDock *pDock = data[1]; const gchar *cName = (icon->cInitialName != NULL ? icon->cInitialName : icon->cName); if (cName == NULL) { if (CAIRO_DOCK_ICON_TYPE_IS_SEPARATOR (icon)) cName = _("separator"); else cName = "no name"; } gchar *question = g_strdup_printf (_("You're about to remove this icon (%s) from the dock. Are you sure?"), cName); int answer = cairo_dock_ask_question_and_wait (question, icon, CAIRO_CONTAINER (pDock)); g_free (question); if (answer != GTK_RESPONSE_YES) return ; if (icon->pSubDock != NULL) // on bazarde le sous-dock. { gboolean bDestroyIcons = TRUE; if (icon->pSubDock->icons != NULL) // on propose de repartir les icones de son sous-dock dans le dock principal. { int answer = cairo_dock_ask_question_and_wait (_("Do you want to re-dispatch the icons contained inside this container into the dock?\n(otherwise they will be destroyed)"), icon, CAIRO_CONTAINER (pDock)); g_return_if_fail (answer != GTK_RESPONSE_NONE); if (answer == GTK_RESPONSE_YES) bDestroyIcons = FALSE; } if (!bDestroyIcons) { const gchar *cDockName = cairo_dock_search_dock_name (pDock); cairo_dock_remove_icons_from_dock (icon->pSubDock, pDock, cDockName); } cairo_dock_destroy_dock (icon->pSubDock, (CAIRO_DOCK_IS_APPLI (icon) && icon->cClass != NULL ? icon->cClass : icon->cName)); icon->pSubDock = NULL; } cairo_dock_trigger_icon_removal_from_dock (icon); } static void _cairo_dock_create_launcher (Icon *icon, CairoDock *pDock, CairoDockDesktopFileType iLauncherType) { //\___________________ On determine l'ordre d'insertion suivant l'endroit du clique. double fOrder; if (icon != NULL) { if (pDock->container.iMouseX < icon->fDrawX + icon->fWidth * icon->fScale / 2) // a gauche. { Icon *prev_icon = cairo_dock_get_previous_icon (pDock->icons, icon); fOrder = (prev_icon != NULL ? (icon->fOrder + prev_icon->fOrder) / 2 : icon->fOrder - 1); } else { Icon *next_icon = cairo_dock_get_next_icon (pDock->icons, icon); fOrder = (next_icon != NULL ? (icon->fOrder + next_icon->fOrder) / 2 : icon->fOrder + 1); } } else fOrder = CAIRO_DOCK_LAST_ORDER; //\___________________ On cree et on charge l'icone a partir d'un des templates. Icon *pNewIcon = cairo_dock_add_new_launcher_by_type (iLauncherType, pDock, fOrder, (icon ? icon->iGroup : CAIRO_DOCK_LAUNCHER)); if (pNewIcon == NULL) { cd_warning ("Couldn't create create the icon.\nCheck that you have writing permissions on ~/.config/cairo-dock and its sub-folders"); return ; } //\___________________ On ouvre automatiquement l'IHM pour permettre de modifier ses champs. if (iLauncherType != CAIRO_DOCK_DESKTOP_FILE_FOR_SEPARATOR) // inutile pour un separateur. cairo_dock_show_items_gui (pNewIcon, NULL, NULL, -1); } static void cairo_dock_add_launcher (GtkMenuItem *pMenuItem, gpointer *data) { Icon *icon = data[0]; CairoDock *pDock = data[1]; _cairo_dock_create_launcher (icon, pDock, CAIRO_DOCK_DESKTOP_FILE_FOR_LAUNCHER); } static void cairo_dock_add_sub_dock (GtkMenuItem *pMenuItem, gpointer *data) { Icon *icon = data[0]; CairoDock *pDock = data[1]; _cairo_dock_create_launcher (icon, pDock, CAIRO_DOCK_DESKTOP_FILE_FOR_CONTAINER); } static void cairo_dock_add_main_dock (GtkMenuItem *pMenuItem, gpointer *data) { gchar *cDockName = cairo_dock_add_root_dock_config (); CairoDock *pDock = cairo_dock_create_dock (cDockName, NULL); cairo_dock_reload_one_root_dock (cDockName, pDock); cairo_dock_gui_trigger_reload_items (); // pas de signal "new_dock" cairo_dock_show_general_message (_("The new dock has been created.\nNow move some launchers or applets into it by right-clicking on the icon -> move to another dock"), 10000); // on le place pas sur le nouveau dock, car sa fenetre n'est pas encore bien placee (0,0). } static void cairo_dock_add_separator (GtkMenuItem *pMenuItem, gpointer *data) { Icon *icon = data[0]; CairoDock *pDock = data[1]; _cairo_dock_create_launcher (icon, pDock, CAIRO_DOCK_DESKTOP_FILE_FOR_SEPARATOR); } static void _cairo_dock_launch_class_action (GtkMenuItem *pMenuItem, gchar *cCommand) { cairo_dock_launch_command (cCommand); } static void _cairo_dock_modify_launcher (GtkMenuItem *pMenuItem, gpointer *data) { Icon *icon = data[0]; CairoDock *pDock = data[1]; if (icon->cDesktopFileName == NULL || strcmp (icon->cDesktopFileName, "none") == 0) { cairo_dock_show_temporary_dialog_with_icon (_("Sorry, this icon doesn't have a configuration file."), icon, CAIRO_CONTAINER (pDock), 4000, "same icon"); return ; } cairo_dock_show_items_gui (icon, NULL, NULL, -1); } static void _cairo_dock_move_launcher_to_dock (GtkMenuItem *pMenuItem, const gchar *cDockName) { Icon *pIcon = g_object_get_data (G_OBJECT (pMenuItem), "launcher"); //\_________________________ on cree si besoin le fichier de conf d'un nouveau dock racine. gchar *cValidDockName; if (cDockName == NULL) // nouveau dock { cValidDockName = cairo_dock_add_root_dock_config (); } else { cValidDockName = g_strdup (cDockName); } //\_________________________ on met a jour le fichier de conf de l'icone. gchar *cCurrentDockName = pIcon->cParentDockName; pIcon->cParentDockName = NULL; cairo_dock_update_icon_s_container_name (pIcon, cValidDockName); g_free (pIcon->cParentDockName); pIcon->cParentDockName = cCurrentDockName; //\_________________________ on recharge l'icone, ce qui va creer le dock. if ((CAIRO_DOCK_ICON_TYPE_IS_LAUNCHER (pIcon) || CAIRO_DOCK_ICON_TYPE_IS_CONTAINER (pIcon) || CAIRO_DOCK_ICON_TYPE_IS_SEPARATOR (pIcon)) && pIcon->cDesktopFileName != NULL) // user icon. { cairo_dock_reload_launcher (pIcon); } else if (CAIRO_DOCK_IS_APPLET (pIcon)) { cairo_dock_reload_module_instance (pIcon->pModuleInstance, TRUE); // TRUE <=> reload config. } CairoDock *pNewDock = cairo_dock_search_dock_from_name (cValidDockName); if (pNewDock && pNewDock->iRefCount == 0 && pNewDock->icons && pNewDock->icons->next == NULL) // le dock vient d'etre cree avec cette icone. 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). g_free (cValidDockName); } static void _add_one_dock_to_menu (const gchar *cName, CairoDock *pDock, GtkWidget *pMenu) { // on ne prend que les sous-docks utilisateur. Icon *pPointingIcon = cairo_dock_search_icon_pointing_on_dock (pDock, NULL); if (pPointingIcon && ! CAIRO_DOCK_ICON_TYPE_IS_CONTAINER (pPointingIcon)) return; // on elimine le dock courant. Icon *pIcon = g_object_get_data (G_OBJECT (pMenu), "launcher"); if (strcmp (pIcon->cParentDockName, cName) == 0) return; // on elimine le sous-dock. if (pIcon->pSubDock != NULL && pIcon->pSubDock == pDock) return; // On definit un nom plus parlant. gchar *cUserName = cairo_dock_get_readable_name_for_fock (pDock); // on rajoute une entree pour le dock. GtkWidget *pMenuItem = cairo_dock_add_in_menu_with_stock_and_data (cUserName ? cUserName : cName, NULL, (GFunc)_cairo_dock_move_launcher_to_dock, pMenu, (gpointer)cName); g_object_set_data (G_OBJECT (pMenuItem), "launcher", pIcon); g_free (cUserName); } ////////////////////////////////////////////////////////////////// /////////// LES OPERATIONS SUR LES APPLETS /////////////////////// ////////////////////////////////////////////////////////////////// static void _cairo_dock_initiate_config_module (GtkMenuItem *pMenuItem, gpointer *data) { cd_debug ("%s ()\n", __func__); Icon *icon = data[0]; CairoContainer *pContainer= data[1]; if (CAIRO_DOCK_IS_DESKLET (pContainer)) icon = (CAIRO_DESKLET (pContainer))->pIcon; // l'icone cliquee du desklet n'est pas forcement celle qui contient le module. g_return_if_fail (CAIRO_DOCK_IS_APPLET (icon)); //cairo_dock_show_module_instance_gui (icon->pModuleInstance, -1); cairo_dock_show_items_gui (icon, NULL, NULL, -1); } static void _cairo_dock_detach_module (GtkMenuItem *pMenuItem, gpointer *data) { Icon *icon = data[0]; CairoContainer *pContainer= data[1]; if (CAIRO_DOCK_IS_DESKLET (pContainer)) icon = (CAIRO_DESKLET (pContainer))->pIcon; // l'icone cliquee du desklet n'est pas forcement celle qui contient le module ! g_return_if_fail (CAIRO_DOCK_IS_APPLET (icon)); cairo_dock_detach_module_instance (icon->pModuleInstance); } static void _cairo_dock_remove_module_instance (GtkMenuItem *pMenuItem, gpointer *data) { Icon *icon = data[0]; CairoContainer *pContainer= data[1]; if (CAIRO_DOCK_IS_DESKLET (pContainer)) icon = (CAIRO_DESKLET (pContainer))->pIcon; // l'icone cliquee du desklet n'est pas forcement celle qui contient le module ! g_return_if_fail (CAIRO_DOCK_IS_APPLET (icon)); gchar *question = g_strdup_printf (_("You're about to remove this applet (%s) from the dock. Are you sure?"), icon->pModuleInstance->pModule->pVisitCard->cTitle); int answer = cairo_dock_ask_question_and_wait (question, icon, CAIRO_CONTAINER (pContainer)); if (answer == GTK_RESPONSE_YES) { ///if (icon->pModuleInstance->pModule->pInstancesList->next == NULL) // plus d'instance du module apres ca. /// cairo_dock_deactivate_module_in_gui (icon->pModuleInstance->pModule->pVisitCard->cModuleName); cairo_dock_remove_module_instance (icon->pModuleInstance); } } static void _cairo_dock_add_module_instance (GtkMenuItem *pMenuItem, gpointer *data) { Icon *icon = data[0]; CairoContainer *pContainer= data[1]; if (CAIRO_DOCK_IS_DESKLET (pContainer)) icon = (CAIRO_DESKLET (pContainer))->pIcon; // l'icone cliquee du desklet n'est pas forcement celle qui contient le module ! g_return_if_fail (CAIRO_DOCK_IS_APPLET (icon)); cairo_dock_add_module_instance (icon->pModuleInstance->pModule); } ///////////////////////////////////////////////////////////////// /////////// LES OPERATIONS SUR LES APPLIS /////////////////////// ///////////////////////////////////////////////////////////////// static void _cairo_dock_close_appli (GtkMenuItem *pMenuItem, gpointer *data) { Icon *icon = data[0]; CairoDock *pDock = data[1]; if (CAIRO_DOCK_IS_APPLI (icon)) cairo_dock_close_xwindow (icon->Xid); } static void _show_image_preview (GtkFileChooser *pFileChooser, GtkImage *pPreviewImage) { gchar *cFileName = gtk_file_chooser_get_preview_filename (pFileChooser); if (cFileName == NULL) return ; GdkPixbuf *pixbuf = gdk_pixbuf_new_from_file_at_size (cFileName, 64, 64, NULL); g_free (cFileName); if (pixbuf != NULL) { gtk_image_set_from_pixbuf (pPreviewImage, pixbuf); gdk_pixbuf_unref (pixbuf); gtk_file_chooser_set_preview_widget_active (pFileChooser, TRUE); } else gtk_file_chooser_set_preview_widget_active (pFileChooser, FALSE); } static void _cairo_dock_set_custom_appli_icon (GtkMenuItem *pMenuItem, gpointer *data) { Icon *icon = data[0]; CairoDock *pDock = data[1]; if (! CAIRO_DOCK_IS_APPLI (icon)) return; GtkWidget* pFileChooserDialog = gtk_file_chooser_dialog_new ( "Pick up an image", GTK_WINDOW (pDock->container.pWidget), GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_OK, GTK_RESPONSE_OK, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, NULL); gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (pFileChooserDialog), "~/.config/cairo-dock/current_theme/icons"); gtk_file_chooser_set_select_multiple (GTK_FILE_CHOOSER (pFileChooserDialog), FALSE); GtkWidget *pPreviewImage = gtk_image_new (); gtk_file_chooser_set_preview_widget (GTK_FILE_CHOOSER (pFileChooserDialog), pPreviewImage); g_signal_connect (GTK_FILE_CHOOSER (pFileChooserDialog), "update-preview", G_CALLBACK (_show_image_preview), pPreviewImage); gtk_widget_show (pFileChooserDialog); int answer = gtk_dialog_run (GTK_DIALOG (pFileChooserDialog)); if (answer == GTK_RESPONSE_OK) { if (myTaskbarParam.cOverwriteException != NULL && icon->cClass != NULL) // si cette classe etait definie pour ne pas ecraser l'icone X, on le change, sinon l'action utilisateur n'aura aucun impact, ce sera troublant. { gchar **pExceptions = g_strsplit (myTaskbarParam.cOverwriteException, ";", -1); int i, j = -1; for (i = 0; pExceptions[i] != NULL; i ++) { if (j == -1 && strcmp (pExceptions[i], icon->cClass) == 0) { g_free (pExceptions[i]); pExceptions[i] = NULL; j = i; } } // apres la boucle, i = nbre d'elements, j = l'element qui a ete enleve. if (j != -1) // un element a ete enleve. { cd_warning ("The class '%s' was explicitely set up to use the X icon, we'll change this behavior automatically.", icon->cClass); if (j < i - 1) // ce n'est pas le dernier { pExceptions[j] = pExceptions[i-1]; pExceptions[i-1] = NULL; } myTaskbarParam.cOverwriteException = g_strjoinv (";", pExceptions); cairo_dock_set_overwrite_exceptions (myTaskbarParam.cOverwriteException); GKeyFile *pKeyFile = cairo_dock_open_key_file (g_cConfFile); if (pKeyFile != NULL) { g_key_file_set_string (pKeyFile, "TaskBar", "overwrite exception", myTaskbarParam.cOverwriteException); cairo_dock_write_keys_to_file (pKeyFile, g_cConfFile); g_key_file_free (pKeyFile); } } g_strfreev (pExceptions); } gchar *cFilePath = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (pFileChooserDialog)); cairo_dock_set_custom_icon_on_appli (cFilePath, icon, CAIRO_CONTAINER (pDock)); g_free (cFilePath); } gtk_widget_destroy (pFileChooserDialog); } static void _cairo_dock_remove_custom_appli_icon (GtkMenuItem *pMenuItem, gpointer *data) { Icon *icon = data[0]; CairoDock *pDock = data[1]; if (! CAIRO_DOCK_IS_APPLI (icon)) return; const gchar *cClassIcon = cairo_dock_get_class_icon (icon->cClass); if (cClassIcon == NULL) cClassIcon = icon->cClass; gchar *cCustomIcon = g_strdup_printf ("%s/%s.png", g_cCurrentIconsPath, cClassIcon); if (!g_file_test (cCustomIcon, G_FILE_TEST_EXISTS)) { g_free (cCustomIcon); cCustomIcon = g_strdup_printf ("%s/%s.svg", g_cCurrentIconsPath, cClassIcon); if (!g_file_test (cCustomIcon, G_FILE_TEST_EXISTS)) { g_free (cCustomIcon); cCustomIcon = NULL; } } if (cCustomIcon != NULL) { g_remove (cCustomIcon); /**gchar *cCommand = g_strdup_printf ("rm -f \"%s\"", cCustomIcon); int r = system (cCommand); g_free (cCommand);*/ cairo_dock_reload_icon_image (icon, CAIRO_CONTAINER (pDock)); cairo_dock_redraw_icon (icon, CAIRO_CONTAINER (pDock)); } } static void _cairo_dock_kill_appli (GtkMenuItem *pMenuItem, gpointer *data) { Icon *icon = data[0]; CairoDock *pDock = data[1]; if (CAIRO_DOCK_IS_APPLI (icon)) cairo_dock_kill_xwindow (icon->Xid); } static void _cairo_dock_minimize_appli (GtkMenuItem *pMenuItem, gpointer *data) { Icon *icon = data[0]; CairoDock *pDock = data[1]; if (CAIRO_DOCK_IS_APPLI (icon)) { cairo_dock_minimize_xwindow (icon->Xid); } } static void _cairo_dock_show_appli (GtkMenuItem *pMenuItem, gpointer *data) { Icon *icon = data[0]; CairoDock *pDock = data[1]; if (CAIRO_DOCK_IS_APPLI (icon)) { cairo_dock_show_xwindow (icon->Xid); } } static void _cairo_dock_launch_new (GtkMenuItem *pMenuItem, gpointer *data) { Icon *icon = data[0]; CairoDock *pDock = data[1]; if (icon->cCommand != NULL) { cairo_dock_notify_on_object (&myContainersMgr, NOTIFICATION_CLICK_ICON, icon, pDock, GDK_SHIFT_MASK); // on emule un shift+clic gauche . cairo_dock_notify_on_object (CAIRO_CONTAINER (pDock), NOTIFICATION_CLICK_ICON, icon, pDock, GDK_SHIFT_MASK); // on emule un shift+clic gauche . } } static void _cairo_dock_make_launcher_from_appli (GtkMenuItem *pMenuItem, gpointer *data) { Icon *icon = data[0]; CairoDock *pDock = data[1]; g_return_if_fail (icon->Xid != 0 && icon->cClass != NULL); // on trouve le .desktop du programme. cd_debug ("%s (%s)\n", __func__, icon->cClass); gchar *cDesktopFilePath = g_strdup (cairo_dock_get_class_desktop_file (icon->cClass)); if (cDesktopFilePath == NULL) { gchar *cCommand = g_strdup_printf ("locate /%s.desktop --limit=1 -i", icon->cClass); gchar *cResult = cairo_dock_launch_command_sync (cCommand); if (cResult != NULL && *cResult != '\0') { if (cResult[strlen (cResult) - 1] == '\n') cResult[strlen (cResult) - 1] = '\0'; cDesktopFilePath = cResult; } else // chercher un desktop qui contienne command="command from /proc"... { g_free (cResult); } } // on cree un nouveau lanceur a partir de la classe. if (cDesktopFilePath != NULL) { cd_message ("found desktop file : %s\n", cDesktopFilePath); cairo_dock_add_new_launcher_by_uri (cDesktopFilePath, g_pMainDock, CAIRO_DOCK_LAST_ORDER); // on l'ajoute dans le main dock. } else { cairo_dock_show_temporary_dialog_with_default_icon (_("Sorry, couldn't find the corresponding description file.\nConsider dragging and dropping the launcher from the Applications Menu."), icon, CAIRO_CONTAINER (pDock), 8000); } g_free (cDesktopFilePath); } static void _cairo_dock_maximize_appli (GtkMenuItem *pMenuItem, gpointer *data) { Icon *icon = data[0]; CairoDock *pDock = data[1]; if (CAIRO_DOCK_IS_APPLI (icon)) { cairo_dock_maximize_xwindow (icon->Xid, ! icon->bIsMaximized); } } static void _cairo_dock_set_appli_fullscreen (GtkMenuItem *pMenuItem, gpointer *data) { Icon *icon = data[0]; CairoDock *pDock = data[1]; if (CAIRO_DOCK_IS_APPLI (icon)) { cairo_dock_set_xwindow_fullscreen (icon->Xid, ! icon->bIsFullScreen); } } static void _cairo_dock_move_appli_to_current_desktop (GtkMenuItem *pMenuItem, gpointer *data) { //g_print ("%s ()\n", __func__); Icon *icon = data[0]; CairoDock *pDock = data[1]; if (CAIRO_DOCK_IS_APPLI (icon)) { cairo_dock_move_window_to_current_desktop (icon); if (!icon->bIsHidden) cairo_dock_show_xwindow (icon->Xid); } } static void _cairo_dock_move_appli_to_desktop (GtkMenuItem *pMenuItem, gpointer *user_data) { gpointer *data = user_data[0]; Icon *icon = data[0]; CairoDock *pDock = data[1]; int iDesktopNumber = GPOINTER_TO_INT (user_data[1]); int iViewPortNumberY = GPOINTER_TO_INT (user_data[2]); int iViewPortNumberX = GPOINTER_TO_INT (user_data[3]); cd_message ("%s (%d;%d;%d)", __func__, iDesktopNumber, iViewPortNumberX, iViewPortNumberY); if (CAIRO_DOCK_IS_APPLI (icon)) { cairo_dock_move_window_to_desktop (icon, iDesktopNumber, iViewPortNumberX, iViewPortNumberY); } } static void _cairo_dock_change_window_above (GtkMenuItem *pMenuItem, gpointer *data) { Icon *icon = data[0]; CairoDock *pDock = data[1]; if (CAIRO_DOCK_IS_APPLI (icon)) { gboolean bIsAbove=FALSE, bIsBelow=FALSE; cairo_dock_xwindow_is_above_or_below (icon->Xid, &bIsAbove, &bIsBelow); cairo_dock_set_xwindow_above (icon->Xid, ! bIsAbove); } } ////////////////////////////////////////////////////////////////// ///////////// LES OPERATIONS SUR LES CLASSES ///////////////////// ////////////////////////////////////////////////////////////////// static void _cairo_dock_show_class (GtkMenuItem *pMenuItem, gpointer *data) { Icon *icon = data[0]; CairoDock *pDock = data[1]; g_return_if_fail (icon->pSubDock != NULL); Icon *pIcon; GList *ic; for (ic = icon->pSubDock->icons; ic != NULL; ic = ic->next) { pIcon = ic->data; if (CAIRO_DOCK_IS_APPLI (pIcon)) { cairo_dock_show_xwindow (pIcon->Xid); } } } static void _cairo_dock_minimize_class (GtkMenuItem *pMenuItem, gpointer *data) { Icon *icon = data[0]; CairoDock *pDock = data[1]; g_return_if_fail (icon->pSubDock != NULL); Icon *pIcon; GList *ic; for (ic = icon->pSubDock->icons; ic != NULL; ic = ic->next) { pIcon = ic->data; if (CAIRO_DOCK_IS_APPLI (pIcon)) { cairo_dock_minimize_xwindow (pIcon->Xid); } } } static void _cairo_dock_close_class (GtkMenuItem *pMenuItem, gpointer *data) { Icon *icon = data[0]; CairoDock *pDock = data[1]; g_return_if_fail (icon->pSubDock != NULL); Icon *pIcon; GList *ic; for (ic = icon->pSubDock->icons; ic != NULL; ic = ic->next) { pIcon = ic->data; if (CAIRO_DOCK_IS_APPLI (pIcon)) { cairo_dock_close_xwindow (pIcon->Xid); } } } static void _cairo_dock_move_class_to_desktop (GtkMenuItem *pMenuItem, gpointer *user_data) { gpointer *data = user_data[0]; Icon *icon = data[0]; CairoDock *pDock = data[1]; g_return_if_fail (icon->pSubDock != NULL); int iDesktopNumber = GPOINTER_TO_INT (user_data[1]); int iViewPortNumberY = GPOINTER_TO_INT (user_data[2]); int iViewPortNumberX = GPOINTER_TO_INT (user_data[3]); cd_message ("%s (%d;%d;%d)", __func__, iDesktopNumber, iViewPortNumberX, iViewPortNumberY); Icon *pIcon; GList *ic; for (ic = icon->pSubDock->icons; ic != NULL; ic = ic->next) { pIcon = ic->data; if (CAIRO_DOCK_IS_APPLI (pIcon)) { cairo_dock_move_window_to_desktop (pIcon, iDesktopNumber, iViewPortNumberX, iViewPortNumberY); } } } static void _cairo_dock_move_class_to_current_desktop (GtkMenuItem *pMenuItem, gpointer *data) { Icon *icon = data[0]; CairoDock *pDock = data[1]; g_return_if_fail (icon->pSubDock != NULL); Icon *pIcon; GList *ic; for (ic = icon->pSubDock->icons; ic != NULL; ic = ic->next) { pIcon = ic->data; if (CAIRO_DOCK_IS_APPLI (pIcon)) { cairo_dock_move_window_to_current_desktop (pIcon); } } } /////////////////////////////////////////////////////////////////// ///////////////// LES OPERATIONS SUR LES DESKLETS ///////////////// /////////////////////////////////////////////////////////////////// static inline void _cairo_dock_set_desklet_accessibility (CairoDesklet *pDesklet, CairoDeskletVisibility iVisibility) { cairo_dock_set_desklet_accessibility (pDesklet, iVisibility, TRUE); // TRUE <=> save state in conf. cairo_dock_gui_trigger_update_desklet_visibility (pDesklet); } static void _cairo_dock_keep_below (GtkCheckMenuItem *pMenuItem, gpointer *data) { CairoDesklet *pDesklet = data[1]; if (gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (pMenuItem))) _cairo_dock_set_desklet_accessibility (pDesklet, CAIRO_DESKLET_KEEP_BELOW); } static void _cairo_dock_keep_normal (GtkCheckMenuItem *pMenuItem, gpointer *data) { CairoDesklet *pDesklet = data[1]; if (gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (pMenuItem))) _cairo_dock_set_desklet_accessibility (pDesklet, CAIRO_DESKLET_NORMAL); } static void _cairo_dock_keep_above (GtkCheckMenuItem *pMenuItem, gpointer *data) { CairoDesklet *pDesklet = data[1]; if (gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (pMenuItem))) _cairo_dock_set_desklet_accessibility (pDesklet, CAIRO_DESKLET_KEEP_ABOVE); } static void _cairo_dock_keep_on_widget_layer (GtkMenuItem *pMenuItem, gpointer *data) { CairoDesklet *pDesklet = data[1]; if (gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (pMenuItem))) _cairo_dock_set_desklet_accessibility (pDesklet, CAIRO_DESKLET_ON_WIDGET_LAYER); } static void _cairo_dock_keep_space (GtkCheckMenuItem *pMenuItem, gpointer *data) { CairoDesklet *pDesklet = data[1]; if (gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (pMenuItem))) _cairo_dock_set_desklet_accessibility (pDesklet, CAIRO_DESKLET_RESERVE_SPACE); } static void _cairo_dock_set_on_all_desktop (GtkCheckMenuItem *pMenuItem, gpointer *data) { CairoDesklet *pDesklet = data[1]; gboolean bSticky = gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (pMenuItem)); cairo_dock_set_desklet_sticky (pDesklet, bSticky); cairo_dock_gui_trigger_update_desklet_visibility (pDesklet); } static void _cairo_dock_lock_position (GtkMenuItem *pMenuItem, gpointer *data) { CairoDesklet *pDesklet = data[1]; gboolean bLocked = gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (pMenuItem)); cairo_dock_lock_desklet_position (pDesklet, bLocked); cairo_dock_gui_trigger_update_desklet_visibility (pDesklet); } static void _add_desktops_entry (GtkWidget *pMenu, gboolean bAll, gpointer *data) { static gpointer *s_pDesktopData = NULL; GtkWidget *pMenuItem, *image; if (g_desktopGeometry.iNbDesktops > 1 || g_desktopGeometry.iNbViewportX > 1 || g_desktopGeometry.iNbViewportY > 1) { int i, j, k, iDesktopCode; const gchar *cLabel; if (g_desktopGeometry.iNbDesktops > 1 && (g_desktopGeometry.iNbViewportX > 1 || g_desktopGeometry.iNbViewportY > 1)) cLabel = bAll ? _("Move all to desktop %d - face %d") : _("Move to desktop %d - face %d"); else if (g_desktopGeometry.iNbDesktops > 1) cLabel = bAll ? _("Move all to desktop %d") : _("Move to desktop %d"); else cLabel = bAll ? _("Move all to face %d") : _("Move to face %d"); GString *sDesktop = g_string_new (""); g_free (s_pDesktopData); s_pDesktopData = g_new0 (gpointer, 4 * g_desktopGeometry.iNbDesktops * g_desktopGeometry.iNbViewportX * g_desktopGeometry.iNbViewportY); gpointer *user_data; Icon *icon = data[0]; Icon *pAppli = cairo_dock_get_icon_with_Xid (icon->Xid); // un inhibiteur ne contient pas les donnees, mais seulement la reference a l'appli, donc on recupere celle-ci pour avoir son bureau. for (i = 0; i < g_desktopGeometry.iNbDesktops; i ++) // on range par bureau. { for (j = 0; j < g_desktopGeometry.iNbViewportY; j ++) // puis par rangee. { for (k = 0; k < g_desktopGeometry.iNbViewportX; k ++) { if (g_desktopGeometry.iNbDesktops > 1 && (g_desktopGeometry.iNbViewportX > 1 || g_desktopGeometry.iNbViewportY > 1)) g_string_printf (sDesktop, cLabel, i+1, j*g_desktopGeometry.iNbViewportX+k+1); else if (g_desktopGeometry.iNbDesktops > 1) g_string_printf (sDesktop, cLabel, i+1); else g_string_printf (sDesktop, cLabel, j*g_desktopGeometry.iNbViewportX+k+1); iDesktopCode = i * g_desktopGeometry.iNbViewportY * g_desktopGeometry.iNbViewportX + j * g_desktopGeometry.iNbViewportX + k; user_data = &s_pDesktopData[4*iDesktopCode]; user_data[0] = data; user_data[1] = GINT_TO_POINTER (i); user_data[2] = GINT_TO_POINTER (j); user_data[3] = GINT_TO_POINTER (k); pMenuItem = cairo_dock_add_in_menu_with_stock_and_data (sDesktop->str, NULL, (GFunc)(bAll ? _cairo_dock_move_class_to_desktop : _cairo_dock_move_appli_to_desktop), pMenu, user_data); if (pAppli && cairo_dock_appli_is_on_desktop (pAppli, i, k, j)) gtk_widget_set_sensitive (pMenuItem, FALSE); } } } g_string_free (sDesktop, TRUE); } } static void _add_add_entry (GtkWidget *pMenu, gpointer *data, gboolean bAddSeparator, gboolean bAddLauncher) { GtkWidget *pSubMenuAdd = cairo_dock_create_sub_menu (_("Add"), pMenu, GTK_STOCK_ADD); /**GtkWidget *pMenuItem = _add_entry_in_menu (_("Add"), GTK_STOCK_ADD, NULL, pMenu); GtkWidget *pSubMenuAdd = gtk_menu_new (); gtk_menu_item_set_submenu (GTK_MENU_ITEM (pMenuItem), pSubMenuAdd);*/ _add_entry_in_menu (_("Sub-dock"), GTK_STOCK_ADD, cairo_dock_add_sub_dock, pSubMenuAdd); _add_entry_in_menu (_("Main dock"), GTK_STOCK_ADD, cairo_dock_add_main_dock, pSubMenuAdd); if (bAddSeparator) _add_entry_in_menu (_("Separator"), GTK_STOCK_ADD, cairo_dock_add_separator, pSubMenuAdd); if (bAddLauncher) { GtkWidget *pMenuItem = _add_entry_in_menu (_("Custom launcher"), GTK_STOCK_ADD, cairo_dock_add_launcher, pSubMenuAdd); gtk_widget_set_tooltip_text (pMenuItem, _("Usually you would drag a launcher from the menu and drop it on the dock.")); } } gboolean cairo_dock_notification_build_icon_menu (gpointer *pUserData, Icon *icon, CairoContainer *pContainer, GtkWidget *menu) { static gpointer *data = NULL; //g_print ("%x;%x;%x\n", icon, pContainer, menu); if (data == NULL) data = g_new (gpointer, 3); data[0] = icon; data[1] = pContainer; data[2] = menu; GtkWidget *pMenuItem, *image; gchar *cLabel; gboolean bAddSeparator = ! (CAIRO_DOCK_IS_DOCK (pContainer) && CAIRO_DOCK (pContainer)->iRefCount > 0); // pas sur les sous-docks. //\_________________________ Si pas d'icone dans un dock, on s'arrete la. if (CAIRO_DOCK_IS_DOCK (pContainer) && (icon == NULL || CAIRO_DOCK_IS_AUTOMATIC_SEPARATOR (icon))) { if (! cairo_dock_is_locked ()) { Icon *pPointingIcon = cairo_dock_search_icon_pointing_on_dock (CAIRO_DOCK (pContainer), NULL); if (CAIRO_DOCK_ICON_TYPE_IS_CONTAINER (pPointingIcon)) _add_add_entry (menu, data, TRUE, TRUE); } return CAIRO_DOCK_LET_PASS_NOTIFICATION; } //\_________________________ class actions. if (icon && icon->cClass != NULL) { const GList *pClassMenuItems = cairo_dock_get_class_menu_items (icon->cClass); gchar **pClassItem; const GList *m; for (m = pClassMenuItems; m != NULL; m = m->next) { pClassItem = m->data; pMenuItem = cairo_dock_add_in_menu_with_stock_and_data (pClassItem[0], pClassItem[2], (GFunc)_cairo_dock_launch_class_action, menu, pClassItem[1]); } } //\_________________________ On rajoute des actions de modifications sur le dock. gboolean bAddNewEntries = FALSE; 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))) { Icon *pPointingIcon = cairo_dock_search_icon_pointing_on_dock (CAIRO_DOCK (pContainer), NULL); if (!pPointingIcon || CAIRO_DOCK_ICON_TYPE_IS_CONTAINER (pPointingIcon)) // the clicked dock is a main dock or user sub-dock. { bAddNewEntries = TRUE; if ((CAIRO_DOCK_ICON_TYPE_IS_LAUNCHER (icon) || CAIRO_DOCK_ICON_TYPE_IS_CONTAINER (icon) || CAIRO_DOCK_ICON_TYPE_IS_SEPARATOR (icon)) && icon->cDesktopFileName != NULL) // user icon ///if (icon->cDesktopFileName != NULL && icon->cParentDockName != NULL) // possede un .desktop. { if (bAddSeparator) { pMenuItem = gtk_separator_menu_item_new (); gtk_menu_shell_append (GTK_MENU_SHELL (menu), pMenuItem); } bAddSeparator = TRUE; _add_entry_in_menu (CAIRO_DOCK_IS_USER_SEPARATOR (icon) ? _("Modify this separator") : _("Modify this launcher"), GTK_STOCK_EDIT, _cairo_dock_modify_launcher, menu); 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); gtk_widget_set_tooltip_text (pMenuItem, _("You can remove a launcher by dragging it out of the dock with the mouse .")); GtkWidget *pSubMenuDocks = cairo_dock_create_sub_menu (_("Move to another dock"), menu, GTK_STOCK_JUMP_TO); /**pMenuItem = _add_entry_in_menu (_("Move to another dock"), GTK_STOCK_JUMP_TO, NULL, menu); GtkWidget *pSubMenuDocks = gtk_menu_new (); gtk_menu_item_set_submenu (GTK_MENU_ITEM (pMenuItem), pSubMenuDocks);*/ g_object_set_data (G_OBJECT (pSubMenuDocks), "launcher", icon); 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); g_object_set_data (G_OBJECT (pMenuItem), "launcher", icon); cairo_dock_foreach_docks ((GHFunc) _add_one_dock_to_menu, pSubMenuDocks); } } } //\_________________________ On rajoute les actions sur les applis. if (CAIRO_DOCK_IS_APPLI (icon)) { if (bAddSeparator) { pMenuItem = gtk_separator_menu_item_new (); gtk_menu_shell_append (GTK_MENU_SHELL (menu), pMenuItem); } bAddSeparator = TRUE; //\_________________________ On rajoute les actions supplementaires sur les icones d'applis. Icon *pAppli = cairo_dock_get_icon_with_Xid (icon->Xid); // un inhibiteur ne contient pas les donnees, mais seulement la reference a l'appli, donc on recupere celle-ci pour avoir son etat. GtkWidget *pSubMenuOtherActions = cairo_dock_create_sub_menu (_("Other actions"), menu, NULL); /**pMenuItem = gtk_menu_item_new_with_label (_("Other actions")); gtk_menu_shell_append (GTK_MENU_SHELL (menu), pMenuItem); GtkWidget *pSubMenuOtherActions = gtk_menu_new (); gtk_menu_item_set_submenu (GTK_MENU_ITEM (pMenuItem), pSubMenuOtherActions);*/ pMenuItem = _add_entry_in_menu (_("Move to this desktop"), GTK_STOCK_JUMP_TO, _cairo_dock_move_appli_to_current_desktop, pSubMenuOtherActions); if (pAppli && cairo_dock_appli_is_on_current_desktop (pAppli)) gtk_widget_set_sensitive (pMenuItem, FALSE); if (pAppli) { icon->bIsMaximized = pAppli->bIsMaximized; icon->bIsFullScreen = pAppli->bIsFullScreen; } else { icon->bIsMaximized = cairo_dock_xwindow_is_maximized (icon->Xid); icon->bIsFullScreen = cairo_dock_xwindow_is_fullscreen (icon->Xid); } _add_entry_in_menu (icon->bIsFullScreen ? _("Not Fullscreen") : _("Fullscreen"), icon->bIsFullScreen ? GTK_STOCK_LEAVE_FULLSCREEN : GTK_STOCK_FULLSCREEN, _cairo_dock_set_appli_fullscreen, pSubMenuOtherActions); gboolean bIsAbove=FALSE, bIsBelow=FALSE; cairo_dock_xwindow_is_above_or_below (icon->Xid, &bIsAbove, &bIsBelow); _add_entry_in_menu (bIsAbove ? _("Don't keep above") : _("Keep above"), bIsAbove ? GTK_STOCK_GOTO_BOTTOM : GTK_STOCK_GOTO_TOP, _cairo_dock_change_window_above, pSubMenuOtherActions); _add_desktops_entry (pSubMenuOtherActions, FALSE, data); if (CAIRO_DOCK_ICON_TYPE_IS_APPLI (icon)) { if (myTaskbarParam.bOverWriteXIcons) { const gchar *cClassIcon = cairo_dock_get_class_icon (icon->cClass); if (cClassIcon == NULL) cClassIcon = icon->cClass; gchar *cCustomIcon = g_strdup_printf ("%s/%s.png", g_cCurrentIconsPath, cClassIcon); if (!g_file_test (cCustomIcon, G_FILE_TEST_EXISTS)) { g_free (cCustomIcon); cCustomIcon = g_strdup_printf ("%s/%s.svg", g_cCurrentIconsPath, cClassIcon); if (!g_file_test (cCustomIcon, G_FILE_TEST_EXISTS)) { g_free (cCustomIcon); cCustomIcon = NULL; } } if (cCustomIcon != NULL) { _add_entry_in_menu (_("Remove custom icon"), GTK_STOCK_REMOVE, _cairo_dock_remove_custom_appli_icon, pSubMenuOtherActions); } } _add_entry_in_menu (_("Set a custom icon"), GTK_STOCK_SELECT_COLOR, _cairo_dock_set_custom_appli_icon, pSubMenuOtherActions); } _add_entry_in_menu (_("Kill"), GTK_STOCK_CANCEL, _cairo_dock_kill_appli, pSubMenuOtherActions); //\_________________________ On rajoute les actions courantes sur les icones d'applis. if (! cairo_dock_icons_are_locked () && ! cairo_dock_class_is_inhibited (icon->cClass)) // if the class doesn't already have an inhibator somewhere. { _add_entry_in_menu (_("Make it a launcher"), GTK_STOCK_CONVERT, _cairo_dock_make_launcher_from_appli, menu); } _add_entry_in_menu (_("Launch a new (Shift+clic)"), GTK_STOCK_ADD, _cairo_dock_launch_new, menu); _add_entry_in_menu (_("Show"), GTK_STOCK_FIND, _cairo_dock_show_appli, menu); _add_entry_in_menu (icon->bIsMaximized ? _("Unmaximise") : _("Maximise"), icon->bIsMaximized ? CAIRO_DOCK_SHARE_DATA_DIR"/icon-restore.png" : CAIRO_DOCK_SHARE_DATA_DIR"/icon-maximize.png", _cairo_dock_maximize_appli, menu); if (! icon->bIsHidden) { if (myTaskbarParam.iActionOnMiddleClick == 2) // minimize cLabel = g_strdup_printf ("%s (%s)", _("Minimise"), _("middle-click")); else cLabel = g_strdup (_("Minimise")); _add_entry_in_menu (cLabel, CAIRO_DOCK_SHARE_DATA_DIR"/icon-minimize.png", _cairo_dock_minimize_appli, menu); g_free (cLabel); } if (myTaskbarParam.iActionOnMiddleClick == 1) // close cLabel = g_strdup_printf ("%s (%s)", _("Close"), _("middle-click")); else cLabel = g_strdup (_("Close")); _add_entry_in_menu (cLabel, CAIRO_DOCK_SHARE_DATA_DIR"/icon-close.png", _cairo_dock_close_appli, menu); g_free (cLabel); } else if (CAIRO_DOCK_IS_MULTI_APPLI (icon)) { if (bAddSeparator) { pMenuItem = gtk_separator_menu_item_new (); gtk_menu_shell_append (GTK_MENU_SHELL (menu), pMenuItem); } bAddSeparator = TRUE; //\_________________________ On rajoute les actions supplementaires sur la classe. GtkWidget *pSubMenuOtherActions = cairo_dock_create_sub_menu (_("Other actions"), menu, NULL); /**pMenuItem = gtk_menu_item_new_with_label (_("Other actions")); gtk_menu_shell_append (GTK_MENU_SHELL (menu), pMenuItem); GtkWidget *pSubMenuOtherActions = gtk_menu_new (); gtk_menu_item_set_submenu (GTK_MENU_ITEM (pMenuItem), pSubMenuOtherActions);*/ _add_entry_in_menu (_("Move all to this desktop"), GTK_STOCK_JUMP_TO, _cairo_dock_move_class_to_current_desktop, pSubMenuOtherActions); _add_desktops_entry (pSubMenuOtherActions, TRUE, data); _add_entry_in_menu (_("Launch a new (Shift+clic)"), GTK_STOCK_ADD, _cairo_dock_launch_new, menu); _add_entry_in_menu (_("Show all"), GTK_STOCK_FIND, _cairo_dock_show_class, menu); _add_entry_in_menu (_("Minimise all"), CAIRO_DOCK_SHARE_DATA_DIR"/icon-minimize.png", _cairo_dock_minimize_class, menu); _add_entry_in_menu (_("Close all"), CAIRO_DOCK_SHARE_DATA_DIR"/icon-close.png", _cairo_dock_close_class, menu); } //\_________________________ On rajoute les actions sur les applets/desklets. if (CAIRO_DOCK_IS_APPLET (icon) || CAIRO_DOCK_IS_DESKLET (pContainer)) { Icon *pIconModule; if (CAIRO_DOCK_IS_APPLET (icon)) pIconModule = icon; else if (CAIRO_DOCK_IS_DESKLET (pContainer)) pIconModule = CAIRO_DESKLET (pContainer)->pIcon; else pIconModule = NULL; //\_________________________ On rajoute les actions propres a un module. if (! cairo_dock_is_locked () && CAIRO_DOCK_IS_APPLET (pIconModule)) { if (bAddSeparator) { pMenuItem = gtk_separator_menu_item_new (); gtk_menu_shell_append (GTK_MENU_SHELL (menu), pMenuItem); } bAddSeparator = TRUE; _add_entry_in_menu (_("Configure this applet"), GTK_STOCK_PROPERTIES, _cairo_dock_initiate_config_module, menu); if (pIconModule->pModuleInstance->bCanDetach) { _add_entry_in_menu (CAIRO_DOCK_IS_DOCK (pContainer) ? _("Detach this applet") : _("Return to the dock"), CAIRO_DOCK_IS_DOCK (pContainer) ? GTK_STOCK_DISCONNECT : GTK_STOCK_CONNECT, _cairo_dock_detach_module, menu); } _add_entry_in_menu (_("Remove this applet"), GTK_STOCK_REMOVE, _cairo_dock_remove_module_instance, menu); if (pIconModule->pModuleInstance->pModule->pVisitCard->bMultiInstance) { _add_entry_in_menu (_("Launch another instance of this applet"), GTK_STOCK_ADD, _cairo_dock_add_module_instance, menu); } if (CAIRO_DOCK_IS_DOCK (pContainer) && pIconModule->cParentDockName != NULL) // sinon bien sur ca n'est pas la peine de presenter l'option (Cairo-Penguin par exemple) { GtkWidget *pSubMenuDocks = cairo_dock_create_sub_menu (_("Move to another dock"), menu, GTK_STOCK_JUMP_TO); /**pMenuItem = _add_entry_in_menu (_("Move to another dock"), GTK_STOCK_JUMP_TO, NULL, menu); GtkWidget *pSubMenuDocks = gtk_menu_new (); gtk_menu_item_set_submenu (GTK_MENU_ITEM (pMenuItem), pSubMenuDocks);*/ g_object_set_data (G_OBJECT (pSubMenuDocks), "launcher", pIconModule); 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); g_object_set_data (G_OBJECT (pMenuItem), "launcher", pIconModule); cairo_dock_foreach_docks ((GHFunc) _add_one_dock_to_menu, pSubMenuDocks); } } } //\_________________________ On rajoute les actions de positionnement d'un desklet. if (! cairo_dock_is_locked () && CAIRO_DOCK_IS_DESKLET (pContainer)) { if (bAddSeparator) { pMenuItem = gtk_separator_menu_item_new (); gtk_menu_shell_append (GTK_MENU_SHELL (menu), pMenuItem); } bAddSeparator = TRUE; GtkWidget *pSubMenuAccessibility = cairo_dock_create_sub_menu (_("Visibility"), menu, GTK_STOCK_FIND); /**pMenuItem = cairo_dock_add_in_menu_with_stock_and_data (_("Visibility"), GTK_STOCK_FIND, NULL, menu, NULL); GtkWidget *pSubMenuAccessibility = gtk_menu_new (); gtk_menu_item_set_submenu (GTK_MENU_ITEM (pMenuItem), pSubMenuAccessibility);*/ GSList *group = NULL; Window Xid = GDK_WINDOW_XID (pContainer->pWidget->window); /*gboolean bIsAbove=FALSE, bIsBelow=FALSE; cairo_dock_xwindow_is_above_or_below (Xid, &bIsAbove, &bIsBelow); // gdk_window_get_state bugue. gboolean bIsUtility = cairo_dock_window_is_utility (Xid); // gtk_window_get_type_hint me renvoie toujours 0 ! gboolean bIsDock = (CAIRO_DESKLET (pContainer)->bSpaceReserved); gboolean bIsNormal = (!bIsAbove && !bIsBelow && !bIsUtility && !bIsDock);*/ gboolean bIsSticky = cairo_dock_xwindow_is_sticky (Xid); CairoDesklet *pDesklet = CAIRO_DESKLET (pContainer); CairoDeskletVisibility iVisibility = pDesklet->iVisibility; pMenuItem = gtk_radio_menu_item_new_with_label(group, _("Normal")); group = gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(pMenuItem)); gtk_menu_shell_append(GTK_MENU_SHELL(pSubMenuAccessibility), pMenuItem); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(pMenuItem), iVisibility == CAIRO_DESKLET_NORMAL/*bIsNormal*/); // on coche celui-ci par defaut, il sera decoche par les suivants eventuellement. g_signal_connect(G_OBJECT(pMenuItem), "toggled", G_CALLBACK(_cairo_dock_keep_normal), data); pMenuItem = gtk_radio_menu_item_new_with_label(group, _("Always on top")); group = gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(pMenuItem)); gtk_menu_shell_append(GTK_MENU_SHELL(pSubMenuAccessibility), pMenuItem); if (iVisibility == CAIRO_DESKLET_KEEP_ABOVE/*bIsAbove*/) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(pMenuItem), TRUE); g_signal_connect(G_OBJECT(pMenuItem), "toggled", G_CALLBACK(_cairo_dock_keep_above), data); pMenuItem = gtk_radio_menu_item_new_with_label(group, _("Always below")); group = gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(pMenuItem)); gtk_menu_shell_append(GTK_MENU_SHELL(pSubMenuAccessibility), pMenuItem); if (iVisibility == CAIRO_DESKLET_KEEP_BELOW/*bIsBelow*/) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(pMenuItem), TRUE); g_signal_connect(G_OBJECT(pMenuItem), "toggled", G_CALLBACK(_cairo_dock_keep_below), data); if (cairo_dock_wm_can_set_on_widget_layer ()) { pMenuItem = gtk_radio_menu_item_new_with_label(group, "Widget Layer"); group = gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(pMenuItem)); gtk_menu_shell_append(GTK_MENU_SHELL(pSubMenuAccessibility), pMenuItem); if (iVisibility == CAIRO_DESKLET_ON_WIDGET_LAYER/*bIsUtility*/) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(pMenuItem), TRUE); g_signal_connect(G_OBJECT(pMenuItem), "toggled", G_CALLBACK(_cairo_dock_keep_on_widget_layer), data); //gtk_widget_set_tooltip_text (pMenuItem, _("Set behaviour in Compiz to: (name=cairo-dock & type=Utility)")); } pMenuItem = gtk_radio_menu_item_new_with_label(group, _("Reserve space")); group = gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(pMenuItem)); gtk_menu_shell_append(GTK_MENU_SHELL(pSubMenuAccessibility), pMenuItem); if (iVisibility == CAIRO_DESKLET_RESERVE_SPACE/*bIsDock*/) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(pMenuItem), TRUE); g_signal_connect(G_OBJECT(pMenuItem), "toggled", G_CALLBACK(_cairo_dock_keep_space), data); pMenuItem = gtk_check_menu_item_new_with_label(_("On all desktops")); gtk_menu_shell_append (GTK_MENU_SHELL (menu), pMenuItem); if (bIsSticky) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(pMenuItem), TRUE); g_signal_connect(G_OBJECT(pMenuItem), "toggled", G_CALLBACK(_cairo_dock_set_on_all_desktop), data); pMenuItem = gtk_check_menu_item_new_with_label(_("Lock position")); gtk_menu_shell_append (GTK_MENU_SHELL (menu), pMenuItem); if (CAIRO_DESKLET (pContainer)->bPositionLocked) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(pMenuItem), TRUE); g_signal_connect(G_OBJECT(pMenuItem), "toggled", G_CALLBACK(_cairo_dock_lock_position), data); } //\_________________________ On rajoute les actions d'ajout de nouveaux elements. if (bAddNewEntries) { if (bAddSeparator) { pMenuItem = gtk_separator_menu_item_new (); gtk_menu_shell_append (GTK_MENU_SHELL (menu), pMenuItem); } _add_add_entry (menu, data, TRUE, cairo_dock_get_icon_order (icon) == cairo_dock_get_group_order (CAIRO_DOCK_LAUNCHER)); } return CAIRO_DOCK_LET_PASS_NOTIFICATION; }