~cairo-dock-team/ubuntu/natty/cairo-dock/2.3.0-2.1

« back to all changes in this revision

Viewing changes to src/cairo-dock-class-manager.c

  • Committer: Bazaar Package Importer
  • Author(s): Matthieu Baerts (matttbe), Matthieu Baerts (matttbe), Didier Roche
  • Date: 2010-03-01 21:24:00 UTC
  • mfrom: (1.1.8 upstream)
  • Revision ID: james.westby@ubuntu.com-20100301212400-3a3csog6eonse3in
Tags: 2.1.3-6-0ubuntu1
[ Matthieu Baerts (matttbe) ]
* New Upstream Version. (LP: #521534)
* Updated debian/watch and debian/copyright with LP account.
* Removed debian/patches/02-merge-changelog.patch'
 - data/ChangeLog.txt has to respect a syntax and is used by CD.
* debian/cairo-dock.1:
 - Updated with the latest release.
 - The domain name 'cairo-dock.org' has changed to 'glx-dock.org'
* debian/control:
 - Changed the homepage and other links (glx-dock.org)
 - Updated cairo-dock-dev architecture to 'all' (it no longer contains compiled files)
* debian/cairo-dock-dev.install
 - libcairo-dock.a and libcairo-dock.so no longer exist
* debian/rules
 - removed uneeded changelog file
* Updated debian/patches/01-desktop-file-category.patch

[ Didier Roche ]
* Fix debian/watch
* Fix some issue in versionning
* debian/control: clean the packaging and add right -plugins depends

Show diffs side-by-side

added added

removed removed

Lines of Context:
39
39
#include "cairo-dock-internal-icons.h"
40
40
#include "cairo-dock-container.h"
41
41
#include "cairo-dock-animations.h"
 
42
#include "cairo-dock-application-facility.h"
42
43
#include "cairo-dock-class-manager.h"
43
44
 
44
45
extern CairoDock *g_pMainDock;
69
70
        return (pClassAppli != NULL ? pClassAppli->pAppliOfClass : NULL);
70
71
}
71
72
 
72
 
static Window cairo_dock_detach_appli_of_class (const gchar *cClass, gboolean bDetachAll)
73
 
{
74
 
        g_return_val_if_fail (cClass != NULL, 0);
75
 
        
76
 
        const GList *pList = cairo_dock_list_existing_appli_with_class (cClass);
77
 
        Icon *pIcon;
78
 
        const GList *pElement;
79
 
        gboolean bNeedsRedraw = FALSE, bDetached;
80
 
        CairoDock *pParentDock;
81
 
        Window XFirstFoundId = 0;
82
 
        for (pElement = pList; pElement != NULL; pElement = pElement->next)
83
 
        {
84
 
                pIcon = pElement->data;
85
 
                cd_debug ("detachement de l'icone %s (%d;%d)", pIcon->cName, bDetachAll, XFirstFoundId);
86
 
                CairoContainer *pContainer = cairo_dock_search_container_from_icon (pIcon);
87
 
                if (CAIRO_DOCK_IS_DOCK (pContainer))
88
 
                {
89
 
                        pParentDock = CAIRO_DOCK (pContainer);
90
 
                        bDetached = FALSE;
91
 
                        if (bDetachAll || XFirstFoundId == 0)
92
 
                        {
93
 
                                gchar *cParentDockName = pIcon->cParentDockName;
94
 
                                pIcon->cParentDockName = NULL;  // astuce.
95
 
                                bDetached = cairo_dock_detach_icon_from_dock (pIcon, pParentDock, myIcons.bUseSeparator);  // on la garde, elle pourra servir car elle contient l'Xid.
96
 
                                if (! pParentDock->bIsMainDock)
97
 
                                {
98
 
                                        if (pParentDock->icons == NULL)
99
 
                                                cairo_dock_destroy_dock (pParentDock, cParentDockName, NULL, NULL);
100
 
                                        else
101
 
                                                cairo_dock_update_dock_size (pParentDock);
102
 
                                }
103
 
                                else
104
 
                                        bNeedsRedraw |= (bDetached);
105
 
                                g_free (cParentDockName);
106
 
                        }
107
 
                        if (bDetached && XFirstFoundId == 0)
108
 
                                XFirstFoundId = pIcon->Xid;
109
 
                        else
110
 
                        {
111
 
                                /**cairo_t *pCairoContext = cairo_dock_create_context_from_window (CAIRO_CONTAINER (pContainer));
112
 
                                cd_messge ("  on recharge l'icone de l'appli detachee %s", pIcon->cName);
113
 
                                cairo_dock_fill_one_icon_buffer (pIcon, pCairoContext, 1 + myIcons.fAmplitude, pParentDock->container.bIsHorizontal, TRUE, pParentDock->container.bDirectionUp);
114
 
                                cairo_destroy (pCairoContext);*/
115
 
                                bNeedsRedraw |= pParentDock->bIsMainDock;
116
 
                        }
117
 
                }
118
 
        }
119
 
        if (! cairo_dock_is_loading () && bNeedsRedraw)
120
 
        {
121
 
                cairo_dock_update_dock_size (g_pMainDock);
122
 
                cairo_dock_calculate_dock_icons (g_pMainDock);
123
 
                gtk_widget_queue_draw (g_pMainDock->container.pWidget);
124
 
        }
125
 
        return XFirstFoundId;
126
 
}
127
73
 
128
74
static void _cairo_dock_set_same_indicator_on_sub_dock (Icon *pInhibhatorIcon)
129
75
{
191
137
        return pClassAppli;
192
138
}
193
139
 
194
 
static gboolean cairo_dock_add_inhibator_to_class (const gchar *cClass, Icon *pIcon)
 
140
gboolean cairo_dock_add_inhibator_to_class (const gchar *cClass, Icon *pIcon)
195
141
{
196
142
        CairoDockClassAppli *pClassAppli = cairo_dock_get_class (cClass);
197
143
        g_return_val_if_fail (pClassAppli!= NULL, FALSE);
245
191
        CairoDock *pDock;
246
192
        GList *pElement;
247
193
        Icon *pAppliIcon;
248
 
        cairo_t *pCairoContext = cairo_dock_create_context_from_window (CAIRO_CONTAINER (g_pMainDock));
 
194
        cairo_t *pCairoContext = cairo_dock_create_drawing_context_generic (CAIRO_CONTAINER (g_pMainDock));
249
195
        for (pElement = pClassAppli->pAppliOfClass; pElement != NULL; pElement = pElement->next)
250
196
        {
251
197
                pAppliIcon = pElement->data;
274
220
}
275
221
 
276
222
 
 
223
static Window _cairo_dock_detach_appli_of_class (const gchar *cClass, gboolean bDetachAll)
 
224
{
 
225
        g_return_val_if_fail (cClass != NULL, 0);
 
226
        
 
227
        const GList *pList = cairo_dock_list_existing_appli_with_class (cClass);
 
228
        Icon *pIcon;
 
229
        const GList *pElement;
 
230
        gboolean bNeedsRedraw = FALSE, bDetached;
 
231
        CairoDock *pParentDock;
 
232
        Window XFirstFoundId = 0;
 
233
        for (pElement = pList; pElement != NULL; pElement = pElement->next)
 
234
        {
 
235
                pIcon = pElement->data;
 
236
                pParentDock = cairo_dock_search_dock_from_name (pIcon->cParentDockName);
 
237
                if (pParentDock == NULL)  // pas dans un dock => rien a faire.
 
238
                        continue;
 
239
                
 
240
                cd_debug ("detachement de l'icone %s (%d;%d)", pIcon->cName, bDetachAll, XFirstFoundId);
 
241
                gchar *cParentDockName = pIcon->cParentDockName;
 
242
                pIcon->cParentDockName = NULL;  // astuce.
 
243
                bDetached = cairo_dock_detach_icon_from_dock (pIcon, pParentDock, myIcons.iSeparateIcons);
 
244
                if (bDetached)  // detachee => on met a jour son dock.
 
245
                {
 
246
                        if (! pParentDock->bIsMainDock)  // sous-dock de classe => on le met a jour / detruit.
 
247
                        {
 
248
                                if (pParentDock->icons == NULL)  // devient vide => on le detruit.
 
249
                                {
 
250
                                        if (pParentDock->iRefCount != 0)  // on vire l'icone de paille qui pointe sur ce sous-dock.
 
251
                                        {
 
252
                                                CairoDock *pMainDock=NULL;
 
253
                                                Icon *pPointingIcon = cairo_dock_search_icon_pointing_on_dock (pParentDock, &pMainDock);
 
254
                                                if (pMainDock && pPointingIcon && pPointingIcon->cDesktopFileName == NULL)
 
255
                                                {
 
256
                                                        cairo_dock_remove_icon_from_dock (pMainDock, pPointingIcon);
 
257
                                                        bNeedsRedraw |= pMainDock->bIsMainDock;
 
258
                                                        cairo_dock_free_icon (pPointingIcon);
 
259
                                                }
 
260
                                        }
 
261
                                        cairo_dock_destroy_dock (pParentDock, cParentDockName, NULL, NULL);
 
262
                                }
 
263
                                else  // non vide => on le met a jour.
 
264
                                        cairo_dock_update_dock_size (pParentDock);
 
265
                        }
 
266
                        else  // main dock => on le met a jour a la fin.
 
267
                                bNeedsRedraw = TRUE;
 
268
                }
 
269
                g_free (cParentDockName);
 
270
                
 
271
                if (XFirstFoundId == 0)  // on recupere la 1ere appli de la classe.
 
272
                {
 
273
                        XFirstFoundId = pIcon->Xid;
 
274
                        if (! bDetachAll)
 
275
                                break;
 
276
                }
 
277
        }
 
278
        if (! cairo_dock_is_loading () && bNeedsRedraw)  // mise a jour du main dock en 1 coup.
 
279
        {
 
280
                cairo_dock_update_dock_size (g_pMainDock);
 
281
                cairo_dock_calculate_dock_icons (g_pMainDock);
 
282
                gtk_widget_queue_draw (g_pMainDock->container.pWidget);
 
283
        }
 
284
        return XFirstFoundId;
 
285
}
277
286
gboolean cairo_dock_inhibate_class (const gchar *cClass, Icon *pInhibatorIcon)
278
287
{
279
288
        g_return_val_if_fail (cClass != NULL, FALSE);
282
291
        if (! cairo_dock_add_inhibator_to_class (cClass, pInhibatorIcon))  // on l'insere avant pour que les icones des applis puissent le trouver et prendre sa surface si necessaire.
283
292
                return FALSE;
284
293
        
285
 
        Window XFirstFoundId = cairo_dock_detach_appli_of_class (cClass, (TRUE));
 
294
        Window XFirstFoundId = _cairo_dock_detach_appli_of_class (cClass, (TRUE));
286
295
        if (pInhibatorIcon != NULL)
287
296
        {
288
297
                pInhibatorIcon->Xid = XFirstFoundId;
306
315
                }
307
316
        }
308
317
        
309
 
        //return cairo_dock_add_inhibator_to_class (cClass, pInhibatorIcon);
310
318
        return TRUE;
311
319
}
312
320
 
374
382
                                                else
375
383
                                                        g_free (pInhibatorIcon->cName);
376
384
                                                pInhibatorIcon->cName = NULL;
377
 
                                                cairo_t *pCairoContext = cairo_dock_create_context_from_window (CAIRO_CONTAINER (pInhibhatorDock));
 
385
                                                cairo_t *pCairoContext = cairo_dock_create_drawing_context_generic (CAIRO_CONTAINER (pInhibhatorDock));
378
386
                                                cairo_dock_set_icon_name (pCairoContext, pIcon->cName, pInhibatorIcon, CAIRO_CONTAINER (pInhibhatorDock));
379
387
                                                cairo_destroy (pCairoContext);
380
388
                                        }
418
426
        
419
427
        if (pInhibatorIcon == NULL || pInhibatorIcon->Xid != 0)
420
428
        {
421
 
                cairo_t *pCairoContext = cairo_dock_create_context_from_window (CAIRO_CONTAINER (g_pMainDock));
 
429
                cairo_t *pCairoContext = cairo_dock_create_drawing_context_generic (CAIRO_CONTAINER (g_pMainDock));
422
430
                const GList *pList = cairo_dock_list_existing_appli_with_class (cClass);
423
431
                Icon *pIcon;
424
432
                gboolean bNeedsRedraw = FALSE;
430
438
                        if (pInhibatorIcon == NULL || pIcon->Xid == pInhibatorIcon->Xid)
431
439
                        {
432
440
                                cd_message ("rajout de l'icone precedemment inhibee (Xid:%d)", pIcon->Xid);
433
 
                                pIcon->fPersonnalScale = 0;
 
441
                                pIcon->fInsertRemoveFactor = 0;
434
442
                                pIcon->fScale = 1.;
435
443
                                pParentDock = cairo_dock_insert_appli_in_dock (pIcon, g_pMainDock, CAIRO_DOCK_UPDATE_DOCK_SIZE, ! CAIRO_DOCK_ANIMATE_ICON);
436
444
                                bNeedsRedraw = (pParentDock != NULL && pParentDock->bIsMainDock);
445
453
                        }
446
454
                        else
447
455
                        {
448
 
                                cairo_dock_fill_one_icon_buffer (pIcon, pCairoContext, (1 + myIcons.fAmplitude), g_pMainDock->container.bIsHorizontal, g_pMainDock->container.bDirectionUp);
 
456
                                cairo_dock_reload_one_icon_buffer_in_dock_full (pIcon, g_pMainDock, pCairoContext);
449
457
                        }
450
458
                }
451
459
                cairo_destroy (pCairoContext);
487
495
                                        for (ic = pList; ic != NULL; ic = ic->next)
488
496
                                        {
489
497
                                                pOneIcon = ic->data;
490
 
                                                if (pOneIcon != NULL && pOneIcon->fPersonnalScale <= 0 && pOneIcon->Xid != Xid)  // la 2eme condition est a priori toujours vraie.
 
498
                                                if (pOneIcon != NULL && ! cairo_dock_icon_is_being_removed (pOneIcon) && pOneIcon->Xid != Xid)  // la 2eme condition est a priori toujours vraie.
491
499
                                                {
492
500
                                                        pSameClassIcon = pOneIcon;
493
501
                                                        break ;
500
508
                                                CairoDock *pClassSubDock = cairo_dock_search_dock_from_name (pSameClassIcon->cParentDockName);
501
509
                                                if (pClassSubDock != NULL)
502
510
                                                {
503
 
                                                        cairo_dock_detach_icon_from_dock (pSameClassIcon, pClassSubDock, myIcons.bUseSeparator);
 
511
                                                        cairo_dock_detach_icon_from_dock (pSameClassIcon, pClassSubDock, myIcons.iSeparateIcons);
504
512
                                                        if (pClassSubDock->icons == NULL && pClassSubDock == cairo_dock_search_dock_from_name (cClass))  // le sous-dock de la classe devient vide.
505
513
                                                                cairo_dock_destroy_dock (pClassSubDock, cClass, NULL, NULL);
506
514
                                                        else
554
562
        
555
563
        cairo_surface_t *pSurface = cairo_dock_duplicate_surface (pInhibatorIcon->pIconBuffer,
556
564
                pSourceContext,
557
 
                pInhibatorIcon->fWidth * fInhibatorMaxScale / pInhibhatorContainer->fRatio,
558
 
                pInhibatorIcon->fHeight * fInhibatorMaxScale / pInhibhatorContainer->fRatio,
 
565
                pInhibatorIcon->fWidth * fInhibatorMaxScale / (pInhibhatorContainer ? pInhibhatorContainer->fRatio : 1.),
 
566
                pInhibatorIcon->fHeight * fInhibatorMaxScale / (pInhibhatorContainer ? pInhibhatorContainer->fRatio : 1.),
559
567
                *fWidth * fMaxScale,
560
568
                *fHeight * fMaxScale);
561
569
        return pSurface;
706
714
                                                        g_free (pInhibatorIcon->cName);
707
715
                                                pInhibatorIcon->cName = NULL;
708
716
                                                
709
 
                                                cairo_t *pCairoContext = cairo_dock_create_context_from_window (CAIRO_CONTAINER (pParentDock));
 
717
                                                cairo_t *pCairoContext = cairo_dock_create_drawing_context_generic (CAIRO_CONTAINER (pParentDock));
710
718
                                                cairo_dock_set_icon_name (pCairoContext, (cNewName != NULL ? cNewName : pInhibatorIcon->cInitialName), pInhibatorIcon, CAIRO_CONTAINER (pParentDock));
711
719
                                                cairo_destroy (pCairoContext);
712
720
                                        }
784
792
                        pLastClassIcon->cParentDockName = g_strdup (pFakeClassIcon->cParentDockName);
785
793
                        pLastClassIcon->fOrder = pFakeClassIcon->fOrder;
786
794
                        
 
795
                        cd_debug ("on enleve l'icone de paille");
 
796
                        cairo_dock_remove_icon_from_dock (pFakeParentDock, pFakeClassIcon);  // a faire avant que l'icone n'ait plus de sous-dock, sinon elle est consideree comme un separateur auto, et du coup le separateur n'est pas enleve.
 
797
                        
787
798
                        cd_debug (" on detruit le sous-dock...");
788
799
                        cairo_dock_destroy_dock (pDock, cClass, NULL, NULL);
789
800
                        pFakeClassIcon->pSubDock = NULL;
790
801
                        
791
 
                        cd_debug (" et l'icone de paille");
792
 
                        cairo_dock_remove_icon_from_dock (pFakeParentDock, pFakeClassIcon);
 
802
                        cd_debug ("on detruit l'icone de paille");
793
803
                        cairo_dock_free_icon (pFakeClassIcon);
794
804
                        
795
805
                        cd_debug (" puis on re-insere l'appli restante");
796
 
                        
797
 
                        if (pLastClassIcon->fPersonnalScale <= 0)
 
806
                        if (! cairo_dock_icon_is_being_removed (pLastClassIcon))
798
807
                        {
799
 
                                cairo_dock_insert_icon_in_dock_full (pLastClassIcon, pFakeParentDock, CAIRO_DOCK_UPDATE_DOCK_SIZE, ! CAIRO_DOCK_ANIMATE_ICON, ! CAIRO_DOCK_INSERT_SEPARATOR, NULL);
 
808
                                cairo_dock_insert_icon_in_dock (pLastClassIcon, pFakeParentDock, CAIRO_DOCK_UPDATE_DOCK_SIZE, ! CAIRO_DOCK_ANIMATE_ICON);
800
809
                                cairo_dock_calculate_dock_icons (pFakeParentDock);
801
810
                                cairo_dock_redraw_icon (pLastClassIcon, CAIRO_CONTAINER (pFakeParentDock));  // on suppose que les tailles des 2 icones sont identiques.
802
811
                        }
803
812
                        else  // la derniere icone est en cours de suppression, inutile de la re-inserer. (c'est souvent lorsqu'on ferme toutes une classe d'un coup. donc les animations sont pratiquement dans le meme etat, donc la derniere icone en est aussi a la fin, donc on ne verrait de toute facon aucune animation.
804
813
                        {
 
814
                                g_print ("inutile de re-inserer l'icone restante\n");
805
815
                                cairo_dock_free_icon (pLastClassIcon);
806
816
                                cairo_dock_update_dock_size (pFakeParentDock);
807
817
                                cairo_dock_calculate_dock_icons (pFakeParentDock);
817
827
                        cairo_dock_destroy_dock (pDock, cClass, NULL, NULL);
818
828
                        pFakeClassIcon->pSubDock = NULL;
819
829
                        cd_debug ("sanity check : pFakeClassIcon->Xid : %d", pFakeClassIcon->Xid);
820
 
                        if (pLastClassIcon->fPersonnalScale <= 0)
 
830
                        if (! cairo_dock_icon_is_being_removed (pLastClassIcon))
821
831
                        {
822
832
                                cairo_dock_insert_appli_in_dock (pLastClassIcon, g_pMainDock, ! CAIRO_DOCK_UPDATE_DOCK_SIZE, ! CAIRO_DOCK_ANIMATE_ICON);  // a priori inutile.
823
833
                                cairo_dock_update_name_on_inhibators (cClass, pLastClassIcon->Xid, pLastClassIcon->cName);
990
1000
{
991
1001
        double fOrder = CAIRO_DOCK_LAST_ORDER;
992
1002
        CairoDockClassAppli *pClassAppli = cairo_dock_get_class (pIcon->cClass);
993
 
        if (pClassAppli != NULL)
 
1003
        if (pClassAppli != NULL)  // on va chercher une icone de meme classe dans le dock principal
994
1004
        {
995
 
                // on charche une icone de meme classe dans le dock principal, de preference un inhibiteur, et de preference un lanceur.
 
1005
                // on cherche un inhibiteur de cette classe, de preference un lanceur.
996
1006
                Icon *pSameClassIcon = NULL;
997
1007
                CairoDock *pDock;
998
1008
                Icon *pInhibatorIcon;
1000
1010
                for (ic = pClassAppli->pIconsOfClass; ic != NULL; ic = ic->next)
1001
1011
                {
1002
1012
                        pInhibatorIcon = ic->data;
1003
 
                        if (CAIRO_DOCK_IS_APPLET (pInhibatorIcon) && ! myIcons.bMixAppletsAndLaunchers)
 
1013
                        if (CAIRO_DOCK_IS_APPLET (pInhibatorIcon) && myIcons.iSeparateIcons)
1004
1014
                                continue;
1005
1015
                        pDock = cairo_dock_search_dock_from_name (pInhibatorIcon->cParentDockName);
1006
 
                        if (!pDock->bIsMainDock)
 
1016
                        if (!pDock || !pDock->bIsMainDock)
1007
1017
                                pInhibatorIcon = cairo_dock_search_icon_pointing_on_dock (pDock, NULL);
1008
1018
                        pSameClassIcon = pInhibatorIcon;
1009
1019
                        if (CAIRO_DOCK_IS_LAUNCHER (pSameClassIcon))  // on prend les lanceurs de preference.
1010
1020
                                break ;
1011
1021
                }
1012
1022
                
1013
 
                if (pSameClassIcon == NULL)  // alors on se place par rapport a une autre appli.
 
1023
                // si aucun trouve, on cherche une autre appli de cette classe.
 
1024
                if (pSameClassIcon == NULL)
1014
1025
                {
1015
1026
                        Icon *pAppliIcon = NULL;
1016
1027
                        for (ic = pClassAppli->pAppliOfClass; ic != NULL; ic = ic->next)
1019
1030
                                if (pAppliIcon == pIcon)
1020
1031
                                        continue;
1021
1032
                                pDock = cairo_dock_search_dock_from_name (pAppliIcon->cParentDockName);
1022
 
                                if (pDock->bIsMainDock)
 
1033
                                if (pDock && pDock->bIsMainDock)
1023
1034
                                {
1024
1035
                                        pSameClassIcon = pAppliIcon;
1025
1036
                                        break ;
1027
1038
                        }
1028
1039
                }
1029
1040
                
1030
 
                // on se place entre l'icone trouvee et la suivante de clase differente.
 
1041
                // on se place entre l'icone trouvee et la suivante de classe differente.
1031
1042
                if (pSameClassIcon != NULL)  // une icone de meme classe existe dans le main dock, on va se placer apres.
1032
1043
                {
 
1044
                        Icon *pNextIcon = NULL;
1033
1045
                        ic = g_list_find (g_pMainDock->icons, pSameClassIcon);
1034
 
                        if (ic != NULL && ic->next != NULL)  // on remonte vers la droite toutes les icones de meme classe.
 
1046
                        if (ic && ic->next != NULL)  // on remonte vers la droite toutes les icones de meme classe, et on cherche l'icone suivante.
1035
1047
                        {
1036
 
                                Icon *pNextIcon = NULL;
1037
1048
                                ic = ic->next;
1038
1049
                                for (;ic != NULL; ic = ic->next)
1039
1050
                                {
1043
1054
                                        pSameClassIcon = pNextIcon;
1044
1055
                                        pNextIcon = NULL;
1045
1056
                                }
1046
 
                                fOrder = (pNextIcon ? (pNextIcon->fOrder + pSameClassIcon->fOrder) / 2 : pSameClassIcon->fOrder + 1);
1047
1057
                        }
1048
 
                        else
1049
 
                        {
 
1058
                        //g_print ("on se place apres la derniere icone de cette classe\n");
 
1059
                        if (pNextIcon != NULL && cairo_dock_get_icon_order (pNextIcon) == cairo_dock_get_icon_order (pSameClassIcon))  // l'icone suivante est dans le meme groupe que nous, on s'intercalle entre elle et pSameClassIcon.
 
1060
                                fOrder = (pNextIcon->fOrder + pSameClassIcon->fOrder) / 2;
 
1061
                        else  // aucune icone apres notre classe, ou alors dans un groupe different, on se place juste apres pSameClassIcon.
1050
1062
                                fOrder = pSameClassIcon->fOrder + 1;
 
1063
                }
 
1064
        }
 
1065
        
 
1066
        if (fOrder == CAIRO_DOCK_LAST_ORDER)  // cette classe n'existe pas encore ou est vide ou n'a aucune icone dans le main dock => on va se positionner par rapport a la derniere appli.
 
1067
        {
 
1068
                GList* ic;
 
1069
                Icon *icon;
 
1070
                for (ic = g_list_last (g_pMainDock->icons); ic != NULL; ic = ic->prev)
 
1071
                {
 
1072
                        icon = ic->data;
 
1073
                        if (icon->iType == CAIRO_DOCK_APPLI && ! cairo_dock_class_is_inhibated (icon->cClass))  // on verifie qu'elle n'est pas placé a cote de son lanceur, sinon cela cree des incoherences suivants que l'appli est lancee 2 fois ou pas.
 
1074
                        {
 
1075
                                break ;
 
1076
                        }
 
1077
                }
 
1078
                if (ic != NULL)  // on a trouve une icone d'appli.
 
1079
                {
 
1080
                        //g_print ("on se place apres la derniere appli\n");
 
1081
                        ic = ic->next;
 
1082
                        Icon *next_icon = (ic ? ic->data : NULL);
 
1083
                        if (next_icon != NULL && cairo_dock_get_icon_order (next_icon) == cairo_dock_get_icon_order (icon))
 
1084
                                fOrder = (icon->fOrder + next_icon->fOrder) / 2;
 
1085
                        else
 
1086
                                fOrder = icon->fOrder + 1;
 
1087
                }
 
1088
                else if (myTaskBar.bMixLauncherAppli)  // on decide de la placer apres le dernier lanceur dans le cas ou les lanceurs peuvent faire appli.
 
1089
                {
 
1090
                        for (ic = g_list_last (g_pMainDock->icons); ic != NULL; ic = ic->prev)
 
1091
                        {
 
1092
                                icon = ic->data;
 
1093
                                if (icon->iType == CAIRO_DOCK_LAUNCHER)
 
1094
                                        break;
 
1095
                        }
 
1096
                        if (ic != NULL)  // on a trouve une icone de lanceur.
 
1097
                        {
 
1098
                                //g_print ("on se place apres le dernier lanceur\n");
 
1099
                                ic = ic->next;
 
1100
                                Icon *next_icon = (ic ? ic->data : NULL);
 
1101
                                if (next_icon != NULL && cairo_dock_get_icon_order (next_icon) == cairo_dock_get_icon_order (icon))
 
1102
                                        fOrder = (icon->fOrder + next_icon->fOrder) / 2;
 
1103
                                else
 
1104
                                        fOrder = icon->fOrder + 1;
1051
1105
                        }
1052
1106
                }
1053
1107
        }
1064
1118
        for (ic = pClassAppli->pIconsOfClass; ic != NULL; ic = ic->next)
1065
1119
        {
1066
1120
                pInhibatorIcon = ic->data;
1067
 
                if (CAIRO_DOCK_IS_APPLET (pInhibatorIcon) && ! myIcons.bMixAppletsAndLaunchers)
 
1121
                if (CAIRO_DOCK_IS_APPLET (pInhibatorIcon) && myIcons.iSeparateIcons)
1068
1122
                        continue;
1069
1123
                
1070
1124
                pParentDock = cairo_dock_search_dock_from_name (pInhibatorIcon->cParentDockName);
1091
1145
                        for (ic = ic->next; ic != NULL; ic = ic->next)
1092
1146
                        {
1093
1147
                                pNextIcon = ic->data;
1094
 
                                if (!pNextIcon->cClass || strcmp (pNextIcon->cClass, pSameClassIcon->cClass) != 0)  // icone d'une autre classe.
 
1148
                                if (!pNextIcon->cClass || strcmp (pNextIcon->cClass, cClass) != 0)  // icone d'une autre classe. (pSameClassIcon->cClass peut etre NULL dans le cas d'un inhibiteur place dans un sous-dock, car alors pSameClassIcon est l'icone pointant sur le sous-dock.)
1095
1149
                                        break;
1096
1150
                                pSameClassIcon = pNextIcon;
1097
1151
                                pNextIcon = NULL;
1109
1163
                {
1110
1164
                        pAppliIcon = ic->data;
1111
1165
                        pDock = cairo_dock_search_dock_from_name (pAppliIcon->cParentDockName);
1112
 
                        if (pDock->iRefCount == 0)
 
1166
                        if (pDock && pDock->iRefCount == 0)
1113
1167
                        {
1114
1168
                                pAppliIcon->fOrder = pSameClassIcon->fOrder + (pNextIcon->fOrder - pSameClassIcon->fOrder) * i / (iNbIcons + 1);
1115
1169
                                i ++;
1122
1176
                {
1123
1177
                        pAppliIcon = ic->data;
1124
1178
                        pDock = cairo_dock_search_dock_from_name (pAppliIcon->cParentDockName);
1125
 
                        if (pDock->iRefCount == 0)
 
1179
                        if (pDock && pDock->iRefCount == 0)
1126
1180
                        {
1127
1181
                                pAppliIcon->fOrder = *iMaxOrder;
1128
1182
                                *iMaxOrder ++;