~cairo-dock-team/ubuntu/precise/cairo-dock/3.0.0.0beta1

« back to all changes in this revision

Viewing changes to src/cairo-dock-icons.c

  • Committer: Bazaar Package Importer
  • Author(s): Julien Lavergne
  • Date: 2008-09-14 16:26:12 UTC
  • mfrom: (1.1.1 upstream)
  • Revision ID: james.westby@ubuntu.com-20080914162612-t6aa8pr2o0qry48o
Tags: 1.6.2.3-0ubuntu1
* New upstream release.
* debian/control
 - Update to 3.8.0 (no change needed).
 - Add libxtst-dev as Build-Depends.
* debian/cairo-dock-data.install
 - Add usr/share/cairo-dock/emblems directory.
* debian/watch
 - Update location.
* debian/rules
 - Add a get-orig-source rule.

Show diffs side-by-side

added added

removed removed

Lines of Context:
39
39
#include "cairo-dock-icons.h"
40
40
 
41
41
 
42
 
extern gint g_iScreenWidth;
43
 
extern gint g_iScreenHeight;
44
42
extern gboolean g_bReserveSpace;
45
43
extern int g_iLeaveSubDockDelay;
46
44
 
47
45
extern gint g_iDockLineWidth;
48
46
extern gint g_iDockRadius;
49
47
extern gint g_iFrameMargin;
50
 
extern int g_iLabelSize;
51
48
extern int g_iIconGap;
52
 
extern double g_fSubDockSizeRatio;
53
 
extern int g_iMaxAuthorizedWidth;
54
49
 
55
50
extern gchar *g_cCurrentLaunchersPath;
56
51
 
57
52
extern double g_fAmplitude;
58
53
extern int g_iSinusoidWidth;
59
54
 
60
 
extern double g_fUnfoldAcceleration;
61
 
extern gboolean g_bAutoHide;
62
 
 
63
 
extern gboolean g_bUniquePid;
64
 
 
65
55
extern int g_tIconTypeOrder[CAIRO_DOCK_NB_TYPES];
66
 
extern gchar *g_cConfFile;
67
 
 
68
 
 
69
 
/**
70
 
*Libere toutes les ressources liees a une icone, ainsi que cette derniere. Le sous-dock pointee par elle n'est pas dereference, cela doit etre fait au prealable.
71
 
*@param icon l'icone a liberer.
72
 
*/
 
56
 
 
57
 
73
58
void cairo_dock_free_icon (Icon *icon)
74
59
{
75
60
        if (icon == NULL)
76
61
                return ;
77
62
        cd_message ("%s (%s , %s)", __func__, icon->acName, icon->cClass);
78
 
 
 
63
        
79
64
        cairo_dock_remove_dialog_if_any (icon);
80
65
        if (CAIRO_DOCK_IS_NORMAL_APPLI (icon))
81
66
                cairo_dock_unregister_appli (icon);
82
67
        else if (icon->cClass != NULL)  // c'est un inhibiteur.
83
68
                cairo_dock_deinhibate_class (icon->cClass, icon);
84
 
        cairo_dock_deactivate_module (icon->pModule);
 
69
        if (icon->pModuleInstance != NULL)
 
70
                cairo_dock_deinstanciate_module (icon->pModuleInstance);
85
71
        
86
72
        cairo_dock_free_icon_buffers (icon);
87
73
        
122
108
                return CAIRO_DOCK_LAUNCHER;
123
109
}
124
110
 
125
 
/**
126
 
*Compare 2 icones grace a la relation d'ordre sur le couple (position du type , ordre).
127
 
*@param icon1 une icone.
128
 
*@param icon2 une autre icone.
129
 
*@Returns -1 si icone1 < icone2, 1 si icone1 > icone2, 0 si icone1 = icone2 (au sens de la relation d'ordre).
130
 
*/
 
111
 
131
112
int cairo_dock_compare_icons_order (Icon *icon1, Icon *icon2)
132
113
{
133
 
        int iOrder1 = cairo_dock_get_group_order (icon1);
134
 
        int iOrder2 = cairo_dock_get_group_order (icon2);
 
114
        int iOrder1 = cairo_dock_get_icon_order (icon1);
 
115
        int iOrder2 = cairo_dock_get_icon_order (icon2);
135
116
        if (iOrder1 < iOrder2)
136
117
                return -1;
137
118
        else if (iOrder1 > iOrder2)
146
127
                        return 0;
147
128
        }
148
129
}
149
 
static int cairo_dock_compare_icons_name (Icon *icon1, Icon *icon2)
 
130
int cairo_dock_compare_icons_name (Icon *icon1, Icon *icon2)
150
131
{
151
132
        if (icon1->acName == NULL)
152
133
                return -1;
159
140
        g_free (cURI_2);
160
141
        return iOrder;
161
142
}
162
 
/**
163
 
*Trie une liste en se basant sur la relation d'ordre sur le couple (position du type , ordre).
164
 
*@param pIconList la liste d'icones.
165
 
*@Returns la liste triee. Les elements sont les memes que ceux de la liste initiale, seul leur ordre a change.
166
 
*/
 
143
 
 
144
int cairo_dock_compare_icons_extension (Icon *icon1, Icon *icon2)
 
145
{
 
146
        if (icon1->cBaseURI == NULL)
 
147
                return -1;
 
148
        if (icon2->cBaseURI == NULL)
 
149
                return 1;
 
150
        
 
151
        gchar *ext1 = strrchr (icon1->cBaseURI, '.');
 
152
        gchar *ext2 = strrchr (icon2->cBaseURI, '.');
 
153
        if (ext1 == NULL)
 
154
                return -1;
 
155
        if (ext2 == NULL)
 
156
                return 1;
 
157
        
 
158
        ext1 = g_ascii_strdown (ext1+1, -1);
 
159
        ext2 = g_ascii_strdown (ext2+1, -1);
 
160
        
 
161
        int iOrder = strcmp (ext1, ext2);
 
162
        g_free (ext1);
 
163
        g_free (ext2);
 
164
        return iOrder;
 
165
}
 
166
 
167
167
GList *cairo_dock_sort_icons_by_order (GList *pIconList)
168
168
{
169
169
        return g_list_sort (pIconList, (GCompareFunc) cairo_dock_compare_icons_order);
170
170
}
171
 
/**
172
 
*Trie une liste en se basant sur la relation d'ordre alphanumerique sur le nom des icones.
173
 
*@param pIconList la liste d'icones.
174
 
*@Returns la liste triee. Les elements sont les memes que ceux de la liste initiale, seul leur ordre a change. Les ordres des icones sont mis a jour pour refleter le nouvel ordre global.
175
 
*/
 
171
 
176
172
GList *cairo_dock_sort_icons_by_name (GList *pIconList)
177
173
{
178
174
        GList *pSortedIconList = g_list_sort (pIconList, (GCompareFunc) cairo_dock_compare_icons_name);
188
184
}
189
185
 
190
186
 
191
 
/**
192
 
*Renvoie la 1ere icone d'une liste d'icones.
193
 
*@param pIconList la liste d'icones.
194
 
*@Returns la 1ere icone, ou NULL si la liste est vide.
195
 
*/
 
187
 
196
188
Icon* cairo_dock_get_first_icon (GList *pIconList)
197
189
{
198
190
        GList *pListHead = g_list_first(pIconList);
199
191
        return (pListHead != NULL ? pListHead->data : NULL);
200
192
}
201
 
/**
202
 
*Renvoie la derniere icone d'une liste d'icones.
203
 
*@param pIconList la liste d'icones.
204
 
*@Returns la derniere icone, ou NULL si la liste est vide.
205
 
*/
 
193
 
206
194
Icon* cairo_dock_get_last_icon (GList *pIconList)
207
195
{
208
196
        GList *pListTail = g_list_last(pIconList);
209
197
        return (pListTail != NULL ? pListTail->data : NULL);
210
198
}
211
 
/**
212
 
*Renvoie la 1ere icone a etre dessinee d'une liste d'icones (qui n'est pas forcement la 1ere icone de la liste, si l'utilisateur a scrolle).
213
 
*@param pIconList la liste d'icones.
214
 
*@Returns la 1ere icone a etre dessinee, ou NULL si la liste est vide.
215
 
*/
 
199
 
216
200
Icon *cairo_dock_get_first_drawn_icon (CairoDock *pDock)
217
201
{
218
202
        if (pDock->pFirstDrawnElement != NULL)
220
204
        else
221
205
                return cairo_dock_get_first_icon (pDock->icons);
222
206
}
223
 
/**
224
 
*Renvoie la derniere icone a etre dessinee d'une liste d'icones (qui n'est pas forcement la derniere icone de la liste, si l'utilisateur a scrolle).
225
 
*@param pIconList la liste d'icones.
226
 
*@Returns la derniere icone a etre dessinee, ou NULL si la liste est vide.
227
 
*/
 
207
 
228
208
Icon *cairo_dock_get_last_drawn_icon (CairoDock *pDock)
229
209
{
230
210
        if (pDock->pFirstDrawnElement != NULL)
237
217
        else
238
218
                return cairo_dock_get_last_icon (pDock->icons);;
239
219
}
240
 
/**
241
 
*Renvoie la 1ere icone du type donne.
242
 
*@param pIconList la liste d'icones.
243
 
*@param iType le type d'icone recherche.
244
 
*@Returns la 1ere icone trouvee ayant ce type, ou NULL si aucune icone n'est trouvee.
245
 
*/
 
220
 
246
221
Icon* cairo_dock_get_first_icon_of_type (GList *pIconList, CairoDockIconType iType)
247
222
{
248
223
        GList* ic;
380
355
        for (ic = pIconList; ic != NULL; ic = ic->next)
381
356
        {
382
357
                icon = ic->data;
 
358
                //cd_message ("  icon->cBaseURI : %s\n", icon->cBaseURI);
383
359
                if (icon->cBaseURI != NULL && strcmp (icon->cBaseURI, cBaseURI) == 0)
384
360
                        return icon;
385
361
        }
394
370
        for (ic = pIconList; ic != NULL; ic = ic->next)
395
371
        {
396
372
                icon = ic->data;
 
373
                //cd_message ("  icon->acName : %s\n", icon->acName);
397
374
                if (icon->acName != NULL && strcmp (icon->acName, cName) == 0)
398
375
                        return icon;
399
376
        }
420
397
        for (ic = pIconList; ic != NULL; ic = ic->next)
421
398
        {
422
399
                icon = ic->data;
423
 
                if (icon->pModule == pModule)
 
400
                if (icon->pModuleInstance->pModule == pModule)
424
401
                        return icon;
425
402
        }
426
403
        return NULL;
441
418
}
442
419
 
443
420
 
 
421
void cairo_dock_normalize_icons_order (GList *pIconList, CairoDockIconType iType)
 
422
{
 
423
        g_print ("%s (%d)\n", __func__, iType);
 
424
        int iOrder = 1;
 
425
        int iGroupOrder = cairo_dock_get_group_order (iType);
 
426
        GString *sDesktopFilePath = g_string_new ("");
 
427
        GList* ic;
 
428
        Icon *icon;
 
429
        for (ic = pIconList; ic != NULL; ic = ic->next)
 
430
        {
 
431
                icon = ic->data;
 
432
                if (cairo_dock_get_icon_order (icon) != iGroupOrder)
 
433
                        continue;
 
434
                
 
435
                icon->fOrder = iOrder ++;
 
436
                if (icon->acDesktopFileName != NULL)
 
437
                {
 
438
                        g_string_printf (sDesktopFilePath, "%s/%s", g_cCurrentLaunchersPath, icon->acDesktopFileName);
 
439
                        cairo_dock_update_conf_file (sDesktopFilePath->str,
 
440
                                G_TYPE_DOUBLE, "Icon", "order", icon->fOrder,
 
441
                                G_TYPE_INVALID);
 
442
                }
 
443
                else if (CAIRO_DOCK_IS_APPLET (icon))
 
444
                {
 
445
                        cairo_dock_update_conf_file (icon->pModuleInstance->cConfFilePath,
 
446
                                G_TYPE_DOUBLE, "Icon", "order", icon->fOrder,
 
447
                                G_TYPE_INVALID);
 
448
                }
 
449
        }
 
450
        g_string_free (sDesktopFilePath, TRUE);
 
451
}
444
452
 
445
453
void cairo_dock_swap_icons (CairoDock *pDock, Icon *icon1, Icon *icon2)
446
454
{
467
475
                        g_key_file_load_from_file (pKeyFile, cDesktopFilePath, G_KEY_FILE_KEEP_COMMENTS | G_KEY_FILE_KEEP_TRANSLATIONS, &erreur);
468
476
                        if (erreur != NULL)
469
477
                        {
470
 
                                cd_warning ("Attention : %s", erreur->message);
 
478
                                cd_warning ("%s", erreur->message);
471
479
                                g_error_free (erreur);
472
480
                                return ;
473
481
                        }
485
493
                        g_key_file_load_from_file (pKeyFile, cDesktopFilePath, G_KEY_FILE_KEEP_COMMENTS | G_KEY_FILE_KEEP_TRANSLATIONS, &erreur);
486
494
                        if (erreur != NULL)
487
495
                        {
488
 
                                cd_warning ("Attention : %s", erreur->message);
 
496
                                cd_warning ("%s", erreur->message);
489
497
                                g_error_free (erreur);
490
498
                                return ;
491
499
                        }
514
522
 
515
523
        //\_________________ On met a jour l'ordre des applets dans le fichier de conf.
516
524
        if (CAIRO_DOCK_IS_APPLET (icon1))
517
 
                cairo_dock_update_module_order (icon1->pModule, icon1->fOrder);
518
 
                ///cairo_dock_update_conf_file_with_active_modules (NULL, g_cConfFile, pDock->icons);
 
525
                cairo_dock_update_module_instance_order (icon1->pModuleInstance, icon1->fOrder);
519
526
        if (CAIRO_DOCK_IS_APPLET (icon2))
520
 
                cairo_dock_update_module_order (icon2->pModule, icon2->fOrder);
 
527
                cairo_dock_update_module_instance_order (icon2->pModuleInstance, icon2->fOrder);
 
528
        if (fabs (icon2->fOrder - icon1->fOrder) < 1e-3)
 
529
        {
 
530
                cairo_dock_normalize_icons_order (pDock->icons, icon1->iType);
 
531
        }
521
532
}
522
533
 
523
534
void cairo_dock_move_icon_after_icon (CairoDock *pDock, Icon *icon1, Icon *icon2)
524
535
{
525
536
        //g_print ("%s (%s, %.2f)\n", __func__, icon1->acName, icon1->fOrder);
526
 
        if ((icon2 != NULL) && (! ( (CAIRO_DOCK_IS_APPLI (icon1) && CAIRO_DOCK_IS_APPLI (icon2)) || (CAIRO_DOCK_IS_LAUNCHER (icon1) && CAIRO_DOCK_IS_LAUNCHER (icon2)) || (CAIRO_DOCK_IS_APPLET (icon1) && CAIRO_DOCK_IS_APPLET (icon2)) ) ))
 
537
        ///if ((icon2 != NULL) && (! ( (CAIRO_DOCK_IS_APPLI (icon1) && CAIRO_DOCK_IS_APPLI (icon2)) || (CAIRO_DOCK_IS_LAUNCHER (icon1) && CAIRO_DOCK_IS_LAUNCHER (icon2)) || (CAIRO_DOCK_IS_APPLET (icon1) && CAIRO_DOCK_IS_APPLET (icon2)) ) ))
 
538
        if ((icon2 != NULL) && fabs (cairo_dock_get_icon_order (icon1) - cairo_dock_get_icon_order (icon2)) > 1)
527
539
                return ;
528
 
 
529
540
        //\_________________ On change l'ordre de l'icone.
530
541
        if (icon2 != NULL)
531
542
        {
532
543
                Icon *pNextIcon = cairo_dock_get_next_icon (pDock->icons, icon2);
533
 
                if (pNextIcon == NULL || pNextIcon->iType != icon2->iType)
 
544
                if (pNextIcon == NULL || cairo_dock_get_icon_order (pNextIcon) != cairo_dock_get_icon_order (icon2))
534
545
                        icon1->fOrder = icon2->fOrder + 1;
535
546
                else
536
547
                        icon1->fOrder = (pNextIcon->fOrder - icon2->fOrder > 1 ? icon2->fOrder + 1 : (pNextIcon->fOrder + icon2->fOrder) / 2);
 
548
                
 
549
                if (fabs (icon2->fOrder - icon1->fOrder) < 1e-3)
 
550
                {
 
551
                        cairo_dock_normalize_icons_order (pDock->icons, icon1->iType);
 
552
                }
537
553
        }
538
554
        else
539
555
        {
545
561
        }
546
562
 
547
563
        //\_________________ On change l'ordre dans le fichier du lanceur 1.
548
 
        if (CAIRO_DOCK_IS_LAUNCHER (icon1) && icon1->acDesktopFileName != NULL)
 
564
        if ((CAIRO_DOCK_IS_LAUNCHER (icon1) || CAIRO_DOCK_IS_SEPARATOR (icon1)) && icon1->acDesktopFileName != NULL)
549
565
        {
550
566
                GError *erreur = NULL;
551
567
                gchar *cDesktopFilePath = g_strdup_printf ("%s/%s", g_cCurrentLaunchersPath, icon1->acDesktopFileName);
553
569
                g_key_file_load_from_file (pKeyFile, cDesktopFilePath, G_KEY_FILE_KEEP_COMMENTS | G_KEY_FILE_KEEP_TRANSLATIONS, &erreur);
554
570
                if (erreur != NULL)
555
571
                {
556
 
                        cd_warning ("Attention : %s", erreur->message);
 
572
                        cd_warning ("%s", erreur->message);
557
573
                        g_error_free (erreur);
558
574
                        erreur = NULL;
559
575
                }
578
594
 
579
595
        //\_________________ On prend en compte le changement de position pour les applets.
580
596
        if (CAIRO_DOCK_IS_APPLET (icon1))
581
 
                cairo_dock_update_module_order (icon1->pModule, icon1->fOrder);
582
 
                ///cairo_dock_update_conf_file_with_active_modules (NULL, g_cConfFile, pDock->icons);
 
597
                cairo_dock_update_module_instance_order (icon1->pModuleInstance, icon1->fOrder);
583
598
}
584
599
 
585
600
 
586
601
 
587
602
gboolean cairo_dock_detach_icon_from_dock (Icon *icon, CairoDock *pDock, gboolean bCheckUnusedSeparator)
588
603
{
589
 
        if (g_list_find (pDock->icons, icon) == NULL)  // elle est deja detachee.
 
604
        if (pDock == NULL || g_list_find (pDock->icons, icon) == NULL)  // elle est deja detachee.
590
605
                return FALSE;
591
606
 
592
607
        cd_message ("%s (%s)", __func__, icon->acName);
670
685
        //\___________________ On la remet a la taille normale en vue d'une reinsertion quelque part.
671
686
        ///if (pDock->iRefCount > 0)
672
687
        {
673
 
                icon->fWidth /= pDock->fRatio;  /// g_fSubDockSizeRatio
 
688
                icon->fWidth /= pDock->fRatio;
674
689
                icon->fHeight /= pDock->fRatio;
675
690
        }
676
691
        //g_print (" -size <- %.2fx%.2f\n", icon->fWidth, icon->fHeight);
684
699
                        Icon *pSameTypeIcon = cairo_dock_get_first_icon_of_type (pDock->icons, icon->iType);
685
700
                        if (pSameTypeIcon == NULL)
686
701
                        {
687
 
                                int iOrder = cairo_dock_get_group_order (icon);
 
702
                                int iOrder = cairo_dock_get_icon_order (icon);
688
703
                                if (iOrder > 1)  // attention : iType - 1 > 0 si iType = 0, car c'est un unsigned int !
689
704
                                        pSeparatorIcon = cairo_dock_get_first_icon_of_type (pDock->icons, iOrder - 1);
690
705
                                else if (iOrder + 1 < CAIRO_DOCK_NB_TYPES)
699
714
                        }
700
715
                }
701
716
        }
 
717
        return TRUE;
702
718
}
703
719
static void _cairo_dock_remove_one_icon_from_dock (CairoDock *pDock, Icon *icon, gboolean bCheckUnusedSeparator)
704
720
{
705
 
        g_return_if_fail (icon != NULL);
 
721
        g_return_if_fail (icon != NULL && pDock != NULL);
706
722
        //\___________________ On effectue les taches de fermeture de l'icone suivant son type.
707
723
        if (icon->acDesktopFileName != NULL)
708
724
        {
715
731
                        cairo_dock_fm_remove_monitor (icon);
716
732
                }
717
733
        }
718
 
        if (CAIRO_DOCK_IS_NORMAL_APPLI (icon))
719
 
        {
720
 
                cairo_dock_unregister_appli (icon);
721
 
        }
722
734
        if (CAIRO_DOCK_IS_APPLET (icon))
723
735
        {
724
 
                cairo_dock_deactivate_module (icon->pModule);  // desactive le module mais ne le ferme pas.
725
 
                icon->pModule = NULL;  // pour ne pas le liberer lors du free_icon.
 
736
                cairo_dock_deinstanciate_module (icon->pModuleInstance);  // desactive l'instance du module.
 
737
                icon->pModuleInstance = NULL;  // l'instance n'est plus valide apres ca.
726
738
        }  // rien a faire pour les separateurs automatiques.
727
739
 
728
740
        //\___________________ On detache l'icone du dock.
729
741
        cairo_dock_detach_icon_from_dock (icon, pDock, bCheckUnusedSeparator);
730
 
 
 
742
        
 
743
        if (CAIRO_DOCK_IS_NORMAL_APPLI (icon))
 
744
        {
 
745
                cairo_dock_unregister_appli (icon);
 
746
        }
 
747
        
731
748
        if (pDock->bIsMainDock && g_bReserveSpace)
732
749
                cairo_dock_reserve_space_for_dock (pDock, TRUE);  // l'espace est reserve sur la taille min, qui a deja ete mise a jour.
733
750
}
964
981
        return pFirstDrawnElement;
965
982
}
966
983
 
 
984
void cairo_dock_update_removing_inserting_icon (Icon *icon)
 
985
{
 
986
        if (icon->fPersonnalScale > 0)
 
987
        {
 
988
                icon->fPersonnalScale *= .85;
 
989
                if (icon->fPersonnalScale < 0.05)
 
990
                        icon->fPersonnalScale = 0.05;
 
991
        }
 
992
        else if (icon->fPersonnalScale < 0)
 
993
        {
 
994
                icon->fPersonnalScale *= .85;
 
995
                if (icon->fPersonnalScale > -0.05)
 
996
                        icon->fPersonnalScale = -0.05;
 
997
        }
 
998
}
 
999
 
967
1000
Icon * cairo_dock_calculate_wave_with_position_linear (GList *pIconList, GList *pFirstDrawnElementGiven, int x_abs, gdouble fMagnitude, double fFlatDockWidth, int iWidth, int iHeight, double fAlign, double fFoldingFactor, gboolean bDirectionUp)
968
1001
{
969
1002
        //g_print (">>>>>%s (%d/%.2f, %dx%d, %.2f, %.2f)\n", __func__, x_abs, fFlatDockWidth, iWidth, iHeight, fAlign, fFoldingFactor);
1000
1033
                
1001
1034
                //\_______________ On en deduit l'amplitude de la sinusoide au niveau de cette icone, et donc son echelle.
1002
1035
                icon->fScale = 1 + fMagnitude * g_fAmplitude * sin (icon->fPhase);
1003
 
                if (icon->fPersonnalScale > 0 && iWidth > 0)
1004
 
                {
1005
 
                        icon->fPersonnalScale *= .85;
1006
 
                        icon->fScale *= icon->fPersonnalScale;
1007
 
                        if (icon->fPersonnalScale < 0.05)
1008
 
                                icon->fPersonnalScale = 0.05;
1009
 
                }
1010
 
                else if (icon->fPersonnalScale < 0 && iWidth > 0)
1011
 
                {
1012
 
                        icon->fPersonnalScale *= .85;
1013
 
                        icon->fScale *= (1 + icon->fPersonnalScale);
1014
 
                        if (icon->fPersonnalScale > -0.05)
1015
 
                                icon->fPersonnalScale = -0.05;
1016
 
                }
 
1036
                if (iWidth > 0 && icon->fPersonnalScale != 0)
 
1037
                {
 
1038
                        if (icon->fPersonnalScale > 0)
 
1039
                                icon->fScale *= icon->fPersonnalScale;
 
1040
                        else
 
1041
                                icon->fScale *= (1 + icon->fPersonnalScale);
 
1042
                }
 
1043
//              if (icon->fPersonnalScale > 0 && iWidth > 0)
 
1044
//              {
 
1045
//                      icon->fPersonnalScale *= .85;
 
1046
//                      icon->fScale *= icon->fPersonnalScale;
 
1047
//                      if (icon->fPersonnalScale < 0.05)
 
1048
//                              icon->fPersonnalScale = 0.05;
 
1049
//              }
 
1050
//              else if (icon->fPersonnalScale < 0 && iWidth > 0)
 
1051
//              {
 
1052
//                      icon->fPersonnalScale *= .85;
 
1053
//                      icon->fScale *= (1 + icon->fPersonnalScale);
 
1054
//                      if (icon->fPersonnalScale > -0.05)
 
1055
//                              icon->fPersonnalScale = -0.05;
 
1056
//              }
1017
1057
                icon->fY = (bDirectionUp ? iHeight - g_iDockLineWidth - g_iFrameMargin - icon->fScale * icon->fHeight : g_iDockLineWidth + g_iFrameMargin);
1018
1058
                
1019
1059
                //\_______________ Si on avait deja defini l'icone pointee, on peut placer l'icone courante par rapport a la precedente.
1119
1159
 
1120
1160
        if (! bMouseInsideDock)
1121
1161
        {
1122
 
                double fSideMargin = (pDock->fAlign - .5) * (iWidth - pDock->fFlatDockWidth);
1123
 
                if (x_abs < fSideMargin || x_abs > pDock->fFlatDockWidth + fSideMargin)
 
1162
                double fSideMargin = fabs (pDock->fAlign - .5) * (iWidth - pDock->fFlatDockWidth);
 
1163
                if (x_abs < - fSideMargin || x_abs > pDock->fFlatDockWidth + fSideMargin)
1124
1164
                        iMousePositionType = CAIRO_DOCK_MOUSE_OUTSIDE;
1125
1165
                else
1126
1166
                        iMousePositionType = CAIRO_DOCK_MOUSE_ON_THE_EDGE;
1144
1184
        {
1145
1185
                case CAIRO_DOCK_MOUSE_INSIDE :
1146
1186
                        //g_print ("INSIDE\n");
1147
 
                        if (cairo_dock_entrance_is_allowed () && pDock->iMagnitudeIndex < CAIRO_DOCK_NB_MAX_ITERATIONS && pDock->iSidGrowUp == 0 && cairo_dock_none_animated (pDock->icons))  // on est dedans et la taille des icones est non maximale bien qu'aucune icone ne soit animee.  ///  && pDock->iSidMoveDown == 0
 
1187
                        if (cairo_dock_entrance_is_allowed (pDock) && pDock->iMagnitudeIndex < CAIRO_DOCK_NB_MAX_ITERATIONS && pDock->iSidGrowUp == 0 && cairo_dock_none_animated (pDock->icons))  // on est dedans et la taille des icones est non maximale bien qu'aucune icone ne soit animee.  ///  && pDock->iSidMoveDown == 0
1148
1188
                        {
1149
1189
                                cd_debug ("on est dedans en x et en y et la taille des icones est non maximale bien qu'aucune icone  ne soit animee");
1150
1190
                                //pDock->bInside = TRUE;
1151
 
                                if ((pDock->bAtBottom && pDock->iRefCount == 0 && ! g_bAutoHide) || (pDock->iCurrentWidth != pDock->iMaxDockWidth || pDock->iCurrentHeight != pDock->iMaxDockHeight))  // on le fait pas avec l'auto-hide, car un signal d'entree est deja emis a cause des mouvements/redimensionnements de la fenetre, et en rajouter un ici fout le boxon.
 
1191
                                if ((pDock->bAtBottom && pDock->iRefCount == 0 && ! pDock->bAutoHide) || (pDock->iCurrentWidth != pDock->iMaxDockWidth || pDock->iCurrentHeight != pDock->iMaxDockHeight))  // on le fait pas avec l'auto-hide, car un signal d'entree est deja emis a cause des mouvements/redimensionnements de la fenetre, et en rajouter un ici fout le boxon.
1152
1192
                                {
1153
1193
                                        cd_debug ("  on emule une re-rentree (pDock->iMagnitudeIndex:%f)", pDock->iMagnitudeIndex);
1154
1194
                                        ///cairo_dock_render_blank (pDock);  // utile ?
1170
1210
                                        }
1171
1211
                                        if (pDock->iSidGrowUp == 0)
1172
1212
                                                pDock->iSidGrowUp = g_timeout_add (40, (GSourceFunc) cairo_dock_grow_up, pDock);
1173
 
                                        if (g_bAutoHide && pDock->iRefCount == 0 && pDock->iSidMoveUp == 0)
 
1213
                                        if (pDock->bAutoHide && pDock->iRefCount == 0 && pDock->iSidMoveUp == 0)
1174
1214
                                                pDock->iSidMoveUp = g_timeout_add (40, (GSourceFunc) cairo_dock_move_up, pDock);
1175
1215
                                }
1176
1216
                        }
1280
1320
{
1281
1321
        if (pDock->icons == NULL)
1282
1322
                return;
1283
 
 
 
1323
        
 
1324
        gboolean bCanDrop = FALSE;
1284
1325
        Icon *icon;
1285
1326
        GList *pFirstDrawnElement = (pDock->pFirstDrawnElement != NULL ? pDock->pFirstDrawnElement : pDock->icons);
1286
1327
        GList *ic = pFirstDrawnElement;
1291
1332
                {
1292
1333
                        icon->iAnimationType = 0;
1293
1334
 
1294
 
                        if (pDock->iMouseX < icon->fDrawX + icon->fWidth * icon->fScale * fMargin)  // on est a gauche.
 
1335
                        if (pDock->iMouseX < icon->fDrawXAtRest + icon->fWidth * icon->fScale * fMargin)  // on est a gauche.
1295
1336
                        {
1296
1337
                                Icon *prev_icon = cairo_dock_get_previous_element (ic, pDock->icons) -> data;
1297
 
                                if ((icon->iType == iType || prev_icon->iType == iType) && prev_icon->iAnimationType != CAIRO_DOCK_FOLLOW_MOUSE)
 
1338
                                if ((cairo_dock_get_icon_order (icon) == cairo_dock_get_group_order (iType) || cairo_dock_get_icon_order (prev_icon) == cairo_dock_get_group_order (iType)) && prev_icon->iAnimationType != CAIRO_DOCK_FOLLOW_MOUSE)
1298
1339
                                {
1299
1340
                                        icon->iAnimationType = CAIRO_DOCK_AVOID_MOUSE;
1300
1341
                                        prev_icon->iAnimationType = CAIRO_DOCK_AVOID_MOUSE;
1301
1342
                                        //g_print ("%s> <%s\n", prev_icon->acName, icon->acName);
 
1343
                                        bCanDrop = TRUE;
1302
1344
                                }
1303
1345
                        }
1304
 
                        else if (pDock->iMouseX > icon->fDrawX + icon->fWidth * icon->fScale * (1 - fMargin))  // on est a droite.
 
1346
                        else if (pDock->iMouseX > icon->fDrawXAtRest + icon->fWidth * icon->fScale * (1 - fMargin))  // on est a droite.
1305
1347
                        {
1306
1348
                                Icon *next_icon = cairo_dock_get_next_element (ic, pDock->icons) -> data;
1307
1349
                                if ((icon->iType == iType || next_icon->iType == iType) && next_icon->iAnimationType != CAIRO_DOCK_FOLLOW_MOUSE)
1309
1351
                                        icon->iAnimationType = CAIRO_DOCK_AVOID_MOUSE;
1310
1352
                                        next_icon->iAnimationType = CAIRO_DOCK_AVOID_MOUSE;
1311
1353
                                        //g_print ("%s> <%s\n", icon->acName, next_icon->acName);
 
1354
                                        bCanDrop = TRUE;
1312
1355
                                }
1313
1356
                                ic = cairo_dock_get_next_element (ic, pDock->icons);  // on la saute.
1314
1357
                                if (ic == pFirstDrawnElement)
1315
1358
                                        break ;
1316
1359
                        }
 
1360
                        else  // on est dessus.
 
1361
                        {
 
1362
                                //g_print ("on est sur %s\n", icon->acName);
 
1363
                        }
1317
1364
                }
1318
1365
                else if (icon->iAnimationType == CAIRO_DOCK_AVOID_MOUSE)
1319
1366
                        icon->iAnimationType = 0;
1320
1367
 
1321
1368
                ic = cairo_dock_get_next_element (ic, pDock->icons);
1322
1369
        } while (ic != pFirstDrawnElement);
 
1370
        
 
1371
        if (bCanDrop)
 
1372
        {
 
1373
                if (pDock->bIsDragging && pDock->iSidDropIndicator == 0)
 
1374
                        pDock->iSidDropIndicator = g_timeout_add (40, (GSourceFunc) cairo_dock_display_drop_indicator, pDock);
 
1375
        }
 
1376
        else
 
1377
        {
 
1378
                if (pDock->iSidDropIndicator != 0)
 
1379
                {
 
1380
                        g_source_remove (pDock->iSidDropIndicator);
 
1381
                        pDock->iSidDropIndicator = 0;
 
1382
                        pDock->iDropIndicatorOffset = 0;
 
1383
                }
 
1384
        }
1323
1385
}
1324
1386
void cairo_dock_mark_avoiding_mouse_icons_linear (CairoDock *pDock)
1325
1387
{
1363
1425
                g_key_file_load_from_file (pKeyFile, cDesktopFilePath, G_KEY_FILE_KEEP_COMMENTS | G_KEY_FILE_KEEP_TRANSLATIONS, &erreur);
1364
1426
                if (erreur != NULL)
1365
1427
                {
1366
 
                        cd_warning ("Attention : %s", erreur->message);
 
1428
                        cd_warning ("%s", erreur->message);
1367
1429
                        g_error_free (erreur);
1368
1430
                        g_free (cDesktopFilePath);
1369
1431
                        return ;
1379
1441
        {
1380
1442
                GError *erreur = NULL;
1381
1443
                GKeyFile *pKeyFile = g_key_file_new ();
1382
 
                g_key_file_load_from_file (pKeyFile, icon->pModule->cConfFilePath, G_KEY_FILE_KEEP_COMMENTS | G_KEY_FILE_KEEP_TRANSLATIONS, &erreur);
 
1444
                g_key_file_load_from_file (pKeyFile, icon->pModuleInstance->cConfFilePath, G_KEY_FILE_KEEP_COMMENTS | G_KEY_FILE_KEEP_TRANSLATIONS, &erreur);
1383
1445
                if (erreur != NULL)
1384
1446
                {
1385
 
                        cd_warning ("Attention : %s", erreur->message);
 
1447
                        cd_warning ("%s", erreur->message);
1386
1448
                        g_error_free (erreur);
1387
1449
                        return ;
1388
1450
                }
1389
1451
                g_key_file_set_string (pKeyFile, "Icon", "dock name", cNewParentDockName);
1390
 
                cairo_dock_write_keys_to_file (pKeyFile, icon->pModule->cConfFilePath);
 
1452
                cairo_dock_write_keys_to_file (pKeyFile, icon->pModuleInstance->cConfFilePath);
1391
1453
                g_key_file_free (pKeyFile);
1392
1454
        }
1393
1455
}