2
* This file is a part of the Cairo-Dock project
4
* Copyright : (C) see the 'copyright' file.
5
* E-mail : see the 'copyright' file.
7
* This program is free software; you can redistribute it and/or
8
* modify it under the terms of the GNU General Public License
9
* as published by the Free Software Foundation; either version 3
10
* of the License, or (at your option) any later version.
12
* This program is distributed in the hope that it will be useful,
13
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
* GNU General Public License for more details.
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/>.
26
#include <glib/gstdio.h>
32
#include <glitz-glx.h>
33
#include <cairo-glitz.h>
36
#include "cairo-dock-draw.h"
37
#include "cairo-dock-draw-opengl.h"
38
#include "cairo-dock-animations.h"
39
#include "cairo-dock-config.h"
40
#include "cairo-dock-modules.h"
41
#include "cairo-dock-callbacks.h"
42
#include "cairo-dock-dock-factory.h"
43
#include "cairo-dock-dock-facility.h"
44
#include "cairo-dock-dialog-manager.h"
45
#include "cairo-dock-applications-manager.h"
46
#include "cairo-dock-application-facility.h"
47
#include "cairo-dock-separator-factory.h"
48
#include "cairo-dock-log.h"
49
#include "cairo-dock-dock-manager.h"
50
#include "cairo-dock-file-manager.h"
51
#include "cairo-dock-class-manager.h"
52
#include "cairo-dock-internal-icons.h"
53
#include "cairo-dock-internal-labels.h"
54
#include "cairo-dock-internal-background.h"
55
#include "cairo-dock-internal-indicators.h"
56
#include "cairo-dock-notifications.h"
57
#include "cairo-dock-load.h"
58
#include "cairo-dock-container.h"
59
#include "cairo-dock-emblem.h"
60
#include "cairo-dock-desktop-file-factory.h"
61
#include "cairo-dock-gui-manager.h"
62
#include "cairo-dock-X-manager.h"
63
#include "cairo-dock-icons.h"
65
int g_iNbNonStickyLaunchers = 0;
67
extern CairoDockDesktopGeometry g_desktopGeometry;
68
extern gchar *g_cCurrentLaunchersPath;
69
extern gboolean g_bUseOpenGL;
71
static GList *s_DetachedLaunchersList = NULL;
74
static void _cairo_dock_free_icon_buffers (Icon *icon)
79
g_free (icon->cDesktopFileName);
80
g_free (icon->cFileName);
82
g_free (icon->cInitialName);
83
g_free (icon->cCommand);
84
g_free (icon->cWorkingDirectory);
85
g_free (icon->cBaseURI);
86
g_free (icon->cParentDockName); // on ne liberera pas le sous-dock ici sous peine de se mordre la queue, donc il faut l'avoir fait avant.
87
g_free (icon->cClass);
88
g_free (icon->cQuickInfo);
89
g_free (icon->cLastAttentionDemand);
91
cairo_surface_destroy (icon->pIconBuffer);
92
cairo_surface_destroy (icon->pReflectionBuffer);
93
cairo_surface_destroy (icon->pTextBuffer);
94
cairo_surface_destroy (icon->pQuickInfoBuffer);
96
if (icon->iIconTexture != 0)
97
_cairo_dock_delete_texture (icon->iIconTexture);
98
if (icon->iLabelTexture != 0)
99
_cairo_dock_delete_texture (icon->iLabelTexture);
100
if (icon->iQuickInfoTexture != 0)
101
_cairo_dock_delete_texture (icon->iQuickInfoTexture);
103
void cairo_dock_free_icon (Icon *icon)
107
cd_debug ("%s (%s , %s)", __func__, icon->cName, icon->cClass);
109
cairo_dock_remove_dialog_if_any (icon);
110
if (icon->iSidRedrawSubdockContent != 0)
111
g_source_remove (icon->iSidRedrawSubdockContent);
112
if (icon->iSidLoadImage != 0)
113
g_source_remove (icon->iSidLoadImage);
114
if (icon->cBaseURI != NULL)
115
cairo_dock_fm_remove_monitor_full (icon->cBaseURI, (icon->pSubDock != NULL), (icon->iVolumeID != 0 ? icon->cCommand : NULL));
116
if (CAIRO_DOCK_IS_NORMAL_APPLI (icon))
117
cairo_dock_unregister_appli (icon);
118
else if (icon->cClass != NULL) // c'est un inhibiteur.
119
cairo_dock_deinhibate_class (icon->cClass, icon);
120
if (icon->pModuleInstance != NULL)
121
cairo_dock_deinstanciate_module (icon->pModuleInstance);
122
cairo_dock_notify (CAIRO_DOCK_STOP_ICON, icon);
123
cairo_dock_remove_transition_on_icon (icon);
125
if (icon->iSpecificDesktop != 0)
127
g_iNbNonStickyLaunchers --;
128
s_DetachedLaunchersList = g_list_remove(s_DetachedLaunchersList, icon);
131
cairo_dock_free_notification_table (icon->pNotificationsTab);
132
_cairo_dock_free_icon_buffers (icon);
133
cd_debug ("icon freeed");
137
CairoDockIconType cairo_dock_get_icon_type (Icon *icon)
140
if (CAIRO_DOCK_ICON_TYPE_IS_SEPARATOR (icon))
141
iType = CAIRO_DOCK_SEPARATOR12;
143
iType = (icon->iType < CAIRO_DOCK_NB_TYPES ? icon->iType : icon->iType & 1);
146
/**if (CAIRO_DOCK_IS_APPLI (icon))
147
return CAIRO_DOCK_APPLI;
148
else if (CAIRO_DOCK_IS_APPLET (icon))
149
return CAIRO_DOCK_APPLET;
150
else if (CAIRO_DOCK_IS_SEPARATOR (icon))
151
return CAIRO_DOCK_SEPARATOR12;
153
return CAIRO_DOCK_LAUNCHER;*/
157
int cairo_dock_compare_icons_order (Icon *icon1, Icon *icon2)
159
int iOrder1 = cairo_dock_get_icon_order (icon1);
160
int iOrder2 = cairo_dock_get_icon_order (icon2);
161
if (iOrder1 < iOrder2)
163
else if (iOrder1 > iOrder2)
167
if (icon1->fOrder < icon2->fOrder)
169
else if (icon1->fOrder > icon2->fOrder)
175
int cairo_dock_compare_icons_name (Icon *icon1, Icon *icon2)
177
int iOrder1 = cairo_dock_get_icon_order (icon1);
178
int iOrder2 = cairo_dock_get_icon_order (icon2);
179
if (iOrder1 < iOrder2)
181
else if (iOrder1 > iOrder2)
184
if (icon1->cName == NULL)
186
if (icon2->cName == NULL)
188
gchar *cURI_1 = g_ascii_strdown (icon1->cName, -1);
189
gchar *cURI_2 = g_ascii_strdown (icon2->cName, -1);
190
int iOrder = strcmp (cURI_1, cURI_2);
196
int cairo_dock_compare_icons_extension (Icon *icon1, Icon *icon2)
198
int iOrder1 = cairo_dock_get_icon_order (icon1);
199
int iOrder2 = cairo_dock_get_icon_order (icon2);
200
if (iOrder1 < iOrder2)
202
else if (iOrder1 > iOrder2)
205
if (icon1->cBaseURI == NULL)
207
if (icon2->cBaseURI == NULL)
210
gchar *ext1 = strrchr (icon1->cBaseURI, '.');
211
gchar *ext2 = strrchr (icon2->cBaseURI, '.');
217
ext1 = g_ascii_strdown (ext1+1, -1);
218
ext2 = g_ascii_strdown (ext2+1, -1);
220
int iOrder = strcmp (ext1, ext2);
226
GList *cairo_dock_sort_icons_by_order (GList *pIconList)
228
return g_list_sort (pIconList, (GCompareFunc) cairo_dock_compare_icons_order);
231
GList *cairo_dock_sort_icons_by_name (GList *pIconList)
233
GList *pSortedIconList = g_list_sort (pIconList, (GCompareFunc) cairo_dock_compare_icons_name);
237
for (ic = pIconList; ic != NULL; ic = ic->next)
240
icon->fOrder = iOrder ++;
242
return pSortedIconList;
247
Icon* cairo_dock_get_first_icon (GList *pIconList)
249
GList *pListHead = g_list_first(pIconList);
250
return (pListHead != NULL ? pListHead->data : NULL);
253
Icon* cairo_dock_get_last_icon (GList *pIconList)
255
GList *pListTail = g_list_last(pIconList);
256
return (pListTail != NULL ? pListTail->data : NULL);
259
Icon *cairo_dock_get_first_drawn_icon (CairoDock *pDock)
261
if (pDock->pFirstDrawnElement != NULL)
262
return pDock->pFirstDrawnElement->data;
264
return cairo_dock_get_first_icon (pDock->icons);
267
Icon *cairo_dock_get_last_drawn_icon (CairoDock *pDock)
269
if (pDock->pFirstDrawnElement != NULL)
271
if (pDock->pFirstDrawnElement->prev != NULL)
272
return pDock->pFirstDrawnElement->prev->data;
274
return cairo_dock_get_last_icon (pDock->icons);
277
return cairo_dock_get_last_icon (pDock->icons);;
280
Icon* cairo_dock_get_first_icon_of_group (GList *pIconList, CairoDockIconType iType)
284
for (ic = pIconList; ic != NULL; ic = ic->next)
287
if (icon->iType == iType)
292
Icon* cairo_dock_get_last_icon_of_group (GList *pIconList, CairoDockIconType iType)
296
for (ic = g_list_last (pIconList); ic != NULL; ic = ic->prev)
299
if (icon->iType == iType)
304
Icon* cairo_dock_get_first_icon_of_order (GList *pIconList, CairoDockIconType iType)
306
CairoDockIconType iGroupOrder = cairo_dock_get_group_order (iType);
309
for (ic = pIconList; ic != NULL; ic = ic->next)
312
if (cairo_dock_get_icon_order (icon) == iGroupOrder)
317
Icon* cairo_dock_get_last_icon_of_order (GList *pIconList, CairoDockIconType iType)
319
CairoDockIconType iGroupOrder = cairo_dock_get_group_order (iType);
322
for (ic = g_list_last (pIconList); ic != NULL; ic = ic->prev)
325
if (cairo_dock_get_icon_order (icon) == iGroupOrder)
330
Icon* cairo_dock_get_last_icon_until_order (GList *pIconList, CairoDockIconType iType)
332
CairoDockIconType iGroupOrder = cairo_dock_get_group_order (iType);
335
for (ic = pIconList; ic != NULL; ic = ic->next)
338
if (cairo_dock_get_icon_order (icon) > iGroupOrder)
340
if (ic->prev != NULL)
341
icon = ic->prev->data;
350
Icon* cairo_dock_get_pointed_icon (GList *pIconList)
354
for (ic = pIconList; ic != NULL; ic = ic->next)
364
Icon *cairo_dock_get_next_icon (GList *pIconList, Icon *pIcon)
368
for (ic = pIconList; ic != NULL; ic = ic->next)
373
if (ic->next != NULL)
374
return ic->next->data;
382
Icon *cairo_dock_get_previous_icon (GList *pIconList, Icon *pIcon)
386
for (ic = pIconList; ic != NULL; ic = ic->next)
391
if (ic->prev != NULL)
392
return ic->prev->data;
400
Icon *cairo_dock_get_icon_with_command (GList *pIconList, const gchar *cCommand)
402
g_return_val_if_fail (cCommand != NULL, NULL);
405
for (ic = pIconList; ic != NULL; ic = ic->next)
408
if (icon->cCommand != NULL && strncmp (icon->cCommand, cCommand, MIN (strlen (icon->cCommand), strlen (cCommand))) == 0)
414
Icon *cairo_dock_get_icon_with_base_uri (GList *pIconList, const gchar *cBaseURI)
416
g_return_val_if_fail (cBaseURI != NULL, NULL);
419
for (ic = pIconList; ic != NULL; ic = ic->next)
422
//cd_message (" icon->cBaseURI : %s\n", icon->cBaseURI);
423
if (icon->cBaseURI != NULL && strcmp (icon->cBaseURI, cBaseURI) == 0)
429
Icon *cairo_dock_get_icon_with_name (GList *pIconList, const gchar *cName)
431
g_return_val_if_fail (cName != NULL, NULL);
434
for (ic = pIconList; ic != NULL; ic = ic->next)
437
//cd_message (" icon->cName : %s\n", icon->cName);
438
if (icon->cName != NULL && strcmp (icon->cName, cName) == 0)
444
Icon *cairo_dock_get_icon_with_subdock (GList *pIconList, CairoDock *pSubDock)
448
for (ic = pIconList; ic != NULL; ic = ic->next)
451
if (icon->pSubDock == pSubDock)
457
Icon *cairo_dock_get_icon_with_module (GList *pIconList, CairoDockModule *pModule)
461
for (ic = pIconList; ic != NULL; ic = ic->next)
464
if (icon->pModuleInstance->pModule == pModule)
470
void cairo_dock_get_icon_extent (Icon *pIcon, CairoContainer *pContainer, int *iWidth, int *iHeight)
472
/**double fMaxScale = cairo_dock_get_max_scale (pContainer);
473
double fRatio = (CAIRO_DOCK_IS_DOCK (pContainer) ? pContainer->fRatio : 1.); // on ne tient pas compte de l'effet de zoom initial du desklet.
474
if (!pContainer || pContainer->bIsHorizontal)
476
*iWidth = (int) (pIcon->fWidth / fRatio * fMaxScale);
477
*iHeight = (int) (pIcon->fHeight / fRatio * fMaxScale);
481
*iHeight = (int) (pIcon->fWidth / fRatio * fMaxScale);
482
*iWidth = (int) (pIcon->fHeight / fRatio * fMaxScale);
484
*iWidth = pIcon->iImageWidth;
485
*iHeight = pIcon->iImageHeight;
488
void cairo_dock_get_current_icon_size (Icon *pIcon, CairoContainer *pContainer, double *fSizeX, double *fSizeY)
490
if (pContainer->bIsHorizontal)
492
if (myIcons.bConstantSeparatorSize && CAIRO_DOCK_IS_SEPARATOR (pIcon))
494
*fSizeX = pIcon->fWidth;
495
*fSizeY = pIcon->fHeight;
499
*fSizeX = pIcon->fWidth * pIcon->fWidthFactor * pIcon->fScale * pIcon->fGlideScale;
500
*fSizeY = pIcon->fHeight * pIcon->fHeightFactor * pIcon->fScale * pIcon->fGlideScale;
505
if (myIcons.bConstantSeparatorSize && CAIRO_DOCK_IS_SEPARATOR (pIcon))
507
*fSizeX = pIcon->fHeight;
508
*fSizeY = pIcon->fWidth;
512
*fSizeX = pIcon->fHeight * pIcon->fHeightFactor * pIcon->fScale * pIcon->fGlideScale;
513
*fSizeY = pIcon->fWidth * pIcon->fWidthFactor * pIcon->fScale * pIcon->fGlideScale;
518
void cairo_dock_compute_icon_area (Icon *icon, CairoContainer *pContainer, GdkRectangle *pArea)
520
double fReflectSize = 0;
521
if (pContainer->bUseReflect)
523
fReflectSize = myIcons.fReflectSize * icon->fScale * fabs (icon->fHeightFactor) + icon->fDeltaYReflection + myBackground.iFrameMargin; // un peu moyen le iFrameMargin mais bon ...
525
if (! myIndicators.bIndicatorOnIcon)
526
fReflectSize = MAX (fReflectSize, myIndicators.fIndicatorDeltaY * icon->fHeight);
528
double fX = icon->fDrawX;
529
fX += icon->fWidth * icon->fScale * (1 - fabs (icon->fWidthFactor))/2 + icon->fGlideOffset * icon->fWidth * icon->fScale;
531
double fY = icon->fDrawY;
532
fY += (pContainer->bDirectionUp ? icon->fHeight * icon->fScale * (1 - icon->fHeightFactor)/2 : - fReflectSize);
536
if (pContainer->bIsHorizontal)
538
pArea->x = (int) floor (fX) - 1;
539
pArea->y = (int) floor (fY);
540
pArea->width = (int) ceil (icon->fWidth * icon->fScale * fabs (icon->fWidthFactor)) + 2;
541
pArea->height = (int) ceil (icon->fHeight * icon->fScale * fabs (icon->fHeightFactor) + fReflectSize);
545
pArea->x = (int) floor (fY);
546
pArea->y = (int) floor (fX) - 1;
547
pArea->width = ((int) ceil (icon->fHeight * icon->fScale * fabs (icon->fHeightFactor) + fReflectSize));
548
pArea->height = (int) ceil (icon->fWidth * icon->fScale * fabs (icon->fWidthFactor)) + 2;
550
//g_print ("redraw : %d;%d %dx%d\n", pArea->x, pArea->y, pArea->width,pArea->height);
555
void cairo_dock_normalize_icons_order (GList *pIconList, CairoDockIconType iType)
557
cd_message ("%s (%d)", __func__, iType);
559
CairoDockIconType iGroupOrder = cairo_dock_get_group_order (iType);
560
GString *sDesktopFilePath = g_string_new ("");
563
for (ic = pIconList; ic != NULL; ic = ic->next)
566
if (cairo_dock_get_icon_order (icon) != iGroupOrder)
569
icon->fOrder = iOrder ++;
570
if (icon->cDesktopFileName != NULL)
572
g_string_printf (sDesktopFilePath, "%s/%s", g_cCurrentLaunchersPath, icon->cDesktopFileName);
573
cairo_dock_update_conf_file (sDesktopFilePath->str,
574
G_TYPE_DOUBLE, "Desktop Entry", "Order", icon->fOrder,
577
else if (CAIRO_DOCK_IS_APPLET (icon))
579
cairo_dock_update_conf_file (icon->pModuleInstance->cConfFilePath,
580
G_TYPE_DOUBLE, "Icon", "order", icon->fOrder,
584
g_string_free (sDesktopFilePath, TRUE);
585
cairo_dock_trigger_refresh_launcher_gui ();
588
void cairo_dock_move_icon_after_icon (CairoDock *pDock, Icon *icon1, Icon *icon2)
590
//g_print ("%s (%s, %.2f, %x)\n", __func__, icon1->cName, icon1->fOrder, icon2);
591
if ((icon2 != NULL) && fabs (cairo_dock_get_icon_order (icon1) - cairo_dock_get_icon_order (icon2)) > 1)
593
//\_________________ On change l'ordre de l'icone.
594
gboolean bForceUpdate = FALSE;
597
Icon *pNextIcon = cairo_dock_get_next_icon (pDock->icons, icon2);
598
if (pNextIcon != NULL && fabs (pNextIcon->fOrder - icon2->fOrder) < 1e-2)
602
if (pNextIcon == NULL || cairo_dock_get_icon_order (pNextIcon) != cairo_dock_get_icon_order (icon2))
603
icon1->fOrder = icon2->fOrder + 1;
605
icon1->fOrder = (pNextIcon->fOrder - icon2->fOrder > 1 ? icon2->fOrder + 1 : (pNextIcon->fOrder + icon2->fOrder) / 2);
609
Icon *pFirstIcon = cairo_dock_get_first_icon_of_order (pDock->icons, icon1->iType);
610
if (pFirstIcon != NULL)
611
icon1->fOrder = pFirstIcon->fOrder - 1;
615
//g_print ("icon1->fOrder:%.2f\n", icon1->fOrder);
617
//\_________________ On change l'ordre dans le fichier du lanceur 1.
618
cairo_dock_write_order_in_conf_file (icon1, icon1->fOrder);
620
//\_________________ On change sa place dans la liste.
621
pDock->pFirstDrawnElement = NULL;
622
pDock->icons = g_list_remove (pDock->icons, icon1);
623
pDock->icons = g_list_insert_sorted (pDock->icons,
625
(GCompareFunc) cairo_dock_compare_icons_order);
627
//\_________________ On recalcule la largeur max, qui peut avoir ete influencee par le changement d'ordre.
628
cairo_dock_update_dock_size (pDock);
630
if (icon1->pSubDock != NULL && icon1->cClass != NULL)
632
cairo_dock_trigger_set_WM_icons_geometry (icon1->pSubDock);
635
if (pDock->iRefCount != 0)
637
cairo_dock_redraw_subdock_content (pDock);
641
cairo_dock_normalize_icons_order (pDock->icons, icon1->iType);
642
if (CAIRO_DOCK_IS_STORED_LAUNCHER (icon1) || CAIRO_DOCK_IS_USER_SEPARATOR (icon1) || CAIRO_DOCK_ICON_TYPE_IS_APPLET (icon1))
643
cairo_dock_trigger_refresh_launcher_gui ();
647
Icon *cairo_dock_foreach_icons_of_type (GList *pIconList, CairoDockIconType iType, CairoDockForeachIconFunc pFuntion, gpointer data)
649
//g_print ("%s (%d)\n", __func__, iType);
650
if (pIconList == NULL)
654
GList *ic = pIconList, *next_ic;
655
gboolean bOneIconFound = FALSE;
656
Icon *pSeparatorIcon = NULL;
657
while (ic != NULL) // on parcourt tout, inutile de complexifier la chose pour gagner 3ns.
661
if (icon->iType == iType)
663
bOneIconFound = TRUE;
664
pFuntion (icon, NULL, data);
668
if (CAIRO_DOCK_IS_AUTOMATIC_SEPARATOR (icon))
670
if ( (bOneIconFound && pSeparatorIcon == NULL) || (! bOneIconFound) )
671
pSeparatorIcon = icon;
678
return pSeparatorIcon;
685
void cairo_dock_update_icon_s_container_name (Icon *icon, const gchar *cNewParentDockName)
687
g_free (icon->cParentDockName);
688
icon->cParentDockName = g_strdup (cNewParentDockName);
690
cairo_dock_write_container_name_in_conf_file (icon, cNewParentDockName);
694
void cairo_dock_set_icon_name (const gchar *cIconName, Icon *pIcon, CairoContainer *pContainer) // fonction proposee par Necropotame.
696
g_return_if_fail (pIcon != NULL && pContainer != NULL); // le contexte sera verifie plus loin.
697
gchar *cUniqueName = NULL;
699
if (pIcon->pSubDock != NULL)
701
cUniqueName = cairo_dock_get_unique_dock_name (cIconName);
702
cIconName = cUniqueName;
703
cairo_dock_rename_dock (pIcon->cName, pIcon->pSubDock, cUniqueName);
705
if (pIcon->cName != cIconName)
707
g_free (pIcon->cName);
708
pIcon->cName = g_strdup (cIconName);
711
g_free (cUniqueName);
713
cairo_dock_load_icon_text (pIcon, &myLabels.iconTextDescription);
716
void cairo_dock_set_icon_name_printf (Icon *pIcon, CairoContainer *pContainer, const gchar *cIconNameFormat, ...)
719
va_start (args, cIconNameFormat);
720
gchar *cFullText = g_strdup_vprintf (cIconNameFormat, args);
721
cairo_dock_set_icon_name (cFullText, pIcon, pContainer);
726
void cairo_dock_set_quick_info (Icon *pIcon, CairoContainer *pContainer, const gchar *cQuickInfo)
728
g_return_if_fail (pIcon != NULL); // le contexte sera verifie plus loin.
730
if (pIcon->cQuickInfo != cQuickInfo)
732
g_free (pIcon->cQuickInfo);
733
pIcon->cQuickInfo = g_strdup (cQuickInfo);
736
double fMaxScale = cairo_dock_get_max_scale (pContainer);
737
cairo_dock_load_icon_quickinfo (pIcon,
738
&myLabels.quickInfoTextDescription,
742
void cairo_dock_set_quick_info_printf (Icon *pIcon, CairoContainer *pContainer, const gchar *cQuickInfoFormat, ...)
745
va_start (args, cQuickInfoFormat);
746
gchar *cFullText = g_strdup_vprintf (cQuickInfoFormat, args);
747
cairo_dock_set_quick_info (pIcon, pContainer, cFullText);
754
static CairoDock *_cairo_dock_insert_launcher_in_dock (Icon *icon, CairoDock *pMainDock, gboolean bUpdateSize, gboolean bAnimate)
756
cd_message ("%s (%s)", __func__, icon->cName);
757
g_return_val_if_fail (pMainDock != NULL, NULL);
759
cairo_dock_reserve_one_icon_geometry_for_window_manager (&icon->Xid, icon, pMainDock);
761
//\_________________ On determine dans quel dock l'inserer.
762
CairoDock *pParentDock = pMainDock;
763
g_return_val_if_fail (pParentDock != NULL, NULL);
765
//\_________________ On l'insere dans son dock parent en animant ce dernier eventuellement.
766
cairo_dock_insert_icon_in_dock (icon, pParentDock, bUpdateSize, bAnimate);
767
cd_message (" insertion de %s complete (%.2f %.2fx%.2f) dans %s", icon->cName, icon->fInsertRemoveFactor, icon->fWidth, icon->fHeight, icon->cParentDockName);
769
if (bAnimate && cairo_dock_animation_will_be_visible (pParentDock))
771
cairo_dock_launch_animation (CAIRO_CONTAINER (pParentDock));
775
icon->fInsertRemoveFactor = 0;
781
static CairoDock * _cairo_dock_detach_launcher(Icon *pIcon)
783
cd_debug ("%s (%s, parent dock=%s)", __func__, pIcon->cName, pIcon->cParentDockName);
784
CairoDock *pParentDock = cairo_dock_search_dock_from_name (pIcon->cParentDockName);
785
if (pParentDock == NULL)
788
gchar *cParentDockName = g_strdup(pIcon->cParentDockName);
789
cairo_dock_detach_icon_from_dock (pIcon, pParentDock, TRUE); // this will set cParentDockName to NULL
791
pIcon->cParentDockName = cParentDockName; // put it back !
793
cairo_dock_update_dock_size (pParentDock);
796
static void _cairo_dock_hide_show_launchers_on_other_desktops (Icon *icon, CairoContainer *pContainer, CairoDock *pMainDock)
798
if (CAIRO_DOCK_IS_LAUNCHER(icon))
800
cd_debug ("%s (%s, iNumViewport=%d)", __func__, icon->cName, icon->iSpecificDesktop);
801
CairoDock *pParentDock = NULL;
802
// a specific desktop/viewport has been selected for this icon
804
int iCurrentDesktop = 0, iCurrentViewportX = 0, iCurrentViewportY = 0;
805
cairo_dock_get_current_desktop_and_viewport (&iCurrentDesktop, &iCurrentViewportX, &iCurrentViewportY);
806
int index = iCurrentDesktop * g_desktopGeometry.iNbViewportX * g_desktopGeometry.iNbViewportY + iCurrentViewportX * g_desktopGeometry.iNbViewportY + iCurrentViewportY + 1; // +1 car on commence a compter a partir de 1.
808
if (icon->iSpecificDesktop == 0 || icon->iSpecificDesktop == index || icon->iSpecificDesktop > g_desktopGeometry.iNbDesktops * g_desktopGeometry.iNbViewportX * g_desktopGeometry.iNbViewportY)
809
/**if( icon->iSpecificDesktop <= 0 ||
810
// metacity case: metacity uses desktop instead of viewport.
811
(g_desktopGeometry.iNbViewportX*g_desktopGeometry.iNbViewportY==1 &&
812
(icon->iSpecificDesktop-1 == iCurrentDesktop ||
813
icon->iSpecificDesktop >= g_desktopGeometry.iNbDesktops)) ||
814
// compiz case: viewports are used within a desktop
815
(g_desktopGeometry.iNbViewportX*g_desktopGeometry.iNbViewportY>1 &&
816
(icon->iSpecificDesktop-1 == iCurrentViewportX + g_desktopGeometry.iNbViewportX*iCurrentViewportY ||
817
icon->iSpecificDesktop >= g_desktopGeometry.iNbViewportX*g_desktopGeometry.iNbViewportY)) )*/
819
cd_debug (" => est visible sur ce viewport (iSpecificDesktop = %d).",icon->iSpecificDesktop);
820
// check that it is in the detached list
821
if( g_list_find(s_DetachedLaunchersList, icon) != NULL )
823
pParentDock = _cairo_dock_insert_launcher_in_dock (icon, pMainDock, CAIRO_DOCK_UPDATE_DOCK_SIZE, ! CAIRO_DOCK_ANIMATE_ICON);
824
s_DetachedLaunchersList = g_list_remove(s_DetachedLaunchersList, icon);
829
cd_debug (" Viewport actuel = %d => n'est pas sur le viewport actuel.", iCurrentViewportX + g_desktopGeometry.iNbViewportX*iCurrentViewportY);
830
if( g_list_find(s_DetachedLaunchersList, icon) == NULL ) // only if not yet detached
832
cd_debug( "Detach launcher %s", icon->cName);
833
pParentDock = _cairo_dock_detach_launcher(icon);
834
s_DetachedLaunchersList = g_list_prepend(s_DetachedLaunchersList, icon);
837
if (pParentDock != NULL)
838
gtk_widget_queue_draw (pParentDock->container.pWidget);
842
void cairo_dock_hide_show_launchers_on_other_desktops (CairoDock *pDock)
844
if (g_iNbNonStickyLaunchers <= 0)
846
// first we detach what shouldn't be show on this viewport
847
cairo_dock_foreach_icons_of_type (pDock->icons, CAIRO_DOCK_LAUNCHER, (CairoDockForeachIconFunc)_cairo_dock_hide_show_launchers_on_other_desktops, pDock);
848
// then we reattach what was eventually missing
849
cairo_dock_foreach_icons_of_type (s_DetachedLaunchersList, CAIRO_DOCK_LAUNCHER, (CairoDockForeachIconFunc)_cairo_dock_hide_show_launchers_on_other_desktops, pDock);