~ubuntu-branches/ubuntu/precise/cairo-dock/precise-updates

« back to all changes in this revision

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

  • Committer: Kees Cook
  • Date: 2011-08-11 19:31:26 UTC
  • mfrom: (19.1.1 cairo-dock)
  • Revision ID: kees@outflux.net-20110811193126-wh97aamdqx5gaf2f
Tags: 2.4.0~0beta2-0ubuntu1
releasing version 2.4.0~0beta2-0ubuntu1

Show diffs side-by-side

added added

removed removed

Lines of Context:
62
62
                return g_strdup_printf ("%02d%s", iPrefixNumber, cBaseName);
63
63
}
64
64
 
65
 
 
66
 
void cairo_dock_remove_html_spaces (gchar *cString)
67
 
{
68
 
        gchar *str = cString;
69
 
        do
70
 
        {
71
 
                str = g_strstr_len (str, -1, "%20");
72
 
                if (str == NULL)
73
 
                        break ;
74
 
                *str = ' ';
75
 
                str ++;
76
 
                strcpy (str, str+2);
77
 
        }
78
 
        while (TRUE);
79
 
}
80
 
 
81
 
 
82
65
static inline const gchar *_cairo_dock_get_launcher_template_conf_file_path (CairoDockDesktopFileType iNewDesktopFileType)
83
66
{
84
67
        const gchar *cTemplateFile;
99
82
        return cTemplateFile;
100
83
}
101
84
 
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)
103
86
{
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)
108
 
        {
109
 
                g_propagate_error (erreur, tmp_erreur);
110
 
                return NULL;
111
 
        }
112
 
 
113
 
        //\___________________ On ouvre le patron.
114
 
        GKeyFile *pKeyFile = cairo_dock_open_key_file (cFilePath);
115
 
        if (pKeyFile == NULL)
116
 
                return NULL;
117
 
 
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);
121
 
        
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)
126
 
        {
127
 
                g_propagate_error (erreur, tmp_erreur);
128
 
                g_key_file_free (pKeyFile);
129
 
                return NULL;
130
 
        }
131
 
        gchar *str = strchr (cCommand, '%');
132
 
        if (str != NULL)
133
 
        {
134
 
                *str = '\0';
135
 
                g_key_file_set_string (pKeyFile, "Desktop Entry", "Exec", cCommand);
136
 
        }
137
 
        g_free (cCommand);
138
 
 
139
 
        gchar *cIconName = g_key_file_get_string (pKeyFile, "Desktop Entry", "Icon", &tmp_erreur);
140
 
        if (tmp_erreur != NULL)
141
 
        {
142
 
                g_propagate_error (erreur, tmp_erreur);
143
 
                g_key_file_free (pKeyFile);
144
 
                return NULL;
145
 
        }
146
 
        if (*cIconName != '/' && (g_str_has_suffix (cIconName, ".svg") || g_str_has_suffix (cIconName, ".png") || g_str_has_suffix (cIconName, ".xpm")))
147
 
        {
148
 
                cIconName[strlen(cIconName) - 4] = '\0';
149
 
                g_key_file_set_string (pKeyFile, "Desktop Entry", "Icon", cIconName);
150
 
        }
151
 
        g_free (cIconName);
152
 
        
153
 
        gchar **pKeyList = g_key_file_get_keys (pKeyFile, "Desktop Entry", NULL, NULL);  // on enleve les cles 'Icon' traduites !
154
 
        gchar *cKeyName;
155
 
        int i;
156
 
        for (i = 0; pKeyList[i] != NULL; i ++)
157
 
        {
158
 
                cKeyName = pKeyList[i];
159
 
                if (strncmp (cKeyName, "Icon[", 5) == 0)
160
 
                        g_key_file_remove_key (pKeyFile, "Desktop Entry", cKeyName, NULL);
161
 
        }
162
 
        g_strfreev (pKeyList);
163
 
        
 
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);
 
90
        
 
91
        GKeyFile *pKeyFile = cairo_dock_open_key_file (cTemplateFile);
 
92
        g_return_val_if_fail (pKeyFile != NULL, NULL);
 
93
        
 
94
        //\__________________ fill the parameters
 
95
        gchar *cFilePath = NULL;
 
96
        if (cOrigin != NULL && *cOrigin != '/')  // transform the origin URI into a path or a file name.
 
97
        {
 
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.
 
100
                else
 
101
                        cFilePath = g_filename_from_uri (cOrigin, NULL, NULL);
 
102
        }
 
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:"");
 
106
        
 
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);
165
110
        
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);
 
112
        
 
113
        g_key_file_set_string (pKeyFile, "Desktop Entry", "Container", cDockName);
 
114
        
 
115
        //\__________________ in the case of a script, set ourselves a valid name and command.
 
116
        if (cFilePath != NULL && g_str_has_suffix (cFilePath, ".sh"))
 
117
        {
 
118
                gchar *cName = g_path_get_basename (cFilePath);
 
119
                g_key_file_set_string (pKeyFile, "Desktop Entry", "Name", cName);
 
120
                g_free (cName);
 
121
                g_key_file_set_string (pKeyFile, "Desktop Entry", "Exec", cFilePath);
 
122
                g_key_file_set_boolean (pKeyFile, "Desktop Entry", "Terminal", TRUE);
 
123
        }
 
124
        
 
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)
 
127
        {
 
128
                g_key_file_set_string (pKeyFile, "Desktop Entry", "Exec", _("Enter a command"));
 
129
        }
 
130
        
 
131
        //\__________________ generate a unique and readable filename.
 
132
        gchar *cBaseName = (cFilePath ?
 
133
                *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);
170
 
 
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);
174
 
        
175
 
        g_free (cNewDesktopFilePath);
176
 
        g_key_file_free (pKeyFile);
177
 
        g_free (cFilePath);
178
 
 
179
 
        return cNewDesktopFileName;
180
 
}
181
 
 
182
 
static gchar *_cairo_dock_generate_desktop_file_for_script (const gchar *cURI, const gchar *cDockName, double fOrder, GError **erreur)
183
 
{
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)
188
 
                return NULL;
189
 
        
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);
195
 
        g_free (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);
198
 
        g_free (cFilePath);
199
 
        g_key_file_set_boolean (pKeyFile, "Desktop Entry", "Terminal", TRUE);
200
 
        
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);
203
 
        
204
 
        //\___________________ On ecrit tout.
 
139
        
 
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);
 
144
        
 
145
        g_free (cFilePath);
208
146
        g_key_file_free (pKeyFile);
209
 
 
210
147
        return cNewDesktopFileName;
211
148
}
212
149
 
213
 
 
214
150
gchar *cairo_dock_add_desktop_file_from_uri (const gchar *cURI, const gchar *cDockName, double fOrder, CairoDockIconGroup iGroup, GError **erreur)
215
151
{
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);
220
 
        
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.
225
 
        {
226
 
                cNewDesktopFileName = _cairo_dock_generate_desktop_file_for_launcher (cURI, cDockName, fOrder, iGroup, &tmp_erreur);
227
 
        }
228
 
        else if (g_str_has_suffix (cURI, ".sh"))  // script.
229
 
        {
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);
232
 
        }
233
 
 
234
 
        if (tmp_erreur != NULL)
235
 
        {
236
 
                g_propagate_error (erreur, tmp_erreur);
237
 
                g_free (cNewDesktopFileName);
238
 
                cNewDesktopFileName = NULL;
239
 
        }
240
 
        return cNewDesktopFileName;
 
152
        if (! (cURI == NULL || g_str_has_suffix (cURI, ".desktop") || g_str_has_suffix (cURI, ".sh")))
 
153
                return NULL;
 
154
        return _add_new_desktop_file (CAIRO_DOCK_DESKTOP_FILE_FOR_LAUNCHER, cURI, cDockName, fOrder, iGroup, erreur);
241
155
}
242
156
 
243
157
gchar *cairo_dock_add_desktop_file_from_type (CairoDockDesktopFileType iLauncherType, const gchar *cDockName, double fOrder, CairoDockIconGroup iGroup, GError **erreur)
244
158
{
 
159
        return _add_new_desktop_file (iLauncherType, NULL, cDockName, fOrder, iGroup, erreur);
 
160
}
 
161
 
 
162
 
 
163
void cairo_dock_update_launcher_key_file (GKeyFile *pKeyFile, const gchar *cDesktopFilePath, CairoDockDesktopFileType iLauncherType)
 
164
{
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);
247
 
}
248
 
 
249
 
 
250
 
void cairo_dock_update_launcher_desktop_file (gchar *cDesktopFilePath, CairoDockDesktopFileType iLauncherType)
251
 
{
252
 
        GError *erreur = NULL;
253
 
        GKeyFile *pKeyFile = cairo_dock_open_key_file (cDesktopFilePath);
254
 
        if (pKeyFile == NULL)
255
 
                return ;
256
 
 
257
 
        if (cairo_dock_conf_file_needs_update (pKeyFile, GLDI_VERSION))
258
 
        {
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,
262
 
                        cDesktopFilePath,
263
 
                        GLDI_SHARE_DATA_DIR,
264
 
                        FALSE,
265
 
                        cTemplateFile);
266
 
        }
 
166
        cd_debug ("%s (%s)", __func__, cTemplateFile);
267
167
        
268
 
        g_key_file_free (pKeyFile);
 
168
        cairo_dock_upgrade_conf_file (cDesktopFilePath, pKeyFile, cTemplateFile);  // update keys
269
169
}
270
170
 
271
171
 
304
204
                        G_TYPE_INVALID);
305
205
        }
306
206
}
 
207
 
 
208
 
 
209
// should not be here, and probably not be used either (only applets does).
 
210
void cairo_dock_remove_html_spaces (gchar *cString)
 
211
{
 
212
        gchar *str = cString;
 
213
        do
 
214
        {
 
215
                str = g_strstr_len (str, -1, "%20");
 
216
                if (str == NULL)
 
217
                        break ;
 
218
                *str = ' ';
 
219
                str ++;
 
220
                strcpy (str, str+2);
 
221
        }
 
222
        while (TRUE);
 
223
}