160
164
gchar *cCommand = g_strdup_printf ("%s wget \"%s/%s/%s\" -O \"%s\" -t %d -T %d%s", (iShowActivity == 2 ? "xterm -e '" : ""), cServerAdress, cDistantFilePath, cDistantFileName, cTmpFilePath, CAIRO_DOCK_DL_NB_RETRY, CAIRO_DOCK_DL_TIMEOUT, (iShowActivity == 2 ? "'" : ""));
161
165
g_print ("%s\n", cCommand);
162
167
int r = system (cCommand);
166
170
g_set_error (erreur, 1, 1, "an error occured while executing '%s'", cCommand);
168
172
g_free (cTmpFilePath);
169
173
cTmpFilePath = NULL;
176
gboolean bOk = (cTmpFilePath != NULL);
177
if (cTmpFilePath != NULL)
180
stat (cTmpFilePath, &buf);
181
bOk = (buf.st_size > 0);
185
g_set_error (erreur, 1, 1, "couldn't get distant file %s", cDistantFileName);
186
cairo_dock_set_status_message_printf (s_pThemeManager, _("couldn't get distant file %s"), cDistantFileName);
187
g_remove (cTmpFilePath);
188
g_free (cTmpFilePath);
193
cairo_dock_set_status_message (s_pThemeManager, "");
171
196
g_free (cCommand);
173
198
if (cTmpFilePath != NULL && cExtractTo != NULL)
226
251
cd_message ("listing net themes on %s/%s ...", cServerAdress, cDirectory);
228
253
GError *tmp_erreur = NULL;
229
gchar *cContent = cairo_dock_get_distant_file_content (cServerAdress, cDirectory, cListFileName, 1, &tmp_erreur);
254
gchar *cContent = cairo_dock_get_distant_file_content (cServerAdress, cDirectory, cListFileName, 0, &tmp_erreur);
230
255
if (tmp_erreur != NULL)
232
257
cd_warning ("couldn't retrieve themes on %s (check that your connection is alive, or retry later)", cServerAdress);
386
static void on_theme_destroy (gpointer *user_data)
411
static void on_theme_destroy (gchar *cInitConfFile)
388
413
g_print ("%s ()\n", __func__);
389
g_remove (user_data[0]);
390
g_free (user_data[0]);
391
cairo_dock_dialog_unreference (user_data[2]);
394
static gboolean on_theme_apply (gpointer *user_data)
396
gchar *cInitConfFile = user_data[0];
397
GtkWidget *pWidget = user_data[2];
414
g_remove (cInitConfFile);
415
g_free (cInitConfFile);
416
s_pThemeManager = NULL;
419
static gboolean _find_module_from_user_data_dir (gchar *cModuleName, CairoDockModule *pModule, const gchar *cUserDataDirName)
421
if (pModule->pVisitCard->cUserDataDir && strcmp (cUserDataDirName, pModule->pVisitCard->cUserDataDir) == 0)
425
static gboolean on_theme_apply (gchar *cInitConfFile)
398
427
g_print ("%s (%s)\n", __func__, cInitConfFile);
399
428
GError *erreur = NULL;
400
429
int r; // resultat de system().
740
g_string_printf (sCommand, "find '%s' -mindepth 1 ! -name '*.conf' ! -path '%s/%s*' ! -type d -exec cp -p {} '%s' \\;", cNewThemePath, cNewThemePath, CAIRO_DOCK_LAUNCHERS_DIR, g_cCurrentThemePath); // copie tous les fichiers du nouveau theme sauf les lanceurs/icones et les .conf du dock et des plug-ins.
769
g_string_printf (sCommand, "find '%s' -mindepth 1 ! -name '*.conf' ! -path '%s/%s*' ! -type d -exec cp -p {} '%s' \\;", cNewThemePath, cNewThemePath, CAIRO_DOCK_LAUNCHERS_DIR, g_cCurrentThemePath); // copie tous les fichiers du nouveau theme sauf les lanceurs et les .conf du dock et des plug-ins.
741
770
cd_message (sCommand->str);
742
771
r = system (sCommand->str);
744
773
gchar *cNewPlugInsDir = g_strdup_printf ("%s/%s", cNewThemePath, "plug-ins");
745
774
GDir *dir = g_dir_open (cNewPlugInsDir, 0, NULL); // NULL si ce theme n'a pas de repertoire 'plug-ins'.
746
const gchar* cModuleName;
747
gchar *cConfFilePath, *cNewConfFilePath, *cUserDataDirPath;
775
const gchar* cModuleDirName;
776
gchar *cConfFilePath, *cNewConfFilePath, *cUserDataDirPath, *cConfFileName;
750
cModuleName = g_dir_read_name (dir);
751
if (cModuleName == NULL)
779
cModuleDirName = g_dir_read_name (dir);
780
if (cModuleDirName == NULL)
754
CairoDockModule *pModule = cairo_dock_find_module_from_name (cModuleName);
783
/*CairoDockModule *pModule = cairo_dock_find_module_from_name (cModuleName);
755
784
if (pModule == NULL || pModule->pVisitCard == NULL)
758
cd_debug (" installing %s's config\n", cModuleName);
759
cUserDataDirPath = g_strdup_printf ("%s/plug-ins/%s", g_cCurrentThemePath, pModule->pVisitCard->cUserDataDir);
787
cd_debug (" installing %s's config\n", cModuleDirName);
788
cUserDataDirPath = g_strdup_printf ("%s/plug-ins/%s", g_cCurrentThemePath, cModuleDirName);
760
789
if (! g_file_test (cUserDataDirPath, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR))
762
791
cd_debug (" directory %s doesn't exist, it will be created.", cUserDataDirPath);
764
gchar *command = g_strdup_printf ("mkdir -p %s", cUserDataDirPath);
793
gchar *command = g_strdup_printf ("mkdir -p '%s'", cUserDataDirPath);
765
794
r = system (command);
766
795
g_free (command);
768
cConfFilePath = g_strdup_printf ("%s/%s", cUserDataDirPath, pModule->pVisitCard->cConfFileName);
769
cNewConfFilePath = g_strdup_printf ("%s/%s/%s", cNewPlugInsDir, pModule->pVisitCard->cUserDataDir, pModule->pVisitCard->cConfFileName);
798
cConfFileName = g_strdup_printf ("%s.conf", cModuleDirName);
799
cNewConfFilePath = g_strdup_printf ("%s/%s/%s", cNewPlugInsDir, cModuleDirName, cConfFileName);
800
if (! g_file_test (cNewConfFilePath, G_FILE_TEST_EXISTS))
802
g_free (cConfFileName);
803
g_free (cNewConfFilePath);
804
CairoDockModule *pModule = cairo_dock_foreach_module ((GHRFunc) _find_module_from_user_data_dir, cModuleDirName);
805
if (pModule == NULL) // du coup, dans ce cas-la, on ne charge pas des plug-ins non utilises par l'utilisateur.
807
cd_warning ("couldn't find the module owning '%s', this file will be ignored.");
810
cConfFileName = g_strdup (pModule->pVisitCard->cConfFileName);
811
cNewConfFilePath = g_strdup_printf ("%s/%s/%s", cNewPlugInsDir, cModuleDirName, cConfFileName);
813
cConfFilePath = g_strdup_printf ("%s/%s", cUserDataDirPath, cConfFileName);
771
815
if (! g_file_test (cConfFilePath, G_FILE_TEST_EXISTS))
801
gboolean cairo_dock_manage_themes (GtkWidget *pWidget, CairoDockStartMode iMode)
846
void cairo_dock_manage_themes (void)
848
if (s_pThemeManager != NULL)
850
gtk_window_present (GTK_WINDOW (s_pThemeManager));
803
854
gchar *cInitConfFile = cairo_dock_build_temporary_themes_conf_file (); // sera supprime a la destruction de la fenetre.
805
856
//\___________________ On laisse l'utilisateur l'editer.
806
857
gchar *cPresentedGroup = (cairo_dock_theme_need_save () ? "Save" : NULL);
807
const gchar *cTitle = (iMode == CAIRO_DOCK_START_SAFE ? _("< Safe Mode >") : _("Manage Themes"));
809
CairoDialog *pDialog = NULL;
810
if (iMode == CAIRO_DOCK_START_SAFE)
812
pDialog = cairo_dock_show_general_message (_("You are running Cairo-Dock in safe mode.\nWhy ? Probably because a plug-in has messed into your dock,\n or maybe your theme has got corrupted.\nSo, no plug-in will be available, and you can now save your current theme if you want\n before you start using the dock.\nTry with your current theme, if it works, it means a plug-in is wrong.\nOtherwise, try with another theme.\nSave a config that is working, and restart the dock in normal mode.\nThen, activate plug-ins one by one to guess which one is wrong."), 0.);
813
g_print ("safe mode ...\n");
814
while (gtk_events_pending ())
815
gtk_main_iteration ();
818
gpointer *data = g_new0 (gpointer, 3);
819
data[0] = cInitConfFile;
822
if (iMode == CAIRO_DOCK_START_NOMINAL)
824
gboolean bChoiceOK = cairo_dock_build_normal_gui (cInitConfFile, NULL, cTitle, CAIRO_DOCK_THEME_PANEL_WIDTH, CAIRO_DOCK_THEME_PANEL_HEIGHT, (CairoDockApplyConfigFunc) on_theme_apply, data, (GFreeFunc) on_theme_destroy);
826
else // maintenance ou sans echec.
828
gboolean bChoiceOK = cairo_dock_build_normal_gui (cInitConfFile, NULL, cTitle, CAIRO_DOCK_THEME_PANEL_WIDTH, CAIRO_DOCK_THEME_PANEL_HEIGHT, NULL, NULL, NULL); // bloquant.
829
on_theme_apply (data);
830
on_theme_destroy (data);
858
const gchar *cTitle = _("Manage Themes");
860
cairo_dock_build_normal_gui (cInitConfFile,
862
CAIRO_DOCK_THEME_PANEL_WIDTH, CAIRO_DOCK_THEME_PANEL_HEIGHT,
863
(CairoDockApplyConfigFunc) on_theme_apply,
865
(GFreeFunc) on_theme_destroy,
836
869
gchar *cairo_dock_get_theme_path (const gchar *cThemeName, const gchar *cShareThemesDir, const gchar *cUserThemesDir, const gchar *cDistantThemesDir)
862
895
gchar *cDistantFileName = g_strdup_printf ("%s/%s.tar.gz", cThemeName, cThemeName);
863
896
GError *erreur = NULL;
864
cThemePath = cairo_dock_download_file (g_cThemeServerAdress != NULL ? g_cThemeServerAdress : CAIRO_DOCK_THEME_SERVER, cDistantThemesDir, cDistantFileName, 2, cUserThemesDir, &erreur);
897
cThemePath = cairo_dock_download_file (g_cThemeServerAdress != NULL ? g_cThemeServerAdress : CAIRO_DOCK_THEME_SERVER, cDistantThemesDir, cDistantFileName, 0, cUserThemesDir, &erreur);
865
898
g_free (cDistantFileName);
866
899
if (erreur != NULL)
868
901
cd_warning ("couldn't retrieve distant theme %s : %s" , cThemeName, erreur->message);
902
cairo_dock_set_status_message_printf (s_pThemeManager, _("couldn't retrieve distant theme %s"), cThemeName); // le message sera repris par une bulle de dialogue, mais on le met la aussi quand meme.
869
903
g_error_free (erreur);