2
* This file is a part of the Cairo-Dock project
4
* Copyright : (C) see the 'copyright' file.
5
* E-mail : see the 'copyright' file.
7
* This program is free software; you can redistribute it and/or
8
* modify it under the terms of the GNU General Public License
9
* as published by the Free Software Foundation; either version 3
10
* of the License, or (at your option) any later version.
12
* This program is distributed in the hope that it will be useful,
13
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
* GNU General Public License for more details.
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/>.
28
#include "../config.h"
33
static char DES_crypt_key[64] =
35
1,0,0,1,1,1,0,0, 1,0,1,1,1,0,1,1, 1,1,0,1,0,1,0,1, 1,1,0,0,0,0,0,1,
36
0,0,0,1,0,1,1,0, 1,1,1,0,1,1,1,0, 1,1,1,0,0,1,0,0, 1,0,1,0,1,0,1,1
40
#include "cairo-dock-draw.h"
41
#include "cairo-dock-draw-opengl.h"
42
#include "cairo-dock-load.h"
43
#include "cairo-dock-icons.h"
44
#include "cairo-dock-applications-manager.h"
45
#include "cairo-dock-modules.h"
46
#include "cairo-dock-keyfile-utilities.h"
47
#include "cairo-dock-dock-factory.h"
48
#include "cairo-dock-themes-manager.h"
49
#include "cairo-dock-backends-manager.h"
50
#include "cairo-dock-callbacks.h"
51
#include "cairo-dock-dialog-manager.h"
52
#include "cairo-dock-X-utilities.h"
53
#include "cairo-dock-log.h"
54
#include "cairo-dock-keybinder.h"
55
#include "cairo-dock-dock-manager.h"
56
#include "cairo-dock-surface-factory.h"
57
#include "cairo-dock-class-manager.h"
58
#include "cairo-dock-gui-manager.h"
59
#include "cairo-dock-desklet-manager.h"
60
#include "cairo-dock-internal-position.h"
61
#include "cairo-dock-internal-accessibility.h"
62
#include "cairo-dock-internal-system.h"
63
#include "cairo-dock-internal-taskbar.h"
64
#include "cairo-dock-internal-dialogs.h"
65
#include "cairo-dock-internal-indicators.h"
66
#include "cairo-dock-internal-views.h"
67
#include "cairo-dock-internal-labels.h"
68
#include "cairo-dock-internal-desklets.h"
69
#include "cairo-dock-internal-icons.h"
70
#include "cairo-dock-internal-background.h"
71
#include "cairo-dock-container.h"
72
#include "cairo-dock-dock-facility.h"
73
#include "cairo-dock-file-manager.h"
74
#include "cairo-dock-animations.h"
75
#include "cairo-dock-launcher-manager.h"
76
#include "cairo-dock-indicator-manager.h"
77
#include "cairo-dock-config.h"
79
CairoDockDesktopBackground *g_pFakeTransparencyDesktopBg = NULL;
80
gboolean g_bEasterEggs = FALSE;
82
extern gchar *g_cCurrentLaunchersPath;
83
extern gchar *g_cConfFile;
84
extern gboolean g_bUseOpenGL;
85
extern CairoDockDesktopEnv g_iDesktopEnv;
86
extern CairoDockHidingEffect *g_pHidingBackend;
88
static gboolean s_bLoading = FALSE;
91
gboolean cairo_dock_get_boolean_key_value (GKeyFile *pKeyFile, const gchar *cGroupName, const gchar *cKeyName, gboolean *bFlushConfFileNeeded, gboolean bDefaultValue, const gchar *cDefaultGroupName, const gchar *cDefaultKeyName)
93
GError *erreur = NULL;
94
gboolean bValue = g_key_file_get_boolean (pKeyFile, cGroupName, cKeyName, &erreur);
97
if (bFlushConfFileNeeded != NULL)
98
cd_warning (erreur->message);
99
g_error_free (erreur);
102
gchar* cGroupNameUpperCase = g_ascii_strup (cGroupName, -1);
103
bValue = g_key_file_get_boolean (pKeyFile, cGroupNameUpperCase, cKeyName, &erreur);
104
g_free (cGroupNameUpperCase);
107
g_error_free (erreur);
109
bValue = g_key_file_get_boolean (pKeyFile, "Cairo Dock", cKeyName, &erreur);
112
g_error_free (erreur);
114
bValue = g_key_file_get_boolean (pKeyFile, (cDefaultGroupName != NULL ? cDefaultGroupName : cGroupName), (cDefaultKeyName != NULL ? cDefaultKeyName : cKeyName), &erreur);
117
g_error_free (erreur);
118
bValue = bDefaultValue;
121
cd_message (" (recuperee)");
124
cd_message (" (recuperee)");
127
g_key_file_set_boolean (pKeyFile, cGroupName, cKeyName, bValue);
128
if (bFlushConfFileNeeded != NULL)
129
*bFlushConfFileNeeded = TRUE;
134
int cairo_dock_get_integer_key_value (GKeyFile *pKeyFile, const gchar *cGroupName, const gchar *cKeyName, gboolean *bFlushConfFileNeeded, int iDefaultValue, const gchar *cDefaultGroupName, const gchar *cDefaultKeyName)
136
GError *erreur = NULL;
137
int iValue = g_key_file_get_integer (pKeyFile, cGroupName, cKeyName, &erreur);
140
if (bFlushConfFileNeeded != NULL)
141
cd_warning (erreur->message);
142
g_error_free (erreur);
145
gchar* cGroupNameUpperCase = g_ascii_strup (cGroupName, -1);
146
iValue = g_key_file_get_integer (pKeyFile, cGroupNameUpperCase, cKeyName, &erreur);
149
g_error_free (erreur);
151
iValue = g_key_file_get_integer (pKeyFile, "Cairo Dock", cKeyName, &erreur);
154
g_error_free (erreur);
156
iValue = g_key_file_get_integer (pKeyFile, (cDefaultGroupName != NULL ? cDefaultGroupName : cGroupName), (cDefaultKeyName != NULL ? cDefaultKeyName : cKeyName), &erreur);
159
g_error_free (erreur);
160
iValue = iDefaultValue;
163
cd_message (" (recuperee)");
166
cd_message (" (recuperee)");
168
g_free (cGroupNameUpperCase);
170
g_key_file_set_integer (pKeyFile, cGroupName, cKeyName, iValue);
171
if (bFlushConfFileNeeded != NULL)
172
*bFlushConfFileNeeded = TRUE;
177
double cairo_dock_get_double_key_value (GKeyFile *pKeyFile, const gchar *cGroupName, const gchar *cKeyName, gboolean *bFlushConfFileNeeded, double fDefaultValue, const gchar *cDefaultGroupName, const gchar *cDefaultKeyName)
179
GError *erreur = NULL;
180
double fValue = g_key_file_get_double (pKeyFile, cGroupName, cKeyName, &erreur);
183
if (bFlushConfFileNeeded != NULL)
184
cd_warning (erreur->message);
185
g_error_free (erreur);
188
gchar* cGroupNameUpperCase = g_ascii_strup (cGroupName, -1);
189
fValue = g_key_file_get_double (pKeyFile, cGroupNameUpperCase, cKeyName, &erreur);
192
g_error_free (erreur);
194
fValue = g_key_file_get_double (pKeyFile, "Cairo Dock", cKeyName, &erreur);
197
g_error_free (erreur);
199
fValue = g_key_file_get_double (pKeyFile, (cDefaultGroupName != NULL ? cDefaultGroupName : cGroupName), (cDefaultKeyName != NULL ? cDefaultKeyName : cKeyName), &erreur);
202
g_error_free (erreur);
203
fValue = fDefaultValue;
206
cd_message (" (recuperee)");
209
cd_message (" (recuperee)");
211
g_free (cGroupNameUpperCase);
213
g_key_file_set_double (pKeyFile, cGroupName, cKeyName, fValue);
214
if (bFlushConfFileNeeded != NULL)
215
*bFlushConfFileNeeded = TRUE;
220
gchar *cairo_dock_get_string_key_value (GKeyFile *pKeyFile, const gchar *cGroupName, const gchar *cKeyName, gboolean *bFlushConfFileNeeded, const gchar *cDefaultValue, const gchar *cDefaultGroupName, const gchar *cDefaultKeyName)
222
GError *erreur = NULL;
223
gchar *cValue = g_key_file_get_string (pKeyFile, cGroupName, cKeyName, &erreur);
226
if (bFlushConfFileNeeded != NULL)
227
cd_warning (erreur->message);
228
g_error_free (erreur);
231
gchar* cGroupNameUpperCase = g_ascii_strup (cGroupName, -1);
232
cValue = g_key_file_get_string (pKeyFile, cGroupNameUpperCase, cKeyName, &erreur);
235
g_error_free (erreur);
237
cValue = g_key_file_get_string (pKeyFile, "Cairo Dock", cKeyName, &erreur);
240
g_error_free (erreur);
242
cValue = g_key_file_get_string (pKeyFile, (cDefaultGroupName != NULL ? cDefaultGroupName : cGroupName), (cDefaultKeyName != NULL ? cDefaultKeyName : cKeyName), &erreur);
245
g_error_free (erreur);
246
cValue = g_strdup (cDefaultValue);
249
cd_message (" (recuperee)");
252
cd_message (" (recuperee)");
254
g_free (cGroupNameUpperCase);
256
g_key_file_set_string (pKeyFile, cGroupName, cKeyName, (cValue != NULL ? cValue : ""));
257
if (bFlushConfFileNeeded != NULL)
258
*bFlushConfFileNeeded = TRUE;
260
if (cValue != NULL && *cValue == '\0')
268
void cairo_dock_get_integer_list_key_value (GKeyFile *pKeyFile, const gchar *cGroupName, const gchar *cKeyName, gboolean *bFlushConfFileNeeded, int *iValueBuffer, guint iNbElements, int *iDefaultValues, const gchar *cDefaultGroupName, const gchar *cDefaultKeyName)
270
GError *erreur = NULL;
272
if (iDefaultValues != NULL)
273
memcpy (iValueBuffer, iDefaultValues, iNbElements * sizeof (int));
275
int *iValuesList = g_key_file_get_integer_list (pKeyFile, cGroupName, cKeyName, &length, &erreur);
278
if (bFlushConfFileNeeded != NULL)
279
cd_warning (erreur->message);
280
g_error_free (erreur);
283
gchar* cGroupNameUpperCase = g_ascii_strup (cGroupName, -1);
284
iValuesList = g_key_file_get_integer_list (pKeyFile, cGroupNameUpperCase, cKeyName, &length, &erreur);
287
g_error_free (erreur);
289
iValuesList = g_key_file_get_integer_list (pKeyFile, "Cairo Dock", cKeyName, &length, &erreur);
292
g_error_free (erreur);
294
iValuesList = g_key_file_get_integer_list (pKeyFile, (cDefaultGroupName != NULL ? cDefaultGroupName : cGroupName), (cDefaultKeyName != NULL ? cDefaultKeyName : cKeyName), &length, &erreur);
297
g_error_free (erreur);
301
cd_message (" (recuperee)");
303
memcpy (iValueBuffer, iValuesList, MIN (iNbElements, length) * sizeof (int));
308
cd_message (" (recuperee)");
310
memcpy (iValueBuffer, iValuesList, MIN (iNbElements, length) * sizeof (int));
316
memcpy (iValueBuffer, iValuesList, MIN (iNbElements, length) * sizeof (int));
318
g_free (cGroupNameUpperCase);
320
if (iDefaultValues != NULL) // on ne modifie les valeurs actuelles que si on a explicitement passe des valeurs par defaut en entree; sinon on considere que l'on va traiter le cas en aval.
321
g_key_file_set_integer_list (pKeyFile, cGroupName, cKeyName, iValueBuffer, iNbElements);
322
if (bFlushConfFileNeeded != NULL)
323
*bFlushConfFileNeeded = TRUE;
328
memcpy (iValueBuffer, iValuesList, MIN (iNbElements, length) * sizeof (int));
330
g_free (iValuesList);
333
void cairo_dock_get_double_list_key_value (GKeyFile *pKeyFile, const gchar *cGroupName, const gchar *cKeyName, gboolean *bFlushConfFileNeeded, double *fValueBuffer, guint iNbElements, double *fDefaultValues, const gchar *cDefaultGroupName, const gchar *cDefaultKeyName)
335
GError *erreur = NULL;
337
if (fDefaultValues != NULL)
338
memcpy (fValueBuffer, fDefaultValues, iNbElements * sizeof (double));
340
double *fValuesList = g_key_file_get_double_list (pKeyFile, cGroupName, cKeyName, &length, &erreur);
343
if (bFlushConfFileNeeded != NULL)
344
cd_warning (erreur->message);
345
g_error_free (erreur);
348
gchar* cGroupNameUpperCase = g_ascii_strup (cGroupName, -1);
349
fValuesList = g_key_file_get_double_list (pKeyFile, cGroupNameUpperCase, cKeyName, &length, &erreur);
352
g_error_free (erreur);
354
fValuesList = g_key_file_get_double_list (pKeyFile, "Cairo Dock", cKeyName, &length, &erreur);
357
g_error_free (erreur);
359
fValuesList = g_key_file_get_double_list (pKeyFile, (cDefaultGroupName != NULL ? cDefaultGroupName : cGroupName), (cDefaultKeyName != NULL ? cDefaultKeyName : cKeyName), &length, &erreur);
362
g_error_free (erreur);
366
cd_message (" (recuperee)");
368
memcpy (fValueBuffer, fValuesList, MIN (iNbElements, length) * sizeof (double));
373
cd_message (" (recuperee)");
375
memcpy (fValueBuffer, fValuesList, MIN (iNbElements, length) * sizeof (double));
381
memcpy (fValueBuffer, fValuesList, MIN (iNbElements, length) * sizeof (double));
383
g_free (cGroupNameUpperCase);
385
g_key_file_set_double_list (pKeyFile, cGroupName, cKeyName, fValueBuffer, iNbElements);
386
if (bFlushConfFileNeeded != NULL)
387
*bFlushConfFileNeeded = TRUE;
392
memcpy (fValueBuffer, fValuesList, MIN (iNbElements, length) * sizeof (double));
394
g_free (fValuesList);
397
gchar **cairo_dock_get_string_list_key_value (GKeyFile *pKeyFile, const gchar *cGroupName, const gchar *cKeyName, gboolean *bFlushConfFileNeeded, gsize *length, const gchar *cDefaultValues, const gchar *cDefaultGroupName, const gchar *cDefaultKeyName)
399
GError *erreur = NULL;
401
gchar **cValuesList = g_key_file_get_string_list (pKeyFile, cGroupName, cKeyName, length, &erreur);
404
if (bFlushConfFileNeeded != NULL)
405
cd_warning (erreur->message);
406
g_error_free (erreur);
409
gchar* cGroupNameUpperCase = g_ascii_strup (cGroupName, -1);
410
cValuesList = g_key_file_get_string_list (pKeyFile, cGroupNameUpperCase, cKeyName, length, &erreur);
413
g_error_free (erreur);
415
cValuesList = g_key_file_get_string_list (pKeyFile, (cDefaultGroupName != NULL ? cDefaultGroupName : cGroupName), (cDefaultKeyName != NULL ? cDefaultKeyName : cKeyName), length, &erreur);
418
g_error_free (erreur);
419
cValuesList = g_strsplit (cDefaultValues, ";", -1); // "" -> NULL.
421
if (cValuesList != NULL)
423
while (cValuesList[i] != NULL)
429
g_free (cGroupNameUpperCase);
432
g_key_file_set_string_list (pKeyFile, cGroupName, cKeyName, (const gchar **)cValuesList, *length);
434
g_key_file_set_string (pKeyFile, cGroupName, cKeyName, "");
435
if (bFlushConfFileNeeded != NULL)
436
*bFlushConfFileNeeded = TRUE;
438
if (cValuesList != NULL && (cValuesList[0] == NULL || (*(cValuesList[0]) == '\0' && *length == 1)))
440
g_strfreev (cValuesList);
447
gchar *cairo_dock_get_file_path_key_value (GKeyFile *pKeyFile, const gchar *cGroupName, const gchar *cKeyName, gboolean *bFlushConfFileNeeded, const gchar *cDefaultGroupName, const gchar *cDefaultKeyName, const gchar *cDefaultDir, const gchar *cDefaultFileName)
449
gchar *cFileName = cairo_dock_get_string_key_value (pKeyFile, cGroupName, cKeyName, bFlushConfFileNeeded, NULL, cDefaultGroupName, cDefaultKeyName);
450
gchar *cFilePath = NULL;
451
if (cFileName != NULL)
452
cFilePath = cairo_dock_generate_file_path (cFileName);
453
else if (cDefaultFileName != NULL && cDefaultDir != NULL)
454
cFilePath = g_strdup_printf ("%s/%s", cDefaultDir, cDefaultFileName);
457
void cairo_dock_get_size_key_value (GKeyFile *pKeyFile, const gchar *cGroupName, const gchar *cKeyName, gboolean *bFlushConfFileNeeded, gint iDefaultSize, const gchar *cDefaultGroupName, const gchar *cDefaultKeyName, int *iWidth, int *iHeight)
460
int iDefaultValues[2] = {iDefaultSize, iDefaultSize};
461
cairo_dock_get_integer_list_key_value (pKeyFile, cGroupName, cKeyName, bFlushConfFileNeeded, iSize, 2, iDefaultValues, cDefaultGroupName, cDefaultKeyName);
467
void cairo_dock_load_config (const gchar *cConfFilePath, CairoDock *pMainDock)
469
//\___________________ On ouvre le fichier de conf.
470
gboolean bFlushConfFileNeeded = FALSE; // si un champ n'existe pas, on le rajoute au fichier de conf.
471
GKeyFile *pKeyFile = cairo_dock_open_key_file (cConfFilePath);
472
g_return_if_fail (pKeyFile != NULL);
476
//\___________________ On recupere la conf de tous les modules.
477
bFlushConfFileNeeded = cairo_dock_get_global_config (pKeyFile);
479
//\___________________ Post-initialisation : parametres impactant le main dock.
480
pMainDock->iGapX = myPosition.iGapX;
481
pMainDock->iGapY = myPosition.iGapY;
482
pMainDock->fAlign = myPosition.fAlign;
483
if (myPosition.bUseXinerama)
485
pMainDock->iNumScreen = myPosition.iNumScreen;
486
cairo_dock_get_screen_offsets (myPosition.iNumScreen, &pMainDock->iScreenOffsetX, &pMainDock->iScreenOffsetY);
489
cairo_dock_set_dock_orientation (pMainDock, myPosition.iScreenBorder);
490
cairo_dock_move_resize_dock (pMainDock);
492
//\___________________ fausse transparence.
493
if (mySystem.bUseFakeTransparency)
495
g_pFakeTransparencyDesktopBg = cairo_dock_get_desktop_background (g_bUseOpenGL);
498
//\___________________ On charge les images dont on aura besoin tout de suite.
499
cairo_dock_load_icon_textures ();
500
cairo_dock_load_indicator_textures ();
502
cairo_dock_load_visible_zone (myAccessibility.cZoneImage, myAccessibility.iZoneWidth, myAccessibility.iZoneHeight, myAccessibility.fZoneAlpha);
504
cairo_dock_create_icon_fbo ();
506
//\___________________ On charge les lanceurs.
507
pMainDock->fFlatDockWidth = - myIcons.iIconGap; // car on ne le connaissait pas encore au moment de sa creation .
508
cairo_dock_build_docks_tree_with_desktop_files (g_cCurrentLaunchersPath);
510
cairo_dock_hide_show_launchers_on_other_desktops (pMainDock);
512
//\___________________ On charge les applets.
514
g_get_current_time (&time_val); // on pourrait aussi utiliser un compteur statique a la fonction ...
515
double fTime = time_val.tv_sec + time_val.tv_usec * 1e-6;
516
cairo_dock_activate_modules_from_list (mySystem.cActiveModuleList, fTime);
518
//\___________________ On lance la barre des taches.
519
if (myTaskBar.bShowAppli)
521
cairo_dock_start_application_manager (pMainDock); // va inserer le separateur si necessaire.
524
//\___________________ On dessine tout.
525
cairo_dock_draw_subdock_icons ();
527
cairo_dock_set_all_views_to_default (0); // met a jour la taille de tous les docks, maintenant qu'ils sont tous remplis.
528
cairo_dock_redraw_root_docks (FALSE); // FALSE <=> main dock inclus.
530
//\___________________ On charge le comportement d'accessibilite.
531
g_pHidingBackend = cairo_dock_get_hiding_effect (myAccessibility.cHideEffect);
533
cairo_dock_set_dock_visibility (pMainDock, myAccessibility.iVisibility);
535
//\___________________ On charge les decorations des desklets.
536
if (myDesklets.cDeskletDecorationsName != NULL) // chargement initial, on charge juste ceux qui n'ont pas encore leur deco et qui ont atteint leur taille definitive.
538
cairo_dock_reload_desklets_decorations (FALSE);
541
//\___________________ On charge les listes de backends.
542
cairo_dock_update_renderer_list_for_gui ();
543
cairo_dock_update_desklet_decorations_list_for_gui ();
544
cairo_dock_update_desklet_decorations_list_for_applet_gui ();
545
cairo_dock_update_animations_list_for_gui ();
546
cairo_dock_update_dialog_decorator_list_for_gui ();
548
//\___________________ On met a jour le fichier sur le disque si necessaire.
549
if (! bFlushConfFileNeeded)
550
bFlushConfFileNeeded = cairo_dock_conf_file_needs_update (pKeyFile, GLDI_VERSION);
551
if (bFlushConfFileNeeded)
553
cairo_dock_flush_conf_file (pKeyFile, cConfFilePath, CAIRO_DOCK_SHARE_DATA_DIR, CAIRO_DOCK_CONF_FILE);
556
g_key_file_free (pKeyFile);
560
cairo_dock_trigger_refresh_launcher_gui ();
563
void cairo_dock_read_conf_file (const gchar *cConfFilePath, CairoDock *pDock)
565
//g_print ("%s (%s)\n", __func__, cConfFilePath);
566
GError *erreur = NULL;
568
gboolean bFlushConfFileNeeded = FALSE, bFlushConfFileNeeded2 = FALSE; // si un champ n'existe pas, on le rajoute au fichier de conf.
570
//\___________________ On ouvre le fichier de conf.
571
GKeyFile *pKeyFile = cairo_dock_open_key_file (cConfFilePath);
572
if (pKeyFile == NULL)
577
//\___________________ On garde une trace de certains parametres.
578
gchar *cRaiseDockShortcutOld = myAccessibility.cRaiseDockShortcut;
579
myAccessibility.cRaiseDockShortcut = NULL;
580
///gboolean bPopUpOld = myAccessibility.bPopUp; // FALSE initialement.
581
gboolean bUseFakeTransparencyOld = mySystem.bUseFakeTransparency; // FALSE initialement.
582
gboolean bGroupAppliByClassOld = myTaskBar.bGroupAppliByClass; // FALSE initialement.
583
gboolean bHideVisibleApplisOld = myTaskBar.bHideVisibleApplis;
584
gboolean bAppliOnCurrentDesktopOnlyOld = myTaskBar.bAppliOnCurrentDesktopOnly;
585
gboolean bMixLauncherAppliOld = myTaskBar.bMixLauncherAppli;
586
gboolean bOverWriteXIconsOld = myTaskBar.bOverWriteXIcons; // TRUE initialement.
587
gint iMinimizedWindowRenderTypeOld = myTaskBar.iMinimizedWindowRenderType;
588
gchar *cDeskletDecorationsNameOld = myDesklets.cDeskletDecorationsName;
589
myDesklets.cDeskletDecorationsName = NULL;
590
int iSeparateIconsOld = myIcons.iSeparateIcons;
591
CairoDockIconType tIconTypeOrderOld[CAIRO_DOCK_NB_TYPES];
592
memcpy (tIconTypeOrderOld, myIcons.tIconTypeOrder, sizeof (tIconTypeOrderOld));
594
//\___________________ On recupere la conf de tous les modules.
595
bFlushConfFileNeeded = cairo_dock_get_global_config (pKeyFile);
597
//\___________________ Post-initialisation : parametres impactant le main dock.
598
pDock->iGapX = myPosition.iGapX;
599
pDock->iGapY = myPosition.iGapY;
601
pDock->fAlign = myPosition.fAlign;
603
gboolean bGroupOrderChanged;
604
if (tIconTypeOrderOld[CAIRO_DOCK_LAUNCHER] != myIcons.tIconTypeOrder[CAIRO_DOCK_LAUNCHER] ||
605
tIconTypeOrderOld[CAIRO_DOCK_APPLI] != myIcons.tIconTypeOrder[CAIRO_DOCK_APPLI] ||
606
tIconTypeOrderOld[CAIRO_DOCK_APPLET] != myIcons.tIconTypeOrder[CAIRO_DOCK_APPLET])
607
bGroupOrderChanged = TRUE;
609
bGroupOrderChanged = FALSE;
611
if (myPosition.bUseXinerama)
613
pDock->iNumScreen = myPosition.iNumScreen;
614
cairo_dock_get_screen_offsets (myPosition.iNumScreen, &pDock->iScreenOffsetX, &pDock->iScreenOffsetY);
618
pDock->iNumScreen = pDock->iScreenOffsetX = pDock->iScreenOffsetY = 0;
621
switch (myPosition.iScreenBorder)
623
case CAIRO_DOCK_BOTTOM :
625
pDock->container.bIsHorizontal = CAIRO_DOCK_HORIZONTAL;
626
pDock->container.bDirectionUp = TRUE;
628
case CAIRO_DOCK_TOP :
629
pDock->container.bIsHorizontal = CAIRO_DOCK_HORIZONTAL;
630
pDock->container.bDirectionUp = FALSE;
632
case CAIRO_DOCK_RIGHT :
633
pDock->container.bIsHorizontal = CAIRO_DOCK_VERTICAL;
634
pDock->container.bDirectionUp = TRUE;
636
case CAIRO_DOCK_LEFT :
637
pDock->container.bIsHorizontal = CAIRO_DOCK_VERTICAL;
638
pDock->container.bDirectionUp = FALSE;
642
//\___________________ On (re)charge tout, car n'importe quel parametre peut avoir change.
643
// fausse transparence.
644
if (mySystem.bUseFakeTransparency)
646
if (g_pFakeTransparencyDesktopBg == NULL)
648
g_pFakeTransparencyDesktopBg = cairo_dock_get_desktop_background (g_bUseOpenGL);
650
else if (g_bUseOpenGL)
652
CairoDockDesktopBackground *dummy = cairo_dock_get_desktop_background (g_bUseOpenGL); // pour recharger la texture.
653
cairo_dock_destroy_desktop_background (dummy);
656
else if (g_pFakeTransparencyDesktopBg != NULL)
658
cairo_dock_destroy_desktop_background (g_pFakeTransparencyDesktopBg);
659
g_pFakeTransparencyDesktopBg = NULL;
662
//\___________________ on recharge les buffers d'images.
663
cairo_dock_unload_dialog_buttons (); // on se contente de remettre a zero ces buffers,
664
cairo_dock_unload_desklet_buttons (); // qui seront charges lorsque necessaire.
666
cairo_dock_load_icon_textures ();
667
cairo_dock_load_indicator_textures ();
669
cairo_dock_load_visible_zone (myAccessibility.cZoneImage, myAccessibility.iZoneWidth, myAccessibility.iZoneHeight, myAccessibility.fZoneAlpha);
671
///cairo_dock_create_icon_pbuffer ();
672
cairo_dock_create_icon_fbo ();
674
//\___________________ On recharge les lanceurs, les applis, et les applets.
675
if (bGroupAppliByClassOld != myTaskBar.bGroupAppliByClass ||
676
bHideVisibleApplisOld != myTaskBar.bHideVisibleApplis ||
677
bAppliOnCurrentDesktopOnlyOld != myTaskBar.bAppliOnCurrentDesktopOnly ||
678
bMixLauncherAppliOld != myTaskBar.bMixLauncherAppli ||
679
bOverWriteXIconsOld != myTaskBar.bOverWriteXIcons ||
680
iMinimizedWindowRenderTypeOld != myTaskBar.iMinimizedWindowRenderType ||
681
(cairo_dock_application_manager_is_running () && ! myTaskBar.bShowAppli)) // on ne veut plus voir les applis, il faut donc les enlever.
683
cairo_dock_stop_application_manager ();
686
if (bGroupOrderChanged || myIcons.iSeparateIcons != iSeparateIconsOld)
687
pDock->icons = g_list_sort (pDock->icons, (GCompareFunc) cairo_dock_compare_icons_order);
689
if ((iSeparateIconsOld && ! myIcons.iSeparateIcons) || bGroupOrderChanged)
690
cairo_dock_remove_automatic_separators (pDock);
692
if (pDock->icons == NULL)
694
pDock->fFlatDockWidth = - myIcons.iIconGap; // car on ne le connaissait pas encore au moment de la creation du dock.
695
cairo_dock_build_docks_tree_with_desktop_files (g_cCurrentLaunchersPath);
699
cairo_dock_synchronize_sub_docks_orientation (pDock, FALSE);
700
cairo_dock_reload_buffers_in_all_docks (FALSE); // tout sauf les applets, qui seront rechargees en bloc juste apres.
704
g_get_current_time (&time_val); // on pourrait aussi utiliser un compteur statique a la fonction ...
705
double fTime = time_val.tv_sec + time_val.tv_usec * 1e-6;
706
cairo_dock_activate_modules_from_list (mySystem.cActiveModuleList, fTime);
707
cairo_dock_deactivate_old_modules (fTime);
709
if (! cairo_dock_application_manager_is_running () && myTaskBar.bShowAppli) // maintenant on veut voir les applis !
711
cairo_dock_start_application_manager (pDock); // va inserer le separateur si necessaire.
714
if (myIcons.iSeparateIcons && (! iSeparateIconsOld || bGroupOrderChanged))
716
cairo_dock_insert_separators_in_dock (pDock);
719
cairo_dock_draw_subdock_icons ();
721
cairo_dock_set_all_views_to_default (0); // met a jour la taille de tous les docks, maintenant qu'ils sont tous remplis.
722
cairo_dock_redraw_root_docks (TRUE); // TRUE <=> sauf le main dock.
724
if (myAccessibility.cRaiseDockShortcut != NULL)
726
if (cRaiseDockShortcutOld == NULL || strcmp (myAccessibility.cRaiseDockShortcut, cRaiseDockShortcutOld) != 0)
728
if (cRaiseDockShortcutOld != NULL)
729
cd_keybinder_unbind (cRaiseDockShortcutOld, (CDBindkeyHandler) cairo_dock_raise_from_shortcut);
730
if (! cd_keybinder_bind (myAccessibility.cRaiseDockShortcut, (CDBindkeyHandler) cairo_dock_raise_from_shortcut, NULL))
732
g_free (myAccessibility.cRaiseDockShortcut);
733
myAccessibility.cRaiseDockShortcut = NULL;
739
if (cRaiseDockShortcutOld != NULL)
741
cd_keybinder_unbind (cRaiseDockShortcutOld, (CDBindkeyHandler) cairo_dock_raise_from_shortcut);
742
cairo_dock_move_resize_dock (pDock);
743
gtk_widget_show (pDock->container.pWidget);
746
g_free (cRaiseDockShortcutOld);
748
//\___________________ On gere le changement dans la visibilite.
749
g_pHidingBackend = cairo_dock_get_hiding_effect (myAccessibility.cHideEffect);
751
if (pDock->bAutoHide)
753
pDock->iInputState = CAIRO_DOCK_INPUT_HIDDEN; // le 'configure' mettra a jour la zone d'input.
754
pDock->fHideOffset = 1.;
758
cairo_dock_start_showing (pDock);
761
cairo_dock_hide_show_launchers_on_other_desktops (pDock);
763
cairo_dock_set_dock_visibility (pDock, myAccessibility.iVisibility);
765
///cairo_dock_load_background_decorations (pDock);
767
cairo_dock_move_resize_dock (pDock);
769
pDock->container.iMouseX = 0; // on se place hors du dock initialement.
770
pDock->container.iMouseY = 0;
771
cairo_dock_calculate_dock_icons (pDock);
772
gtk_widget_queue_draw (pDock->container.pWidget); // le 'gdk_window_move_resize' ci-dessous ne provoquera pas le redessin si la taille n'a pas change.
774
//\___________________ On recharge les decorations des desklets.
775
if (cDeskletDecorationsNameOld == NULL && myDesklets.cDeskletDecorationsName != NULL) // chargement initial, on charge juste ceux qui n'ont pas encore leur deco et qui ont atteint leur taille definitive.
777
cairo_dock_reload_desklets_decorations (FALSE);
779
else if (cDeskletDecorationsNameOld != NULL && (myDesklets.cDeskletDecorationsName == NULL || strcmp (cDeskletDecorationsNameOld, myDesklets.cDeskletDecorationsName) != 0)) // le theme par defaut a change, on recharge les desklets qui utilisent le theme "default".
781
cairo_dock_reload_desklets_decorations (TRUE);
783
else if (myDesklets.cDeskletDecorationsName != NULL && strcmp (myDesklets.cDeskletDecorationsName, "personnal") == 0) // on a configure le theme personnel, il peut avoir change.
785
cairo_dock_reload_desklets_decorations (TRUE);
787
else // on charge juste ceux qui n'ont pas encore leur deco et qui ont atteint leur taille definitive.
789
cairo_dock_reload_desklets_decorations (FALSE);
791
g_free (cDeskletDecorationsNameOld);
793
cairo_dock_update_renderer_list_for_gui ();
794
cairo_dock_update_desklet_decorations_list_for_gui ();
795
cairo_dock_update_desklet_decorations_list_for_applet_gui ();
796
cairo_dock_update_animations_list_for_gui ();
797
cairo_dock_update_dialog_decorator_list_for_gui ();
799
//\___________________ On ecrit sur le disque si necessaire.
800
if (! bFlushConfFileNeeded)
801
bFlushConfFileNeeded = cairo_dock_conf_file_needs_update (pKeyFile, GLDI_VERSION);
802
if (bFlushConfFileNeeded)
804
cairo_dock_flush_conf_file (pKeyFile, cConfFilePath, CAIRO_DOCK_SHARE_DATA_DIR, CAIRO_DOCK_CONF_FILE);
807
g_key_file_free (pKeyFile);
811
cairo_dock_trigger_refresh_launcher_gui ();
814
gboolean cairo_dock_is_loading (void)
820
void cairo_dock_update_conf_file (const gchar *cConfFilePath, GType iFirstDataType, ...) // type, groupe, cle, valeur, etc. finir par G_TYPE_INVALID.
822
cd_message ("%s (%s)", __func__, cConfFilePath);
823
GKeyFile *pKeyFile = cairo_dock_open_key_file (cConfFilePath);
824
g_return_if_fail (pKeyFile != NULL);
827
va_start (args, iFirstDataType);
829
GType iType = iFirstDataType;
834
gchar *cGroupName, *cGroupKey;
835
while (iType != G_TYPE_INVALID)
837
cGroupName = va_arg (args, gchar *);
838
cGroupKey = va_arg (args, gchar *);
842
case G_TYPE_BOOLEAN :
843
bValue = va_arg (args, gboolean);
844
g_key_file_set_boolean (pKeyFile, cGroupName, cGroupKey, bValue);
847
iValue = va_arg (args, gint);
848
g_key_file_set_integer (pKeyFile, cGroupName, cGroupKey, iValue);
851
fValue = va_arg (args, gdouble);
852
g_key_file_set_double (pKeyFile, cGroupName, cGroupKey, fValue);
855
cValue = va_arg (args, gchar *);
856
g_key_file_set_string (pKeyFile, cGroupName, cGroupKey, cValue);
862
iType = va_arg (args, GType);
865
cairo_dock_write_keys_to_file (pKeyFile, cConfFilePath);
866
g_key_file_free (pKeyFile);
872
void cairo_dock_update_conf_file_with_position (const gchar *cConfFilePath, int x, int y)
874
//g_print ("%s (%s ; %d;%d)\n", __func__, cConfFilePath, x, y);
875
cairo_dock_update_conf_file (cConfFilePath,
876
G_TYPE_INT, "Position", "x gap", x,
877
G_TYPE_INT, "Position", "y gap", y,
882
void cairo_dock_get_version_from_string (const gchar *cVersionString, int *iMajorVersion, int *iMinorVersion, int *iMicroVersion)
884
gchar **cVersions = g_strsplit (cVersionString, ".", -1);
885
if (cVersions[0] != NULL)
887
*iMajorVersion = atoi (cVersions[0]);
888
if (cVersions[1] != NULL)
890
*iMinorVersion = atoi (cVersions[1]);
891
if (cVersions[2] != NULL)
892
*iMicroVersion = atoi (cVersions[2]);
895
g_strfreev (cVersions);
899
void cairo_dock_decrypt_string( const gchar *cEncryptedString, gchar **cDecryptedString )
901
g_return_if_fail (cDecryptedString != NULL);
902
if( !cEncryptedString || *cEncryptedString == '\0' )
904
*cDecryptedString = g_strdup( "" );
908
guchar *input = g_strdup(cEncryptedString);
909
guchar *shifted_input = input;
910
guchar **output = (guchar **)cDecryptedString;
912
guchar *current_output = NULL;
914
*output = g_malloc( (strlen(input)+1)/3+1 );
915
current_output = *output;
917
guchar *last_char_in_input = input + strlen(input);
918
// g_print( "Password (before decrypt): %s\n", input );
920
for( ; shifted_input < last_char_in_input; shifted_input += 16+8, current_output += 8 )
925
guchar current_letter = 0;
927
memset( txt, 0, 64 );
929
shifted_input[16+8-1] = 0; // cut the string
931
sscanf( shifted_input, "%X-%X-%X-%X-%X-%X-%X-%X",
932
&block[0], &block[1], &block[2], &block[3], &block[4], &block[5], &block[6], &block[7] );
934
// process the eight first characters of "input"
935
for( i = 0; i < 8 ; i++ )
936
for ( j = 0; j < 8; j++ )
937
txt[i*8+j] = block[i] >> j & 1;
939
setkey( DES_crypt_key );
940
encrypt( txt, 1 ); // decrypt
942
for ( i = 0; i < 8; i++ )
944
current_output[i] = 0;
945
for ( j = 0; j < 8; j++ )
947
current_output[i] |= txt[i*8+j] << j;
954
// g_print( "Password (after decrypt): %s\n", *output );
959
*cDecryptedString = g_strdup( cEncryptedString );
963
void cairo_dock_encrypt_string( const gchar *cDecryptedString, gchar **cEncryptedString )
965
g_return_if_fail (cEncryptedString != NULL);
966
if( !cDecryptedString || *cDecryptedString == '\0' )
968
*cEncryptedString = g_strdup( "" );
973
const guchar *input = (guchar *)cDecryptedString;
974
guchar **output = (guchar **)cEncryptedString;
975
guint input_length = 0;
977
guchar *current_output = NULL;
978
// for each block of 8 characters, we need 24 bytes.
979
guint nbBlocks = strlen(input)/8+1;
980
*output = g_malloc( nbBlocks*24+1 );
981
current_output = *output;
983
const guchar *last_char_in_input = input + strlen(input);
985
// g_print( "Password (before encrypt): %s\n", input );
987
for( ; input < last_char_in_input; input += 8, current_output += 16+8 )
991
guchar current_letter = 0;
993
memset( txt, 0, 64 );
995
// process the eight first characters of "input"
996
for( i = 0; i < strlen(input) && i < 8 ; i++ )
997
for ( j = 0; j < 8; j++ )
998
txt[i*8+j] = input[i] >> j & 1;
1000
setkey( DES_crypt_key );
1001
encrypt( txt, 0 ); // encrypt
1003
for ( i = 0; i < 8; i++ )
1006
for ( j = 0; j < 8; j++ )
1008
current_letter |= txt[i*8+j] << j;
1010
snprintf( current_output + i*3, 4, "%02X-", current_letter );
1014
*(current_output-1) = 0;
1016
// g_print( "Password (after encrypt): %s\n", *output );
1018
*cEncryptedString = g_strdup( cDecryptedString );
1023
xmlDocPtr cairo_dock_open_xml_file (const gchar *cDataFilePath, const gchar *cRootNodeName, xmlNodePtr *root_node, GError **erreur)
1025
if (cairo_dock_get_file_size (cDataFilePath) == 0)
1027
g_set_error (erreur, 1, 1, "file '%s' doesn't exist or is empty", cDataFilePath);
1033
xmlDocPtr doc = xmlParseFile (cDataFilePath);
1036
g_set_error (erreur, 1, 1, "file '%s' is incorrect", cDataFilePath);
1041
xmlNodePtr noeud = xmlDocGetRootElement (doc);
1042
if (noeud == NULL || xmlStrcmp (noeud->name, (const xmlChar *) cRootNodeName) != 0)
1044
g_set_error (erreur, 1, 2, "xml file '%s' is not well formed", cDataFilePath);
1052
void cairo_dock_close_xml_file (xmlDocPtr doc)
1055
xmlFreeDoc (doc); // ne pas utiliser xmlCleanupParser(), cela peut affecter les autres threads utilisant libxml !
1060
gchar *cairo_dock_get_default_system_font (void)
1062
static gchar *s_cFontName = NULL;
1063
if (s_cFontName == NULL)
1065
if (g_iDesktopEnv == CAIRO_DOCK_GNOME)
1066
s_cFontName = cairo_dock_launch_command_sync ("gconftool-2 -g /desktop/gnome/interface/font_name"); /// ou document_font_name ?...
1068
s_cFontName = g_strdup ("Sans 10");
1070
return g_strdup (s_cFontName);