41
42
extern gchar *g_cCurrentThemePath;
42
43
extern gchar *g_cCurrentLaunchersPath;
46
static gchar *_cairo_dock_generate_desktop_filename (const gchar *cBaseName, gchar *cCairoDockDataDir)
48
int iPrefixNumber = 0;
49
GString *sFileName = g_string_new ("");
54
g_string_printf (sFileName, "%s/%02d%s", cCairoDockDataDir, iPrefixNumber, cBaseName);
55
} while (iPrefixNumber < 99 && g_file_test (sFileName->str, G_FILE_TEST_EXISTS));
57
g_string_free (sFileName, TRUE);
58
if (iPrefixNumber == 99)
61
return g_strdup_printf ("%02d%s", iPrefixNumber, cBaseName);
44
65
void cairo_dock_remove_html_spaces (gchar *cString)
46
67
gchar *str = cString;
81
static inline const gchar *_cairo_dock_get_launcher_template_conf_file (CairoDockDesktopFileType iNewDesktopFileType)
83
const gchar *cTemplateFile;
84
switch (iNewDesktopFileType)
86
case CAIRO_DOCK_DESKTOP_FILE_FOR_LAUNCHER :
88
cTemplateFile = CAIRO_DOCK_LAUNCHER_CONF_FILE;
90
case CAIRO_DOCK_DESKTOP_FILE_FOR_CONTAINER :
91
cTemplateFile = CAIRO_DOCK_CONTAINER_CONF_FILE;
93
case CAIRO_DOCK_DESKTOP_FILE_FOR_SEPARATOR :
94
cTemplateFile = CAIRO_DOCK_SEPARATOR_CONF_FILE;
96
case CAIRO_DOCK_DESKTOP_FILE_FOR_FILE :
97
cTemplateFile = CAIRO_DOCK_FILE_CONF_FILE;
100
return cTemplateFile;
102
static inline gchar *_cairo_dock_get_launcher_template_conf_file_path (CairoDockDesktopFileType iNewDesktopFileType)
104
const gchar *cTemplateFile = _cairo_dock_get_launcher_template_conf_file (iNewDesktopFileType);
105
return g_strdup_printf ("%s/%s", CAIRO_DOCK_SHARE_DATA_DIR, cTemplateFile);
59
108
static gchar *_cairo_dock_generate_desktop_file_for_launcher (const gchar *cDesktopURI, const gchar *cDockName, double fOrder, GError **erreur)
61
110
g_return_val_if_fail (cDesktopURI != NULL, NULL);
126
175
return cNewDesktopFileName;
129
static gchar *_cairo_dock_generate_desktop_file_for_edition (CairoDockNewLauncherType iNewLauncherType, const gchar *cDockName, double fOrder, GError **erreur)
178
static gchar *_cairo_dock_generate_desktop_file_for_edition (CairoDockDesktopFileType iNewDesktopFileType, const gchar *cDockName, double fOrder, GError **erreur)
131
180
//\___________________ On ouvre le patron.
132
gchar *cDesktopFileTemplate = cairo_dock_get_launcher_template_conf_file (iNewLauncherType);
181
gchar *cDesktopFileTemplate = _cairo_dock_get_launcher_template_conf_file_path (iNewDesktopFileType);
134
183
GKeyFile *pKeyFile = cairo_dock_open_key_file (cDesktopFileTemplate);
135
184
g_free (cDesktopFileTemplate);
139
188
//\___________________ On renseigne ce qu'on peut.
140
189
g_key_file_set_double (pKeyFile, "Desktop Entry", "Order", fOrder);
141
190
g_key_file_set_string (pKeyFile, "Desktop Entry", "Container", cDockName);
192
if (iNewDesktopFileType == CAIRO_DOCK_DESKTOP_FILE_FOR_CONTAINER) // on assure l'unicite du nom du dock ici, car cela n'est volontairement pas fait dans la fonction de creation de l'icone.
194
gchar *cUniqueName = cairo_dock_get_unique_dock_name ("_SubDock_");
195
g_key_file_set_string (pKeyFile, "Desktop Entry", "Name", cUniqueName);
196
g_free (cUniqueName);
143
199
//\___________________ On lui choisit un nom de fichier tel qu'il n'y ait pas de collision, et qu'il soit comprehensible par l'utilisateur, au cas ou il voudrait les modifier a la main.
144
gchar *cNewDesktopFileName = cairo_dock_generate_desktop_filename (iNewLauncherType == CAIRO_DOCK_LAUNCHER_FOR_CONTAINER ? "container.desktop" : iNewLauncherType == CAIRO_DOCK_LAUNCHER_FOR_SEPARATOR ? "separator.desktop" : "launcher.desktop", g_cCurrentLaunchersPath);
200
gchar *cNewDesktopFileName = _cairo_dock_generate_desktop_filename (iNewDesktopFileType == CAIRO_DOCK_DESKTOP_FILE_FOR_CONTAINER ? "container.desktop" : iNewDesktopFileType == CAIRO_DOCK_DESKTOP_FILE_FOR_SEPARATOR ? "separator.desktop" : "launcher.desktop", g_cCurrentLaunchersPath);
146
202
//\___________________ On ecrit tout.
147
203
gchar *cNewDesktopFilePath = g_strdup_printf ("%s/%s", g_cCurrentLaunchersPath, cNewDesktopFileName);
190
246
g_free (cIconName);
192
248
g_key_file_set_boolean (pKeyFile, "Desktop Entry", "Is mounting point", (iVolumeID > 0));
194
//\___________________ On lui choisit un nom de fichier tel qu'il n'y ait pas de collision.
195
gchar *cNewDesktopFileName = cairo_dock_generate_desktop_filename ("file-launcher.desktop", g_cCurrentLaunchersPath);
197
//\___________________ On ecrit tout.
198
gchar *cNewDesktopFilePath = g_strdup_printf ("%s/%s", g_cCurrentLaunchersPath, cNewDesktopFileName);
199
cairo_dock_write_keys_to_file (pKeyFile, cNewDesktopFilePath);
200
g_free (cNewDesktopFilePath);
201
g_key_file_free (pKeyFile);
203
return cNewDesktopFileName;
207
gchar *cairo_dock_add_desktop_file_from_uri_full (const gchar *cURI, const gchar *cDockName, double fOrder, CairoDockNewLauncherType iNewLauncherType, CairoDock *pDock, GError **erreur)
249
g_key_file_set_boolean (pKeyFile, "Desktop Entry", "Is container", bIsDirectory);
251
//\___________________ On lui choisit un nom de fichier tel qu'il n'y ait pas de collision.
252
gchar *cNewDesktopFileName = _cairo_dock_generate_desktop_filename ("file-launcher.desktop", g_cCurrentLaunchersPath);
254
//\___________________ On ecrit tout.
255
gchar *cNewDesktopFilePath = g_strdup_printf ("%s/%s", g_cCurrentLaunchersPath, cNewDesktopFileName);
256
cairo_dock_write_keys_to_file (pKeyFile, cNewDesktopFilePath);
257
g_free (cNewDesktopFilePath);
258
g_key_file_free (pKeyFile);
260
return cNewDesktopFileName;
263
static gchar *_cairo_dock_generate_desktop_file_for_script (const gchar *cURI, const gchar *cDockName, double fOrder, GError **erreur)
265
//\___________________ On ouvre le patron.
266
gchar *cDesktopFileTemplate = _cairo_dock_get_launcher_template_conf_file_path (CAIRO_DOCK_DESKTOP_FILE_FOR_LAUNCHER);
268
GKeyFile *pKeyFile = cairo_dock_open_key_file (cDesktopFileTemplate);
269
g_free (cDesktopFileTemplate);
270
if (pKeyFile == NULL)
273
//\___________________ On renseigne ce qu'on peut.
274
g_key_file_set_double (pKeyFile, "Desktop Entry", "Order", fOrder);
275
g_key_file_set_string (pKeyFile, "Desktop Entry", "Container", cDockName);
276
gchar *cName = g_path_get_basename (cURI);
277
g_key_file_set_string (pKeyFile, "Desktop Entry", "Name", cName);
279
gchar *cFilePath = (*cURI == '/' ? g_strdup (cURI) : g_filename_from_uri (cURI, NULL, NULL));
280
g_key_file_set_string (pKeyFile, "Desktop Entry", "Exec", cFilePath);
283
//\___________________ On lui choisit un nom de fichier tel qu'il n'y ait pas de collision.
284
gchar *cNewDesktopFileName = _cairo_dock_generate_desktop_filename ("script-launcher.desktop", g_cCurrentLaunchersPath);
286
//\___________________ On ecrit tout.
287
gchar *cNewDesktopFilePath = g_strdup_printf ("%s/%s", g_cCurrentLaunchersPath, cNewDesktopFileName);
288
cairo_dock_write_keys_to_file (pKeyFile, cNewDesktopFilePath);
289
g_free (cNewDesktopFilePath);
290
g_key_file_free (pKeyFile);
292
return cNewDesktopFileName;
296
gchar *cairo_dock_add_desktop_file_from_uri_full (const gchar *cURI, const gchar *cDockName, double fOrder, CairoDockDesktopFileType iNewDesktopFileType, CairoDock *pDock, GError **erreur)
209
298
cd_message ("%s (%s)", __func__, cURI);
210
299
double fEffectiveOrder;
220
309
fEffectiveOrder = fOrder;
222
//\_________________ On regarde si c'est un repertoire ou un fichier ou sinon un fichier cree a partir de zero.
311
//\_________________ On cree un desktop-file correspondant.
223
312
GError *tmp_erreur = NULL;
224
313
gchar *cNewDesktopFileName;
314
if (cURI == NULL) // on s'appuie sur le type fourni en entree.
227
cNewDesktopFileName = _cairo_dock_generate_desktop_file_for_edition (iNewLauncherType, cDockName, fEffectiveOrder, &tmp_erreur);
316
cNewDesktopFileName = _cairo_dock_generate_desktop_file_for_edition (iNewDesktopFileType, cDockName, fEffectiveOrder, &tmp_erreur);
229
else if (g_str_has_suffix (cURI, ".desktop")) // && (strncmp (cURI, "file://", 7) == 0 || *cURI == '/')
318
else if (g_str_has_suffix (cURI, ".desktop")) // lanceur.
231
320
cNewDesktopFileName = _cairo_dock_generate_desktop_file_for_launcher (cURI, cDockName, fEffectiveOrder, &tmp_erreur);
322
else if (g_str_has_suffix (cURI, ".sh")) // script.
324
cd_message ("This file will be treated as a launcher, not as a file.\nIf this doesn't fit you, you should use the Stack applet, which is dedicated to file stacking.");
325
cNewDesktopFileName = _cairo_dock_generate_desktop_file_for_script (cURI, cDockName, fEffectiveOrder, &tmp_erreur);
327
else // fichier, repertoire ou point de montage.
235
329
cNewDesktopFileName = _cairo_dock_generate_desktop_file_for_file (cURI, cDockName, fEffectiveOrder, &tmp_erreur);
246
gchar *cairo_dock_generate_desktop_filename (const gchar *cBaseName, gchar *cCairoDockDataDir)
248
int iPrefixNumber = 0;
249
GString *sFileName = g_string_new ("");
254
g_string_printf (sFileName, "%s/%02d%s", cCairoDockDataDir, iPrefixNumber, cBaseName);
255
} while (iPrefixNumber < 99 && g_file_test (sFileName->str, G_FILE_TEST_EXISTS));
257
g_string_free (sFileName, TRUE);
258
if (iPrefixNumber == 99)
261
return g_strdup_printf ("%02d%s", iPrefixNumber, cBaseName);
265
void cairo_dock_update_launcher_desktop_file (gchar *cDesktopFilePath, CairoDockNewLauncherType iLauncherType)
341
void cairo_dock_update_launcher_desktop_file (gchar *cDesktopFilePath, CairoDockDesktopFileType iLauncherType)
267
343
GError *erreur = NULL;
268
344
GKeyFile *pKeyFile = cairo_dock_open_key_file (cDesktopFilePath);
272
348
if (cairo_dock_conf_file_needs_update (pKeyFile, CAIRO_DOCK_VERSION))
350
const gchar *cTemplateFile = _cairo_dock_get_launcher_template_conf_file (iLauncherType);
351
g_print ("%s (%s)\n", __func__, cTemplateFile);
274
352
cairo_dock_flush_conf_file_full (pKeyFile,
275
353
cDesktopFilePath,
276
354
CAIRO_DOCK_SHARE_DATA_DIR,
278
(iLauncherType == CAIRO_DOCK_LAUNCHER_FOR_CONTAINER ?
279
CAIRO_DOCK_CONTAINER_CONF_FILE :
280
(iLauncherType == CAIRO_DOCK_LAUNCHER_FOR_SEPARATOR ?
281
CAIRO_DOCK_SEPARATOR_CONF_FILE :
282
CAIRO_DOCK_LAUNCHER_CONF_FILE)));
285
359
g_key_file_free (pKeyFile);
289
gchar *cairo_dock_get_launcher_template_conf_file (CairoDockNewLauncherType iNewLauncherType)
363
void cairo_dock_write_container_name_in_conf_file (Icon *pIcon, const gchar *cParentDockName)
291
return g_strdup_printf ("%s/%s", CAIRO_DOCK_SHARE_DATA_DIR, (iNewLauncherType == CAIRO_DOCK_LAUNCHER_FOR_CONTAINER ? CAIRO_DOCK_CONTAINER_CONF_FILE : iNewLauncherType == CAIRO_DOCK_LAUNCHER_FOR_SEPARATOR ? CAIRO_DOCK_SEPARATOR_CONF_FILE : CAIRO_DOCK_LAUNCHER_CONF_FILE));
365
if (pIcon->cDesktopFileName != NULL) // lanceur ou separateur.
367
gchar *cDesktopFilePath = *pIcon->cDesktopFileName == '/' ? g_strdup (pIcon->cDesktopFileName) : g_strdup_printf ("%s/%s", g_cCurrentLaunchersPath, pIcon->cDesktopFileName);
368
cairo_dock_update_conf_file (cDesktopFilePath,
369
G_TYPE_STRING, "Desktop Entry", "Container", cParentDockName,
371
g_free (cDesktopFilePath);
373
else if (CAIRO_DOCK_IS_APPLET (pIcon))
375
cairo_dock_update_conf_file (pIcon->pModuleInstance->cConfFilePath,
376
G_TYPE_STRING, "Icon", "dock name", cParentDockName,