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

« back to all changes in this revision

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

  • Committer: Bazaar Package Importer
  • Author(s): Julien Lavergne, Matthieu Baerts (matttbe), Julien Lavergne
  • Date: 2009-10-04 16:33:52 UTC
  • mfrom: (1.1.7 upstream)
  • Revision ID: james.westby@ubuntu.com-20091004163352-ttbbjfmpb8uzl8j4
Tags: 2.0.9-0ubuntu1
[ Matthieu Baerts (matttbe) ]
* New Upstream Version. (LP: #435587)
* Added apport hook in debian/apport
 - Add debian/apport
 - debian/cairo-dock-core.install: Added debian/apport/cairo-dock.py
* Use .desktop provided by upstream
 - Removed debian/*.desktop
 - debian/cairo-dock-core.install: install upstream desktop files. 

[ Julien Lavergne ]
* Adjust debian/changelog with Daniel Holbach suggestions.
* debian/patches/01_rename_cairo-dock-package-theme.patch: drop, 
  merged upstream.
* debian/patches/01-desktop-file-category.patch:
 - Remove Encoding field and set category to Utility.
* debian/patches/02-merge-changelog.patch:
 - Merge ChangeLog and ChangeLog-2.0.9.
* debian/apport: Remove commands with grep, python doesn't like it.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 2; tab-width: 2 -*- */
2
1
/**
3
 
* menu for Cairo-Dock
 
2
* This file is a part of the Cairo-Dock project
4
3
*
5
 
* Copyright : (C) 2009 by Fabrice Rey
6
 
* E-mail    : fabounet@users.berlios.de
 
4
* Copyright : (C) see the 'copyright' file.
 
5
* E-mail    : see the 'copyright' file.
7
6
*
8
7
* This program is free software; you can redistribute it and/or
9
8
* modify it under the terms of the GNU General Public License
14
13
* but WITHOUT ANY WARRANTY; without even the implied warranty of
15
14
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
15
* GNU General Public License for more details.
17
 
*   http://www.gnu.org/licenses/licenses.html#GPL
 
16
* You should have received a copy of the GNU General Public License
 
17
* along with this program.  If not, see <http://www.gnu.org/licenses/>.
18
18
*/
19
19
 
20
20
#include <math.h>
21
21
#include <string.h>
22
22
#include <stdlib.h>
 
23
#define __USE_POSIX 1
23
24
#include <time.h>
24
25
#include <glib.h>
25
26
#include <glib/gi18n.h>
54
55
#include "cairo-dock-internal-icons.h"
55
56
#include "cairo-dock-internal-accessibility.h"
56
57
#include "cairo-dock-container.h"
 
58
#include "cairo-dock-keyfile-utilities.h"
57
59
#include "cairo-dock-menu.h"
58
60
 
59
61
#define CAIRO_DOCK_CONF_PANEL_WIDTH 800
60
62
#define CAIRO_DOCK_CONF_PANEL_HEIGHT 600
61
63
#define CAIRO_DOCK_LAUNCHER_PANEL_WIDTH 600
62
64
#define CAIRO_DOCK_LAUNCHER_PANEL_HEIGHT 350
63
 
#define CAIRO_DOCK_FILE_HOST_URL "https://developer.berlios.de/project/showfiles.php?group_id=8724"
 
65
//#define CAIRO_DOCK_FILE_HOST_URL "https://developer.berlios.de/project/showfiles.php?group_id=8724"
 
66
#define CAIRO_DOCK_FILE_HOST_URL "https://launchpad.net/cairo-dock"
64
67
#define CAIRO_DOCK_HELP_URL "http://www.cairo-dock.org"
65
68
 
66
 
extern struct tm *localtime_r (time_t *timer, struct tm *tp);
 
69
//extern struct tm *localtime_r (time_t *timer, struct tm *tp);
67
70
 
68
71
extern CairoDock *g_pMainDock;
69
72
 
70
73
extern gchar *g_cConfFile;
71
74
extern gchar *g_cCurrentLaunchersPath;
72
75
extern gchar *g_cCurrentThemePath;
 
76
extern gchar *g_cCairoDockDataDir;
73
77
 
74
78
extern int g_iNbDesktops;
75
79
extern int g_iNbViewportX,g_iNbViewportY ;
76
 
extern int g_iScreenWidth[2], g_iScreenHeight[2];
 
80
extern int g_iXScreenWidth[2], g_iXScreenHeight[2];  // change tous les g_iScreen par g_iXScreen le 28/07/2009
77
81
extern gboolean g_bLocked;
 
82
extern gboolean g_bForceCairo;
78
83
extern gboolean g_bEasterEggs;
79
 
extern gboolean g_bForceCairo;
80
 
 
81
 
 
 
84
 
 
85
#define cairo_dock_icons_are_locked(...) (myAccessibility.bLockIcons || myAccessibility.bLockAll || g_bLocked)
 
86
#define cairo_dock_is_locked(...) (myAccessibility.bLockAll || g_bLocked)
 
87
 
 
88
static void _present_help_from_dialog (int iClickedButton, GtkWidget *pInteractiveWidget, gpointer data, CairoDialog *pDialog)
 
89
{
 
90
        if (iClickedButton == 0 || iClickedButton == -1)  // click OK or press Enter.
 
91
        {
 
92
                CairoDockModule *pModule = cairo_dock_find_module_from_name ("Help");
 
93
                cairo_dock_build_main_ihm (g_cConfFile, FALSE);
 
94
                cairo_dock_present_module_gui (pModule);
 
95
        }
 
96
}
82
97
static void _cairo_dock_edit_and_reload_conf (GtkMenuItem *pMenuItem, gpointer *data)
83
98
{
84
99
        Icon *icon = data[0];
85
100
        CairoDock *pDock = data[1];
86
101
 
87
102
        GtkWidget *pWindow = cairo_dock_build_main_ihm (g_cConfFile, FALSE);
 
103
        
 
104
        CairoDockModule *pModule = cairo_dock_find_module_from_name ("Help");
 
105
        if (pModule != NULL)
 
106
        {
 
107
                gchar *cHelpHistory = g_strdup_printf ("%s/.help/entered-once", g_cCairoDockDataDir);
 
108
                if (! g_file_test (cHelpHistory, G_FILE_TEST_EXISTS))
 
109
                {
 
110
                        Icon *pIcon = cairo_dock_get_dialogless_icon ();
 
111
                        cairo_dock_show_dialog_full (_("It seems that you've never entered the help module yet.\nIf you have some difficulty to configure the dock, or if you are willing to customize it,\nthe Help module is here for you !\nDo you want to take a look at it now ?"),
 
112
                        pIcon,
 
113
                        CAIRO_CONTAINER (g_pMainDock),
 
114
                        10e3,
 
115
                        CAIRO_DOCK_SHARE_DATA_DIR"/"CAIRO_DOCK_ICON,
 
116
                        NULL,
 
117
                        (CairoDockActionOnAnswerFunc) _present_help_from_dialog,
 
118
                        NULL,
 
119
                        NULL);
 
120
                }
 
121
        }
88
122
}
89
123
 
90
124
static void _cairo_dock_initiate_theme_management (GtkMenuItem *pMenuItem, gpointer *data)
124
158
                G_TYPE_BOOLEAN, "Accessibility", "lock icons", myAccessibility.bLockIcons,
125
159
                G_TYPE_INVALID);
126
160
}
 
161
static void _cairo_dock_lock_all (GtkMenuItem *pMenuItem, gpointer *data)
 
162
{
 
163
        myAccessibility.bLockAll = ! myAccessibility.bLockAll;
 
164
        cairo_dock_update_conf_file (g_cConfFile,
 
165
                G_TYPE_BOOLEAN, "Accessibility", "lock all", myAccessibility.bLockAll,
 
166
                G_TYPE_INVALID);
 
167
}
127
168
static void _cairo_dock_about (GtkMenuItem *pMenuItem, gpointer *data)
128
169
{
129
170
        Icon *icon = data[0];
130
171
        CairoDock *pDock = data[1];
131
 
        const gchar *cTitle = "\nCairo-Dock (2007-2009)\n version "CAIRO_DOCK_VERSION;
132
 
        GtkWidget *pDialog = gtk_message_dialog_new (GTK_WINDOW (pDock->pWidget),
 
172
        GtkWidget *pDialog = gtk_message_dialog_new (GTK_WINDOW (pDock->container.pWidget),
133
173
                GTK_DIALOG_DESTROY_WITH_PARENT,
134
174
                GTK_MESSAGE_INFO,
135
175
                GTK_BUTTONS_CLOSE,
136
 
                cTitle);
 
176
                "\nCairo-Dock (2007-2009)\n version "CAIRO_DOCK_VERSION);
137
177
        
138
178
        gchar *cImagePath = g_strdup_printf ("%s/%s", CAIRO_DOCK_SHARE_DATA_DIR, CAIRO_DOCK_LOGO);
139
179
        GtkWidget *pImage = gtk_image_new_from_file (cImagePath);
150
190
                _("Development"),
151
191
                "<b>Main developer :</b>\n  Fabounet (Fabrice Rey)\n\
152
192
<b>Original idea/first development :</b>\n  Mac Slow\n\
153
 
<b>Applets :</b>\n  Fabounet\n  Necropotame\n  Ctaf\n  ChAnGFu\n  Tofe\n  Paradoxxx_Zero\n\
154
 
<b>Patchs :</b>\n  Special thanks to Augur for his great help with OpenGL\n  Ctaf\n  M.Tasaka\n  Necropotame\n  Robrob\n  Smidgey\n  Tshirtman\n");
 
193
<b>Applets :</b>\n  Fabounet\n  Necropotame\n  Ctaf\n  ChAnGFu\n  Tofe\n  Paradoxxx_Zero\n  Mav\n  Nochka85\n\
 
194
<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");
155
195
        _cairo_dock_add_about_page (pNoteBook,
156
196
                _("Artwork"),
157
 
                "<b>Themes :</b>\n  Fabounet\n  Chilperik\n  Djoole\n  Glattering\n  Vilraleur\n  Lord Northam\n  Paradoxxx_Zero\n  Coz\n  Benoit2600\n  Nochka85\n\
158
 
<b>Translations :</b>\n  Fabounet\n  Ppmt \n  Jiro Kawada (Kawaji)\n  BiAji\n  Mattia Tavernini (Maathias)\n  Peter Thornqvist\n  Yannis Kaskamanidis");
 
197
                "<b>Themes :</b>\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\
 
198
<b>Translations :</b>\n  Fabounet\n  Ppmt \n  Jiro Kawada (Kawaji)\n  BiAji\n  Mattia Tavernini (Maathias)\n  Peter Thornqvist\n  Yannis Kaskamanidis\n  Eduardo Mucelli\n");
159
199
        _cairo_dock_add_about_page (pNoteBook,
160
200
                _("Support"),
161
201
                "<b>Installation script and web hosting :</b>\n  Mav\n\
162
 
<b>Site (cairo-dock.org) :</b>\n  Necropotame\n  Tdey\n\
 
202
<b>Site (cairo-dock.org) :</b>\n  Necropotame\n  Matttbe\n  Tdey\n\
 
203
<b>LaunchPad :</b>\n  Matttbe\n  Mav\n\
163
204
<b>Suggestions/Comments/Bêta-Testers :</b>\n  AuraHxC\n  Chilperik\n  Cybergoll\n  Damster\n  Djoole\n  Glattering\n  Mav\n  Necropotame\n  Nochka85\n  Ppmt\n  RavanH\n  Rhinopierroce\n  Rom1\n  Sombrero\n  Vilraleur");
164
205
        
165
 
        cairo_dock_config_panel_created ();
 
206
        cairo_dock_dialog_window_created ();
166
207
        gtk_widget_show_all (pDialog);
167
208
        gtk_window_set_position (GTK_WINDOW (pDialog), GTK_WIN_POS_CENTER_ALWAYS);  // un GTK_WIN_POS_CENTER simple ne marche pas, probablement parceque la fenetre n'est pas encore realisee. le 'always' ne pose pas de probleme, puisqu'on ne peut pas redimensionner le dialogue.
168
209
        gtk_window_set_keep_above (GTK_WINDOW (pDialog), TRUE);
169
210
        gtk_dialog_run (GTK_DIALOG (pDialog));
170
211
        gtk_widget_destroy (pDialog);
171
 
        cairo_dock_config_panel_destroyed ();
 
212
        cairo_dock_dialog_window_destroyed ();
172
213
}
173
214
 
174
215
static void _launch_url (const gchar *cURL)
230
271
{
231
272
        Icon *pIcon = data[0];
232
273
        CairoContainer *pContainer = data[1];
233
 
        //cairo_dock_on_delete (pDock->pWidget, NULL, pDock);
 
274
        //cairo_dock_on_delete (pDock->container.pWidget, NULL, pDock);
234
275
        if (pIcon == NULL)
235
276
        {
236
277
                if (CAIRO_DOCK_IS_DOCK (pContainer))
 
278
                {
237
279
                        pIcon = cairo_dock_get_dialogless_icon ();
 
280
                        pContainer = CAIRO_CONTAINER (g_pMainDock);
 
281
                }
238
282
                else
239
283
                        pIcon = CAIRO_DESKLET (pContainer)->pIcon;
240
284
        }
241
285
        
242
286
        int answer = cairo_dock_ask_question_and_wait (_("Quit Cairo-Dock ?"), pIcon, pContainer);
 
287
        g_print ("quit : %d (yes:%d)\n", answer, GTK_RESPONSE_YES);
243
288
        if (answer == GTK_RESPONSE_YES)
244
289
                gtk_main_quit ();
245
290
}
246
291
 
 
292
  ///////////////////////////////////////////////////////////////////
 
293
 /////////// LES OPERATIONS SUR LES LANCEURS ///////////////////////
 
294
///////////////////////////////////////////////////////////////////
247
295
 
248
 
static void _cairo_dock_on_user_remove_icon (Icon *icon, CairoDock *pDock)
 
296
static void _cairo_dock_remove_launcher (GtkMenuItem *pMenuItem, gpointer *data)
249
297
{
250
 
        cd_debug ("%s (%s)", __func__, icon->acName);
 
298
        Icon *icon = data[0];
 
299
        CairoDock *pDock = data[1];
 
300
 
 
301
        gchar *question = g_strdup_printf (_("You're about removing this icon (%s) from the dock. Sure ?"), (icon->cInitialName != NULL ? icon->cInitialName : icon->cName));
 
302
        int answer = cairo_dock_ask_question_and_wait (question, icon, CAIRO_CONTAINER (pDock));
 
303
        g_free (question);
 
304
        if (answer != GTK_RESPONSE_YES)
 
305
                return ;
251
306
        
252
 
        if (icon->pSubDock != NULL)
 
307
        if (icon->pSubDock != NULL)  // on bazarde le sous-dock.
253
308
        {
254
309
                gboolean bDestroyIcons = ! CAIRO_DOCK_IS_APPLI (icon);
255
 
                if (! CAIRO_DOCK_IS_URI_LAUNCHER (icon) && ! CAIRO_DOCK_IS_APPLI (icon) && icon->pSubDock->icons != NULL)  // alors on propose de repartir les icones de son sous-dock dans le dock principal.
 
310
                if (icon->pSubDock->icons != NULL && ! CAIRO_DOCK_IS_URI_LAUNCHER (icon) && icon->cClass == NULL)  // alors on propose de repartir les icones de son sous-dock dans le dock principal.
256
311
                {
257
312
                        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));
258
313
                        g_return_if_fail (answer != GTK_RESPONSE_NONE);
259
314
                        if (answer == GTK_RESPONSE_YES)
260
315
                                bDestroyIcons = FALSE;
261
316
                }
262
 
                cairo_dock_destroy_dock (icon->pSubDock, (CAIRO_DOCK_IS_APPLI (icon) && icon->cClass != NULL ? icon->cClass : icon->acName), (bDestroyIcons ? NULL : g_pMainDock), (bDestroyIcons ? NULL : CAIRO_DOCK_MAIN_DOCK_NAME));
 
317
                cairo_dock_destroy_dock (icon->pSubDock, (CAIRO_DOCK_IS_APPLI (icon) && icon->cClass != NULL ? icon->cClass : icon->cName), (bDestroyIcons ? NULL : g_pMainDock), (bDestroyIcons ? NULL : CAIRO_DOCK_MAIN_DOCK_NAME));
263
318
                icon->pSubDock = NULL;
264
319
        }
265
320
        
266
 
        cairo_dock_stop_icon_animation (icon);
267
 
        icon->fPersonnalScale = 1.0;
268
 
        cairo_dock_notify (CAIRO_DOCK_REMOVE_ICON, icon, pDock);
269
 
        cairo_dock_start_icon_animation (icon, pDock);
270
 
        
271
 
        cairo_dock_mark_theme_as_modified (TRUE);
272
 
}
273
 
static void _cairo_dock_remove_launcher (GtkMenuItem *pMenuItem, gpointer *data)
274
 
{
275
 
        Icon *icon = data[0];
276
 
        CairoDock *pDock = data[1];
277
 
 
278
 
        gchar *question = g_strdup_printf (_("You're about removing this icon (%s) from the dock. Sure ?"), (icon->cInitialName != NULL ? icon->cInitialName : icon->acName));
279
 
        int answer = cairo_dock_ask_question_and_wait (question, icon, CAIRO_CONTAINER (pDock));
280
 
        g_free (question);
281
 
        if (answer == GTK_RESPONSE_YES)
282
 
        {
283
 
                _cairo_dock_on_user_remove_icon (icon, pDock);
284
 
        }
285
 
        //else
286
 
        //      g_print ("ok on la garde\n");
287
 
}
288
 
 
289
 
static void _cairo_dock_create_launcher (GtkMenuItem *pMenuItem, Icon *icon, CairoDock *pDock, CairoDockNewLauncherType iLauncherType)
 
321
        cairo_dock_trigger_icon_removal_from_dock (icon);
 
322
}
 
323
 
 
324
static void _cairo_dock_create_launcher (Icon *icon, CairoDock *pDock, CairoDockDesktopFileType iLauncherType)
290
325
{
291
326
        //\___________________ On determine l'ordre d'insertion suivant l'endroit du clique.
292
 
        GError *erreur = NULL;
293
327
        double fOrder;
294
328
        if (CAIRO_DOCK_IS_LAUNCHER (icon))
295
329
        {
296
 
                if (pDock->iMouseX < icon->fDrawX + icon->fWidth * icon->fScale / 2)  // a gauche.
 
330
                if (pDock->container.iMouseX < icon->fDrawX + icon->fWidth * icon->fScale / 2)  // a gauche.
297
331
                {
298
332
                        Icon *prev_icon = cairo_dock_get_previous_icon (pDock->icons, icon);
299
333
                        fOrder = (prev_icon != NULL ? (icon->fOrder + prev_icon->fOrder) / 2 : icon->fOrder - 1);
308
342
                fOrder = CAIRO_DOCK_LAST_ORDER;
309
343
 
310
344
        //\___________________ On cree un fichier de lanceur avec des valeurs par defaut.
 
345
        GError *erreur = NULL;
311
346
        const gchar *cDockName = cairo_dock_search_dock_name (pDock);
312
347
        gchar *cNewDesktopFileName;
313
 
        if (iLauncherType == 1)  // conteneur.
314
 
                cNewDesktopFileName = cairo_dock_add_desktop_file_for_container (cDockName, fOrder, pDock, &erreur);
315
 
        else if (iLauncherType == 0)  // lanceur vide.
316
 
                cNewDesktopFileName = cairo_dock_add_desktop_file_from_uri (NULL, cDockName, fOrder, pDock, &erreur);
317
 
        else if (iLauncherType == 2)  // separateur.
318
 
                cNewDesktopFileName = cairo_dock_add_desktop_file_for_separator (cDockName, fOrder, pDock, &erreur);
319
 
        else
 
348
        switch (iLauncherType)
 
349
        {
 
350
                case CAIRO_DOCK_DESKTOP_FILE_FOR_CONTAINER :
 
351
                        cNewDesktopFileName = cairo_dock_add_desktop_file_for_container (cDockName, fOrder, pDock, &erreur);
 
352
                break ;
 
353
                case CAIRO_DOCK_DESKTOP_FILE_FOR_LAUNCHER :
 
354
                        cNewDesktopFileName = cairo_dock_add_desktop_file_for_launcher (cDockName, fOrder, pDock, &erreur);
 
355
                break ;
 
356
                case CAIRO_DOCK_DESKTOP_FILE_FOR_SEPARATOR :
 
357
                        cNewDesktopFileName = cairo_dock_add_desktop_file_for_separator (cDockName, fOrder, pDock, &erreur);
 
358
                break ;
 
359
                default :
320
360
                return ;
 
361
        }
321
362
        if (erreur != NULL)
322
363
        {
323
 
                cd_message ("while trying to create a new launcher : %s", erreur->message);
 
364
                cd_warning ("while trying to create a new launcher : %s\nCheck that you have writing permissions on ~/.config/cairo-dock", erreur->message);
324
365
                g_error_free (erreur);
325
366
                return ;
326
367
        }
327
 
 
328
 
        //\___________________ On ouvre automatiquement l'IHM pour permettre de modifier ses champs.
329
 
        gchar *cNewDesktopFilePath = g_strdup_printf ("%s/%s", g_cCurrentLaunchersPath, cNewDesktopFileName);
330
 
        cairo_dock_update_launcher_desktop_file (cNewDesktopFilePath, iLauncherType);
331
 
 
332
 
        gboolean config_ok;
333
 
        if (iLauncherType != CAIRO_DOCK_LAUNCHER_FOR_SEPARATOR)  // inutile pour un separateur.
334
 
                config_ok = cairo_dock_build_normal_gui (cNewDesktopFilePath, NULL, _("Fill this launcher"), CAIRO_DOCK_LAUNCHER_PANEL_WIDTH, CAIRO_DOCK_LAUNCHER_PANEL_HEIGHT, NULL, NULL, NULL, NULL);
335
 
                //config_ok = cairo_dock_edit_conf_file (GTK_WINDOW (pDock->pWidget), cNewDesktopFilePath, _("Fill this launcher"), CAIRO_DOCK_LAUNCHER_PANEL_WIDTH, CAIRO_DOCK_LAUNCHER_PANEL_HEIGHT, 0, NULL, NULL, NULL, NULL, CAIRO_DOCK_GETTEXT_PACKAGE);
336
 
        else
337
 
                config_ok = TRUE;
338
 
        if (config_ok)
339
 
        {
340
 
                cairo_t* pCairoContext = cairo_dock_create_context_from_window (CAIRO_CONTAINER (pDock));
341
 
                Icon *pNewIcon = cairo_dock_create_icon_from_desktop_file (cNewDesktopFileName, pCairoContext);
342
 
 
343
 
                if (iLauncherType = CAIRO_DOCK_LAUNCHER_FOR_SEPARATOR)
344
 
                        pNewIcon->iType = (icon ? icon->iType : CAIRO_DOCK_LAUNCHER);
345
 
                else if (pNewIcon->acName == NULL)
346
 
                        pNewIcon->acName = g_strdup (_("Undefined"));
347
 
 
348
 
                
349
 
                CairoDock *pParentDock = cairo_dock_search_dock_from_name (pNewIcon->cParentDockName);  // existe forcement puique a ete cree au besoin.
350
 
                cairo_dock_insert_icon_in_dock (pNewIcon, pParentDock, CAIRO_DOCK_UPDATE_DOCK_SIZE, CAIRO_DOCK_ANIMATE_ICON);
351
 
 
352
 
                cairo_dock_launch_animation (CAIRO_CONTAINER (pParentDock));
353
 
                cairo_dock_mark_theme_as_modified (TRUE);
354
 
        }
355
 
        else
356
 
        {
357
 
                g_remove (cNewDesktopFilePath);
358
 
        }
359
 
 
360
 
        g_free (cNewDesktopFilePath);
361
 
        g_free (cNewDesktopFileName);
 
368
        
 
369
        if (g_bEasterEggs)
 
370
        {
 
371
                //\___________________ On cree l'icone et on l'insere.
 
372
                cairo_t* pCairoContext = cairo_dock_create_context_from_window (CAIRO_CONTAINER (pDock));
 
373
                Icon *pNewIcon = cairo_dock_create_icon_from_desktop_file (cNewDesktopFileName, pCairoContext);
 
374
                cairo_destroy (pCairoContext);
 
375
                
 
376
                if (iLauncherType == CAIRO_DOCK_DESKTOP_FILE_FOR_SEPARATOR)
 
377
                        pNewIcon->iType = (icon ? icon->iType : CAIRO_DOCK_LAUNCHER);
 
378
                else if (pNewIcon->cName == NULL)
 
379
                        pNewIcon->cName = g_strdup (_("Undefined"));
 
380
                
 
381
                CairoDock *pParentDock = cairo_dock_search_dock_from_name (pNewIcon->cParentDockName);  // existe forcement puique a ete cree au besoin.
 
382
                cairo_dock_insert_icon_in_dock (pNewIcon, pParentDock, CAIRO_DOCK_UPDATE_DOCK_SIZE, CAIRO_DOCK_ANIMATE_ICON);
 
383
 
 
384
                cairo_dock_launch_animation (CAIRO_CONTAINER (pParentDock));
 
385
                cairo_dock_mark_theme_as_modified (TRUE);
 
386
                
 
387
                g_free (cNewDesktopFileName);
 
388
                
 
389
                //\___________________ On ouvre automatiquement l'IHM pour permettre de modifier ses champs.
 
390
                if (iLauncherType != CAIRO_DOCK_DESKTOP_FILE_FOR_SEPARATOR)  // inutile pour un separateur.
 
391
                        cairo_dock_build_launcher_gui (icon);
 
392
        }
 
393
        else
 
394
        {
 
395
                //\___________________ On ouvre automatiquement l'IHM pour permettre de modifier ses champs.
 
396
                gchar *cNewDesktopFilePath = g_strdup_printf ("%s/%s", g_cCurrentLaunchersPath, cNewDesktopFileName);
 
397
                if (iLauncherType != CAIRO_DOCK_DESKTOP_FILE_FOR_SEPARATOR)  // inutile pour un separateur.
 
398
                {
 
399
                        gboolean config_ok = cairo_dock_build_normal_gui (cNewDesktopFilePath, NULL, _("Fill this launcher"), CAIRO_DOCK_LAUNCHER_PANEL_WIDTH, CAIRO_DOCK_LAUNCHER_PANEL_HEIGHT, NULL, NULL, NULL, NULL);
 
400
                        if (! config_ok)
 
401
                        {
 
402
                                g_remove (cNewDesktopFilePath);
 
403
                                g_free (cNewDesktopFilePath);
 
404
                                return ;
 
405
                        }
 
406
                }
 
407
                
 
408
                //\___________________ On cree l'icone et on l'insere.
 
409
                if (iLauncherType == CAIRO_DOCK_DESKTOP_FILE_FOR_CONTAINER)  // on assure l'unicite du nom du dock ici, car cela n'est volontairement pas fait dans la fonction de creation de l'icone.
 
410
                {
 
411
                        GKeyFile* pKeyFile = cairo_dock_open_key_file (cNewDesktopFilePath);
 
412
                        g_return_if_fail (pKeyFile != NULL);
 
413
                        
 
414
                        gchar *cName = g_key_file_get_string (pKeyFile, "Desktop Entry", "Name", NULL);
 
415
                        if (cName == NULL)
 
416
                                cName = g_strdup ("dock");
 
417
                        gchar *cUniqueName = cairo_dock_get_unique_dock_name (cName);
 
418
                        if (strcmp (cName, cUniqueName) != 0)
 
419
                        {
 
420
                                g_key_file_set_string (pKeyFile, "Desktop Entry", "Name", cUniqueName);
 
421
                                cairo_dock_write_keys_to_file (pKeyFile, cNewDesktopFilePath);
 
422
                        }
 
423
                        g_free (cName);
 
424
                        g_free (cUniqueName);
 
425
                        g_key_file_free (pKeyFile);
 
426
                }
 
427
                
 
428
                cairo_t* pCairoContext = cairo_dock_create_context_from_window (CAIRO_CONTAINER (pDock));
 
429
                Icon *pNewIcon = cairo_dock_create_icon_from_desktop_file (cNewDesktopFileName, pCairoContext);
 
430
                cairo_destroy (pCairoContext);
 
431
                
 
432
                if (iLauncherType == CAIRO_DOCK_DESKTOP_FILE_FOR_SEPARATOR)
 
433
                        pNewIcon->iType = (icon ? icon->iType : CAIRO_DOCK_LAUNCHER);
 
434
                else if (pNewIcon->cName == NULL)
 
435
                        pNewIcon->cName = g_strdup (_("Undefined"));
 
436
                
 
437
                CairoDock *pParentDock = cairo_dock_search_dock_from_name (pNewIcon->cParentDockName);  // existe forcement puique a ete cree au besoin.
 
438
                cairo_dock_insert_icon_in_dock (pNewIcon, pParentDock, CAIRO_DOCK_UPDATE_DOCK_SIZE, CAIRO_DOCK_ANIMATE_ICON);
 
439
 
 
440
                cairo_dock_launch_animation (CAIRO_CONTAINER (pParentDock));
 
441
                cairo_dock_mark_theme_as_modified (TRUE);
 
442
                
 
443
                g_free (cNewDesktopFilePath);
 
444
                g_free (cNewDesktopFileName);
 
445
        }
362
446
}
363
447
 
364
448
static void cairo_dock_add_launcher (GtkMenuItem *pMenuItem, gpointer *data)
366
450
        Icon *icon = data[0];
367
451
        CairoDock *pDock = data[1];
368
452
        
369
 
        _cairo_dock_create_launcher (pMenuItem, icon, pDock, CAIRO_DOCK_LAUNCHER_FROM_DESKTOP_FILE);
 
453
        _cairo_dock_create_launcher (icon, pDock, CAIRO_DOCK_DESKTOP_FILE_FOR_LAUNCHER);
370
454
}
371
455
 
372
456
static void cairo_dock_add_container (GtkMenuItem *pMenuItem, gpointer *data)
374
458
        Icon *icon = data[0];
375
459
        CairoDock *pDock = data[1];
376
460
 
377
 
        _cairo_dock_create_launcher (pMenuItem, icon, pDock, CAIRO_DOCK_LAUNCHER_FOR_CONTAINER);
 
461
        _cairo_dock_create_launcher (icon, pDock, CAIRO_DOCK_DESKTOP_FILE_FOR_CONTAINER);
378
462
}
379
463
 
380
464
static void cairo_dock_add_separator (GtkMenuItem *pMenuItem, gpointer *data)
382
466
        Icon *icon = data[0];
383
467
        CairoDock *pDock = data[1];
384
468
        if (icon != NULL)
385
 
                _cairo_dock_create_launcher (pMenuItem, icon, pDock, CAIRO_DOCK_LAUNCHER_FOR_SEPARATOR);
386
 
}
387
 
 
388
 
static void _on_modify_launcher (Icon *icon)
389
 
{
390
 
        //g_print ("%s (%s)\n", __func__, icon->acName);
391
 
        GError *erreur = NULL;
392
 
        //\_____________ On detache l'icone.
393
 
        gchar *cPrevDockName = icon->cParentDockName;
394
 
        CairoDock *pDock = cairo_dock_search_dock_from_name (cPrevDockName);
395
 
        icon->cParentDockName = NULL;  // astuce.
396
 
        cairo_dock_detach_icon_from_dock (icon, pDock, TRUE);  // il va falloir la recreer, car tous ses parametres peuvent avoir change; neanmoins, on ne souhaite pas detruire son .desktop.
397
 
 
398
 
        //\_____________ On recharge l'icone.
399
 
        Window Xid = icon->Xid;
400
 
        CairoDock *pSubDock = icon->pSubDock;
401
 
        icon->pSubDock = NULL;
402
 
        gchar *cClass = icon->cClass;
403
 
        icon->cClass = NULL;
404
 
        gchar *cDesktopFileName = icon->acDesktopFileName;
405
 
        icon->acDesktopFileName = NULL;
406
 
        gchar *cName = icon->acName;
407
 
        icon->acName = NULL;
408
 
        gchar *cRendererName = NULL;
409
 
        if (pSubDock != NULL)
410
 
        {
411
 
                cRendererName = pSubDock->cRendererName;
412
 
                pSubDock->cRendererName = NULL;
413
 
        }
414
 
        cairo_t *pCairoContext = cairo_dock_create_context_from_window (CAIRO_CONTAINER (pDock));
415
 
        cairo_dock_reload_icon_from_desktop_file (cDesktopFileName, pCairoContext, icon);
416
 
        
417
 
        if (cName && ! icon->acName)
418
 
                icon->acName = g_strdup (" ");
419
 
        
420
 
        icon->Xid = Xid;
421
 
        //\_____________ On gere le sous-dock.
422
 
        if (Xid != 0)
423
 
        {
424
 
                if (icon->pSubDock == NULL)
425
 
                        icon->pSubDock = pSubDock;
426
 
                else  // ne devrait pas arriver (une icone de container n'est pas un lanceur pouvant prendre un Xid).
427
 
                        cairo_dock_destroy_dock (pSubDock, cName, g_pMainDock, CAIRO_DOCK_MAIN_DOCK_NAME);
428
 
        }
429
 
        else
430
 
        {
431
 
                if (pSubDock != icon->pSubDock)  // ca n'est plus le meme container, on transvase ou on detruit.
432
 
                {
433
 
                        cairo_dock_destroy_dock (pSubDock, cName, icon->pSubDock, icon->acName);
434
 
                }
435
 
        }
436
 
 
437
 
        if (icon->pSubDock != NULL && pSubDock == icon->pSubDock)  // c'est le meme sous-dock, son rendu a pu change.
438
 
        {
439
 
                if ((cRendererName != NULL && icon->pSubDock->cRendererName == NULL)
440
 
                 || (cRendererName == NULL && icon->pSubDock->cRendererName != NULL)
441
 
                 || (cRendererName != NULL && icon->pSubDock->cRendererName != NULL && strcmp (cRendererName, icon->pSubDock->cRendererName) != 0))
442
 
                        cairo_dock_update_dock_size (icon->pSubDock);
443
 
        }
444
 
 
445
 
        //\_____________ On l'insere dans le dock auquel elle appartient maintenant.
446
 
        CairoDock *pNewContainer = cairo_dock_search_dock_from_name (icon->cParentDockName);
447
 
        g_return_if_fail (pNewContainer != NULL);
448
 
 
449
 
        if (pDock != pNewContainer && icon->fOrder > g_list_length (pNewContainer->icons) + 1)
450
 
                icon->fOrder = CAIRO_DOCK_LAST_ORDER;
451
 
 
452
 
        cairo_dock_insert_icon_in_dock (icon, pNewContainer, CAIRO_DOCK_UPDATE_DOCK_SIZE, ! CAIRO_DOCK_ANIMATE_ICON);  // on n'empeche pas les bouclages.
453
 
 
454
 
        if (pDock != pNewContainer)
455
 
                cairo_dock_update_dock_size (pDock);
456
 
 
457
 
        //\_____________ On gere l'inhibition de sa classe.
458
 
        gchar *cNowClass = icon->cClass;
459
 
        if (cClass != NULL && (cNowClass == NULL || strcmp (cNowClass, cClass) != 0))
460
 
        {
461
 
                icon->cClass = cClass;
462
 
                cairo_dock_deinhibate_class (cClass, icon);
463
 
                cClass = NULL;  // libere par la fonction precedente.
464
 
                icon->cClass = cNowClass;
465
 
        }
466
 
        if (cNowClass != NULL && (cClass == NULL || strcmp (cNowClass, cClass) != 0))
467
 
                cairo_dock_inhibate_class (cNowClass, icon);
468
 
 
469
 
        //\_____________ On redessine les docks impactes.
470
 
        cairo_dock_calculate_dock_icons (pDock);
471
 
        gtk_widget_queue_draw (pDock->pWidget);
472
 
        if (pNewContainer != pDock)
473
 
        {
474
 
                cairo_dock_calculate_dock_icons (pNewContainer);
475
 
                gtk_widget_queue_draw (pNewContainer->pWidget);
476
 
 
477
 
                if (pDock->icons == NULL)
478
 
                {
479
 
                        cd_message ("dock %s vide => a la poubelle", cPrevDockName);
480
 
                        cairo_dock_destroy_dock (pDock, cPrevDockName, NULL, NULL);
481
 
                }
482
 
        }
483
 
 
484
 
        g_free (cPrevDockName);
485
 
        g_free (cClass);
486
 
        g_free (cDesktopFileName);
487
 
        g_free (cName);
488
 
        g_free (cRendererName);
489
 
        cairo_destroy (pCairoContext);
490
 
        cairo_dock_mark_theme_as_modified (TRUE);
491
 
}
 
469
                _cairo_dock_create_launcher (icon, pDock, CAIRO_DOCK_DESKTOP_FILE_FOR_SEPARATOR);
 
470
}
 
471
 
492
472
static void _cairo_dock_modify_launcher (GtkMenuItem *pMenuItem, gpointer *data)
493
473
{
494
474
        Icon *icon = data[0];
495
475
        CairoDock *pDock = data[1];
496
 
 
497
 
        gchar *cDesktopFilePath = g_strdup_printf ("%s/%s", g_cCurrentLaunchersPath, icon->acDesktopFileName);
498
 
 
499
 
        cairo_dock_update_launcher_desktop_file (cDesktopFilePath, CAIRO_DOCK_IS_SEPARATOR (icon) ? CAIRO_DOCK_LAUNCHER_FOR_SEPARATOR : (icon->pSubDock != NULL && icon->Xid == 0) ? CAIRO_DOCK_LAUNCHER_FOR_CONTAINER : CAIRO_DOCK_LAUNCHER_FROM_DESKTOP_FILE);
500
 
 
501
 
        gboolean config_ok = cairo_dock_build_normal_gui (cDesktopFilePath, NULL, _("Modify this launcher"), CAIRO_DOCK_LAUNCHER_PANEL_WIDTH, CAIRO_DOCK_LAUNCHER_PANEL_HEIGHT, (CairoDockApplyConfigFunc)NULL, NULL, NULL, NULL);
502
 
        g_free (cDesktopFilePath);
503
 
        if (config_ok)
504
 
        {
505
 
                _on_modify_launcher (icon);
506
 
        }
507
 
        
508
 
        if (! pDock->bInside)
509
 
        {
510
 
                //g_print ("on force a quitter\n");
511
 
                pDock->bInside = TRUE;
512
 
                pDock->bAtBottom = FALSE;
513
 
                cairo_dock_emit_leave_signal (pDock);
514
 
        }
515
 
}
 
476
        
 
477
        if (icon->cDesktopFileName == NULL || strcmp (icon->cDesktopFileName, "none") == 0)
 
478
        {
 
479
                cairo_dock_show_temporary_dialog_with_icon (_("This icon doesn't have a desktop file."), icon, CAIRO_CONTAINER (pDock), 4000, "same icon");
 
480
                return ;
 
481
        }
 
482
 
 
483
        if (g_bEasterEggs)
 
484
        {
 
485
                cairo_dock_build_launcher_gui (icon);
 
486
        }
 
487
        else
 
488
        {
 
489
                gchar *cDesktopFilePath = g_strdup_printf ("%s/%s", g_cCurrentLaunchersPath, icon->cDesktopFileName);
 
490
                gboolean config_ok = cairo_dock_build_normal_gui (cDesktopFilePath, NULL, _("Modify this launcher"), CAIRO_DOCK_LAUNCHER_PANEL_WIDTH, CAIRO_DOCK_LAUNCHER_PANEL_HEIGHT, (CairoDockApplyConfigFunc)NULL, NULL, NULL, NULL);
 
491
                g_free (cDesktopFilePath);
 
492
                
 
493
                if (config_ok)
 
494
                        cairo_dock_reload_launcher (icon);
 
495
                if (! pDock->container.bInside)
 
496
                {
 
497
                        //g_print ("on force a quitter\n");
 
498
                        pDock->container.bInside = TRUE;
 
499
                        pDock->bAtBottom = FALSE;
 
500
                        cairo_dock_emit_leave_signal (pDock);
 
501
                }
 
502
        }
 
503
}
 
504
 
 
505
static void _cairo_dock_move_launcher_to_dock (GtkMenuItem *pMenuItem, const gchar *cDockName)
 
506
{
 
507
        Icon *pIcon = g_object_get_data (G_OBJECT (pMenuItem), "launcher");
 
508
        
 
509
        gchar *cValidDockName;
 
510
        if (cDockName == NULL)  // new dock
 
511
        {
 
512
                cValidDockName = cairo_dock_get_unique_dock_name ("dock");
 
513
        }
 
514
        else
 
515
        {
 
516
                cValidDockName = g_strdup (cDockName);
 
517
        }
 
518
        if (CAIRO_DOCK_IS_STORED_LAUNCHER (pIcon))
 
519
        {
 
520
                gchar *cDesktopFilePath = g_strdup_printf ("%s/%s", g_cCurrentLaunchersPath, pIcon->cDesktopFileName);
 
521
                cairo_dock_update_conf_file (cDesktopFilePath,
 
522
                        G_TYPE_STRING, "Desktop Entry", "Container", cValidDockName,
 
523
                        G_TYPE_INVALID);
 
524
                g_free (cDesktopFilePath);
 
525
                cairo_dock_reload_launcher (pIcon);
 
526
        }
 
527
        else if (CAIRO_DOCK_IS_APPLET (pIcon))
 
528
        {
 
529
                cairo_dock_update_conf_file (pIcon->pModuleInstance->cConfFilePath,
 
530
                        G_TYPE_STRING, "Icon", "dock name", cValidDockName,
 
531
                        G_TYPE_INVALID);
 
532
                cairo_dock_reload_module_instance (pIcon->pModuleInstance, TRUE);  // TRUE <=> reload config.
 
533
        }
 
534
        g_free (cValidDockName);
 
535
}
 
536
static void _add_one_dock_to_menu (const gchar *cName, CairoDock *pDock, GtkWidget *pMenu)
 
537
{
 
538
        Icon *pPointingIcon = cairo_dock_search_icon_pointing_on_dock (pDock, NULL);
 
539
        if (CAIRO_DOCK_IS_APPLET (pPointingIcon) || CAIRO_DOCK_IS_MULTI_APPLI (pPointingIcon) || CAIRO_DOCK_IS_URI_LAUNCHER (pPointingIcon))
 
540
                return;
 
541
        Icon *pIcon = g_object_get_data (G_OBJECT (pMenu), "launcher");
 
542
        if (strcmp (pIcon->cParentDockName, cName) == 0)
 
543
                return;
 
544
        GtkWidget *pMenuItem = cairo_dock_add_in_menu_with_stock_and_data (cName, NULL, (GFunc)_cairo_dock_move_launcher_to_dock, pMenu, (gpointer)cName);
 
545
        g_object_set_data (G_OBJECT (pMenuItem), "launcher", pIcon);
 
546
}
 
547
 
 
548
  ///////////////////////////////////////////////////////////////////
 
549
 /////////// LES OPERATIONS SUR LES FICHIERS ///////////////////////
 
550
///////////////////////////////////////////////////////////////////
516
551
 
517
552
static void _cairo_dock_show_file_properties (GtkMenuItem *pMenuItem, gpointer *data)
518
553
{
519
554
        Icon *icon = data[0];
520
555
        CairoDock *pDock = data[1];
521
 
        //g_print ("%s (%s)\n", __func__, icon->acName);
 
556
        //g_print ("%s (%s)\n", __func__, icon->cName);
522
557
 
523
558
        guint64 iSize = 0;
524
559
        time_t iLastModificationTime = 0;
525
560
        gchar *cMimeType = NULL;
526
561
        int iUID=0, iGID=0, iPermissionsMask=0;
527
 
        if (cairo_dock_fm_get_file_properties (icon->acCommand, &iSize, &iLastModificationTime, &cMimeType, &iUID, &iGID, &iPermissionsMask))
 
562
        if (cairo_dock_fm_get_file_properties (icon->cCommand, &iSize, &iLastModificationTime, &cMimeType, &iUID, &iGID, &iPermissionsMask))
528
563
        {
529
 
                GtkWidget *pDialog = gtk_message_dialog_new (GTK_WINDOW (pDock->pWidget),
 
564
                GtkWidget *pDialog = gtk_message_dialog_new (GTK_WINDOW (pDock->container.pWidget),
530
565
                        GTK_DIALOG_DESTROY_WITH_PARENT,
531
566
                        GTK_MESSAGE_INFO,
532
567
                        GTK_BUTTONS_OK,
533
568
                        "Properties :");
534
569
 
535
570
                GString *sInfo = g_string_new ("");
536
 
                g_string_printf (sInfo, "<b>%s</b>", icon->acName);
 
571
                g_string_printf (sInfo, "<b>%s</b>", icon->cName);
537
572
 
538
573
                GtkWidget *pLabel= gtk_label_new (NULL);
539
574
                gtk_label_set_use_markup (GTK_LABEL (pLabel), TRUE);
610
645
{
611
646
        Icon *icon = data[0];
612
647
        CairoDock *pDock = data[1];
613
 
        cd_message ("%s (%s / %s)\n", __func__, icon->acName, icon->cBaseURI);
 
648
        cd_message ("%s (%s / %s)\n", __func__, icon->cName, icon->cBaseURI);
614
649
 
615
650
        gboolean bIsMounted = FALSE;
616
651
        gchar *cActivationURI = cairo_dock_fm_is_mounted (icon->cBaseURI, &bIsMounted);
629
664
{
630
665
        Icon *icon = data[0];
631
666
        CairoDock *pDock = data[1];
632
 
        cd_message ("%s (%s / %s)\n", __func__, icon->acName, icon->acCommand);
633
 
        cairo_dock_fm_eject_drive (icon->acCommand);
 
667
        cd_message ("%s (%s / %s)\n", __func__, icon->cName, icon->cCommand);
 
668
        cairo_dock_fm_eject_drive (icon->cCommand);
634
669
}
635
670
 
636
671
 
638
673
{
639
674
        Icon *icon = data[0];
640
675
        CairoDock *pDock = data[1];
641
 
        cd_message ("%s (%s)\n", __func__, icon->acName);
 
676
        cd_message ("%s (%s)\n", __func__, icon->cName);
642
677
 
643
 
        gchar *question = g_strdup_printf (_("You're about deleting this file\n  (%s)\nfrom your hard-disk. Sure ?"), icon->acCommand);
 
678
        gchar *question = g_strdup_printf (_("You're about deleting this file\n  (%s)\nfrom your hard-disk. Sure ?"), icon->cCommand);
644
679
        int answer = cairo_dock_ask_question_and_wait (question, icon, CAIRO_CONTAINER (pDock));
645
680
        g_free (question);
646
681
        if (answer == GTK_RESPONSE_YES)
647
682
        {
648
 
                gboolean bSuccess = cairo_dock_fm_delete_file (icon->acCommand);
 
683
                gboolean bSuccess = cairo_dock_fm_delete_file (icon->cCommand);
649
684
                if (! bSuccess)
650
685
                {
651
 
                        cd_message ("Attention : couldn't delete this file.\nCheck that you have writing rights on this file.\n");
 
686
                        cd_warning ("couldn't delete this file.\nCheck that you have writing rights on this file.\n");
652
687
                        gchar *cMessage = g_strdup_printf (_("Attention : couldn't delete this file.\nCheck that you have writing rights on it."));
653
688
                        cairo_dock_show_temporary_dialog_with_default_icon (cMessage, icon, CAIRO_CONTAINER (pDock), 4000);
654
689
                        g_free (cMessage);
656
691
                ///cairo_dock_remove_icon_from_dock (pDock, icon);
657
692
                ///cairo_dock_update_dock_size (pDock);
658
693
 
659
 
                if (icon->acDesktopFileName != NULL)
 
694
                if (icon->cDesktopFileName != NULL)
660
695
                {
661
 
                        gchar *icon_path = g_strdup_printf ("%s/%s", g_cCurrentLaunchersPath, icon->acDesktopFileName);
 
696
                        gchar *icon_path = g_strdup_printf ("%s/%s", g_cCurrentLaunchersPath, icon->cDesktopFileName);
662
697
                        g_remove (icon_path);
663
698
                        g_free (icon_path);
664
699
                }
671
706
{
672
707
        Icon *icon = data[0];
673
708
        CairoDock *pDock = data[1];
674
 
        cd_message ("%s (%s)", __func__, icon->acName);
 
709
        cd_message ("%s (%s)", __func__, icon->cName);
675
710
 
676
 
        gchar *cNewName = cairo_dock_show_demand_and_wait (_("Rename to :"), icon, CAIRO_CONTAINER (pDock), icon->acName);
 
711
        gchar *cNewName = cairo_dock_show_demand_and_wait (_("Rename to :"), icon, CAIRO_CONTAINER (pDock), icon->cName);
677
712
        if (cNewName != NULL && *cNewName != '\0')
678
713
        {
679
 
                gboolean bSuccess = cairo_dock_fm_rename_file (icon->acCommand, cNewName);
 
714
                gboolean bSuccess = cairo_dock_fm_rename_file (icon->cCommand, cNewName);
680
715
                if (! bSuccess)
681
716
                {
682
717
                        cd_warning ("couldn't rename this file.\nCheck that you have writing rights, and that the new name does not already exist.");
683
 
                        cairo_dock_show_temporary_dialog (_("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, icon->acCommand);
 
718
                        cairo_dock_show_temporary_dialog (_("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, icon->cCommand);
684
719
                }
685
720
        }
686
721
        g_free (cNewName);
687
722
}
688
723
 
689
 
/////////// LES OPERATIONS SUR LES APPLETS ///////////////////////
 
724
  //////////////////////////////////////////////////////////////////
 
725
 /////////// LES OPERATIONS SUR LES APPLETS ///////////////////////
 
726
//////////////////////////////////////////////////////////////////
690
727
 
691
728
static void _cairo_dock_initiate_config_module (GtkMenuItem *pMenuItem, gpointer *data)
692
729
{
746
783
        cairo_dock_add_module_instance (icon->pModuleInstance->pModule);
747
784
}
748
785
 
749
 
/////////// LES OPERATIONS SUR LES APPLIS ///////////////////////
 
786
  /////////////////////////////////////////////////////////////////
 
787
 /////////// LES OPERATIONS SUR LES APPLIS ///////////////////////
 
788
/////////////////////////////////////////////////////////////////
750
789
 
751
790
static void _cairo_dock_close_appli (GtkMenuItem *pMenuItem, gpointer *data)
752
791
{
788
827
{
789
828
        Icon *icon = data[0];
790
829
        CairoDock *pDock = data[1];
791
 
        if (icon->acCommand != NULL)
 
830
        if (icon->cCommand != NULL)
792
831
        {
793
832
                cairo_dock_notify (CAIRO_DOCK_CLICK_ICON, icon, pDock, GDK_SHIFT_MASK);  // on emule un shift+clic gauche .
794
833
        }
845
884
        CairoDock *pDock = data[1];
846
885
        if (icon->Xid > 0)
847
886
        {
848
 
                gboolean bIsMaximized = cairo_dock_window_is_maximized (icon->Xid);
 
887
                gboolean bIsMaximized = cairo_dock_xwindow_is_maximized (icon->Xid);
849
888
                cairo_dock_maximize_xwindow (icon->Xid, ! bIsMaximized);
850
889
        }
851
890
}
856
895
        CairoDock *pDock = data[1];
857
896
        if (icon->Xid > 0)
858
897
        {
859
 
                gboolean bIsFullScreen = cairo_dock_window_is_fullscreen (icon->Xid);
 
898
                gboolean bIsFullScreen = cairo_dock_xwindow_is_fullscreen (icon->Xid);
860
899
                cairo_dock_set_xwindow_fullscreen (icon->Xid, ! bIsFullScreen);
861
900
        }
862
901
}
884
923
        cd_message ("%s (%d;%d;%d)", __func__, iDesktopNumber, iViewPortNumberX, iViewPortNumberY);
885
924
        if (icon->Xid > 0)
886
925
        {
887
 
                int iCurrentDesktopNumber = cairo_dock_get_window_desktop (icon->Xid);
 
926
                int iCurrentDesktopNumber = cairo_dock_get_xwindow_desktop (icon->Xid);
888
927
                
889
928
                int iCurrentViewPortX, iCurrentViewPortY;
890
929
                cairo_dock_get_current_viewport (&iCurrentViewPortX, &iCurrentViewPortY);
891
930
                cd_debug (" current_viewport : %d;%d", iCurrentViewPortX, iCurrentViewPortY);
892
931
                
893
 
                cairo_dock_move_xwindow_to_nth_desktop (icon->Xid, iDesktopNumber, iViewPortNumberX * g_iScreenWidth[CAIRO_DOCK_HORIZONTAL] - iCurrentViewPortX, iViewPortNumberY * g_iScreenHeight[CAIRO_DOCK_HORIZONTAL] - iCurrentViewPortY);
 
932
                cairo_dock_move_xwindow_to_nth_desktop (icon->Xid, iDesktopNumber, iViewPortNumberX * g_iXScreenWidth[CAIRO_DOCK_HORIZONTAL] - iCurrentViewPortX, iViewPortNumberY * g_iXScreenHeight[CAIRO_DOCK_HORIZONTAL] - iCurrentViewPortY);
894
933
        }
895
934
}
896
935
 
901
940
        if (icon->Xid > 0)
902
941
        {
903
942
                gboolean bIsAbove=FALSE, bIsBelow=FALSE;
904
 
                cairo_dock_window_is_above_or_below (icon->Xid, &bIsAbove, &bIsBelow);
 
943
                cairo_dock_xwindow_is_above_or_below (icon->Xid, &bIsAbove, &bIsBelow);
905
944
                cairo_dock_set_xwindow_above (icon->Xid, ! bIsAbove);
906
945
        }
907
946
}
908
947
 
909
 
/////////// LES OPERATIONS SUR LES CLASSES ///////////////////////
 
948
  //////////////////////////////////////////////////////////////////
 
949
 /////////// LES OPERATIONS SUR LES CLASSES ///////////////////////
 
950
//////////////////////////////////////////////////////////////////
910
951
 
911
952
static void _cairo_dock_show_class (GtkMenuItem *pMenuItem, gpointer *data)
912
953
{
980
1021
                pIcon = ic->data;
981
1022
                if (pIcon->Xid != 0)
982
1023
                {
983
 
                        int iCurrentDesktopNumber = cairo_dock_get_window_desktop (pIcon->Xid);         
 
1024
                        int iCurrentDesktopNumber = cairo_dock_get_xwindow_desktop (pIcon->Xid);                
984
1025
                        int iCurrentViewPortX, iCurrentViewPortY;
985
1026
                        cairo_dock_get_current_viewport (&iCurrentViewPortX, &iCurrentViewPortY);
986
1027
                        cd_debug (" current_viewport : %d;%d", iCurrentViewPortX, iCurrentViewPortY);
987
1028
                        
988
 
                        cairo_dock_move_xwindow_to_nth_desktop (pIcon->Xid, iDesktopNumber, iViewPortNumberX * g_iScreenWidth[CAIRO_DOCK_HORIZONTAL] - iCurrentViewPortX, iViewPortNumberY * g_iScreenHeight[CAIRO_DOCK_HORIZONTAL] - iCurrentViewPortY);
 
1029
                        cairo_dock_move_xwindow_to_nth_desktop (pIcon->Xid, iDesktopNumber, iViewPortNumberX * g_iXScreenWidth[CAIRO_DOCK_HORIZONTAL] - iCurrentViewPortX, iViewPortNumberY * g_iXScreenHeight[CAIRO_DOCK_HORIZONTAL] - iCurrentViewPortY);
989
1030
                }
990
1031
        }
991
1032
}
1009
1050
        }
1010
1051
}
1011
1052
 
1012
 
///////////////// LES OPERATIONS SUR LES DESKLETS /////////////////////
 
1053
  ///////////////////////////////////////////////////////////////////
 
1054
 ///////////////// LES OPERATIONS SUR LES DESKLETS /////////////////
 
1055
///////////////////////////////////////////////////////////////////
1013
1056
 
1014
1057
static void _cairo_dock_keep_below (GtkCheckMenuItem *pMenuItem, gpointer *data)
1015
1058
{
1020
1063
        
1021
1064
        gboolean bBelow = gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (pMenuItem));
1022
1065
        g_print (" %s (%d)\n", __func__, bBelow);
1023
 
        gtk_window_set_keep_below (GTK_WINDOW(pDesklet->pWidget), bBelow);
 
1066
        gtk_window_set_keep_below (GTK_WINDOW(pDesklet->container.pWidget), bBelow);
1024
1067
        if (CAIRO_DOCK_IS_APPLET (icon) && bBelow)
1025
1068
                cairo_dock_update_conf_file (icon->pModuleInstance->cConfFilePath,
1026
1069
                        G_TYPE_INT, "Desklet", "accessibility", CAIRO_DESKLET_KEEP_BELOW,
1051
1094
        
1052
1095
        gboolean bAbove = gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (pMenuItem));
1053
1096
        g_print (" %s (%d)\n", __func__, bAbove);
1054
 
        gtk_window_set_keep_above (GTK_WINDOW(pDesklet->pWidget), bAbove);
 
1097
        gtk_window_set_keep_above (GTK_WINDOW(pDesklet->container.pWidget), bAbove);
1055
1098
        if (CAIRO_DOCK_IS_APPLET (icon) && bAbove)
1056
1099
                cairo_dock_update_conf_file (icon->pModuleInstance->cConfFilePath,
1057
1100
                        G_TYPE_INT, "Desklet", "accessibility", CAIRO_DESKLET_KEEP_ABOVE,
1059
1102
}
1060
1103
 
1061
1104
//for compiz fusion "widget layer"
1062
 
//set behaviour in compiz to: (name=cairo-dock & type=utility)
 
1105
//set behaviour in compiz to: (class=Cairo-dock & type=utility)
1063
1106
static void _cairo_dock_keep_on_widget_layer (GtkMenuItem *pMenuItem, gpointer *data)
1064
1107
{
1065
1108
        Icon *icon = data[0];
1068
1111
                icon = pDesklet->pIcon;
1069
1112
        
1070
1113
        cairo_dock_hide_desklet (pDesklet);
1071
 
        Window Xid = GDK_WINDOW_XID (pDesklet->pWidget->window);
 
1114
        Window Xid = GDK_WINDOW_XID (pDesklet->container.pWidget->window);
1072
1115
 
1073
1116
        gboolean bOnCompizWidgetLayer = gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (pMenuItem));
1074
1117
        g_print (" %s (%d)\n", __func__, bOnCompizWidgetLayer);
1075
1118
        if (bOnCompizWidgetLayer)
1076
1119
                cairo_dock_set_xwindow_type_hint (Xid, "_NET_WM_WINDOW_TYPE_UTILITY");
1077
 
                //gtk_window_set_type_hint(GTK_WINDOW(pDock->pWidget), GDK_WINDOW_TYPE_HINT_UTILITY);
 
1120
                //gtk_window_set_type_hint(GTK_WINDOW(pDock->container.pWidget), GDK_WINDOW_TYPE_HINT_UTILITY);
1078
1121
        else
1079
1122
                cairo_dock_set_xwindow_type_hint (Xid, "_NET_WM_WINDOW_TYPE_NORMAL");
1080
 
                //gtk_window_set_type_hint(GTK_WINDOW(pDock->pWidget), GDK_WINDOW_TYPE_HINT_NORMAL);
 
1123
                //gtk_window_set_type_hint(GTK_WINDOW(pDock->container.pWidget), GDK_WINDOW_TYPE_HINT_NORMAL);
1081
1124
        cairo_dock_show_desklet (pDesklet);
1082
 
 
 
1125
        
1083
1126
        if (CAIRO_DOCK_IS_APPLET (icon) && bOnCompizWidgetLayer)
1084
1127
                cairo_dock_update_conf_file (icon->pModuleInstance->cConfFilePath,
1085
1128
                        G_TYPE_INT, "Desklet", "accessibility", CAIRO_DESKLET_ON_WIDGET_LAYER,
1086
1129
                        G_TYPE_INVALID);
 
1130
        
 
1131
        if (bOnCompizWidgetLayer)  // on verifie que la regle de Compiz est correcte.
 
1132
        {
 
1133
                // on recupere la regle
 
1134
                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");
 
1135
                g_print ("cDbusAnswer : '%s'\n", cDbusAnswer);
 
1136
                gchar *cRule = NULL;
 
1137
                gchar *str = strchr (cDbusAnswer, '\n');
 
1138
                if (str)
 
1139
                {
 
1140
                        str ++;
 
1141
                        while (*str == ' ')
 
1142
                                str ++;
 
1143
                        if (strncmp (str, "string", 6) == 0)
 
1144
                        {
 
1145
                                str += 6;
 
1146
                                while (*str == ' ')
 
1147
                                        str ++;
 
1148
                                if (*str == '"')
 
1149
                                {
 
1150
                                        str ++;
 
1151
                                        gchar *ptr = strrchr (str, '"');
 
1152
                                        if (ptr)
 
1153
                                        {
 
1154
                                                *ptr = '\0';
 
1155
                                                cRule = g_strdup (str);
 
1156
                                        }
 
1157
                                }
 
1158
                        }
 
1159
                }
 
1160
                g_free (cDbusAnswer);
 
1161
                g_print ("got rule : '%s'\n", cRule);
 
1162
                
 
1163
                /// gerer le cas ou Compiz n'est pas lance : comment le distinguer d'une regle vide ?...
 
1164
                if (cRule == NULL)
 
1165
                {
 
1166
                        cd_warning ("couldn't get Widget Layer rule from Compiz");
 
1167
                }
 
1168
                
 
1169
                // on complete la regle si necessaire.
 
1170
                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))
 
1171
                {
 
1172
                        gchar *cNewRule = (cRule == NULL || *cRule == '\0' ?
 
1173
                                g_strdup ("(class=Cairo-dock & type=utility)") :
 
1174
                                g_strdup_printf ("(%s) | (class=Cairo-dock & type=utility)", cRule));
 
1175
                        g_print ("set rule : %s\n", cNewRule);
 
1176
                        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);
 
1177
                        cairo_dock_launch_command_sync (cCommand);
 
1178
                        g_free (cCommand);
 
1179
                        g_free (cNewRule);
 
1180
                }
 
1181
                g_free (cRule);
 
1182
        }
1087
1183
}
1088
1184
 
1089
1185
static void _cairo_dock_keep_space (GtkCheckMenuItem *pMenuItem, gpointer *data)
1096
1192
        gboolean bReserveSpace = gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (pMenuItem));
1097
1193
        g_print (" %s (%d)\n", __func__, bReserveSpace);
1098
1194
        
1099
 
        Window Xid = GDK_WINDOW_XID (pDesklet->pWidget->window);
 
1195
        Window Xid = GDK_WINDOW_XID (pDesklet->container.pWidget->window);
1100
1196
        pDesklet->bSpaceReserved = bReserveSpace;
1101
1197
        //cairo_dock_set_xwindow_type_hint (Xid, bReserveSpace ? "_NET_WM_WINDOW_TYPE_DOCK" : "_NET_WM_WINDOW_TYPE_NORMAL");
1102
1198
        cairo_dock_reserve_space_for_desklet (pDesklet, bReserveSpace);
1117
1213
        gboolean bSticky = gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (pMenuItem));
1118
1214
        g_print (" %s (%d)\n", __func__, bSticky);
1119
1215
        if (bSticky)
1120
 
                gtk_window_stick (GTK_WINDOW (pDesklet->pWidget));
 
1216
                gtk_window_stick (GTK_WINDOW (pDesklet->container.pWidget));
1121
1217
        else
1122
 
                gtk_window_unstick (GTK_WINDOW (pDesklet->pWidget));
 
1218
                gtk_window_unstick (GTK_WINDOW (pDesklet->container.pWidget));
1123
1219
        
1124
1220
        if (CAIRO_DOCK_IS_APPLET (icon))
1125
1221
                cairo_dock_update_conf_file (icon->pModuleInstance->cConfFilePath,
1161
1257
        }
1162
1258
        
1163
1259
        gchar *cTitle = g_strdup_printf (_("Set position for the dock '%s'"), cDockName);
1164
 
        //gboolean config_ok = cairo_dock_edit_conf_file (GTK_WINDOW (pDock->pWidget), cConfFilePath, cTitle, CAIRO_DOCK_CONF_PANEL_WIDTH, CAIRO_DOCK_CONF_PANEL_HEIGHT, 0, NULL, NULL, NULL, NULL, CAIRO_DOCK_GETTEXT_PACKAGE);
 
1260
        //gboolean config_ok = cairo_dock_edit_conf_file (GTK_WINDOW (pDock->container.pWidget), cConfFilePath, cTitle, CAIRO_DOCK_CONF_PANEL_WIDTH, CAIRO_DOCK_CONF_PANEL_HEIGHT, 0, NULL, NULL, NULL, NULL, CAIRO_DOCK_GETTEXT_PACKAGE);
1165
1261
        gboolean config_ok = cairo_dock_build_normal_gui (cConfFilePath, NULL, cTitle, CAIRO_DOCK_CONF_PANEL_WIDTH, CAIRO_DOCK_CONF_PANEL_HEIGHT, NULL, NULL, NULL, NULL);
1166
1262
        g_free (cTitle);
1167
1263
        
1176
1272
                cairo_dock_calculate_dock_icons (pDock);
1177
1273
                
1178
1274
                cairo_dock_place_root_dock (pDock);
1179
 
                gtk_widget_queue_draw (pDock->pWidget);
 
1275
                gtk_widget_queue_draw (pDock->container.pWidget);
1180
1276
        }
1181
1277
        
1182
1278
        g_free (cConfFilePath);
1189
1285
        pDock->bMenuVisible = FALSE;
1190
1286
        
1191
1287
        cd_message ("on force a quitter");
1192
 
        pDock->bInside = TRUE;
 
1288
        pDock->container.bInside = TRUE;
1193
1289
        pDock->bAtBottom = FALSE;
1194
1290
        ///cairo_dock_disable_entrance ();  // trop violent, il faudrait trouver un autre truc.
1195
 
        cairo_dock_on_leave_notify (pDock->pWidget,
 
1291
        cairo_dock_on_leave_notify (pDock->container.pWidget,
1196
1292
                NULL,
1197
1293
                pDock);
1198
1294
}
1199
1295
 
1200
 
 
1201
 
#define _add_entry_in_menu(cLabel, gtkStock, pSubMenu, pCallBack) CAIRO_DOCK_ADD_IN_MENU_WITH_STOCK_AND_DATA (cLabel, gtkStock, pSubMenu, pCallBack, data)
 
1296
#define _add_entry_in_menu(cLabel, gtkStock, pCallBack, pSubMenu) cairo_dock_add_in_menu_with_stock_and_data (cLabel, gtkStock, (GFunc) (pCallBack), pSubMenu, data)
1202
1297
 
1203
1298
GtkWidget *cairo_dock_build_menu (Icon *icon, CairoContainer *pContainer)
1204
1299
{
1242
1337
                GtkWidget *pSubMenu = gtk_menu_new ();
1243
1338
                gtk_menu_item_set_submenu (GTK_MENU_ITEM (pMenuItem), pSubMenu);
1244
1339
 
1245
 
                if (! g_bLocked)
 
1340
                if (! cairo_dock_is_locked ())
1246
1341
                {
1247
 
                        _add_entry_in_menu (_("Configure"), GTK_STOCK_PREFERENCES, _cairo_dock_edit_and_reload_conf, pSubMenu);
1248
 
                
 
1342
                        pMenuItem = _add_entry_in_menu (_("Configure"), GTK_STOCK_PREFERENCES, _cairo_dock_edit_and_reload_conf, pSubMenu);
 
1343
                        gtk_widget_set_tooltip_text (pMenuItem, _("Configure the behaviour, appearance, and applets."));
 
1344
                        
1249
1345
                        pMenuItem = gtk_separator_menu_item_new ();
1250
1346
                        gtk_menu_shell_append (GTK_MENU_SHELL (pSubMenu), pMenuItem);
1251
1347
                
1252
1348
                        if (CAIRO_DOCK_IS_DOCK (pContainer) && ! CAIRO_DOCK (pContainer)->bIsMainDock && CAIRO_DOCK (pContainer)->iRefCount == 0)
1253
1349
                        {
1254
 
                                _add_entry_in_menu (_("Set up this dock"), GTK_STOCK_EXECUTE, _cairo_dock_configure_root_dock_position, pSubMenu);
 
1350
                                pMenuItem = _add_entry_in_menu (_("Set up this dock"), GTK_STOCK_EXECUTE, _cairo_dock_configure_root_dock_position, pSubMenu);
 
1351
                                gtk_widget_set_tooltip_text (pMenuItem, _("Set up the position of this main dock."));
1255
1352
                        }
1256
 
                        _add_entry_in_menu (_("Manage themes"), GTK_STOCK_EXECUTE, _cairo_dock_initiate_theme_management, pSubMenu);
1257
 
                }
1258
 
                
1259
 
                pMenuItem = gtk_image_menu_item_new_with_label (myAccessibility.bLockIcons ? _("unlock icons") : _("lock icons"));
1260
 
                pixbuf = gdk_pixbuf_new_from_file_at_size (CAIRO_DOCK_SHARE_DATA_DIR"/icon-lock-icons.svg", 16, 16, NULL);
1261
 
                image = gtk_image_new_from_pixbuf (pixbuf);
1262
 
                g_object_unref (pixbuf);
1263
 
                gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (pMenuItem), image);
1264
 
                gtk_menu_shell_append  (GTK_MENU_SHELL (pSubMenu), pMenuItem);
1265
 
                g_signal_connect (G_OBJECT (pMenuItem), "activate", G_CALLBACK(_cairo_dock_lock_icons), data);
 
1353
                        pMenuItem = _add_entry_in_menu (_("Manage themes"), GTK_STOCK_EXECUTE, _cairo_dock_initiate_theme_management, pSubMenu);
 
1354
                        gtk_widget_set_tooltip_text (pMenuItem, _("Choose amongst many themes on the server, and save your current theme."));
 
1355
                        
 
1356
                        pMenuItem = _add_entry_in_menu (myAccessibility.bLockIcons ? _("unlock icons") : _("lock icons"),
 
1357
                                CAIRO_DOCK_SHARE_DATA_DIR"/icon-lock-icons.svg",
 
1358
                                _cairo_dock_lock_icons,
 
1359
                                pSubMenu);
 
1360
                        gtk_widget_set_tooltip_text (pMenuItem, _("This will (un)lock the position of the icons."));
 
1361
                }
 
1362
                if (! g_bLocked)
 
1363
                {
 
1364
                        pMenuItem = _add_entry_in_menu (myAccessibility.bLockAll ? _("unlock dock") : _("lock dock"),
 
1365
                                CAIRO_DOCK_SHARE_DATA_DIR"/icon-lock-icons.svg",
 
1366
                                _cairo_dock_lock_all,
 
1367
                                pSubMenu);
 
1368
                                gtk_widget_set_tooltip_text (pMenuItem, _("This will (un)lock the whole dock."));
 
1369
                }
1266
1370
                
1267
1371
                if (CAIRO_DOCK_IS_DOCK (pContainer) && ! CAIRO_DOCK (pContainer)->bAutoHide)
1268
1372
                {
1269
 
                        _add_entry_in_menu (_("Quick-Hide"), GTK_STOCK_GOTO_BOTTOM, _cairo_dock_quick_hide, pSubMenu);
 
1373
                        pMenuItem = _add_entry_in_menu (_("Quick-Hide"), GTK_STOCK_GOTO_BOTTOM, _cairo_dock_quick_hide, pSubMenu);
 
1374
                        gtk_widget_set_tooltip_text (pMenuItem, _("It will hide the dock until you enter inside with the mouse."));
1270
1375
                }
1271
1376
                
1272
1377
                gchar *cCairoAutoStartDirPath = g_strdup_printf ("%s/.config/autostart", g_getenv ("HOME"));
1280
1385
                g_free (cCairoAutoStartEntryPath2);
1281
1386
                g_free (cCairoAutoStartDirPath);
1282
1387
                
1283
 
                _add_entry_in_menu (_("Development's site"), GTK_STOCK_DIALOG_WARNING, _cairo_dock_check_for_updates, pSubMenu);
1284
 
 
1285
 
                _add_entry_in_menu (_("Community's site"), GTK_STOCK_DIALOG_INFO, _cairo_dock_help, pSubMenu);
1286
 
 
1287
 
                _add_entry_in_menu (_("Help"), GTK_STOCK_HELP, _cairo_dock_present_help, pSubMenu);
1288
 
 
 
1388
                pMenuItem = _add_entry_in_menu (_("Development's site"), GTK_STOCK_DIALOG_WARNING, _cairo_dock_check_for_updates, pSubMenu);
 
1389
                gtk_widget_set_tooltip_text (pMenuItem, _("Find out the latest version of Cairo-Dock here !."));
 
1390
 
 
1391
                pMenuItem = _add_entry_in_menu (_("Community's site"), GTK_STOCK_DIALOG_INFO, _cairo_dock_help, pSubMenu);
 
1392
                gtk_widget_set_tooltip_text (pMenuItem, _("A problem ? A suggestion ? Want to talk to us ? You're welcome !"));
 
1393
                
 
1394
                pMenuItem = _add_entry_in_menu (_("Help"), GTK_STOCK_HELP, _cairo_dock_present_help, pSubMenu);
 
1395
                gtk_widget_set_tooltip_text (pMenuItem, _("There is no problem, there is only solution (and a lot of useful hints !)."));
 
1396
                
1289
1397
                _add_entry_in_menu (_("About"), GTK_STOCK_ABOUT, _cairo_dock_about, pSubMenu);
1290
 
 
 
1398
                
1291
1399
                if (! g_bLocked)
1292
1400
                {
1293
1401
                        _add_entry_in_menu (_("Quit"), GTK_STOCK_QUIT, _cairo_dock_quit, pSubMenu);
1340
1448
                                        user_data[2] = GINT_TO_POINTER (j);
1341
1449
                                        user_data[3] = GINT_TO_POINTER (k);
1342
1450
                                        
1343
 
                                        CAIRO_DOCK_ADD_IN_MENU_WITH_STOCK_AND_DATA (sDesktop->str, NULL, (bAll ? _cairo_dock_move_class_to_desktop : _cairo_dock_move_appli_to_desktop), pMenu, user_data);
 
1451
                                        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);
1344
1452
                                }
1345
1453
                        }
1346
1454
                }
1359
1467
        GtkWidget *pMenuItem, *image;
1360
1468
 
1361
1469
        //\_________________________ Si pas d'icone dans un dock, on s'arrete la.
1362
 
        if (! g_bLocked && CAIRO_DOCK_IS_DOCK (pContainer) && (icon == NULL || CAIRO_DOCK_IS_AUTOMATIC_SEPARATOR (icon)))
 
1470
        if (CAIRO_DOCK_IS_DOCK (pContainer) && (icon == NULL || CAIRO_DOCK_IS_AUTOMATIC_SEPARATOR (icon)))
1363
1471
        {
1364
 
                pMenuItem = gtk_separator_menu_item_new ();
1365
 
                gtk_menu_shell_append  (GTK_MENU_SHELL (menu), pMenuItem);
1366
 
                
1367
 
                _add_entry_in_menu (_("Add a manual launcher"), GTK_STOCK_ADD, cairo_dock_add_launcher, menu);
1368
 
                gtk_widget_set_tooltip_text (pMenuItem, _("Don't forget you can drag a launcher from the menu and drop it in the dock !"));
1369
 
                
1370
 
                _add_entry_in_menu (_("Add a sub-dock"), GTK_STOCK_ADD, cairo_dock_add_container, menu);
1371
 
                
1372
 
                if (icon != NULL)
 
1472
                if (! cairo_dock_is_locked ())
1373
1473
                {
1374
 
                        _add_entry_in_menu (_("Add a separator"), GTK_STOCK_ADD, cairo_dock_add_separator, menu);
 
1474
                        pMenuItem = gtk_separator_menu_item_new ();
 
1475
                        gtk_menu_shell_append  (GTK_MENU_SHELL (menu), pMenuItem);
 
1476
                        
 
1477
                        _add_entry_in_menu (_("Add a sub-dock"), GTK_STOCK_ADD, cairo_dock_add_container, menu);
 
1478
                        
 
1479
                        if (icon != NULL)
 
1480
                        {
 
1481
                                _add_entry_in_menu (_("Add a separator"), GTK_STOCK_ADD, cairo_dock_add_separator, menu);
 
1482
                        }
 
1483
                        
 
1484
                        pMenuItem = _add_entry_in_menu (_("Add a custom launcher"), GTK_STOCK_ADD, cairo_dock_add_launcher, menu);
 
1485
                        gtk_widget_set_tooltip_text (pMenuItem, _("Usually you would drag a launcher from the menu and drop it into the dock."));
1375
1486
                }
1376
 
 
1377
1487
                return CAIRO_DOCK_LET_PASS_NOTIFICATION;
1378
1488
        }
1379
1489
 
1380
1490
        //\_________________________ On rajoute des actions suivant le type de l'icone.
1381
 
        if (CAIRO_DOCK_IS_LAUNCHER (icon) || CAIRO_DOCK_IS_USER_SEPARATOR (icon) || (icon != NULL && icon->acDesktopFileName != NULL))  // le dernier cas est la pour les cas ou l'utilisateur aurait par megarde efface la commande du lanceur.
 
1491
        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).
1382
1492
        {
1383
1493
                //\_________________________ On rajoute les actions sur les icones de fichiers.
1384
1494
                if (CAIRO_DOCK_IS_URI_LAUNCHER (icon))
1386
1496
                        if (icon->iVolumeID > 0)
1387
1497
                        {
1388
1498
                                gboolean bIsMounted = FALSE;
1389
 
                                cd_message ("%s (%s / %s)\n", __func__, icon->acName, icon->acCommand);
 
1499
                                cd_message ("%s (%s / %s)\n", __func__, icon->cName, icon->cCommand);
1390
1500
                                gchar *cActivationURI = cairo_dock_fm_is_mounted  (icon->cBaseURI, &bIsMounted);
1391
1501
                                cd_message ("  cActivationURI : %s; bIsMounted : %d\n", cActivationURI, bIsMounted);
1392
1502
                                g_free (cActivationURI);
1395
1505
                                gtk_menu_shell_append  (GTK_MENU_SHELL (menu), pMenuItem);
1396
1506
                                g_signal_connect (G_OBJECT (pMenuItem), "activate", G_CALLBACK(_cairo_dock_mount_unmount), data);
1397
1507
                                
1398
 
                                if (cairo_dock_fm_can_eject (icon->acCommand))
 
1508
                                if (cairo_dock_fm_can_eject (icon->cCommand))
1399
1509
                                {
1400
1510
                                        pMenuItem = gtk_menu_item_new_with_label (_("Eject"));
1401
1511
                                        gtk_menu_shell_append  (GTK_MENU_SHELL (menu), pMenuItem);
1416
1526
                                gtk_menu_shell_append  (GTK_MENU_SHELL (menu), pMenuItem);
1417
1527
                                g_signal_connect (G_OBJECT (pMenuItem), "activate", G_CALLBACK(_cairo_dock_show_file_properties), data);
1418
1528
                        }
1419
 
                        if (icon->acDesktopFileName == NULL)  // un lanceur sans fichier .desktop, on est donc dans un sous-dock ou l'on ne peut pas faire d'autre action.
 
1529
                        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.
1420
1530
                                return CAIRO_DOCK_LET_PASS_NOTIFICATION;
1421
1531
                }
1422
1532
                
1423
1533
                //\_________________________ On rajoute des actions de modifications sur le dock.
1424
 
                if (! g_bLocked && CAIRO_DOCK_IS_DOCK (pContainer))
 
1534
                if (! cairo_dock_is_locked () && CAIRO_DOCK_IS_DOCK (pContainer))
1425
1535
                {
1426
1536
                        pMenuItem = gtk_separator_menu_item_new ();
1427
1537
                        gtk_menu_shell_append  (GTK_MENU_SHELL (menu), pMenuItem);
1428
 
                        
1429
 
                        _add_entry_in_menu (_("Add a manual launcher"), GTK_STOCK_ADD, cairo_dock_add_launcher, menu);
1430
 
                        gtk_widget_set_tooltip_text (pMenuItem, _("Don't forget you can drag a launcher from the menu and drop it in the dock !"));
1431
1538
        
1432
1539
                        _add_entry_in_menu (_("Add a sub-dock"), GTK_STOCK_ADD, cairo_dock_add_container, menu);
1433
1540
                        
1434
 
                        if (icon != NULL)
1435
 
                        {
1436
 
                                _add_entry_in_menu (_("Add a separator"), GTK_STOCK_ADD, cairo_dock_add_separator, menu);
1437
 
                        }
 
1541
                        _add_entry_in_menu (_("Add a separator"), GTK_STOCK_ADD, cairo_dock_add_separator, menu);
1438
1542
                        
1439
 
                        ///if (CAIRO_DOCK_IS_NORMAL_LAUNCHER (icon) || CAIRO_DOCK_IS_USER_SEPARATOR (icon))  // possede un .desktop.
1440
 
                        if (icon->acDesktopFileName != NULL)
 
1543
                        pMenuItem = _add_entry_in_menu (_("Add a custom launcher"), GTK_STOCK_ADD, cairo_dock_add_launcher, menu);
 
1544
                gtk_widget_set_tooltip_text (pMenuItem, _("Usually you would drag a launcher from the menu and drop it into the dock."));
 
1545
                
 
1546
                        if (icon->cDesktopFileName != NULL)  // possede un .desktop.
1441
1547
                        {
1442
1548
                                pMenuItem = gtk_separator_menu_item_new ();
1443
1549
                                gtk_menu_shell_append (GTK_MENU_SHELL (menu), pMenuItem);
1444
1550
                        
1445
 
                                _add_entry_in_menu (CAIRO_DOCK_IS_USER_SEPARATOR (icon) ? _("Remove this separator") : _("Remove this launcher"), GTK_STOCK_REMOVE, _cairo_dock_remove_launcher, menu);
 
1551
                                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);
 
1552
                                gtk_widget_set_tooltip_text (pMenuItem, _("You can remove a launcher by dragging it with the mouse out of the dock."));
1446
1553
                        
1447
1554
                                _add_entry_in_menu (CAIRO_DOCK_IS_USER_SEPARATOR (icon) ? _("Modify this separator") : _("Modify this launcher"), GTK_STOCK_EDIT, _cairo_dock_modify_launcher, menu);
 
1555
                                
 
1556
                                pMenuItem = _add_entry_in_menu (_("Move to another dock"), GTK_STOCK_JUMP_TO, NULL, menu);
 
1557
                                GtkWidget *pSubMenuDocks = gtk_menu_new ();
 
1558
                                gtk_menu_item_set_submenu (GTK_MENU_ITEM (pMenuItem), pSubMenuDocks);
 
1559
                                g_object_set_data (G_OBJECT (pSubMenuDocks), "launcher", icon);
 
1560
                                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);
 
1561
                                g_object_set_data (G_OBJECT (pMenuItem), "launcher", icon);
 
1562
                                cairo_dock_foreach_docks ((GHFunc) _add_one_dock_to_menu, pSubMenuDocks);
1448
1563
                        }
1449
1564
                }
1450
1565
        }
1462
1577
                
1463
1578
                _add_entry_in_menu (_("Move to this desktop"), GTK_STOCK_JUMP_TO, _cairo_dock_move_appli_to_current_desktop, pSubMenuOtherActions);
1464
1579
                
1465
 
                gboolean bIsFullScreen = cairo_dock_window_is_fullscreen (icon->Xid);
 
1580
                gboolean bIsFullScreen = cairo_dock_xwindow_is_fullscreen (icon->Xid);
1466
1581
                _add_entry_in_menu (bIsFullScreen ? _("Not Fullscreen") : _("Fullscreen"), bIsFullScreen ? GTK_STOCK_LEAVE_FULLSCREEN : GTK_STOCK_FULLSCREEN, _cairo_dock_set_appli_fullscreen, pSubMenuOtherActions);
1467
1582
                
1468
1583
                gboolean bIsAbove=FALSE, bIsBelow=FALSE;
1469
 
                cairo_dock_window_is_above_or_below (icon->Xid, &bIsAbove, &bIsBelow);
 
1584
                cairo_dock_xwindow_is_above_or_below (icon->Xid, &bIsAbove, &bIsBelow);
1470
1585
                _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);
1471
1586
                
1472
1587
                _add_desktops_entry (pSubMenuOtherActions, FALSE, data);
1474
1589
                _add_entry_in_menu (_("Kill"), GTK_STOCK_CANCEL, _cairo_dock_kill_appli, pSubMenuOtherActions);
1475
1590
                
1476
1591
                //\_________________________ On rajoute les actions courantes sur les icones d'applis.
1477
 
                if (icon->acDesktopFileName != NULL)  // c'est un lanceur inhibiteur.
 
1592
                if (icon->cDesktopFileName != NULL)  // c'est un lanceur inhibiteur.
1478
1593
                {
1479
1594
                        _add_entry_in_menu (_("Launch new"), GTK_STOCK_ADD, _cairo_dock_launch_new, menu);
1480
1595
                }
1484
1599
                        _add_entry_in_menu (_("Make it a launcher"), GTK_STOCK_CONVERT, _cairo_dock_make_launcher_from_appli, menu);
1485
1600
                }
1486
1601
                
1487
 
                gboolean bIsMaximized = cairo_dock_window_is_maximized (icon->Xid);
 
1602
                gboolean bIsMaximized = cairo_dock_xwindow_is_maximized (icon->Xid);
1488
1603
                _add_entry_in_menu (bIsMaximized ? _("Unmaximize") : _("Maximize"), GTK_STOCK_GO_UP, _cairo_dock_maximize_appli, menu);
1489
1604
                
1490
1605
                _add_entry_in_menu (_("Show"), GTK_STOCK_FIND, _cairo_dock_show_appli, menu);
1508
1623
                
1509
1624
                _add_desktops_entry (pSubMenuOtherActions, TRUE, data);
1510
1625
                
1511
 
                if (icon->acDesktopFileName != NULL)  // c'est un lanceur inhibiteur.
 
1626
                if (icon->cDesktopFileName != NULL)  // c'est un lanceur inhibiteur.
1512
1627
                {
1513
1628
                        _add_entry_in_menu (_("Launch new"), GTK_STOCK_ADD, _cairo_dock_launch_new, menu);
1514
1629
                }
1531
1646
                        pIconModule = NULL;
1532
1647
                
1533
1648
                //\_________________________ On rajoute les actions propres a un module.
1534
 
                if (! g_bLocked && CAIRO_DOCK_IS_APPLET (pIconModule))
 
1649
                if (! cairo_dock_is_locked () && CAIRO_DOCK_IS_APPLET (pIconModule))
1535
1650
                {
1536
1651
                        pMenuItem = gtk_separator_menu_item_new ();
1537
1652
                        gtk_menu_shell_append (GTK_MENU_SHELL (menu), pMenuItem);
1549
1664
                        {
1550
1665
                                _add_entry_in_menu (_("Launch another instance of this applet"), GTK_STOCK_ADD, _cairo_dock_add_module_instance, menu);
1551
1666
                        }
 
1667
                        
 
1668
                        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)
 
1669
                        {
 
1670
                                pMenuItem = _add_entry_in_menu (_("Move to another dock"), GTK_STOCK_JUMP_TO, NULL, menu);
 
1671
                                GtkWidget *pSubMenuDocks = gtk_menu_new ();
 
1672
                                gtk_menu_item_set_submenu (GTK_MENU_ITEM (pMenuItem), pSubMenuDocks);
 
1673
                                g_object_set_data (G_OBJECT (pSubMenuDocks), "launcher", pIconModule);
 
1674
                                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);
 
1675
                                g_object_set_data (G_OBJECT (pMenuItem), "launcher", pIconModule);
 
1676
                                cairo_dock_foreach_docks ((GHFunc) _add_one_dock_to_menu, pSubMenuDocks);
 
1677
                        }
1552
1678
                }
1553
1679
        }
1554
1680
 
1555
1681
        //\_________________________ On rajoute les actions de positionnement d'un desklet.
1556
 
        if (! g_bLocked && CAIRO_DOCK_IS_DESKLET (pContainer))
 
1682
        if (! cairo_dock_is_locked () && CAIRO_DOCK_IS_DESKLET (pContainer))
1557
1683
        {
1558
1684
                pMenuItem = gtk_separator_menu_item_new ();
1559
1685
                gtk_menu_shell_append (GTK_MENU_SHELL (menu), pMenuItem);
1568
1694
                gboolean bIsAbove=FALSE, bIsBelow=FALSE;
1569
1695
                Window Xid = GDK_WINDOW_XID (pContainer->pWidget->window);
1570
1696
                //cd_debug ("Xid : %d", Xid);
1571
 
                cairo_dock_window_is_above_or_below (Xid, &bIsAbove, &bIsBelow);  // gdk_window_get_state bugue.
 
1697
                cairo_dock_xwindow_is_above_or_below (Xid, &bIsAbove, &bIsBelow);  // gdk_window_get_state bugue.
1572
1698
                //cd_debug (" -> %d;%d", bIsAbove, bIsBelow);
1573
1699
                gboolean bIsUtility = cairo_dock_window_is_utility (Xid);  // gtk_window_get_type_hint me renvoie toujours 0 !
1574
1700
                gboolean bIsDock = (/*cairo_dock_window_is_dock (Xid) || */CAIRO_DESKLET (pContainer)->bSpaceReserved);
1575
1701
                gboolean bIsNormal = (!bIsAbove && !bIsBelow && !bIsUtility && !bIsDock);
1576
 
                gboolean bIsSticky = /*(cairo_dock_get_window_desktop (Xid) == -1) || */cairo_dock_window_is_sticky (Xid);
 
1702
                gboolean bIsSticky = /*(cairo_dock_get_xwindow_desktop (Xid) == -1) || */cairo_dock_xwindow_is_sticky (Xid);
1577
1703
                
1578
1704
                pMenuItem = gtk_radio_menu_item_new_with_label(group, _("Normal"));
1579
1705
                group = gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(pMenuItem));
1648
1774
                1,
1649
1775
                gtk_get_current_event_time ());
1650
1776
}
 
1777
 
 
1778
 
 
1779
GtkWidget *cairo_dock_add_in_menu_with_stock_and_data (const gchar *cLabel, const gchar *gtkStock, GFunc pFunction, GtkWidget *pMenu, gpointer pData)
 
1780
{
 
1781
        GtkWidget *pMenuItem = gtk_image_menu_item_new_with_label (cLabel);
 
1782
        if (gtkStock)
 
1783
        {
 
1784
                GtkWidget *image = NULL;
 
1785
                if (*gtkStock == '/')
 
1786
                {
 
1787
                        GdkPixbuf *pixbuf = gdk_pixbuf_new_from_file_at_size (gtkStock, 16, 16, NULL);
 
1788
                        image = gtk_image_new_from_pixbuf (pixbuf);
 
1789
                        g_object_unref (pixbuf);
 
1790
                }
 
1791
                else
 
1792
                {
 
1793
                        image = gtk_image_new_from_stock (gtkStock, GTK_ICON_SIZE_MENU);
 
1794
                }
 
1795
                gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (pMenuItem), image);
 
1796
        }
 
1797
        gtk_menu_shell_append  (GTK_MENU_SHELL (pMenu), pMenuItem); 
 
1798
        if (pFunction)
 
1799
                g_signal_connect (G_OBJECT (pMenuItem), "activate", G_CALLBACK (pFunction), pData);
 
1800
        return pMenuItem;
 
1801
}