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

« back to all changes in this revision

Viewing changes to src/cairo-dock-launcher-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
 
* Launcher 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 <math.h>
31
32
 
32
33
#include "cairo-dock-load.h"
33
34
#include "cairo-dock-icons.h"
 
35
#include "cairo-dock-draw.h"
34
36
#include "cairo-dock-dock-factory.h"
35
37
#include "cairo-dock-surface-factory.h"
36
38
#include "cairo-dock-renderer-manager.h"
42
44
#include "cairo-dock-keyfile-utilities.h"
43
45
#include "cairo-dock-internal-system.h"
44
46
#include "cairo-dock-internal-icons.h"
 
47
#include "cairo-dock-themes-manager.h"
 
48
#include "cairo-dock-dock-facility.h"
 
49
#include "cairo-dock-gui-manager.h"
45
50
#include "cairo-dock-launcher-factory.h"
46
51
 
47
52
extern CairoDock *g_pMainDock;
53
58
{
54
59
        g_return_val_if_fail (cFileName != NULL, NULL);
55
60
        GString *sIconPath = g_string_new ("");
56
 
        gchar *cSuffixTab[4] = {".svg", ".png", ".xpm", NULL};
 
61
        const gchar *cSuffixTab[4] = {".svg", ".png", ".xpm", NULL};
57
62
        gboolean bAddSuffix, bFileFound;
58
63
        GtkIconInfo* pIconInfo = NULL;
59
64
        int i, j;
65
70
        }
66
71
        else if (*cFileName == '/')
67
72
        {
68
 
                g_string_printf (sIconPath, cFileName);
 
73
                g_string_assign (sIconPath, cFileName);
69
74
        }
70
75
        else
71
76
        {
93
98
                                        j = 0;
94
99
                                        while (! bFileFound && (cSuffixTab[j] != NULL || ! bAddSuffix))
95
100
                                        {
96
 
                                                g_string_printf (sIconPath, "%s/%s", myIcons.pDefaultIconDirectory[2*i], cFileName);
 
101
                                                g_string_printf (sIconPath, "%s/%s", (gchar *)myIcons.pDefaultIconDirectory[2*i], cFileName);
97
102
                                                if (bAddSuffix)
98
103
                                                        g_string_append_printf (sIconPath, "%s", cSuffixTab[j]);
99
104
                                                //g_print ("  -> %s\n", sIconPath->str);
107
112
                                }
108
113
                                else if (myIcons.pDefaultIconDirectory[2*i+1] != NULL)
109
114
                                {
110
 
                                        g_string_printf (sIconPath, cFileName);
 
115
                                        g_string_assign (sIconPath, cFileName);
111
116
                                        if (! bAddSuffix)  // on vire le suffixe pour chercher tous les formats dans le theme d'icones.
112
117
                                        {
113
118
                                                gchar *str = strrchr (sIconPath->str, '.');
121
126
                                                GTK_ICON_LOOKUP_FORCE_SVG);
122
127
                                        if (pIconInfo != NULL)
123
128
                                        {
124
 
                                                g_string_printf (sIconPath, gtk_icon_info_get_filename (pIconInfo));
 
129
                                                g_string_assign (sIconPath, gtk_icon_info_get_filename (pIconInfo));
125
130
                                                bFileFound = TRUE;
126
131
                                                gtk_icon_info_free (pIconInfo);
127
132
                                        }
132
137
 
133
138
                if (! bFileFound)
134
139
                {
135
 
                        g_string_printf (sIconPath, cFileName);
 
140
                        g_string_assign (sIconPath, cFileName);
136
141
                        if (! bAddSuffix)
137
142
                        {
138
143
                                gchar *str = strrchr (sIconPath->str, '.');
148
153
 
149
154
                        if (pIconInfo != NULL)
150
155
                        {
151
 
                                g_string_printf (sIconPath, gtk_icon_info_get_filename (pIconInfo));
 
156
                                g_string_assign (sIconPath, gtk_icon_info_get_filename (pIconInfo));
152
157
                                gtk_icon_info_free (pIconInfo);
153
158
                        }
154
159
                        else
177
182
        g_return_if_fail (keyfile != NULL);
178
183
        
179
184
        icon->iType = CAIRO_DOCK_LAUNCHER;
180
 
        g_free (icon->acDesktopFileName);
181
 
        icon->acDesktopFileName = g_strdup (cDesktopFileName);
182
 
 
183
 
        g_free (icon->acFileName);
184
 
        icon->acFileName = g_key_file_get_string (keyfile, "Desktop Entry", "Icon", &erreur);
185
 
        if (erreur != NULL)
186
 
        {
187
 
                cd_warning ("while trying to load %s : %s", cDesktopFileName, erreur->message);
188
 
                g_error_free (erreur);
189
 
                erreur = NULL;
190
 
        }
191
 
        if (icon->acFileName != NULL && *icon->acFileName == '\0')
192
 
        {
193
 
                g_free (icon->acFileName);
194
 
                icon->acFileName = NULL;
195
 
        }
196
 
 
197
 
 
198
 
        g_free (icon->acName);
199
 
        icon->acName = g_key_file_get_locale_string (keyfile, "Desktop Entry", "Name", NULL, &erreur);
200
 
        if (erreur != NULL)
201
 
        {
202
 
                cd_warning ("while trying to load %s : %s", cDesktopFileName, erreur->message);
203
 
                g_error_free (erreur);
204
 
                erreur = NULL;
205
 
        }
206
 
        if (icon->acName != NULL && *icon->acName == '\0')
207
 
        {
208
 
                g_free (icon->acName);
209
 
                icon->acName = NULL;
210
 
        }
211
 
 
212
 
        g_free (icon->acCommand);
213
 
        icon->acCommand = g_key_file_get_string (keyfile, "Desktop Entry", "Exec", &erreur);
214
 
        if (erreur != NULL)
215
 
        {
216
 
                cd_warning ("while trying to load %s : %s", cDesktopFileName, erreur->message);
217
 
                g_error_free (erreur);
218
 
                erreur = NULL;
219
 
        }
220
 
        if (icon->acCommand != NULL && *icon->acCommand == '\0')
221
 
        {
222
 
                g_free (icon->acCommand);
223
 
                icon->acCommand = NULL;
 
185
        g_free (icon->cDesktopFileName);
 
186
        icon->cDesktopFileName = g_strdup (cDesktopFileName);
 
187
 
 
188
        g_free (icon->cFileName);
 
189
        icon->cFileName = g_key_file_get_string (keyfile, "Desktop Entry", "Icon", &erreur);
 
190
        if (erreur != NULL)
 
191
        {
 
192
                cd_warning ("while trying to load %s : %s", cDesktopFileName, erreur->message);
 
193
                g_error_free (erreur);
 
194
                erreur = NULL;
 
195
        }
 
196
        if (icon->cFileName != NULL && *icon->cFileName == '\0')
 
197
        {
 
198
                g_free (icon->cFileName);
 
199
                icon->cFileName = NULL;
 
200
        }
 
201
 
 
202
 
 
203
        g_free (icon->cName);
 
204
        icon->cName = g_key_file_get_locale_string (keyfile, "Desktop Entry", "Name", NULL, &erreur);
 
205
        if (erreur != NULL)
 
206
        {
 
207
                cd_warning ("while trying to load %s : %s", cDesktopFileName, erreur->message);
 
208
                g_error_free (erreur);
 
209
                erreur = NULL;
 
210
        }
 
211
        if (icon->cName != NULL && *icon->cName == '\0')
 
212
        {
 
213
                g_free (icon->cName);
 
214
                icon->cName = NULL;
 
215
        }
 
216
 
 
217
        g_free (icon->cCommand);
 
218
        icon->cCommand = g_key_file_get_string (keyfile, "Desktop Entry", "Exec", &erreur);
 
219
        if (erreur != NULL)
 
220
        {
 
221
                cd_warning ("while trying to load %s : %s", cDesktopFileName, erreur->message);
 
222
                g_error_free (erreur);
 
223
                erreur = NULL;
 
224
        }
 
225
        if (icon->cCommand != NULL && *icon->cCommand == '\0')
 
226
        {
 
227
                g_free (icon->cCommand);
 
228
                icon->cCommand = NULL;
224
229
        }
225
230
        
226
 
        if (icon->acCommand != NULL)
 
231
        if (icon->cCommand != NULL)
227
232
        {
228
233
                g_free (icon->cWorkingDirectory);
229
234
                icon->cWorkingDirectory = g_key_file_get_string (keyfile, "Desktop Entry", "Path", NULL);
264
269
        }
265
270
        if (icon->iVolumeID)  // les infos dans le .desktop ne sont pas a jour.
266
271
        {
267
 
                g_free (icon->acName);
268
 
                icon->acName = NULL;
269
 
                g_free (icon->acCommand);
270
 
                icon->acCommand = NULL;
271
 
                g_free (icon->acFileName);
272
 
                icon->acFileName = NULL;
 
272
                g_free (icon->cName);
 
273
                icon->cName = NULL;
 
274
                g_free (icon->cCommand);
 
275
                icon->cCommand = NULL;
 
276
                g_free (icon->cFileName);
 
277
                icon->cFileName = NULL;
273
278
 
274
279
                gboolean bIsDirectory;  // on n'ecrase pas le fait que ce soit un container ou pas, car c'est l'utilisateur qui l'a decide.
275
 
                cairo_dock_fm_get_file_info (icon->cBaseURI, &icon->acName, &icon->acCommand, &icon->acFileName, &bIsDirectory, &icon->iVolumeID, &icon->fOrder, mySystem.iFileSortType);
 
280
                cairo_dock_fm_get_file_info (icon->cBaseURI, &icon->cName, &icon->cCommand, &icon->cFileName, &bIsDirectory, &icon->iVolumeID, &icon->fOrder, mySystem.iFileSortType);
276
281
        }
277
282
        
278
283
        
306
311
                erreur = NULL;
307
312
                bIsContainer = FALSE;
308
313
        }
309
 
        if (bIsContainer && icon->acName != NULL)
 
314
        if (bIsContainer && icon->cName != NULL)
310
315
        {
311
316
                gchar *cRendererName = g_key_file_get_string (keyfile, "Desktop Entry", "Renderer", NULL);
312
 
                CairoDock *pChildDock = cairo_dock_search_dock_from_name (icon->acName);
 
317
                CairoDock *pChildDock = cairo_dock_search_dock_from_name (icon->cName);
313
318
                if (pChildDock == NULL)
314
319
                {
315
 
                        cd_message ("le dock fils (%s) n'existe pas, on le cree avec la vue %s", icon->acName, cRendererName);
 
320
                        cd_message ("le dock fils (%s) n'existe pas, on le cree avec la vue %s", icon->cName, cRendererName);
316
321
                        if (icon->cBaseURI == NULL)
317
 
                                icon->pSubDock = cairo_dock_create_subdock_from_scratch (NULL, icon->acName, pParentDock);
 
322
                                icon->pSubDock = cairo_dock_create_subdock_from_scratch (NULL, icon->cName, pParentDock);
318
323
                        else
319
324
                                cairo_dock_fm_create_dock_from_directory (icon, pParentDock);
320
325
                }
322
327
                {
323
328
                        cairo_dock_reference_dock (pChildDock, pParentDock);
324
329
                        icon->pSubDock = pChildDock;
325
 
                        cd_message ("le dock devient un dock fils (%d, %d)", pChildDock->bHorizontalDock, pChildDock->bDirectionUp);
 
330
                        cd_message ("le dock devient un dock fils (%d, %d)", pChildDock->container.bIsHorizontal, pChildDock->container.bDirectionUp);
326
331
                }
327
332
                if (cRendererName != NULL && icon->pSubDock != NULL)
328
333
                        cairo_dock_set_renderer (icon->pSubDock, cRendererName);
334
339
        gboolean bPreventFromInhibating = g_key_file_get_boolean (keyfile, "Desktop Entry", "prevent inhibate", NULL);  // FALSE si la cle n'existe pas.
335
340
        
336
341
        g_free (icon->cClass);
337
 
        if (icon->acCommand != NULL && icon->cBaseURI == NULL)  /// ! bPreventFromInhibating && 
 
342
        if (icon->cCommand != NULL && icon->cBaseURI == NULL)  /// ! bPreventFromInhibating && 
338
343
        {
339
344
                gchar *cStartupWMClass = g_key_file_get_string (keyfile, "Desktop Entry", "StartupWMClass", NULL);
340
345
                if (cStartupWMClass == NULL || *cStartupWMClass == '\0')
341
346
                {
 
347
                        // plusieurs cas sont possibles : 
 
348
                        // Exec=toto
 
349
                        // Exec=toto -x -y
 
350
                        // Exec=/path/to/toto -x -y
 
351
                        // Exec=gksu toto
 
352
                        // Exec=gksu --description /usr/share/applications/synaptic.desktop /usr/sbin/synaptic
342
353
                        g_free (cStartupWMClass);
343
 
                        cStartupWMClass = g_ascii_strdown (icon->acCommand, -1);
344
 
                        gchar *str = strchr (cStartupWMClass, ' ');
345
 
                        if (str != NULL)
346
 
                                *str = '\0';
347
 
                        if (strcmp (cStartupWMClass, "gksu") == 0 || strcmp (cStartupWMClass, "kdesu") == 0)
348
 
                                icon->cClass = str + 1;
 
354
                        cStartupWMClass = g_ascii_strdown (icon->cCommand, -1);
 
355
                        gchar *str, *cClass = cStartupWMClass;
 
356
                        
 
357
                        if (strncmp (cClass, "gksu", 4) == 0 || strncmp (cClass, "kdesu", 4) == 0)  // on prend la fin .
 
358
                        {
 
359
                                while (cClass[strlen(cClass)-1] == ' ')  // par securite on enleve les espaces en fin de ligne.
 
360
                                        cClass[strlen(cClass)-1] = '\0';
 
361
                                str = strrchr (cClass, ' ');  // on cherche le dernier espace.
 
362
                                if (str != NULL)  // on prend apres.
 
363
                                        cClass = str + 1;
 
364
                                str = strrchr (cClass, '/');  // on cherche le dernier '/'.
 
365
                                if (str != NULL)  // on prend apres.
 
366
                                        cClass = str + 1;
 
367
                        }
349
368
                        else
350
 
                                icon->cClass = cStartupWMClass;
351
 
                        
352
 
                        while (*icon->cClass == ' ')
353
 
                                icon->cClass ++;
354
 
                        
355
 
                        if (*icon->cClass == '/')
356
369
                        {
357
 
                                str = strrchr (icon->cClass, '/');  // forcement non NULL.
358
 
                                icon->cClass = str + 1;
 
370
                                while (*cClass == ' ')  // par securite on enleve les espaces en debut de ligne.
 
371
                                        cClass ++;
 
372
                                str = strchr (cClass, ' ');  // on cherche le premier espace.
 
373
                                if (str != NULL)  // on vire apres.
 
374
                                        *str = '\0';
 
375
                                str = strrchr (cClass, '/');  // on cherche le dernier '/'.
 
376
                                if (str != NULL)  // on prend apres.
 
377
                                        cClass = str + 1;
359
378
                        }
360
379
                        
361
 
                        if (*icon->cClass != '\0')
362
 
                                icon->cClass = g_strdup (icon->cClass);
 
380
                        if (*cClass != '\0')
 
381
                                icon->cClass = g_strdup (cClass);
363
382
                        else
364
383
                                icon->cClass = NULL;
365
384
                        cd_message ("no class defined for the launcher %s\n we will assume that its class is '%s'", cDesktopFileName, icon->cClass);
375
394
        
376
395
        if (bPreventFromInhibating && icon->cClass != NULL)
377
396
        {
378
 
                //cairo_dock_set_class_use_xicon (icon->cClass, TRUE);
379
 
                cairo_dock_deinhibate_class (icon->cClass, icon);
 
397
                ///cairo_dock_deinhibate_class (icon->cClass, icon);  /// mis en commentaire le 21/09/2009
380
398
                g_free (icon->cClass);
381
399
                icon->cClass = NULL;
382
400
        }
384
402
        gboolean bExecInTerminal = g_key_file_get_boolean (keyfile, "Desktop Entry", "Terminal", NULL);
385
403
        if (bExecInTerminal)  // on le fait apres la classe puisqu'on change la commande.
386
404
        {
387
 
                gchar *cOldCommand = icon->acCommand;
388
 
                icon->acCommand = g_strdup_printf ("xterm -e \"%s\"", cOldCommand);
 
405
                gchar *cOldCommand = icon->cCommand;
 
406
                icon->cCommand = g_strdup_printf ("xterm -e \"%s\"", cOldCommand);
389
407
                g_free (cOldCommand);
390
408
        }
391
409
        
400
418
        
401
419
        Icon *icon = g_new0 (Icon, 1);
402
420
        cairo_dock_load_icon_info_from_desktop_file (cDesktopFileName, icon);
403
 
        g_return_val_if_fail (icon->acDesktopFileName != NULL, NULL);
 
421
        g_return_val_if_fail (icon->cDesktopFileName != NULL, NULL);
404
422
        
405
423
        CairoDock *pParentDock = cairo_dock_search_dock_from_name (icon->cParentDockName);
406
424
        cairo_dock_fill_icon_buffers_for_dock (icon, pSourceContext, pParentDock)
407
425
        
408
 
        cd_message ("+ %s/%s", icon->acName, icon->cClass);
409
 
        if (CAIRO_DOCK_IS_NORMAL_LAUNCHER (icon) && icon->acCommand != NULL && icon->cClass != NULL)  // pas un lanceur de sous-dock.
 
426
        cd_message ("+ %s/%s", icon->cName, icon->cClass);
 
427
        if (CAIRO_DOCK_IS_NORMAL_LAUNCHER (icon) && icon->cClass != NULL)
410
428
                cairo_dock_inhibate_class (icon->cClass, icon);
411
429
        
412
430
        return icon;
413
431
}
414
432
 
415
 
void cairo_dock_reload_icon_from_desktop_file (const gchar *cDesktopFileName, cairo_t *pSourceContext, Icon *icon)
 
433
 
 
434
 
 
435
void cairo_dock_reload_launcher (Icon *icon)
416
436
{
 
437
        if (icon->cDesktopFileName == NULL || strcmp (icon->cDesktopFileName, "none") == 0)
 
438
        {
 
439
                cd_warning ("tried to reload a launcher whereas this icon (%s) is obviously not a launcher", icon->cName);
 
440
                return ;
 
441
        }
 
442
        GError *erreur = NULL;
 
443
        
 
444
        //\_____________ On assure la coherence du nouveau fichier de conf.
 
445
        if (CAIRO_DOCK_IS_LAUNCHER (icon))
 
446
        {
 
447
                gchar *cDesktopFilePath = g_strdup_printf ("%s/%s", g_cCurrentLaunchersPath, icon->cDesktopFileName);
 
448
                GKeyFile* pKeyFile = cairo_dock_open_key_file (cDesktopFilePath);
 
449
                g_return_if_fail (pKeyFile != NULL);
 
450
                
 
451
                if (icon->pSubDock != NULL)  // on assure l'unicite du nom du sous-dock ici, car cela n'est volontairement pas fait dans la fonction de creation de l'icone.
 
452
                {
 
453
                        gchar *cName = g_key_file_get_string (pKeyFile, "Desktop Entry", "Name", NULL);
 
454
                        if (cName == NULL || *cName == '\0')
 
455
                                cName = g_strdup ("dock");
 
456
                        if (icon->cName == NULL || strcmp (icon->cName, cName) != 0)  // le nom a change.
 
457
                        {
 
458
                                gchar *cUniqueName = cairo_dock_get_unique_dock_name (cName);
 
459
                                if (strcmp (cName, cUniqueName) != 0)
 
460
                                {
 
461
                                        g_key_file_set_string (pKeyFile, "Desktop Entry", "Name", cUniqueName);
 
462
                                        cairo_dock_write_keys_to_file (pKeyFile, cDesktopFilePath);
 
463
                                }
 
464
                                g_free (cUniqueName);
 
465
                        }
 
466
                        g_free (cName);
 
467
                }
 
468
                if (icon->cCommand != NULL)  // on assure que ca reste un lanceur.
 
469
                {
 
470
                        gchar *cCommand = g_key_file_get_string (pKeyFile, "Desktop Entry", "Exec", NULL);
 
471
                        if (cCommand == NULL || *cCommand == '\0')
 
472
                        {
 
473
                                cCommand = g_strdup ("no command");
 
474
                                g_key_file_set_string (pKeyFile, "Desktop Entry", "Exec", cCommand);
 
475
                                cairo_dock_write_keys_to_file (pKeyFile, cDesktopFilePath);
 
476
                        }
 
477
                        g_free (cCommand);
 
478
                }
 
479
                if (icon->cBaseURI != NULL)  // on assure que ca reste un fichier.
 
480
                {
 
481
                        gchar *cBaseURI = g_key_file_get_string (pKeyFile, "Desktop Entry", "Base URI", NULL);
 
482
                        if (cBaseURI == NULL || *cBaseURI == '\0')
 
483
                        {
 
484
                                cBaseURI = g_strdup (icon->cBaseURI);
 
485
                                g_key_file_set_string (pKeyFile, "Desktop Entry", "Base URI", cBaseURI);
 
486
                                cairo_dock_write_keys_to_file (pKeyFile, cDesktopFilePath);
 
487
                        }
 
488
                        g_free (cBaseURI);
 
489
                }
 
490
                
 
491
                g_key_file_free (pKeyFile);
 
492
                g_free (cDesktopFilePath);
 
493
        }
 
494
        
 
495
        //\_____________ On memorise son etat.
 
496
        gchar *cPrevDockName = icon->cParentDockName;
 
497
        icon->cParentDockName = NULL;
 
498
        CairoDock *pDock = cairo_dock_search_dock_from_name (cPrevDockName);  // changement de l'ordre ou du container.
 
499
        double fOrder = icon->fOrder;
 
500
        ///Window Xid = icon->Xid;
 
501
        CairoDock *pSubDock = icon->pSubDock;
 
502
        icon->pSubDock = NULL;
 
503
        gchar *cClass = icon->cClass;
 
504
        icon->cClass = NULL;
 
505
        gchar *cDesktopFileName = icon->cDesktopFileName;
 
506
        icon->cDesktopFileName = NULL;
 
507
        gchar *cName = icon->cName;
 
508
        icon->cName = NULL;
 
509
        gchar *cRendererName = NULL;
 
510
        if (pSubDock != NULL)
 
511
        {
 
512
                cRendererName = pSubDock->cRendererName;
 
513
                pSubDock->cRendererName = NULL;
 
514
        }
 
515
        
 
516
        //\_____________ On recharge l'icone.
 
517
        cairo_t *pCairoContext = cairo_dock_create_context_from_window (CAIRO_CONTAINER (pDock));
417
518
        cairo_dock_load_icon_info_from_desktop_file (cDesktopFileName, icon);
418
 
        g_return_if_fail (icon->acDesktopFileName != NULL);
 
519
        g_return_if_fail (icon->cDesktopFileName != NULL);
419
520
        
420
521
        CairoDock *pParentDock = cairo_dock_search_dock_from_name (icon->cParentDockName);
421
 
        cairo_dock_fill_icon_buffers_for_dock (icon, pSourceContext, pParentDock)
 
522
        cairo_dock_fill_icon_buffers_for_dock (icon, pCairoContext, pParentDock)
 
523
        
 
524
        if (cName && ! icon->cName)
 
525
                icon->cName = g_strdup (" ");
 
526
        
 
527
        ///icon->Xid = Xid;
 
528
        
 
529
        //\_____________ On gere le sous-dock.
 
530
        if (icon->Xid != 0)
 
531
        {
 
532
                if (icon->pSubDock == NULL)
 
533
                        icon->pSubDock = pSubDock;
 
534
                else  // ne devrait pas arriver (une icone de container n'est pas un lanceur pouvant prendre un Xid).
 
535
                        cairo_dock_destroy_dock (pSubDock, cName, g_pMainDock, CAIRO_DOCK_MAIN_DOCK_NAME);
 
536
        }
 
537
        else
 
538
        {
 
539
                if (pSubDock != icon->pSubDock)  // ca n'est plus le meme container, on transvase ou on detruit.
 
540
                {
 
541
                        cairo_dock_destroy_dock (pSubDock, cName, icon->pSubDock, icon->cName);
 
542
                }
 
543
        }
 
544
 
 
545
        if (icon->pSubDock != NULL && pSubDock == icon->pSubDock)  // c'est le meme sous-dock, son rendu a pu changer.
 
546
        {
 
547
                if (cairo_dock_strings_differ (cRendererName, icon->pSubDock->cRendererName))
 
548
                        cairo_dock_update_dock_size (icon->pSubDock);
 
549
        }
 
550
 
 
551
        //\_____________ On gere le changement de container ou d'ordre.
 
552
        CairoDock *pNewDock = cairo_dock_search_dock_from_name (icon->cParentDockName);
 
553
        g_return_if_fail (pNewDock != NULL);
 
554
        
 
555
        if (pDock != pNewDock)  // on la detache de son container actuel et on l'insere dans le nouveau.
 
556
        {
 
557
                cairo_dock_detach_icon_from_dock (icon, pDock, TRUE);
 
558
                if (pDock->icons == NULL && pDock->iRefCount == 0 && ! pDock->bIsMainDock)  // on supprime les docks principaux vides.
 
559
                {
 
560
                        cd_message ("dock %s vide => a la poubelle", cPrevDockName);
 
561
                        cairo_dock_destroy_dock (pDock, cPrevDockName, NULL, NULL);
 
562
                        pDock = NULL;
 
563
                }
 
564
                else
 
565
                {
 
566
                        cairo_dock_update_dock_size (pDock);
 
567
                        cairo_dock_calculate_dock_icons (pDock);
 
568
                        gtk_widget_queue_draw (pDock->container.pWidget);
 
569
                }
 
570
                cairo_dock_insert_icon_in_dock (icon, pNewDock, CAIRO_DOCK_UPDATE_DOCK_SIZE, ! CAIRO_DOCK_ANIMATE_ICON);
 
571
        }
 
572
        else
 
573
        {
 
574
                icon->fWidth *= pNewDock->container.fRatio;
 
575
                icon->fHeight *= pNewDock->container.fRatio;
 
576
                cairo_dock_refresh_launcher_gui ();
 
577
                if (icon->fOrder != fOrder)  // On gere le changement d'ordre.
 
578
                {
 
579
                        pNewDock->pFirstDrawnElement = NULL;
 
580
                        pNewDock->icons = g_list_remove (pNewDock->icons, icon);
 
581
                        pNewDock->icons = g_list_insert_sorted (pNewDock->icons,
 
582
                                icon,
 
583
                                (GCompareFunc) cairo_dock_compare_icons_order);
 
584
                        cairo_dock_update_dock_size (pDock);  // la largeur max peut avoir ete influencee par le changement d'ordre.
 
585
                }
 
586
        }
 
587
        
 
588
        //\_____________ On gere l'inhibition de sa classe.
 
589
        gchar *cNowClass = icon->cClass;
 
590
        if (cClass != NULL && (cNowClass == NULL || strcmp (cNowClass, cClass) != 0))
 
591
        {
 
592
                icon->cClass = cClass;
 
593
                cairo_dock_deinhibate_class (cClass, icon);
 
594
                cClass = NULL;  // libere par la fonction precedente.
 
595
                icon->cClass = cNowClass;
 
596
        }
 
597
        if (cNowClass != NULL && (cClass == NULL || strcmp (cNowClass, cClass) != 0))
 
598
                cairo_dock_inhibate_class (cNowClass, icon);
 
599
 
 
600
        //\_____________ On redessine les docks impactes.
 
601
        cairo_dock_calculate_dock_icons (pNewDock);
 
602
        cairo_dock_redraw_container (CAIRO_CONTAINER (pNewDock));
 
603
 
 
604
        g_free (cPrevDockName);
 
605
        g_free (cClass);
 
606
        g_free (cDesktopFileName);
 
607
        g_free (cName);
 
608
        g_free (cRendererName);
 
609
        cairo_destroy (pCairoContext);
 
610
        cairo_dock_mark_theme_as_modified (TRUE);
422
611
}