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/>.
24
#include <glib/gstdio.h>
25
#include <glib/gi18n.h>
29
#include "../config.h"
30
#include "cairo-dock-icons.h"
31
#include "cairo-dock-dock-factory.h"
32
#include "cairo-dock-dock-facility.h"
33
#include "cairo-dock-dock-manager.h"
34
#include "cairo-dock-keyfile-utilities.h"
35
#include "cairo-dock-log.h"
36
#include "cairo-dock-applet-manager.h"
37
#include "cairo-dock-X-manager.h"
38
#include "cairo-dock-desklet-manager.h"
39
#include "cairo-dock-animations.h"
40
#include "cairo-dock-dialog-manager.h"
41
#include "cairo-dock-container.h"
42
#include "cairo-dock-gui-manager.h"
43
#include "cairo-dock-internal-accessibility.h"
44
#include "cairo-dock-internal-position.h"
45
#include "cairo-dock-internal-system.h"
46
#include "cairo-dock-internal-taskbar.h"
47
#include "cairo-dock-internal-background.h"
48
#include "cairo-dock-internal-indicators.h"
49
#include "cairo-dock-internal-labels.h"
50
#include "cairo-dock-internal-desklets.h"
51
#include "cairo-dock-internal-dialogs.h"
52
#include "cairo-dock-internal-icons.h"
53
#include "cairo-dock-internal-views.h"
54
#include "cairo-dock-modules.h"
56
CairoDockModuleInstance *g_pCurrentModule = NULL;
58
extern CairoDock *g_pPrimaryContainer;
59
extern gchar *g_cConfFile;
60
extern gchar *g_cCurrentThemePath;
61
extern gchar *g_cCairoDockDataDir;
62
extern int g_iMajorVersion, g_iMinorVersion, g_iMicroVersion;
63
extern CairoDockDesktopGeometry g_desktopGeometry;
64
extern gboolean g_bEasterEggs;
66
static GHashTable *s_hModuleTable = NULL;
67
static GHashTable *s_hInternalModuleTable = NULL;
68
static int s_iMaxOrder = 0;
69
static GList *s_AutoLoadedModules = NULL;
70
static guint s_iSidWriteModules = 0;
77
void cairo_dock_initialize_module_manager (const gchar *cModuleDirPath)
79
if (s_hModuleTable == NULL)
80
s_hModuleTable = g_hash_table_new_full (g_str_hash,
82
NULL, // la cle est le nom du module, et pointe directement sur le champ 'cModuleName' du module.
83
(GDestroyNotify) cairo_dock_free_module);
85
if (s_hInternalModuleTable == NULL)
87
s_hInternalModuleTable = g_hash_table_new_full (g_str_hash,
89
NULL, // la cle est le nom du module, et pointe directement sur le champ 'cModuleName' du module.
90
(GDestroyNotify) NULL); // ne sont jamais liberes.
91
cairo_dock_preload_internal_modules (s_hInternalModuleTable);
94
if (cModuleDirPath != NULL && g_file_test (cModuleDirPath, G_FILE_TEST_IS_DIR))
96
GError *erreur = NULL;
97
cairo_dock_load_modules_in_directory (cModuleDirPath, &erreur);
100
cd_warning ("%s\n no module will be available", erreur->message);
101
g_error_free (erreur);
106
CairoDockModule *cairo_dock_find_module_from_name (const gchar *cModuleName)
108
//g_print ("%s (%s)\n", __func__, cModuleName);
109
g_return_val_if_fail (cModuleName != NULL, NULL);
110
return g_hash_table_lookup (s_hModuleTable, cModuleName);
113
CairoDockModule *cairo_dock_foreach_module (GHRFunc pCallback, gpointer user_data)
115
return g_hash_table_find (s_hModuleTable, (GHRFunc) pCallback, user_data);
118
static int _sort_module_by_alphabetical_order (CairoDockModule *m1, CairoDockModule *m2)
120
if (!m1 || !m1->pVisitCard || !m1->pVisitCard->cTitle)
122
if (!m2 || !m2->pVisitCard || !m2->pVisitCard->cTitle)
124
return g_ascii_strncasecmp (dgettext (m1->pVisitCard->cGettextDomain, m1->pVisitCard->cTitle),
125
dgettext (m2->pVisitCard->cGettextDomain, m2->pVisitCard->cTitle),
128
CairoDockModule *cairo_dock_foreach_module_in_alphabetical_order (GCompareFunc pCallback, gpointer user_data)
130
GList *pModuleList = g_hash_table_get_values (s_hModuleTable);
131
pModuleList = g_list_sort (pModuleList, (GCompareFunc) _sort_module_by_alphabetical_order);
133
CairoDockModule *pModule = (CairoDockModule *)g_list_find_custom (pModuleList, user_data, pCallback);
135
g_list_free (pModuleList);
139
int cairo_dock_get_nb_modules (void)
141
return g_hash_table_size (s_hModuleTable);
145
const gchar *cairo_dock_get_modules_dir (void)
147
return CAIRO_DOCK_MODULES_DIR;
150
static void _cairo_dock_write_one_module_name (gchar *cModuleName, CairoDockModule *pModule, GString *pString)
152
if (pModule->pInstancesList != NULL && ! cairo_dock_module_is_auto_loaded (pModule) && pModule->cSoFilePath != NULL)
154
g_string_append_printf (pString, "%s;", cModuleName);
157
gchar *cairo_dock_list_active_modules (void)
159
GString *pString = g_string_new ("");
161
g_hash_table_foreach (s_hModuleTable, (GHFunc) _cairo_dock_write_one_module_name, pString);
163
if (pString->len > 0)
164
pString->str[pString->len-1] = '\0';
166
gchar *cModuleNames = pString->str;
167
g_string_free (pString, FALSE);
172
/////////////////////
173
/// MODULE LOADER ///
174
/////////////////////
176
static gchar *cairo_dock_extract_default_module_name_from_path (gchar *cSoFilePath)
178
gchar *ptr = g_strrstr (cSoFilePath, "/");
183
if (strncmp (ptr, "lib", 3) == 0)
186
if (strncmp (ptr, "cd-", 3) == 0)
188
else if (strncmp (ptr, "cd_", 3) == 0)
191
gchar *cModuleName = g_strdup (ptr);
193
ptr = g_strrstr (cModuleName, ".so");
198
//while ((ptr = g_strrstr (ptr, "-")) != NULL)
204
gchar *cairo_dock_check_module_conf_file (CairoDockVisitCard *pVisitCard)
206
if (pVisitCard->cConfFileName == NULL)
210
gchar *cUserDataDirPath = g_strdup_printf ("%s/plug-ins/%s", g_cCurrentThemePath, pVisitCard->cUserDataDir);
211
if (! g_file_test (cUserDataDirPath, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR))
213
cd_message ("directory %s doesn't exist, it will be added.", cUserDataDirPath);
215
gchar *command = g_strdup_printf ("mkdir -p \"%s\"", cUserDataDirPath);
216
r = system (command);
220
gchar *cConfFilePath = g_strdup_printf ("%s/%s", cUserDataDirPath, pVisitCard->cConfFileName);
221
if (! g_file_test (cConfFilePath, G_FILE_TEST_EXISTS))
223
cd_message ("no conf file %s, we will take the default one", cConfFilePath);
224
gchar *command = g_strdup_printf ("cp \"%s/%s\" \"%s\"", pVisitCard->cShareDataDir, pVisitCard->cConfFileName, cConfFilePath);
225
r = system (command);
229
if (! g_file_test (cConfFilePath, G_FILE_TEST_EXISTS)) // la copie ne s'est pas bien passee.
231
cd_warning ("couldn't copy %s/%s in %s; check permissions and file's existence", pVisitCard->cShareDataDir, pVisitCard->cConfFileName, cUserDataDirPath);
232
g_free (cUserDataDirPath);
233
g_free (cConfFilePath);
237
g_free (cUserDataDirPath);
238
return cConfFilePath;
241
void cairo_dock_free_visit_card (CairoDockVisitCard *pVisitCard)
243
g_free (pVisitCard); // toutes les chaines sont statiques.
247
static void _cairo_dock_open_module (CairoDockModule *pCairoDockModule, GError **erreur)
249
//\__________________ On ouvre le .so.
250
GModule *module = g_module_open (pCairoDockModule->cSoFilePath, G_MODULE_BIND_LAZY | G_MODULE_BIND_LOCAL);
253
g_set_error (erreur, 1, 1, "while opening module '%s' : (%s)", pCairoDockModule->cSoFilePath, g_module_error ());
256
pCairoDockModule->pModule = module;
258
//\__________________ On identifie le module.
259
gboolean bSymbolFound;
260
CairoDockModulePreInit function_pre_init = NULL;
261
bSymbolFound = g_module_symbol (module, "pre_init", (gpointer) &function_pre_init);
262
if (bSymbolFound && function_pre_init != NULL)
264
pCairoDockModule->pVisitCard = g_new0 (CairoDockVisitCard, 1);
265
pCairoDockModule->pInterface = g_new0 (CairoDockModuleInterface, 1);
266
gboolean bModuleLoaded = function_pre_init (pCairoDockModule->pVisitCard, pCairoDockModule->pInterface);
269
cairo_dock_free_visit_card (pCairoDockModule->pVisitCard);
270
pCairoDockModule->pVisitCard = NULL;
271
cd_debug ("module '%s' has not been loaded", pCairoDockModule->cSoFilePath); // peut arriver a xxx-integration.
277
pCairoDockModule->pVisitCard = NULL;
278
g_set_error (erreur, 1, 1, "this module ('%s') does not have the common entry point 'pre_init', it may be broken or icompatible with cairo-dock", pCairoDockModule->cSoFilePath);
282
//\__________________ On verifie sa compatibilite.
283
CairoDockVisitCard *pVisitCard = pCairoDockModule->pVisitCard;
284
if (! g_bEasterEggs &&
285
(pVisitCard->iMajorVersionNeeded > g_iMajorVersion || (pVisitCard->iMajorVersionNeeded == g_iMajorVersion && pVisitCard->iMinorVersionNeeded > g_iMinorVersion) || (pVisitCard->iMajorVersionNeeded == g_iMajorVersion && pVisitCard->iMinorVersionNeeded == g_iMinorVersion && pVisitCard->iMicroVersionNeeded > g_iMicroVersion)))
287
g_set_error (erreur, 1, 1, "this module ('%s') needs at least Cairo-Dock v%d.%d.%d, but Cairo-Dock is in v%d.%d.%d (%s)\n It will be ignored", pCairoDockModule->cSoFilePath, pVisitCard->iMajorVersionNeeded, pVisitCard->iMinorVersionNeeded, pVisitCard->iMicroVersionNeeded, g_iMajorVersion, g_iMinorVersion, g_iMicroVersion, GLDI_VERSION);
288
cairo_dock_free_visit_card (pCairoDockModule->pVisitCard);
289
pCairoDockModule->pVisitCard = NULL;
292
if (! g_bEasterEggs &&
293
pVisitCard->cDockVersionOnCompilation != NULL && strcmp (pVisitCard->cDockVersionOnCompilation, GLDI_VERSION) != 0) // separation des versions en easter egg.
295
g_set_error (erreur, 1, 1, "this module ('%s') was compiled with Cairo-Dock v%s, but Cairo-Dock is in v%s\n It will be ignored", pCairoDockModule->cSoFilePath, pVisitCard->cDockVersionOnCompilation, GLDI_VERSION);
296
cairo_dock_free_visit_card (pCairoDockModule->pVisitCard);
297
pCairoDockModule->pVisitCard = NULL;
301
if (pVisitCard->cModuleName == NULL)
302
pVisitCard->cModuleName = cairo_dock_extract_default_module_name_from_path (pCairoDockModule->cSoFilePath);
304
if (cairo_dock_module_is_auto_loaded (pCairoDockModule)) // c'est un module qui soit ne peut etre activer et/ou desactiver, soit s'est lie a un module interne; on l'activera donc automatiquement.
306
s_AutoLoadedModules = g_list_prepend (s_AutoLoadedModules, pCairoDockModule);
310
static void _cairo_dock_close_module (CairoDockModule *module)
313
g_module_close (module->pModule);
315
g_free (module->pInterface);
316
module->pInterface = NULL;
318
cairo_dock_free_visit_card (module->pVisitCard);
319
module->pVisitCard = NULL;
321
g_free (module->cConfFilePath);
322
module->cConfFilePath = NULL;
325
gboolean cairo_dock_register_module (CairoDockModule *pModule)
327
g_return_val_if_fail (s_hModuleTable != NULL && pModule->pVisitCard != NULL && pModule->pVisitCard->cModuleName != NULL, FALSE);
329
if (g_hash_table_lookup (s_hModuleTable, pModule->pVisitCard->cModuleName) != NULL)
331
cd_warning ("a module with the name '%s' is already registered", pModule->pVisitCard->cModuleName);
335
if (pModule->pVisitCard->cDockVersionOnCompilation == NULL)
336
pModule->pVisitCard->cDockVersionOnCompilation = GLDI_VERSION;
337
g_hash_table_insert (s_hModuleTable, (gpointer)pModule->pVisitCard->cModuleName, pModule);
341
void cairo_dock_unregister_module (const gchar *cModuleName)
343
g_return_if_fail (cModuleName != NULL);
344
g_hash_table_remove (s_hModuleTable, cModuleName);
347
CairoDockModule * cairo_dock_load_module (gchar *cSoFilePath, GError **erreur) // cSoFilePath vers un fichier de la forme 'libtruc.so'. Le module est rajoute dans la table des modules.
349
//g_print ("%s (%s)\n", __func__, cSoFilePath);
350
if (cSoFilePath == NULL) // g_module_open () plante si 'cSoFilePath' est NULL.
352
g_set_error (erreur, 1, 1, "%s () : no such module", __func__);
356
CairoDockModule *pCairoDockModule = g_new0 (CairoDockModule, 1);
357
pCairoDockModule->cSoFilePath = g_strdup (cSoFilePath);
359
GError *tmp_erreur = NULL;
360
_cairo_dock_open_module (pCairoDockModule, &tmp_erreur);
361
if (tmp_erreur != NULL)
363
g_propagate_error (erreur, tmp_erreur);
364
g_free (pCairoDockModule);
368
if (s_hModuleTable != NULL && pCairoDockModule->pVisitCard != NULL)
369
g_hash_table_insert (s_hModuleTable, (gpointer)pCairoDockModule->pVisitCard->cModuleName, pCairoDockModule);
371
return pCairoDockModule;
374
void cairo_dock_load_modules_in_directory (const gchar *cModuleDirPath, GError **erreur)
376
cd_message ("%s (%s)", __func__, cModuleDirPath);
377
GError *tmp_erreur = NULL;
378
GDir *dir = g_dir_open (cModuleDirPath, 0, &tmp_erreur);
379
if (tmp_erreur != NULL)
381
g_propagate_error (erreur, tmp_erreur);
385
CairoDockModule *pModule;
386
const gchar *cFileName;
387
GString *sFilePath = g_string_new ("");
390
cFileName = g_dir_read_name (dir);
391
if (cFileName == NULL)
394
if (g_str_has_suffix (cFileName, ".so"))
396
g_string_printf (sFilePath, "%s/%s", cModuleDirPath, cFileName);
397
pModule = cairo_dock_load_module (sFilePath->str, &tmp_erreur);
398
if (tmp_erreur != NULL)
400
cd_warning (tmp_erreur->message);
401
g_error_free (tmp_erreur);
407
g_string_free (sFilePath, TRUE);
412
///////////////////////
413
/// MODULE INSTANCE ///
414
///////////////////////
416
static void _cairo_dock_read_module_config (GKeyFile *pKeyFile, CairoDockModuleInstance *pInstance)
418
CairoDockModuleInterface *pInterface = pInstance->pModule->pInterface;
419
CairoDockVisitCard *pVisitCard = pInstance->pModule->pVisitCard;
421
gboolean bFlushConfFileNeeded = FALSE;
422
if (pInterface->read_conf_file != NULL)
424
if (pInterface->reset_config != NULL)
425
pInterface->reset_config (pInstance);
426
if (pVisitCard->iSizeOfConfig != 0)
427
memset (((gpointer)pInstance)+sizeof(CairoDockModuleInstance), 0, pVisitCard->iSizeOfConfig);
429
bFlushConfFileNeeded = g_key_file_has_group (pKeyFile, "Desklet") && ! g_key_file_has_key (pKeyFile, "Desklet", "accessibility", NULL); // petit hack des familles ^_^
430
bFlushConfFileNeeded |= pInterface->read_conf_file (pInstance, pKeyFile);
432
if (! bFlushConfFileNeeded)
433
bFlushConfFileNeeded = cairo_dock_conf_file_needs_update (pKeyFile, pVisitCard->cModuleVersion);
434
if (bFlushConfFileNeeded)
435
cairo_dock_flush_conf_file (pKeyFile, pInstance->cConfFilePath, pVisitCard->cShareDataDir, pVisitCard->cConfFileName);
438
GKeyFile *cairo_dock_pre_read_module_instance_config (CairoDockModuleInstance *pInstance, CairoDockMinimalAppletConfig *pMinimalConfig)
440
g_return_val_if_fail (pInstance != NULL, NULL);
441
//\____________________ on ouvre son fichier de conf.
442
if (pInstance->cConfFilePath == NULL) // aucun fichier de conf (xxx-integration par exemple).
444
gchar *cInstanceConfFilePath = pInstance->cConfFilePath;
445
CairoDockModule *pModule = pInstance->pModule;
447
GKeyFile *pKeyFile = cairo_dock_open_key_file (cInstanceConfFilePath);
448
if (pKeyFile == NULL) // fichier illisible.
451
if (pInstance->pModule->pVisitCard->iContainerType == CAIRO_DOCK_MODULE_IS_PLUGIN) // ce module n'a pas d'icone (ce n'est pas une applet).
456
//\____________________ on recupere les parametres de l'icone.
457
if (pInstance->pModule->pVisitCard->iContainerType & CAIRO_DOCK_MODULE_CAN_DOCK) // l'applet peut aller dans un dock.
460
cairo_dock_get_size_key_value_helper (pKeyFile, "Icon", "icon ", bUseless, pMinimalConfig->iDesiredIconWidth, pMinimalConfig->iDesiredIconHeight);
461
if (pMinimalConfig->iDesiredIconWidth == 0)
462
pMinimalConfig->iDesiredIconWidth = myIcons.tIconAuthorizedWidth[CAIRO_DOCK_APPLET];
463
if (pMinimalConfig->iDesiredIconWidth == 0)
464
pMinimalConfig->iDesiredIconWidth = 48;
465
if (pMinimalConfig->iDesiredIconHeight == 0)
466
pMinimalConfig->iDesiredIconHeight = myIcons.tIconAuthorizedHeight[CAIRO_DOCK_APPLET];
467
if (pMinimalConfig->iDesiredIconHeight == 0)
468
pMinimalConfig->iDesiredIconHeight = 48;
470
pMinimalConfig->cLabel = cairo_dock_get_string_key_value (pKeyFile, "Icon", "name", NULL, NULL, NULL, NULL);
471
pMinimalConfig->cIconFileName = cairo_dock_get_string_key_value (pKeyFile, "Icon", "icon", NULL, NULL, NULL, NULL);
472
pMinimalConfig->fOrder = cairo_dock_get_double_key_value (pKeyFile, "Icon", "order", NULL, CAIRO_DOCK_LAST_ORDER, NULL, NULL);
473
if (pMinimalConfig->fOrder == CAIRO_DOCK_LAST_ORDER)
475
pMinimalConfig->fOrder = ++ s_iMaxOrder;
476
g_key_file_set_double (pKeyFile, "Icon", "order", pMinimalConfig->fOrder);
477
cd_debug ("set order to %.1f\n", pMinimalConfig->fOrder);
478
cairo_dock_write_keys_to_file (pKeyFile, cInstanceConfFilePath);
482
s_iMaxOrder = MAX (s_iMaxOrder, pMinimalConfig->fOrder);
484
pMinimalConfig->cDockName = cairo_dock_get_string_key_value (pKeyFile, "Icon", "dock name", NULL, NULL, NULL, NULL);
485
pMinimalConfig->bAlwaysVisible = g_key_file_get_boolean (pKeyFile, "Icon", "always visi", NULL);
488
//\____________________ on recupere les parametres de son desklet.
489
if (pInstance->pModule->pVisitCard->iContainerType & CAIRO_DOCK_MODULE_CAN_DESKLET) // l'applet peut aller dans un desklet.
491
CairoDeskletAttribute *pDeskletAttribute = &pMinimalConfig->deskletAttribute;
492
if (pInstance->pModule->pVisitCard->iContainerType & CAIRO_DOCK_MODULE_CAN_DOCK)
493
pMinimalConfig->bIsDetached = cairo_dock_get_boolean_key_value (pKeyFile, "Desklet", "initially detached", NULL, FALSE, NULL, NULL);
495
pMinimalConfig->bIsDetached = TRUE;
497
pDeskletAttribute->bDeskletUseSize = ! pInstance->pModule->pVisitCard->bStaticDeskletSize;
500
cairo_dock_get_size_key_value_helper (pKeyFile, "Desklet", "", bUseless, pDeskletAttribute->iDeskletWidth, pDeskletAttribute->iDeskletHeight);
501
//g_print ("desklet : %dx%d\n", pDeskletAttribute->iDeskletWidth, pDeskletAttribute->iDeskletHeight);
502
if (pDeskletAttribute->iDeskletWidth == 0)
503
pDeskletAttribute->iDeskletWidth = 96;
504
if (pDeskletAttribute->iDeskletHeight == 0)
505
pDeskletAttribute->iDeskletHeight = 96;
507
pDeskletAttribute->iDeskletPositionX = cairo_dock_get_integer_key_value (pKeyFile, "Desklet", "x position", NULL, 0, NULL, NULL);
508
pDeskletAttribute->iDeskletPositionY = cairo_dock_get_integer_key_value (pKeyFile, "Desklet", "y position", NULL, 0, NULL, NULL);
509
pDeskletAttribute->iVisibility = cairo_dock_get_integer_key_value (pKeyFile, "Desklet", "accessibility", NULL, 0, NULL, NULL);
510
pDeskletAttribute->bOnAllDesktops = cairo_dock_get_boolean_key_value (pKeyFile, "Desklet", "sticky", NULL, TRUE, NULL, NULL);
511
pDeskletAttribute->iNumDesktop = cairo_dock_get_integer_key_value (pKeyFile, "Desklet", "num desktop", NULL, -1, NULL, NULL);
512
pDeskletAttribute->bPositionLocked = cairo_dock_get_boolean_key_value (pKeyFile, "Desklet", "locked", NULL, FALSE, NULL, NULL);
513
pDeskletAttribute->bNoInput = cairo_dock_get_boolean_key_value (pKeyFile, "Desklet", "no input", NULL, FALSE, NULL, NULL);
514
pDeskletAttribute->iRotation = cairo_dock_get_double_key_value (pKeyFile, "Desklet", "rotation", NULL, 0, NULL, NULL);
515
pDeskletAttribute->iDepthRotationY = cairo_dock_get_double_key_value (pKeyFile, "Desklet", "depth rotation y", NULL, 0, NULL, NULL);
516
pDeskletAttribute->iDepthRotationX = cairo_dock_get_double_key_value (pKeyFile, "Desklet", "depth rotation x", NULL, 0, NULL, NULL);
518
// on recupere les decorations du desklet.
519
gchar *cDecorationTheme = cairo_dock_get_string_key_value (pKeyFile, "Desklet", "decorations", NULL, NULL, NULL, NULL);
520
if (cDecorationTheme == NULL || strcmp (cDecorationTheme, "personnal") == 0)
522
//g_print ("on recupere les decorations personnelles au desklet\n");
523
CairoDeskletDecoration *pUserDeskletDecorations = g_new0 (CairoDeskletDecoration, 1);
524
pDeskletAttribute->pUserDecoration = pUserDeskletDecorations;
526
pUserDeskletDecorations->cBackGroundImagePath = cairo_dock_get_string_key_value (pKeyFile, "Desklet", "bg desklet", NULL, NULL, NULL, NULL);
527
pUserDeskletDecorations->cForeGroundImagePath = cairo_dock_get_string_key_value (pKeyFile, "Desklet", "fg desklet", NULL, NULL, NULL, NULL);
528
pUserDeskletDecorations->iLoadingModifier = CAIRO_DOCK_FILL_SPACE;
529
pUserDeskletDecorations->fBackGroundAlpha = cairo_dock_get_double_key_value (pKeyFile, "Desklet", "bg alpha", NULL, 1.0, NULL, NULL);
530
pUserDeskletDecorations->fForeGroundAlpha = cairo_dock_get_double_key_value (pKeyFile, "Desklet", "fg alpha", NULL, 1.0, NULL, NULL);
531
pUserDeskletDecorations->iLeftMargin = cairo_dock_get_integer_key_value (pKeyFile, "Desklet", "left offset", NULL, 0, NULL, NULL);
532
pUserDeskletDecorations->iTopMargin = cairo_dock_get_integer_key_value (pKeyFile, "Desklet", "top offset", NULL, 0, NULL, NULL);
533
pUserDeskletDecorations->iRightMargin = cairo_dock_get_integer_key_value (pKeyFile, "Desklet", "right offset", NULL, 0, NULL, NULL);
534
pUserDeskletDecorations->iBottomMargin = cairo_dock_get_integer_key_value (pKeyFile, "Desklet", "bottom offset", NULL, 0, NULL, NULL);
535
g_free (cDecorationTheme);
539
//g_print ("decorations : %s\n", cDecorationTheme);
540
pDeskletAttribute->cDecorationTheme = cDecorationTheme;
547
void cairo_dock_free_minimal_config (CairoDockMinimalAppletConfig *pMinimalConfig)
549
if (pMinimalConfig == NULL)
551
g_free (pMinimalConfig->cLabel);
552
g_free (pMinimalConfig->cIconFileName);
553
g_free (pMinimalConfig->cDockName);
554
g_free (pMinimalConfig->deskletAttribute.cDecorationTheme);
555
cairo_dock_free_desklet_decoration (pMinimalConfig->deskletAttribute.pUserDecoration);
556
g_free (pMinimalConfig);
560
CairoDockModuleInstance *cairo_dock_instanciate_module (CairoDockModule *pModule, gchar *cConfFilePath) // prend possession de 'cConfFilePah'.
562
g_return_val_if_fail (pModule != NULL, NULL);
563
cd_message ("%s (%s)", __func__, cConfFilePath);
565
//\____________________ On cree une instance du module.
566
//CairoDockModuleInstance *pInstance = g_new0 (CairoDockModuleInstance, 1);
567
CairoDockModuleInstance *pInstance = calloc (1, sizeof (CairoDockModuleInstance) + pModule->pVisitCard->iSizeOfConfig + pModule->pVisitCard->iSizeOfData);
568
pInstance->pModule = pModule;
569
pInstance->cConfFilePath = cConfFilePath;
570
/*if (pModule->pVisitCard->iSizeOfConfig > 0)
571
pInstance->pConfig = g_new0 (gpointer, pModule->pVisitCard->iSizeOfConfig);
572
if (pModule->pVisitCard->iSizeOfData > 0)
573
pInstance->pData = g_new0 (gpointer, pModule->pVisitCard->iSizeOfData);*/
575
CairoDockMinimalAppletConfig *pMinimalConfig = g_new0 (CairoDockMinimalAppletConfig, 1);
576
GKeyFile *pKeyFile = cairo_dock_pre_read_module_instance_config (pInstance, pMinimalConfig);
577
g_return_val_if_fail (cConfFilePath == NULL || pKeyFile != NULL, NULL); // protection en cas de fichier de conf illisible.
578
pModule->pInstancesList = g_list_prepend (pModule->pInstancesList, pInstance);
580
//\____________________ On cree le container de l'instance, ainsi que son icone.
581
CairoContainer *pContainer = NULL;
582
CairoDock *pDock = NULL;
583
CairoDesklet *pDesklet = NULL;
586
if (pInstance->pModule->pVisitCard->iContainerType != CAIRO_DOCK_MODULE_IS_PLUGIN) // le module a une icone (c'est une applet).
588
pInstance->bCanDetach = pMinimalConfig->deskletAttribute.iDeskletWidth > 0;
589
pModule->bCanDetach = pInstance->bCanDetach; // pas encore clair ...
591
// on trouve/cree son container.
592
if (pModule->bCanDetach && pMinimalConfig->bIsDetached)
594
pDesklet = cairo_dock_create_desklet (NULL, &pMinimalConfig->deskletAttribute);
595
/*cd_debug ("transparence du desklet...\n");
596
while (gtk_events_pending ()) // pour la transparence initiale.
597
gtk_main_iteration ();*/
598
pContainer = CAIRO_CONTAINER (pDesklet);
602
const gchar *cDockName = (pMinimalConfig->cDockName != NULL ? pMinimalConfig->cDockName : CAIRO_DOCK_MAIN_DOCK_NAME);
603
pDock = cairo_dock_search_dock_from_name (cDockName);
606
pDock = cairo_dock_create_dock (cDockName, NULL);
608
pContainer = CAIRO_CONTAINER (pDock);
611
// on cree son icone.
612
pIcon = cairo_dock_create_icon_for_applet (pMinimalConfig,
617
pDesklet->pIcon = pIcon;
618
gtk_window_set_title (GTK_WINDOW(pContainer->pWidget), pInstance->pModule->pVisitCard->cModuleName);
619
///gtk_widget_queue_draw (pContainer->pWidget);
621
cairo_dock_free_minimal_config (pMinimalConfig);
624
//\____________________ On initialise l'instance.
625
if (pDock) // on met la taille qu'elle aura une fois dans le dock.
627
pIcon->fWidth *= pDock->container.fRatio;
628
pIcon->fHeight *= pDock->container.fRatio;
631
pInstance->pIcon = pIcon;
632
pInstance->pDock = pDock;
633
pInstance->pDesklet = pDesklet;
634
pInstance->pContainer = pContainer;
637
_cairo_dock_read_module_config (pKeyFile, pInstance);
639
gboolean bCanInit = TRUE;
640
pInstance->pDrawContext = NULL;
641
if (pDock && pIcon) // applet dans un dock (dans un desklet, il faut attendre que l'applet ait mis une vue pour que l'icone soit chargee).
643
if (pIcon->pIconBuffer == NULL)
645
cd_warning ("icon's buffer is NULL, applet won't be able to draw to it !");
646
pInstance->pDrawContext = NULL;
649
pInstance->pDrawContext = cairo_create (pIcon->pIconBuffer);
650
if (cairo_status (pInstance->pDrawContext) != CAIRO_STATUS_SUCCESS)
652
cd_warning ("couldn't initialize drawing context, applet won't be able to draw itself !");
653
pInstance->pDrawContext = NULL;
658
if (bCanInit && pModule->pInterface->initModule)
659
pModule->pInterface->initModule (pInstance, pKeyFile);
663
pIcon->fWidth /= pDock->container.fRatio;
664
pIcon->fHeight /= pDock->container.fRatio;
665
cairo_dock_insert_icon_in_dock (pIcon, pDock, ! CAIRO_DOCK_UPDATE_DOCK_SIZE, ! CAIRO_DOCK_ANIMATE_ICON);
667
else if (pDesklet && pDesklet->iDesiredWidth == 0 && pDesklet->iDesiredHeight == 0) // peut arriver si le desklet a fini de se redimensionner avant l'init.
668
gtk_widget_queue_draw (pDesklet->container.pWidget);
669
if (pKeyFile != NULL)
670
g_key_file_free (pKeyFile);
674
/* Detruit une instance de module et libere les resources associees.
676
static void _cairo_dock_free_module_instance (CairoDockModuleInstance *pInstance)
678
g_free (pInstance->cConfFilePath);
679
/*g_free (pInstance->pConfig);
680
g_free (pInstance->pData);*/
684
/* Stoppe une instance d'un module en vue de la detruire.
686
static void _cairo_dock_stop_module_instance (CairoDockModuleInstance *pInstance)
688
if (pInstance->pModule->pInterface->stopModule != NULL)
689
pInstance->pModule->pInterface->stopModule (pInstance);
691
if (pInstance->pModule->pInterface->reset_data != NULL)
692
pInstance->pModule->pInterface->reset_data (pInstance);
694
if (pInstance->pModule->pInterface->reset_config != NULL)
695
pInstance->pModule->pInterface->reset_config (pInstance);
697
cairo_dock_release_data_slot (pInstance);
699
if (pInstance->pDesklet)
700
cairo_dock_destroy_desklet (pInstance->pDesklet);
701
if (pInstance->pDrawContext != NULL)
702
cairo_destroy (pInstance->pDrawContext);
704
if (pInstance->pIcon != NULL)
705
pInstance->pIcon->pModuleInstance = NULL;
708
void cairo_dock_deinstanciate_module (CairoDockModuleInstance *pInstance)
710
_cairo_dock_stop_module_instance (pInstance);
712
pInstance->pModule->pInstancesList = g_list_remove (pInstance->pModule->pInstancesList, pInstance);
714
_cairo_dock_free_module_instance (pInstance);
717
void cairo_dock_reload_module_instance (CairoDockModuleInstance *pInstance, gboolean bReloadAppletConf)
719
g_return_if_fail (pInstance != NULL);
720
CairoDockModule *module = pInstance->pModule;
721
cd_message ("%s (%s, %d)", __func__, module->pVisitCard->cModuleName, bReloadAppletConf);
723
GError *erreur = NULL;
724
CairoContainer *pCurrentContainer = pInstance->pContainer;
725
pInstance->pContainer = NULL;
726
CairoDock *pCurrentDock = pInstance->pDock;
727
pInstance->pDock = NULL;
728
CairoDesklet *pCurrentDesklet = pInstance->pDesklet;
729
pInstance->pDesklet = NULL;
730
gchar *cOldDockName = NULL;
731
gchar *cCurrentSubDockName = NULL;
733
CairoContainer *pNewContainer = NULL;
734
CairoDock *pNewDock = NULL;
735
CairoDesklet *pNewDesklet = NULL;
737
//\______________ On recharge la config minimale.
738
gboolean bModuleReloaded = FALSE;
739
Icon *pIcon = pInstance->pIcon;
740
GKeyFile *pKeyFile = NULL;
741
CairoDockMinimalAppletConfig *pMinimalConfig = NULL;
742
if (bReloadAppletConf && pInstance->cConfFilePath != NULL)
744
pMinimalConfig = g_new0 (CairoDockMinimalAppletConfig, 1);
745
pKeyFile = cairo_dock_pre_read_module_instance_config (pInstance, pMinimalConfig);
747
if (pInstance->pModule->pVisitCard->iContainerType != CAIRO_DOCK_MODULE_IS_PLUGIN) // c'est une applet.
749
//\______________ On met a jour les champs 'nom' et 'image' de l'icone.
752
cCurrentSubDockName = g_strdup (pIcon->cName);
753
// on gere le changement de nom de son sous-dock.
754
if (pIcon->cName != NULL && pIcon->pSubDock != NULL && cairo_dock_strings_differ (pIcon->cName, pMinimalConfig->cLabel))
756
gchar *cNewName = cairo_dock_get_unique_dock_name (pMinimalConfig->cLabel);
757
cd_debug ("* le sous-dock %s prend le nom '%s'", pIcon->cName, cNewName);
758
if (strcmp (pIcon->cName, cNewName) != 0)
759
cairo_dock_rename_dock (pIcon->cName, NULL, cNewName);
760
g_free (pMinimalConfig->cLabel);
761
pMinimalConfig->cLabel = cNewName;
764
g_free (pIcon->cName);
765
pIcon->cName = pMinimalConfig->cLabel;
766
pMinimalConfig->cLabel = NULL; // astuce.
767
g_free (pIcon->cFileName);
768
pIcon->cFileName = pMinimalConfig->cIconFileName;
769
pMinimalConfig->cIconFileName = NULL;
770
pIcon->bAlwaysVisible = pMinimalConfig->bAlwaysVisible;
773
// on recupere son dock (cree au besoin).
774
if (!pMinimalConfig->bIsDetached) // elle est desormais dans un dock.
776
const gchar *cDockName = (pMinimalConfig->cDockName != NULL ? pMinimalConfig->cDockName : CAIRO_DOCK_MAIN_DOCK_NAME);
777
pNewDock = cairo_dock_search_dock_from_name (cDockName);
778
if (pNewDock == NULL) // c'est un nouveau dock.
780
pNewDock = cairo_dock_create_dock (cDockName, NULL);
782
pNewContainer = CAIRO_CONTAINER (pNewDock);
785
// on la detache de son dock si son container a change.
786
if (pCurrentDock != NULL && (pMinimalConfig->bIsDetached || pNewDock != pCurrentDock))
788
cd_message ("le container a change (%s -> %s)", pIcon->cParentDockName, pMinimalConfig->bIsDetached ? "desklet" : pMinimalConfig->cDockName);
789
cOldDockName = g_strdup (pIcon->cParentDockName);
790
cairo_dock_detach_icon_from_dock (pIcon, pCurrentDock, myIcons.iSeparateIcons);
793
// on recupere son desklet (cree au besoin).
794
if (pMinimalConfig->bIsDetached)
796
if (pCurrentDesklet == NULL) // c'est un nouveau desklet.
798
pNewDesklet = cairo_dock_create_desklet (pIcon, &pMinimalConfig->deskletAttribute);
800
else // on reconfigure le desklet courant.
802
pNewDesklet = pCurrentDesklet;
803
cairo_dock_configure_desklet (pNewDesklet, &pMinimalConfig->deskletAttribute);
805
pNewContainer = CAIRO_CONTAINER (pNewDesklet);
811
pNewContainer = pCurrentContainer;
812
pNewDock = pCurrentDock;
813
pNewDesklet = pCurrentDesklet;
815
pInstance->pContainer = pNewContainer;
816
pInstance->pDock = pNewDock;
817
pInstance->pDesklet = pNewDesklet;
819
//\_______________________ On insere l'icone dans son nouveau dock, et on s'assure que sa taille respecte les tailles par defaut.
820
if (pNewDock != NULL && pIcon != NULL) // l'icone est desormais dans un dock.
822
// on recupere la taille voulue.
823
if (pMinimalConfig == NULL) // on recupere sa taille, car elle peut avoir change (si c'est la taille par defaut, ou si elle est devenue trop grande).
825
pMinimalConfig = g_new0 (CairoDockMinimalAppletConfig, 1);
826
pKeyFile = cairo_dock_pre_read_module_instance_config (pInstance, pMinimalConfig);
827
g_key_file_free (pKeyFile);
830
pIcon->fWidth = pMinimalConfig->iDesiredIconWidth;
831
pIcon->fHeight = pMinimalConfig->iDesiredIconHeight;
833
// on charge l'icone a la bonne taille.
834
cairo_dock_set_icon_size (pNewContainer, pIcon);
835
cairo_dock_load_icon_buffers (pIcon, pNewContainer);
837
// on insere l'icone dans le dock ou on met a jour celui-ci.
838
if (pNewDock != pCurrentDock) // on l'insere dans son nouveau dock.
840
cairo_dock_insert_icon_in_dock (pIcon, pNewDock, CAIRO_DOCK_UPDATE_DOCK_SIZE, CAIRO_DOCK_ANIMATE_ICON);
841
pIcon->cParentDockName = g_strdup (pMinimalConfig->cDockName != NULL ? pMinimalConfig->cDockName : CAIRO_DOCK_MAIN_DOCK_NAME);
842
cairo_dock_start_icon_animation (pIcon, pNewDock);
844
else // le dock n'a pas change, on le met a jour.
846
pIcon->fWidth *= pNewContainer->fRatio;
847
pIcon->fHeight *= pNewContainer->fRatio;
849
if (bReloadAppletConf)
851
cairo_dock_update_dock_size (pNewDock);
852
cairo_dock_calculate_dock_icons (pNewDock);
853
gtk_widget_queue_draw (pNewContainer->pWidget);
858
//\_______________________ On recharge la config.
859
gboolean bCanReload = TRUE;
860
if (pKeyFile != NULL)
862
_cairo_dock_read_module_config (pKeyFile, pInstance);
865
if (pInstance->pDrawContext != NULL)
867
cairo_destroy (pInstance->pDrawContext);
868
pInstance->pDrawContext = NULL;
870
if (pIcon && pIcon->pIconBuffer) // applet, on lui associe un contexte de dessin avant le reload.
872
pInstance->pDrawContext = cairo_create (pIcon->pIconBuffer);
873
if (cairo_status (pInstance->pDrawContext) != CAIRO_STATUS_SUCCESS)
875
cd_warning ("couldn't initialize drawing context, applet won't be reloaded !");
877
pInstance->pDrawContext = NULL;
881
//\_______________________ On recharge l'instance.
882
if (bCanReload && module->pInterface->reloadModule != NULL)
883
bModuleReloaded = module->pInterface->reloadModule (pInstance, pCurrentContainer, pKeyFile);
885
if (pNewContainer != pCurrentContainer && pNewDock != NULL && pCurrentDock != NULL && pIcon != NULL && pIcon->pSubDock != NULL)
887
cairo_dock_synchronize_one_sub_dock_orientation (pIcon->pSubDock, pNewDock, TRUE);
890
if (pNewDock != NULL && pNewDock->iRefCount != 0) // on redessine l'icone pointant sur le sous-dock contenant l'applet, au cas ou son image aurait change.
892
cairo_dock_redraw_subdock_content (pNewDock);
895
if (pNewDock || pCurrentDock)
896
cairo_dock_trigger_refresh_launcher_gui ();
898
//\_______________________ On nettoie derriere nous.
899
cairo_dock_free_minimal_config (pMinimalConfig);
900
if (pKeyFile != NULL)
901
g_key_file_free (pKeyFile);
903
if (pCurrentDesklet != NULL && pCurrentDesklet != pNewDesklet)
904
cairo_dock_destroy_desklet (pCurrentDesklet);
905
if (pCurrentDock != NULL && pCurrentDock != pNewDock)
907
if (pCurrentDock->iRefCount == 0 && pCurrentDock->icons == NULL && !pCurrentDock->bIsMainDock) // dock principal vide.
909
cairo_dock_destroy_dock (pCurrentDock, cOldDockName);
913
cairo_dock_update_dock_size (pCurrentDock);
914
cairo_dock_calculate_dock_icons (pCurrentDock);
915
gtk_widget_queue_draw (pCurrentContainer->pWidget);
918
if (pNewDesklet != NULL && pIcon && pIcon->pSubDock != NULL)
920
cairo_dock_destroy_dock (pIcon->pSubDock, cCurrentSubDockName);
921
pIcon->pSubDock = NULL;
923
g_free (cOldDockName);
924
g_free (cCurrentSubDockName);
932
void cairo_dock_free_module (CairoDockModule *module)
936
cd_debug ("%s (%s)", __func__, module->pVisitCard->cModuleName);
938
cairo_dock_deactivate_module (module);
940
_cairo_dock_close_module (module);
942
cairo_dock_free_visit_card (module->pVisitCard);
943
g_free (module->cSoFilePath);
947
void cairo_dock_activate_module (CairoDockModule *module, GError **erreur)
949
g_return_if_fail (module != NULL);
950
cd_message ("%s (%s)", __func__, module->pVisitCard->cModuleName);
952
if (module->pInstancesList != NULL)
954
cd_warning ("module %s already activated", module->pVisitCard->cModuleName);
955
g_set_error (erreur, 1, 1, "%s () : module %s is already active !", __func__, module->pVisitCard->cModuleName);
959
g_free (module->cConfFilePath);
960
module->cConfFilePath = cairo_dock_check_module_conf_file (module->pVisitCard);
962
gchar *cInstanceFilePath = NULL;
967
cInstanceFilePath = g_strdup (module->cConfFilePath);
969
cInstanceFilePath = g_strdup_printf ("%s-%d", module->cConfFilePath, j);
971
if (cInstanceFilePath != NULL && ! g_file_test (cInstanceFilePath, G_FILE_TEST_EXISTS)) // la 1ere condition est pour xxx-integration par exemple .
973
g_free (cInstanceFilePath);
977
cairo_dock_instanciate_module (module, cInstanceFilePath); // prend possession de 'cInstanceFilePath'.
984
g_set_error (erreur, 1, 1, "%s () : no instance of module %s could be created", __func__, module->pVisitCard->cModuleName);
989
void cairo_dock_deactivate_module (CairoDockModule *module)
991
g_return_if_fail (module != NULL);
992
cd_debug ("%s (%s, %s)", __func__, module->pVisitCard->cModuleName, module->cConfFilePath);
993
g_list_foreach (module->pInstancesList, (GFunc) _cairo_dock_stop_module_instance, NULL);
994
g_list_foreach (module->pInstancesList, (GFunc) _cairo_dock_free_module_instance, NULL);
995
g_list_free (module->pInstancesList);
996
module->pInstancesList = NULL;
999
void cairo_dock_reload_module (CairoDockModule *pModule, gboolean bReloadAppletConf)
1002
CairoDockModuleInstance *pInstance;
1003
for (pElement = pModule->pInstancesList; pElement != NULL; pElement = pElement->next)
1005
pInstance = pElement->data;
1006
cairo_dock_reload_module_instance (pInstance, bReloadAppletConf);
1011
void cairo_dock_activate_modules_from_list (gchar **cActiveModuleList, double fTime)
1013
//\_______________ On active les modules auto-charges en premier.
1014
GError *erreur = NULL;
1016
CairoDockModule *pModule;
1018
for (m = s_AutoLoadedModules; m != NULL; m = m->next)
1021
pModule->fLastLoadingTime = fTime;
1022
if (pModule->pInstancesList == NULL) // on ne les active qu'une seule fois. Si lors d'un changement de theme on re-active les modules, ceux-la resteront inchanges.
1024
cairo_dock_activate_module (pModule, &erreur);
1027
cd_warning (erreur->message);
1028
g_error_free (erreur);
1034
if (cActiveModuleList == NULL)
1037
//\_______________ On active tous les autres.
1039
GList *pNotFoundModules = NULL;
1040
for (i = 0; cActiveModuleList[i] != NULL; i ++)
1042
cModuleName = cActiveModuleList[i];
1043
pModule = g_hash_table_lookup (s_hModuleTable, cModuleName);
1044
if (pModule == NULL)
1046
cd_debug ("No such module (%s)", cModuleName);
1047
pNotFoundModules = g_list_prepend (pNotFoundModules, cModuleName);
1051
pModule->fLastLoadingTime = fTime;
1052
if (pModule->pInstancesList == NULL)
1054
cairo_dock_activate_module (pModule, &erreur);
1057
cd_warning (erreur->message);
1058
g_error_free (erreur);
1064
cairo_dock_reload_module (pModule, FALSE);
1069
static void _cairo_dock_deactivate_one_old_module (gchar *cModuleName, CairoDockModule *pModule, double *fTime)
1071
if (pModule->fLastLoadingTime < *fTime)
1072
cairo_dock_deactivate_module (pModule);
1074
void cairo_dock_deactivate_old_modules (double fTime)
1076
g_hash_table_foreach (s_hModuleTable, (GHFunc) _cairo_dock_deactivate_one_old_module, &fTime);
1079
static void _cairo_dock_deactivate_one_module (gchar *cModuleName, CairoDockModule *pModule, gpointer data)
1081
cairo_dock_deactivate_module (pModule);
1083
void cairo_dock_deactivate_all_modules (void)
1085
g_hash_table_foreach (s_hModuleTable, (GHFunc) _cairo_dock_deactivate_one_module, NULL);
1086
if (s_iSidWriteModules != 0)
1088
g_source_remove (s_iSidWriteModules);
1089
s_iSidWriteModules = 0;
1094
/////////////////////////
1095
/// MODULES HIGH LEVEL///
1096
/////////////////////////
1098
void cairo_dock_activate_module_and_load (const gchar *cModuleName)
1100
CairoDockModule *pModule = cairo_dock_find_module_from_name (cModuleName);
1101
g_return_if_fail (pModule != NULL);
1103
pModule->fLastLoadingTime = 0;
1104
if (pModule->pInstancesList == NULL)
1106
GError *erreur = NULL;
1107
cairo_dock_activate_module (pModule, &erreur);
1110
cd_warning (erreur->message);
1111
g_error_free (erreur);
1116
cairo_dock_reload_module (pModule, FALSE);
1120
CairoDockModuleInstance *pInstance;
1121
for (pElement = pModule->pInstancesList; pElement != NULL; pElement = pElement->next)
1123
pInstance = pElement->data;
1124
if (pInstance->pDock)
1126
cairo_dock_update_dock_size (pInstance->pDock);
1127
gtk_widget_queue_draw (pInstance->pDock->container.pWidget);
1131
cairo_dock_write_active_modules ();
1134
// deinstanciate_module, remove icon, free_icon, write
1135
static void cairo_dock_deactivate_module_instance_and_unload (CairoDockModuleInstance *pInstance)
1137
g_return_if_fail (pInstance != NULL);
1138
cd_message ("%s (%s)", __func__, pInstance->cConfFilePath);
1140
Icon *pIcon = pInstance->pIcon; // l'instance va etre detruite.
1141
CairoDock *pDock = pInstance->pDock;
1144
cairo_dock_remove_icon_from_dock (pDock, pInstance->pIcon); // desinstancie le module et tout.
1145
cairo_dock_update_dock_size (pDock);
1146
gtk_widget_queue_draw (pDock->container.pWidget);
1150
cairo_dock_deinstanciate_module (pInstance);
1152
pIcon->pModuleInstance = NULL;
1154
cairo_dock_free_icon (pIcon);
1157
void cairo_dock_deactivate_module_and_unload (const gchar *cModuleName)
1159
///if (g_pPrimaryContainer == NULL)
1161
CairoDockModule *pModule = cairo_dock_find_module_from_name (cModuleName);
1162
g_return_if_fail (pModule != NULL);
1164
GList *pElement = pModule->pInstancesList, *pNextElement;
1165
CairoDockModuleInstance *pInstance;
1166
cd_debug ("%d instance(s) a arreter", g_list_length (pModule->pInstancesList));
1167
//for (pElement = pModule->pInstancesList; pElement != NULL; pElement = pElement->next)
1168
while (pElement != NULL)
1170
pInstance = pElement->data;
1171
pNextElement = pElement->next;
1172
cairo_dock_deactivate_module_instance_and_unload (pInstance);
1173
pElement = pNextElement;
1176
cairo_dock_write_active_modules ();
1181
* Stoppe une instance d'un module, et la supprime.
1183
void cairo_dock_remove_module_instance (CairoDockModuleInstance *pInstance)
1185
cd_message ("%s (%s)", __func__, pInstance->cConfFilePath);
1186
//\_________________ Si c'est la derniere instance, on desactive le module.
1187
if (pInstance->pModule->pInstancesList->next == NULL)
1189
cairo_dock_deactivate_module_and_unload (pInstance->pModule->pVisitCard->cModuleName);
1193
//\_________________ On efface le fichier de conf de cette instance.
1194
cd_debug ("on efface %s", pInstance->cConfFilePath);
1195
g_remove (pInstance->cConfFilePath);
1197
//\_________________ On supprime cette instance (on le fait maintenant, pour que son fichier de conf n'existe plus lors du 'stop'.
1198
gchar *cConfFilePath = pInstance->cConfFilePath;
1199
pInstance->cConfFilePath = NULL;
1200
CairoDockModule *pModule = pInstance->pModule;
1201
cairo_dock_deactivate_module_instance_and_unload (pInstance); // pInstance n'est plus.
1203
//\_________________ Si c'est pas la derniere instance, la derniere instance prend sa place.
1204
int iNbInstances = g_list_length (pModule->pInstancesList)+1; // nombre d'instances avant suppression.
1205
gchar *str = strrchr (cConfFilePath, '-');
1206
if (str == NULL || atoi (str+1) != iNbInstances-1)
1208
gchar *cLastInstanceFilePath = g_strdup_printf ("%s-%d", pModule->cConfFilePath, iNbInstances-1);
1210
CairoDockModuleInstance *pOneInstance;
1212
for (pElement = pModule->pInstancesList; pElement != NULL; pElement = pElement->next)
1214
pOneInstance = pElement->data;
1215
if (strcmp (pOneInstance->cConfFilePath, cLastInstanceFilePath) == 0)
1217
gchar *cCommand = g_strdup_printf ("mv \"%s\" \"%s\"", cLastInstanceFilePath, cConfFilePath);
1218
int r = system (cCommand);
1221
g_free (pOneInstance->cConfFilePath);
1222
pOneInstance->cConfFilePath = cConfFilePath;
1223
cConfFilePath = NULL;
1228
g_free (cLastInstanceFilePath);
1230
g_free (cConfFilePath);
1233
gchar *cairo_dock_add_module_conf_file (CairoDockModule *pModule)
1235
gchar *cConfFilePath;
1236
if (pModule->pInstancesList == NULL) // module non encore instancie, on utilise la fonction qui cree le dossier du module ainsi que son fichier de conf.
1238
cConfFilePath = cairo_dock_check_module_conf_file (pModule->pVisitCard);
1240
else // on rajoute un n-ieme fichier de conf si necessaire.
1242
int iNbInstances = g_list_length (pModule->pInstancesList);
1243
cConfFilePath = g_strdup_printf ("%s-%d", pModule->cConfFilePath, iNbInstances);
1244
if (! g_file_test (cConfFilePath, G_FILE_TEST_EXISTS))
1246
gchar *cCommand = g_strdup_printf ("cp \"%s/%s\" \"%s\"", pModule->pVisitCard->cShareDataDir, pModule->pVisitCard->cConfFileName, cConfFilePath);
1247
cd_debug (cCommand);
1248
int r = system (cCommand);
1252
return cConfFilePath;
1255
void cairo_dock_add_module_instance (CairoDockModule *pModule)
1257
if (pModule->pInstancesList == NULL)
1259
cd_warning ("This module has not been instanciated yet");
1263
gchar *cInstanceFilePath = cairo_dock_add_module_conf_file (pModule);
1265
CairoDockModuleInstance *pNewInstance = cairo_dock_instanciate_module (pModule, cInstanceFilePath); // prend le 'cInstanceFilePath'.
1267
if (pNewInstance != NULL && pNewInstance->pDock)
1269
cairo_dock_update_dock_size (pNewInstance->pDock);
1273
void cairo_dock_detach_module_instance (CairoDockModuleInstance *pInstance)
1275
//g_return_if_fail (pInstance->pDesklet == NULL);
1276
//\__________________ On recupere l'etat actuel.
1277
gboolean bIsDetached = (pInstance->pDesklet != NULL);
1278
if ((bIsDetached && pInstance->pModule->pVisitCard->iContainerType & CAIRO_DOCK_MODULE_CAN_DOCK) ||
1279
(!bIsDetached && pInstance->pModule->pVisitCard->iContainerType & CAIRO_DOCK_MODULE_CAN_DESKLET))
1281
//\__________________ On enregistre l'etat 'detache'.
1282
cairo_dock_update_conf_file (pInstance->cConfFilePath,
1283
G_TYPE_BOOLEAN, "Desklet", "initially detached", !bIsDetached,
1285
//\__________________ On met a jour le panneau de conf s'il etait ouvert sur cette applet.
1286
cairo_dock_update_desklet_detached_state_in_gui (pInstance, !bIsDetached);
1287
//\__________________ On detache l'applet.
1288
cairo_dock_reload_module_instance (pInstance, TRUE);
1289
if (pInstance->pDesklet) // on a bien detache l'applet.
1290
cairo_dock_zoom_out_desklet (pInstance->pDesklet);
1294
void cairo_dock_detach_module_instance_at_position (CairoDockModuleInstance *pInstance, int iCenterX, int iCenterY)
1296
g_return_if_fail (pInstance->pDesklet == NULL);
1297
//\__________________ On enregistre les nouvelles coordonnees qu'aura le desklet, ainsi que l'etat 'detache'.
1298
GKeyFile *pKeyFile = cairo_dock_open_key_file (pInstance->cConfFilePath);
1299
if (pKeyFile != NULL)
1301
int iDeskletWidth = cairo_dock_get_integer_key_value (pKeyFile, "Desklet", "width", NULL, 92, NULL, NULL);
1302
int iDeskletHeight = cairo_dock_get_integer_key_value (pKeyFile, "Desklet", "height", NULL, 92, NULL, NULL);
1304
int iDeskletPositionX = iCenterX - iDeskletWidth/2;
1305
int iDeskletPositionY = iCenterY - iDeskletHeight/2;
1307
int iRelativePositionX = (iDeskletPositionX + iDeskletWidth/2 <= g_desktopGeometry.iXScreenWidth[CAIRO_DOCK_HORIZONTAL]/2 ? iDeskletPositionX : iDeskletPositionX - g_desktopGeometry.iXScreenWidth[CAIRO_DOCK_HORIZONTAL]);
1308
int iRelativePositionY = (iDeskletPositionY + iDeskletHeight/2 <= g_desktopGeometry.iXScreenHeight[CAIRO_DOCK_HORIZONTAL]/2 ? iDeskletPositionY : iDeskletPositionY - g_desktopGeometry.iXScreenHeight[CAIRO_DOCK_HORIZONTAL]);
1310
g_key_file_set_double (pKeyFile, "Desklet", "x position", iDeskletPositionX);
1311
g_key_file_set_double (pKeyFile, "Desklet", "y position", iDeskletPositionY);
1312
g_key_file_set_boolean (pKeyFile, "Desklet", "initially detached", TRUE);
1314
cairo_dock_write_keys_to_file (pKeyFile, pInstance->cConfFilePath);
1315
g_key_file_free (pKeyFile);
1317
//\__________________ On met a jour le panneau de conf s'il etait ouvert sur cette applet.
1318
cairo_dock_update_desklet_position_in_gui (pInstance, iDeskletPositionX, iDeskletPositionY);
1319
cairo_dock_update_desklet_detached_state_in_gui (pInstance, TRUE);
1322
//\__________________ On detache l'applet.
1323
cairo_dock_reload_module_instance (pInstance, TRUE);
1324
if (pInstance->pDesklet) // on a bien detache l'applet.
1325
cairo_dock_zoom_out_desklet (pInstance->pDesklet);
1329
static int s_iNbUsedSlots = 0;
1330
static CairoDockModuleInstance *s_pUsedSlots[CAIRO_DOCK_NB_DATA_SLOT+1];
1331
gboolean cairo_dock_reserve_data_slot (CairoDockModuleInstance *pInstance)
1333
g_return_val_if_fail (s_iNbUsedSlots < CAIRO_DOCK_NB_DATA_SLOT, FALSE);
1334
if (s_iNbUsedSlots == 0)
1335
memset (s_pUsedSlots, 0, (CAIRO_DOCK_NB_DATA_SLOT+1) * sizeof (CairoDockModuleInstance*));
1337
if (pInstance->iSlotID == 0)
1340
if (s_pUsedSlots[s_iNbUsedSlots] == NULL)
1342
pInstance->iSlotID = s_iNbUsedSlots;
1343
s_pUsedSlots[s_iNbUsedSlots] = pInstance;
1348
for (i = 1; i < s_iNbUsedSlots; i ++)
1350
if (s_pUsedSlots[i] == NULL)
1352
pInstance->iSlotID = i;
1353
s_pUsedSlots[i] = pInstance;
1362
void cairo_dock_release_data_slot (CairoDockModuleInstance *pInstance)
1364
if (pInstance->iSlotID == 0)
1367
s_pUsedSlots[pInstance->iSlotID] = NULL;
1368
pInstance->iSlotID = 0;
1372
////////////////////////
1373
/// INTERNAL MODULES ///
1374
////////////////////////
1376
#define REGISTER_INTERNAL_MODULE(cGroupName) \
1377
pModule = g_new0 (CairoDockInternalModule, 1);\
1378
cairo_dock_pre_init_##cGroupName (pModule);\
1379
g_hash_table_insert (pModuleTable, (gpointer)pModule->cModuleName, pModule)
1380
void cairo_dock_preload_internal_modules (GHashTable *pModuleTable)
1383
CairoDockInternalModule *pModule;
1385
REGISTER_INTERNAL_MODULE (Position);
1386
REGISTER_INTERNAL_MODULE (Accessibility);
1387
REGISTER_INTERNAL_MODULE (System);
1388
REGISTER_INTERNAL_MODULE (TaskBar);
1389
REGISTER_INTERNAL_MODULE (Background);
1390
REGISTER_INTERNAL_MODULE (Icons);
1391
REGISTER_INTERNAL_MODULE (Labels);
1392
REGISTER_INTERNAL_MODULE (Dialogs);
1393
REGISTER_INTERNAL_MODULE (Indicators);
1394
REGISTER_INTERNAL_MODULE (Views);
1395
REGISTER_INTERNAL_MODULE (Desklets);
1398
void cairo_dock_reload_internal_module_from_keyfile (CairoDockInternalModule *pModule, GKeyFile *pKeyFile)
1400
gpointer *pPrevConfig = g_memdup (pModule->pConfig, pModule->iSizeOfConfig);
1401
memset (pModule->pConfig, 0, pModule->iSizeOfConfig);
1403
pModule->get_config (pKeyFile, pModule->pConfig);
1405
if (g_pPrimaryContainer != NULL) // si on est en mode maintenance, inutile de recharger.
1406
pModule->reload (pPrevConfig, pModule->pConfig);
1408
if (pModule->reset_config)
1409
pModule->reset_config (pPrevConfig);
1410
g_free (pPrevConfig);
1413
void cairo_dock_reload_internal_module (CairoDockInternalModule *pModule, const gchar *cConfFilePath)
1415
g_return_if_fail (pModule != NULL);
1416
GKeyFile *pKeyFile = cairo_dock_open_key_file (cConfFilePath);
1417
if (pKeyFile == NULL)
1420
cairo_dock_reload_internal_module_from_keyfile (pModule, pKeyFile);
1422
g_key_file_free (pKeyFile);
1425
CairoDockInternalModule *cairo_dock_find_internal_module_from_name (const gchar *cModuleName)
1427
//g_print ("%s (%s)\n", __func__, cModuleName);
1428
g_return_val_if_fail (cModuleName != NULL, NULL);
1429
return g_hash_table_lookup (s_hInternalModuleTable, cModuleName);
1432
gboolean cairo_dock_get_internal_module_config (CairoDockInternalModule *pModule, GKeyFile *pKeyFile)
1434
if (pModule->reset_config)
1436
pModule->reset_config (pModule->pConfig);
1438
memset (pModule->pConfig, 0, pModule->iSizeOfConfig);
1439
return pModule->get_config (pKeyFile, pModule->pConfig);
1442
static void _cairo_dock_get_one_internal_module_config (gchar *cModuleName, CairoDockInternalModule *pModule, gpointer *data)
1444
GKeyFile *pKeyFile = data[0];
1445
gboolean *bFlushConfFileNeeded = data[1];
1446
*bFlushConfFileNeeded |= cairo_dock_get_internal_module_config (pModule, pKeyFile);
1448
gboolean cairo_dock_get_global_config (GKeyFile *pKeyFile)
1450
gboolean bFlushConfFileNeeded = FALSE;
1451
gpointer data[2] = {pKeyFile, &bFlushConfFileNeeded};
1452
g_hash_table_foreach (s_hInternalModuleTable, (GHFunc) _cairo_dock_get_one_internal_module_config, data);
1453
return bFlushConfFileNeeded;
1457
void cairo_dock_popup_module_instance_description (CairoDockModuleInstance *pModuleInstance)
1459
gchar *cDescription = g_strdup_printf ("%s (v%s) by %s\n%s",
1460
pModuleInstance->pModule->pVisitCard->cModuleName,
1461
pModuleInstance->pModule->pVisitCard->cModuleVersion,
1462
pModuleInstance->pModule->pVisitCard->cAuthor,
1463
dgettext (pModuleInstance->pModule->pVisitCard->cGettextDomain,
1464
pModuleInstance->pModule->pVisitCard->cDescription));
1466
myDialogs.dialogTextDescription.bUseMarkup = TRUE;
1467
cairo_dock_show_temporary_dialog_with_icon (cDescription, pModuleInstance->pIcon, pModuleInstance->pContainer, 0, pModuleInstance->pModule->pVisitCard->cIconFilePath);
1468
g_free (cDescription);
1469
myDialogs.dialogTextDescription.bUseMarkup = FALSE;
1472
void cairo_dock_attach_to_another_module (CairoDockVisitCard *pVisitCard, const gchar *cOtherModuleName)
1474
CairoDockInternalModule *pInternalModule = cairo_dock_find_internal_module_from_name (cOtherModuleName);
1475
g_return_if_fail (pInternalModule != NULL && pInternalModule->iCategory == pVisitCard->iCategory && pVisitCard->cInternalModule == NULL);
1477
pInternalModule->pExternalModules = g_list_prepend (pInternalModule->pExternalModules, (gpointer)pVisitCard->cModuleName);
1478
pVisitCard->cInternalModule = cOtherModuleName;
1482
static gboolean _write_modules (gpointer data)
1484
gchar *cModuleNames = cairo_dock_list_active_modules ();
1486
cairo_dock_update_conf_file (g_cConfFile,
1487
G_TYPE_STRING, "System", "modules", cModuleNames,
1489
g_free (cModuleNames);
1491
static gboolean _write_modules_idle (gpointer data)
1493
_write_modules (data);
1494
s_iSidWriteModules = 0;
1497
void cairo_dock_write_active_modules (void)
1499
if (s_iSidWriteModules == 0)
1500
s_iSidWriteModules = g_idle_add (_write_modules_idle, NULL);