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"
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"
66
extern struct tm *localtime_r (time_t *timer, struct tm *tp);
69
//extern struct tm *localtime_r (time_t *timer, struct tm *tp);
68
71
extern CairoDock *g_pMainDock;
70
73
extern gchar *g_cConfFile;
71
74
extern gchar *g_cCurrentLaunchersPath;
72
75
extern gchar *g_cCurrentThemePath;
76
extern gchar *g_cCairoDockDataDir;
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;
85
#define cairo_dock_icons_are_locked(...) (myAccessibility.bLockIcons || myAccessibility.bLockAll || g_bLocked)
86
#define cairo_dock_is_locked(...) (myAccessibility.bLockAll || g_bLocked)
88
static void _present_help_from_dialog (int iClickedButton, GtkWidget *pInteractiveWidget, gpointer data, CairoDialog *pDialog)
90
if (iClickedButton == 0 || iClickedButton == -1) // click OK or press Enter.
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);
82
97
static void _cairo_dock_edit_and_reload_conf (GtkMenuItem *pMenuItem, gpointer *data)
84
99
Icon *icon = data[0];
85
100
CairoDock *pDock = data[1];
87
102
GtkWidget *pWindow = cairo_dock_build_main_ihm (g_cConfFile, FALSE);
104
CairoDockModule *pModule = cairo_dock_find_module_from_name ("Help");
107
gchar *cHelpHistory = g_strdup_printf ("%s/.help/entered-once", g_cCairoDockDataDir);
108
if (! g_file_test (cHelpHistory, G_FILE_TEST_EXISTS))
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 ?"),
113
CAIRO_CONTAINER (g_pMainDock),
115
CAIRO_DOCK_SHARE_DATA_DIR"/"CAIRO_DOCK_ICON,
117
(CairoDockActionOnAnswerFunc) _present_help_from_dialog,
90
124
static void _cairo_dock_initiate_theme_management (GtkMenuItem *pMenuItem, gpointer *data)
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,
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,
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");
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 ();
174
215
static void _launch_url (const gchar *cURL)
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)
236
277
if (CAIRO_DOCK_IS_DOCK (pContainer))
237
279
pIcon = cairo_dock_get_dialogless_icon ();
280
pContainer = CAIRO_CONTAINER (g_pMainDock);
239
283
pIcon = CAIRO_DESKLET (pContainer)->pIcon;
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 ();
292
///////////////////////////////////////////////////////////////////
293
/////////// LES OPERATIONS SUR LES LANCEURS ///////////////////////
294
///////////////////////////////////////////////////////////////////
248
static void _cairo_dock_on_user_remove_icon (Icon *icon, CairoDock *pDock)
296
static void _cairo_dock_remove_launcher (GtkMenuItem *pMenuItem, gpointer *data)
250
cd_debug ("%s (%s)", __func__, icon->acName);
298
Icon *icon = data[0];
299
CairoDock *pDock = data[1];
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));
304
if (answer != GTK_RESPONSE_YES)
252
if (icon->pSubDock != NULL)
307
if (icon->pSubDock != NULL) // on bazarde le sous-dock.
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.
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;
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;
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);
271
cairo_dock_mark_theme_as_modified (TRUE);
273
static void _cairo_dock_remove_launcher (GtkMenuItem *pMenuItem, gpointer *data)
275
Icon *icon = data[0];
276
CairoDock *pDock = data[1];
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));
281
if (answer == GTK_RESPONSE_YES)
283
_cairo_dock_on_user_remove_icon (icon, pDock);
286
// g_print ("ok on la garde\n");
289
static void _cairo_dock_create_launcher (GtkMenuItem *pMenuItem, Icon *icon, CairoDock *pDock, CairoDockNewLauncherType iLauncherType)
321
cairo_dock_trigger_icon_removal_from_dock (icon);
324
static void _cairo_dock_create_launcher (Icon *icon, CairoDock *pDock, CairoDockDesktopFileType iLauncherType)
291
326
//\___________________ On determine l'ordre d'insertion suivant l'endroit du clique.
292
GError *erreur = NULL;
294
328
if (CAIRO_DOCK_IS_LAUNCHER (icon))
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.
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;
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);
348
switch (iLauncherType)
350
case CAIRO_DOCK_DESKTOP_FILE_FOR_CONTAINER :
351
cNewDesktopFileName = cairo_dock_add_desktop_file_for_container (cDockName, fOrder, pDock, &erreur);
353
case CAIRO_DOCK_DESKTOP_FILE_FOR_LAUNCHER :
354
cNewDesktopFileName = cairo_dock_add_desktop_file_for_launcher (cDockName, fOrder, pDock, &erreur);
356
case CAIRO_DOCK_DESKTOP_FILE_FOR_SEPARATOR :
357
cNewDesktopFileName = cairo_dock_add_desktop_file_for_separator (cDockName, fOrder, pDock, &erreur);
321
362
if (erreur != NULL)
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);
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);
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);
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);
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"));
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);
352
cairo_dock_launch_animation (CAIRO_CONTAINER (pParentDock));
353
cairo_dock_mark_theme_as_modified (TRUE);
357
g_remove (cNewDesktopFilePath);
360
g_free (cNewDesktopFilePath);
361
g_free (cNewDesktopFileName);
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);
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"));
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);
384
cairo_dock_launch_animation (CAIRO_CONTAINER (pParentDock));
385
cairo_dock_mark_theme_as_modified (TRUE);
387
g_free (cNewDesktopFileName);
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);
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.
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);
402
g_remove (cNewDesktopFilePath);
403
g_free (cNewDesktopFilePath);
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.
411
GKeyFile* pKeyFile = cairo_dock_open_key_file (cNewDesktopFilePath);
412
g_return_if_fail (pKeyFile != NULL);
414
gchar *cName = g_key_file_get_string (pKeyFile, "Desktop Entry", "Name", NULL);
416
cName = g_strdup ("dock");
417
gchar *cUniqueName = cairo_dock_get_unique_dock_name (cName);
418
if (strcmp (cName, cUniqueName) != 0)
420
g_key_file_set_string (pKeyFile, "Desktop Entry", "Name", cUniqueName);
421
cairo_dock_write_keys_to_file (pKeyFile, cNewDesktopFilePath);
424
g_free (cUniqueName);
425
g_key_file_free (pKeyFile);
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);
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"));
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);
440
cairo_dock_launch_animation (CAIRO_CONTAINER (pParentDock));
441
cairo_dock_mark_theme_as_modified (TRUE);
443
g_free (cNewDesktopFilePath);
444
g_free (cNewDesktopFileName);
364
448
static void cairo_dock_add_launcher (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);
388
static void _on_modify_launcher (Icon *icon)
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.
398
//\_____________ On recharge l'icone.
399
Window Xid = icon->Xid;
400
CairoDock *pSubDock = icon->pSubDock;
401
icon->pSubDock = NULL;
402
gchar *cClass = icon->cClass;
404
gchar *cDesktopFileName = icon->acDesktopFileName;
405
icon->acDesktopFileName = NULL;
406
gchar *cName = icon->acName;
408
gchar *cRendererName = NULL;
409
if (pSubDock != NULL)
411
cRendererName = pSubDock->cRendererName;
412
pSubDock->cRendererName = NULL;
414
cairo_t *pCairoContext = cairo_dock_create_context_from_window (CAIRO_CONTAINER (pDock));
415
cairo_dock_reload_icon_from_desktop_file (cDesktopFileName, pCairoContext, icon);
417
if (cName && ! icon->acName)
418
icon->acName = g_strdup (" ");
421
//\_____________ On gere le sous-dock.
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);
431
if (pSubDock != icon->pSubDock) // ca n'est plus le meme container, on transvase ou on detruit.
433
cairo_dock_destroy_dock (pSubDock, cName, icon->pSubDock, icon->acName);
437
if (icon->pSubDock != NULL && pSubDock == icon->pSubDock) // c'est le meme sous-dock, son rendu a pu change.
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);
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);
449
if (pDock != pNewContainer && icon->fOrder > g_list_length (pNewContainer->icons) + 1)
450
icon->fOrder = CAIRO_DOCK_LAST_ORDER;
452
cairo_dock_insert_icon_in_dock (icon, pNewContainer, CAIRO_DOCK_UPDATE_DOCK_SIZE, ! CAIRO_DOCK_ANIMATE_ICON); // on n'empeche pas les bouclages.
454
if (pDock != pNewContainer)
455
cairo_dock_update_dock_size (pDock);
457
//\_____________ On gere l'inhibition de sa classe.
458
gchar *cNowClass = icon->cClass;
459
if (cClass != NULL && (cNowClass == NULL || strcmp (cNowClass, cClass) != 0))
461
icon->cClass = cClass;
462
cairo_dock_deinhibate_class (cClass, icon);
463
cClass = NULL; // libere par la fonction precedente.
464
icon->cClass = cNowClass;
466
if (cNowClass != NULL && (cClass == NULL || strcmp (cNowClass, cClass) != 0))
467
cairo_dock_inhibate_class (cNowClass, icon);
469
//\_____________ On redessine les docks impactes.
470
cairo_dock_calculate_dock_icons (pDock);
471
gtk_widget_queue_draw (pDock->pWidget);
472
if (pNewContainer != pDock)
474
cairo_dock_calculate_dock_icons (pNewContainer);
475
gtk_widget_queue_draw (pNewContainer->pWidget);
477
if (pDock->icons == NULL)
479
cd_message ("dock %s vide => a la poubelle", cPrevDockName);
480
cairo_dock_destroy_dock (pDock, cPrevDockName, NULL, NULL);
484
g_free (cPrevDockName);
486
g_free (cDesktopFileName);
488
g_free (cRendererName);
489
cairo_destroy (pCairoContext);
490
cairo_dock_mark_theme_as_modified (TRUE);
469
_cairo_dock_create_launcher (icon, pDock, CAIRO_DOCK_DESKTOP_FILE_FOR_SEPARATOR);
492
472
static void _cairo_dock_modify_launcher (GtkMenuItem *pMenuItem, gpointer *data)
494
474
Icon *icon = data[0];
495
475
CairoDock *pDock = data[1];
497
gchar *cDesktopFilePath = g_strdup_printf ("%s/%s", g_cCurrentLaunchersPath, icon->acDesktopFileName);
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);
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);
505
_on_modify_launcher (icon);
508
if (! pDock->bInside)
510
//g_print ("on force a quitter\n");
511
pDock->bInside = TRUE;
512
pDock->bAtBottom = FALSE;
513
cairo_dock_emit_leave_signal (pDock);
477
if (icon->cDesktopFileName == NULL || strcmp (icon->cDesktopFileName, "none") == 0)
479
cairo_dock_show_temporary_dialog_with_icon (_("This icon doesn't have a desktop file."), icon, CAIRO_CONTAINER (pDock), 4000, "same icon");
485
cairo_dock_build_launcher_gui (icon);
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);
494
cairo_dock_reload_launcher (icon);
495
if (! pDock->container.bInside)
497
//g_print ("on force a quitter\n");
498
pDock->container.bInside = TRUE;
499
pDock->bAtBottom = FALSE;
500
cairo_dock_emit_leave_signal (pDock);
505
static void _cairo_dock_move_launcher_to_dock (GtkMenuItem *pMenuItem, const gchar *cDockName)
507
Icon *pIcon = g_object_get_data (G_OBJECT (pMenuItem), "launcher");
509
gchar *cValidDockName;
510
if (cDockName == NULL) // new dock
512
cValidDockName = cairo_dock_get_unique_dock_name ("dock");
516
cValidDockName = g_strdup (cDockName);
518
if (CAIRO_DOCK_IS_STORED_LAUNCHER (pIcon))
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,
524
g_free (cDesktopFilePath);
525
cairo_dock_reload_launcher (pIcon);
527
else if (CAIRO_DOCK_IS_APPLET (pIcon))
529
cairo_dock_update_conf_file (pIcon->pModuleInstance->cConfFilePath,
530
G_TYPE_STRING, "Icon", "dock name", cValidDockName,
532
cairo_dock_reload_module_instance (pIcon->pModuleInstance, TRUE); // TRUE <=> reload config.
534
g_free (cValidDockName);
536
static void _add_one_dock_to_menu (const gchar *cName, CairoDock *pDock, GtkWidget *pMenu)
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))
541
Icon *pIcon = g_object_get_data (G_OBJECT (pMenu), "launcher");
542
if (strcmp (pIcon->cParentDockName, cName) == 0)
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);
548
///////////////////////////////////////////////////////////////////
549
/////////// LES OPERATIONS SUR LES FICHIERS ///////////////////////
550
///////////////////////////////////////////////////////////////////
517
552
static void _cairo_dock_show_file_properties (GtkMenuItem *pMenuItem, gpointer *data)
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);
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))
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,
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);
538
573
GtkWidget *pLabel= gtk_label_new (NULL);
539
574
gtk_label_set_use_markup (GTK_LABEL (pLabel), TRUE);
1068
1111
icon = pDesklet->pIcon;
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);
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);
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);
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);
1131
if (bOnCompizWidgetLayer) // on verifie que la regle de Compiz est correcte.
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');
1143
if (strncmp (str, "string", 6) == 0)
1151
gchar *ptr = strrchr (str, '"');
1155
cRule = g_strdup (str);
1160
g_free (cDbusAnswer);
1161
g_print ("got rule : '%s'\n", cRule);
1163
/// gerer le cas ou Compiz n'est pas lance : comment le distinguer d'une regle vide ?...
1166
cd_warning ("couldn't get Widget Layer rule from Compiz");
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))
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);
1089
1185
static void _cairo_dock_keep_space (GtkCheckMenuItem *pMenuItem, gpointer *data)
1242
1337
GtkWidget *pSubMenu = gtk_menu_new ();
1243
1338
gtk_menu_item_set_submenu (GTK_MENU_ITEM (pMenuItem), pSubMenu);
1340
if (! cairo_dock_is_locked ())
1247
_add_entry_in_menu (_("Configure"), GTK_STOCK_PREFERENCES, _cairo_dock_edit_and_reload_conf, pSubMenu);
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."));
1249
1345
pMenuItem = gtk_separator_menu_item_new ();
1250
1346
gtk_menu_shell_append (GTK_MENU_SHELL (pSubMenu), pMenuItem);
1252
1348
if (CAIRO_DOCK_IS_DOCK (pContainer) && ! CAIRO_DOCK (pContainer)->bIsMainDock && CAIRO_DOCK (pContainer)->iRefCount == 0)
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."));
1256
_add_entry_in_menu (_("Manage themes"), GTK_STOCK_EXECUTE, _cairo_dock_initiate_theme_management, pSubMenu);
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."));
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,
1360
gtk_widget_set_tooltip_text (pMenuItem, _("This will (un)lock the position of the icons."));
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,
1368
gtk_widget_set_tooltip_text (pMenuItem, _("This will (un)lock the whole dock."));
1267
1371
if (CAIRO_DOCK_IS_DOCK (pContainer) && ! CAIRO_DOCK (pContainer)->bAutoHide)
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."));
1272
1377
gchar *cCairoAutoStartDirPath = g_strdup_printf ("%s/.config/autostart", g_getenv ("HOME"));
1359
1467
GtkWidget *pMenuItem, *image;
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)))
1364
pMenuItem = gtk_separator_menu_item_new ();
1365
gtk_menu_shell_append (GTK_MENU_SHELL (menu), pMenuItem);
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 !"));
1370
_add_entry_in_menu (_("Add a sub-dock"), GTK_STOCK_ADD, cairo_dock_add_container, menu);
1472
if (! cairo_dock_is_locked ())
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);
1477
_add_entry_in_menu (_("Add a sub-dock"), GTK_STOCK_ADD, cairo_dock_add_container, menu);
1481
_add_entry_in_menu (_("Add a separator"), GTK_STOCK_ADD, cairo_dock_add_separator, menu);
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."));
1377
1487
return CAIRO_DOCK_LET_PASS_NOTIFICATION;
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).
1383
1493
//\_________________________ On rajoute les actions sur les icones de fichiers.
1384
1494
if (CAIRO_DOCK_IS_URI_LAUNCHER (icon))
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);
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;
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))
1426
1536
pMenuItem = gtk_separator_menu_item_new ();
1427
1537
gtk_menu_shell_append (GTK_MENU_SHELL (menu), pMenuItem);
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 !"));
1432
1539
_add_entry_in_menu (_("Add a sub-dock"), GTK_STOCK_ADD, cairo_dock_add_container, menu);
1436
_add_entry_in_menu (_("Add a separator"), GTK_STOCK_ADD, cairo_dock_add_separator, menu);
1541
_add_entry_in_menu (_("Add a separator"), GTK_STOCK_ADD, cairo_dock_add_separator, menu);
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."));
1546
if (icon->cDesktopFileName != NULL) // possede un .desktop.
1442
1548
pMenuItem = gtk_separator_menu_item_new ();
1443
1549
gtk_menu_shell_append (GTK_MENU_SHELL (menu), pMenuItem);
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."));
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);
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);