~ubuntu-branches/ubuntu/oneiric/cairo-dock/oneiric-201110111206

« back to all changes in this revision

Viewing changes to src/cairo-dock-desktop-file-factory.c

  • Committer: Bazaar Package Importer
  • Author(s): Julien Lavergne, Matthieu Baerts (matttbe), Julien Lavergne
  • Date: 2009-10-04 16:33:52 UTC
  • mfrom: (1.1.7 upstream)
  • Revision ID: james.westby@ubuntu.com-20091004163352-ttbbjfmpb8uzl8j4
Tags: 2.0.9-0ubuntu1
[ Matthieu Baerts (matttbe) ]
* New Upstream Version. (LP: #435587)
* Added apport hook in debian/apport
 - Add debian/apport
 - debian/cairo-dock-core.install: Added debian/apport/cairo-dock.py
* Use .desktop provided by upstream
 - Removed debian/*.desktop
 - debian/cairo-dock-core.install: install upstream desktop files. 

[ Julien Lavergne ]
* Adjust debian/changelog with Daniel Holbach suggestions.
* debian/patches/01_rename_cairo-dock-package-theme.patch: drop, 
  merged upstream.
* debian/patches/01-desktop-file-category.patch:
 - Remove Encoding field and set category to Utility.
* debian/patches/02-merge-changelog.patch:
 - Merge ChangeLog and ChangeLog-2.0.9.
* debian/apport: Remove commands with grep, python doesn't like it.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
/**
2
 
* Desktop-file-factory for Cairo-Dock
 
2
* This file is a part of the Cairo-Dock project
3
3
*
4
 
* Copyright : (C) 2009 by Fabrice Rey
5
 
* E-mail    : fabounet@users.berlios.de
 
4
* Copyright : (C) see the 'copyright' file.
 
5
* E-mail    : see the 'copyright' file.
6
6
*
7
7
* This program is free software; you can redistribute it and/or
8
8
* modify it under the terms of the GNU General Public License
13
13
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14
14
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
15
* GNU General Public License for more details.
16
 
*   http://www.gnu.org/licenses/licenses.html#GPL
 
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/>.
17
18
*/
18
19
 
19
20
#include <stdlib.h>
41
42
extern gchar *g_cCurrentThemePath;
42
43
extern gchar *g_cCurrentLaunchersPath;
43
44
 
 
45
 
 
46
static gchar *_cairo_dock_generate_desktop_filename (const gchar *cBaseName, gchar *cCairoDockDataDir)
 
47
{
 
48
        int iPrefixNumber = 0;
 
49
        GString *sFileName = g_string_new ("");
 
50
 
 
51
        do
 
52
        {
 
53
                iPrefixNumber ++;
 
54
                g_string_printf (sFileName, "%s/%02d%s", cCairoDockDataDir, iPrefixNumber, cBaseName);
 
55
        } while (iPrefixNumber < 99 && g_file_test (sFileName->str, G_FILE_TEST_EXISTS));
 
56
 
 
57
        g_string_free (sFileName, TRUE);
 
58
        if (iPrefixNumber == 99)
 
59
                return NULL;
 
60
        else
 
61
                return g_strdup_printf ("%02d%s", iPrefixNumber, cBaseName);
 
62
}
 
63
 
 
64
 
44
65
void cairo_dock_remove_html_spaces (gchar *cString)
45
66
{
46
67
        gchar *str = cString;
56
77
        while (TRUE);
57
78
}
58
79
 
 
80
 
 
81
static inline const gchar *_cairo_dock_get_launcher_template_conf_file (CairoDockDesktopFileType iNewDesktopFileType)
 
82
{
 
83
        const gchar *cTemplateFile;
 
84
        switch (iNewDesktopFileType)
 
85
        {
 
86
                case CAIRO_DOCK_DESKTOP_FILE_FOR_LAUNCHER :
 
87
                default :
 
88
                        cTemplateFile = CAIRO_DOCK_LAUNCHER_CONF_FILE;
 
89
                break ;
 
90
                case CAIRO_DOCK_DESKTOP_FILE_FOR_CONTAINER :
 
91
                        cTemplateFile = CAIRO_DOCK_CONTAINER_CONF_FILE;
 
92
                break ;
 
93
                case CAIRO_DOCK_DESKTOP_FILE_FOR_SEPARATOR :
 
94
                        cTemplateFile = CAIRO_DOCK_SEPARATOR_CONF_FILE;
 
95
                break ;
 
96
                case CAIRO_DOCK_DESKTOP_FILE_FOR_FILE :
 
97
                        cTemplateFile = CAIRO_DOCK_FILE_CONF_FILE;
 
98
                break ;
 
99
        }
 
100
        return cTemplateFile;
 
101
}
 
102
static inline gchar *_cairo_dock_get_launcher_template_conf_file_path (CairoDockDesktopFileType iNewDesktopFileType)
 
103
{
 
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);
 
106
}
 
107
 
59
108
static gchar *_cairo_dock_generate_desktop_file_for_launcher (const gchar *cDesktopURI, const gchar *cDockName, double fOrder, GError **erreur)
60
109
{
61
110
        g_return_val_if_fail (cDesktopURI != NULL, NULL);
112
161
 
113
162
        //\___________________ On lui choisit un nom de fichier tel qu'il n'y ait pas de collision.
114
163
        gchar *cBaseName = g_path_get_basename (cFilePath);
115
 
        gchar *cNewDesktopFileName = cairo_dock_generate_desktop_filename (cBaseName, g_cCurrentLaunchersPath);
 
164
        gchar *cNewDesktopFileName = _cairo_dock_generate_desktop_filename (cBaseName, g_cCurrentLaunchersPath);
116
165
        g_free (cBaseName);
117
166
 
118
167
        //\___________________ On ecrit tout ca dans un fichier base sur le template.
126
175
        return cNewDesktopFileName;
127
176
}
128
177
 
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)
130
179
{
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);
133
182
 
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);
142
 
 
 
191
        
 
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.
 
193
        {
 
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);
 
197
        }
 
198
        
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);
145
201
 
146
202
        //\___________________ On ecrit tout.
147
203
        gchar *cNewDesktopFilePath = g_strdup_printf ("%s/%s", g_cCurrentLaunchersPath, cNewDesktopFileName);
170
226
        }
171
227
 
172
228
        //\___________________ On ouvre le patron.
173
 
        gchar *cDesktopFileTemplate = cairo_dock_get_launcher_template_conf_file (bIsDirectory ? CAIRO_DOCK_LAUNCHER_FOR_CONTAINER : CAIRO_DOCK_LAUNCHER_FROM_DESKTOP_FILE);
 
229
        gchar *cDesktopFileTemplate = _cairo_dock_get_launcher_template_conf_file_path (CAIRO_DOCK_DESKTOP_FILE_FOR_FILE);
174
230
 
175
231
        GKeyFile *pKeyFile = cairo_dock_open_key_file (cDesktopFileTemplate);
176
232
        g_free (cDesktopFileTemplate);
190
246
        g_free (cIconName);
191
247
 
192
248
        g_key_file_set_boolean (pKeyFile, "Desktop Entry", "Is mounting point", (iVolumeID > 0));
193
 
 
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);
196
 
 
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);
202
 
 
203
 
        return cNewDesktopFileName;
204
 
}
205
 
 
206
 
 
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);
 
250
 
 
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);
 
253
 
 
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);
 
259
 
 
260
        return cNewDesktopFileName;
 
261
}
 
262
 
 
263
static gchar *_cairo_dock_generate_desktop_file_for_script (const gchar *cURI, const gchar *cDockName, double fOrder, GError **erreur)
 
264
{
 
265
        //\___________________ On ouvre le patron.
 
266
        gchar *cDesktopFileTemplate = _cairo_dock_get_launcher_template_conf_file_path (CAIRO_DOCK_DESKTOP_FILE_FOR_LAUNCHER);
 
267
 
 
268
        GKeyFile *pKeyFile = cairo_dock_open_key_file (cDesktopFileTemplate);
 
269
        g_free (cDesktopFileTemplate);
 
270
        if (pKeyFile == NULL)
 
271
                return NULL;
 
272
        
 
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);
 
278
        g_free (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);
 
281
        g_free (cFilePath);
 
282
        
 
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);
 
285
        
 
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);
 
291
 
 
292
        return cNewDesktopFileName;
 
293
}
 
294
 
 
295
 
 
296
gchar *cairo_dock_add_desktop_file_from_uri_full (const gchar *cURI, const gchar *cDockName, double fOrder, CairoDockDesktopFileType iNewDesktopFileType, CairoDock *pDock, GError **erreur)
208
297
{
209
298
        cd_message ("%s (%s)", __func__, cURI);
210
299
        double fEffectiveOrder;
219
308
        else
220
309
                fEffectiveOrder = fOrder;
221
310
 
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;
225
 
        if (cURI == NULL)
 
314
        if (cURI == NULL)  // on s'appuie sur le type fourni en entree.
226
315
        {
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);
228
317
        }
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.
230
319
        {
231
320
                cNewDesktopFileName = _cairo_dock_generate_desktop_file_for_launcher (cURI, cDockName, fEffectiveOrder, &tmp_erreur);
232
321
        }
233
 
        else
 
322
        else if (g_str_has_suffix (cURI, ".sh"))  // script.
 
323
        {
 
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);
 
326
        }
 
327
        else  // fichier, repertoire ou point de montage.
234
328
        {
235
329
                cNewDesktopFileName = _cairo_dock_generate_desktop_file_for_file (cURI, cDockName, fEffectiveOrder, &tmp_erreur);
236
330
        }
243
337
}
244
338
 
245
339
 
246
 
gchar *cairo_dock_generate_desktop_filename (const gchar *cBaseName, gchar *cCairoDockDataDir)
247
 
{
248
 
        int iPrefixNumber = 0;
249
 
        GString *sFileName = g_string_new ("");
250
 
 
251
 
        do
252
 
        {
253
 
                iPrefixNumber ++;
254
 
                g_string_printf (sFileName, "%s/%02d%s", cCairoDockDataDir, iPrefixNumber, cBaseName);
255
 
        } while (iPrefixNumber < 99 && g_file_test (sFileName->str, G_FILE_TEST_EXISTS));
256
 
 
257
 
        g_string_free (sFileName, TRUE);
258
 
        if (iPrefixNumber == 99)
259
 
                return NULL;
260
 
        else
261
 
                return g_strdup_printf ("%02d%s", iPrefixNumber, cBaseName);
262
 
}
263
 
 
264
 
 
265
 
void cairo_dock_update_launcher_desktop_file (gchar *cDesktopFilePath, CairoDockNewLauncherType iLauncherType)
 
340
 
 
341
void cairo_dock_update_launcher_desktop_file (gchar *cDesktopFilePath, CairoDockDesktopFileType iLauncherType)
266
342
{
267
343
        GError *erreur = NULL;
268
344
        GKeyFile *pKeyFile = cairo_dock_open_key_file (cDesktopFilePath);
271
347
 
272
348
        if (cairo_dock_conf_file_needs_update (pKeyFile, CAIRO_DOCK_VERSION))
273
349
        {
 
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,
277
355
                        FALSE,
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)));
 
356
                        cTemplateFile);
283
357
        }
284
358
        
285
359
        g_key_file_free (pKeyFile);
286
360
}
287
361
 
288
362
 
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)
290
364
{
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.
 
366
        {
 
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,
 
370
                        G_TYPE_INVALID);
 
371
                g_free (cDesktopFilePath);
 
372
        }
 
373
        else if (CAIRO_DOCK_IS_APPLET (pIcon))
 
374
        {
 
375
                cairo_dock_update_conf_file (pIcon->pModuleInstance->cConfFilePath,
 
376
                        G_TYPE_STRING, "Icon", "dock name", cParentDockName,
 
377
                        G_TYPE_INVALID);
 
378
        }
292
379
}