99
82
return cTemplateFile;
102
static gchar *_cairo_dock_generate_desktop_file_for_launcher (const gchar *cDesktopURI, const gchar *cDockName, double fOrder, CairoDockIconGroup iGroup, GError **erreur)
85
static gchar *_add_new_desktop_file (CairoDockDesktopFileType iLauncherType, const gchar *cOrigin, const gchar *cDockName, double fOrder, CairoDockIconGroup iGroup, GError **erreur)
104
g_return_val_if_fail (cDesktopURI != NULL, NULL);
105
GError *tmp_erreur = NULL;
106
gchar *cFilePath = (*cDesktopURI == '/' ? g_strdup (cDesktopURI) : g_filename_from_uri (cDesktopURI, NULL, &tmp_erreur));
107
if (tmp_erreur != NULL)
109
g_propagate_error (erreur, tmp_erreur);
113
//\___________________ On ouvre le patron.
114
GKeyFile *pKeyFile = cairo_dock_open_key_file (cFilePath);
115
if (pKeyFile == NULL)
118
//\___________________ On renseigne nos champs.
119
g_key_file_set_double (pKeyFile, "Desktop Entry", "Order", fOrder);
120
g_key_file_set_string (pKeyFile, "Desktop Entry", "Container", cDockName);
122
//\___________________ On elimine les indesirables.
123
g_key_file_remove_key (pKeyFile, "Desktop Entry", "X-Ubuntu-Gettext-Domain", NULL);
124
gchar *cCommand = g_key_file_get_string (pKeyFile, "Desktop Entry", "Exec", &tmp_erreur);
125
if (tmp_erreur != NULL)
127
g_propagate_error (erreur, tmp_erreur);
128
g_key_file_free (pKeyFile);
131
gchar *str = strchr (cCommand, '%');
135
g_key_file_set_string (pKeyFile, "Desktop Entry", "Exec", cCommand);
139
gchar *cIconName = g_key_file_get_string (pKeyFile, "Desktop Entry", "Icon", &tmp_erreur);
140
if (tmp_erreur != NULL)
142
g_propagate_error (erreur, tmp_erreur);
143
g_key_file_free (pKeyFile);
146
if (*cIconName != '/' && (g_str_has_suffix (cIconName, ".svg") || g_str_has_suffix (cIconName, ".png") || g_str_has_suffix (cIconName, ".xpm")))
148
cIconName[strlen(cIconName) - 4] = '\0';
149
g_key_file_set_string (pKeyFile, "Desktop Entry", "Icon", cIconName);
153
gchar **pKeyList = g_key_file_get_keys (pKeyFile, "Desktop Entry", NULL, NULL); // on enleve les cles 'Icon' traduites !
156
for (i = 0; pKeyList[i] != NULL; i ++)
158
cKeyName = pKeyList[i];
159
if (strncmp (cKeyName, "Icon[", 5) == 0)
160
g_key_file_remove_key (pKeyFile, "Desktop Entry", cKeyName, NULL);
162
g_strfreev (pKeyList);
87
//\__________________ open the template.
88
const gchar *cTemplateFile = _cairo_dock_get_launcher_template_conf_file_path (iLauncherType);
89
g_return_val_if_fail (cTemplateFile != NULL, NULL);
91
GKeyFile *pKeyFile = cairo_dock_open_key_file (cTemplateFile);
92
g_return_val_if_fail (pKeyFile != NULL, NULL);
94
//\__________________ fill the parameters
95
gchar *cFilePath = NULL;
96
if (cOrigin != NULL && *cOrigin != '/') // transform the origin URI into a path or a file name.
98
if (strncmp (cOrigin, "application://", 14) == 0) // Ubuntu >= 11.04: it's now an "app" URI
99
cFilePath = g_strdup (cOrigin + 14); // in this case we don't have the actual path of the .desktop, but that doesn't matter.
101
cFilePath = g_filename_from_uri (cOrigin, NULL, NULL);
103
else // no origin or already a path.
104
cFilePath = g_strdup (cOrigin);
105
g_key_file_set_string (pKeyFile, "Desktop Entry", "Origin", cFilePath?cFilePath:"");
107
if (iGroup != CAIRO_DOCK_LAUNCHER && iGroup != CAIRO_DOCK_APPLET) // on n'autorise a placer des icones du theme que parmi les lanceurs ou les applets.
108
iGroup = CAIRO_DOCK_LAUNCHER;
164
109
g_key_file_set_integer (pKeyFile, "Desktop Entry", "group", iGroup);
166
//\___________________ On lui choisit un nom de fichier tel qu'il n'y ait pas de collision.
167
gchar *cBaseName = g_path_get_basename (cFilePath);
111
g_key_file_set_double (pKeyFile, "Desktop Entry", "Order", fOrder);
113
g_key_file_set_string (pKeyFile, "Desktop Entry", "Container", cDockName);
115
//\__________________ in the case of a script, set ourselves a valid name and command.
116
if (cFilePath != NULL && g_str_has_suffix (cFilePath, ".sh"))
118
gchar *cName = g_path_get_basename (cFilePath);
119
g_key_file_set_string (pKeyFile, "Desktop Entry", "Name", cName);
121
g_key_file_set_string (pKeyFile, "Desktop Entry", "Exec", cFilePath);
122
g_key_file_set_boolean (pKeyFile, "Desktop Entry", "Terminal", TRUE);
125
//\__________________ in the case of a custom launcher, set a command (the launcher would be invalid without).
126
if (iLauncherType == CAIRO_DOCK_DESKTOP_FILE_FOR_LAUNCHER)
128
g_key_file_set_string (pKeyFile, "Desktop Entry", "Exec", _("Enter a command"));
131
//\__________________ generate a unique and readable filename.
132
gchar *cBaseName = (cFilePath ?
134
g_path_get_basename (cFilePath) :
135
g_strdup (cFilePath) :
136
g_path_get_basename (cTemplateFile));
168
137
gchar *cNewDesktopFileName = _cairo_dock_generate_desktop_filename (cBaseName, g_cCurrentLaunchersPath);
169
138
g_free (cBaseName);
171
//\___________________ On ecrit tout ca dans un fichier base sur le template.
172
gchar *cNewDesktopFilePath = g_strdup_printf ("%s/%s", g_cCurrentLaunchersPath, cNewDesktopFileName);
173
cairo_dock_flush_conf_file_full (pKeyFile, cNewDesktopFilePath, GLDI_SHARE_DATA_DIR, FALSE, CAIRO_DOCK_LAUNCHER_CONF_FILE);
175
g_free (cNewDesktopFilePath);
176
g_key_file_free (pKeyFile);
179
return cNewDesktopFileName;
182
static gchar *_cairo_dock_generate_desktop_file_for_script (const gchar *cURI, const gchar *cDockName, double fOrder, GError **erreur)
184
//\___________________ On ouvre le patron.
185
const gchar *cDesktopFileTemplate = _cairo_dock_get_launcher_template_conf_file_path (CAIRO_DOCK_DESKTOP_FILE_FOR_LAUNCHER);
186
GKeyFile *pKeyFile = cairo_dock_open_key_file (cDesktopFileTemplate);
187
if (pKeyFile == NULL)
190
//\___________________ On renseigne ce qu'on peut.
191
g_key_file_set_double (pKeyFile, "Desktop Entry", "Order", fOrder);
192
g_key_file_set_string (pKeyFile, "Desktop Entry", "Container", cDockName);
193
gchar *cName = g_path_get_basename (cURI);
194
g_key_file_set_string (pKeyFile, "Desktop Entry", "Name", cName);
196
gchar *cFilePath = (*cURI == '/' ? g_strdup (cURI) : g_filename_from_uri (cURI, NULL, NULL));
197
g_key_file_set_string (pKeyFile, "Desktop Entry", "Exec", cFilePath);
199
g_key_file_set_boolean (pKeyFile, "Desktop Entry", "Terminal", TRUE);
201
//\___________________ On lui choisit un nom de fichier tel qu'il n'y ait pas de collision.
202
gchar *cNewDesktopFileName = _cairo_dock_generate_desktop_filename ("script-launcher.desktop", g_cCurrentLaunchersPath);
204
//\___________________ On ecrit tout.
140
//\__________________ write the keys.
205
141
gchar *cNewDesktopFilePath = g_strdup_printf ("%s/%s", g_cCurrentLaunchersPath, cNewDesktopFileName);
206
142
cairo_dock_write_keys_to_file (pKeyFile, cNewDesktopFilePath);
207
143
g_free (cNewDesktopFilePath);
208
146
g_key_file_free (pKeyFile);
210
147
return cNewDesktopFileName;
214
150
gchar *cairo_dock_add_desktop_file_from_uri (const gchar *cURI, const gchar *cDockName, double fOrder, CairoDockIconGroup iGroup, GError **erreur)
216
g_return_val_if_fail (cURI != NULL, NULL);
217
if (iGroup != CAIRO_DOCK_LAUNCHER && iGroup != CAIRO_DOCK_APPLET) // on n'autorise a placer des icones du theme que parmi les lanceurs ou les applets.
218
iGroup = CAIRO_DOCK_LAUNCHER;
219
cd_message ("%s (%s)", __func__, cURI);
221
//\_________________ On cree determine le type de lanceur et on ajoute un fichier desktop correspondant.
222
GError *tmp_erreur = NULL;
223
gchar *cNewDesktopFileName = NULL;
224
if (g_str_has_suffix (cURI, ".desktop")) // lanceur.
226
cNewDesktopFileName = _cairo_dock_generate_desktop_file_for_launcher (cURI, cDockName, fOrder, iGroup, &tmp_erreur);
228
else if (g_str_has_suffix (cURI, ".sh")) // script.
230
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.");
231
cNewDesktopFileName = _cairo_dock_generate_desktop_file_for_script (cURI, cDockName, fOrder, &tmp_erreur);
234
if (tmp_erreur != NULL)
236
g_propagate_error (erreur, tmp_erreur);
237
g_free (cNewDesktopFileName);
238
cNewDesktopFileName = NULL;
240
return cNewDesktopFileName;
152
if (! (cURI == NULL || g_str_has_suffix (cURI, ".desktop") || g_str_has_suffix (cURI, ".sh")))
154
return _add_new_desktop_file (CAIRO_DOCK_DESKTOP_FILE_FOR_LAUNCHER, cURI, cDockName, fOrder, iGroup, erreur);
243
157
gchar *cairo_dock_add_desktop_file_from_type (CairoDockDesktopFileType iLauncherType, const gchar *cDockName, double fOrder, CairoDockIconGroup iGroup, GError **erreur)
159
return _add_new_desktop_file (iLauncherType, NULL, cDockName, fOrder, iGroup, erreur);
163
void cairo_dock_update_launcher_key_file (GKeyFile *pKeyFile, const gchar *cDesktopFilePath, CairoDockDesktopFileType iLauncherType)
245
165
const gchar *cTemplateFile = _cairo_dock_get_launcher_template_conf_file_path (iLauncherType);
246
return cairo_dock_add_desktop_file_from_uri (cTemplateFile, cDockName, fOrder, iGroup, erreur);
250
void cairo_dock_update_launcher_desktop_file (gchar *cDesktopFilePath, CairoDockDesktopFileType iLauncherType)
252
GError *erreur = NULL;
253
GKeyFile *pKeyFile = cairo_dock_open_key_file (cDesktopFilePath);
254
if (pKeyFile == NULL)
257
if (cairo_dock_conf_file_needs_update (pKeyFile, GLDI_VERSION))
259
const gchar *cTemplateFile = _cairo_dock_get_launcher_template_conf_file_path (iLauncherType);
260
cd_debug ("%s (%s)", __func__, cTemplateFile);
261
cairo_dock_flush_conf_file_full (pKeyFile,
166
cd_debug ("%s (%s)", __func__, cTemplateFile);
268
g_key_file_free (pKeyFile);
168
cairo_dock_upgrade_conf_file (cDesktopFilePath, pKeyFile, cTemplateFile); // update keys