47
47
#include "cairo-dock-draw.h"
48
48
#include "cairo-dock-applications-manager.h"
49
#include "cairo-dock-load.h"
49
#include "cairo-dock-image-buffer.h"
50
50
#include "cairo-dock-config.h"
51
#include "cairo-dock-modules.h"
51
#include "cairo-dock-module-factory.h"
52
52
#include "cairo-dock-callbacks.h"
53
#include "cairo-dock-icons.h"
53
#include "cairo-dock-icon-factory.h"
54
#include "cairo-dock-icon-facility.h"
54
55
#include "cairo-dock-separator-manager.h"
55
56
#include "cairo-dock-launcher-manager.h"
56
#include "cairo-dock-backends-manager.h"
57
#include "cairo-dock-backends-manager.h" // myBackendsParam.fSubDockSizeRatio
57
58
#include "cairo-dock-X-utilities.h"
58
59
#include "cairo-dock-log.h"
59
60
#include "cairo-dock-keyfile-utilities.h"
60
61
#include "cairo-dock-dock-manager.h"
61
62
#include "cairo-dock-notifications.h"
62
63
#include "cairo-dock-class-manager.h"
63
#include "cairo-dock-internal-accessibility.h"
64
#include "cairo-dock-internal-system.h"
65
#include "cairo-dock-internal-views.h"
66
#include "cairo-dock-internal-icons.h"
67
64
#include "cairo-dock-animations.h"
68
65
#include "cairo-dock-container.h"
69
66
#include "cairo-dock-desktop-file-factory.h"
90
85
static void _cairo_dock_set_icon_size (CairoDock *pDock, Icon *icon)
92
CairoDockIconType iType = cairo_dock_get_icon_type (icon);
87
CairoDockIconGroup iType = cairo_dock_get_icon_type (icon);
93
88
if (CAIRO_DOCK_ICON_TYPE_IS_APPLET (icon)) // une applet peut definir la taille de son icone elle-meme.
95
90
if (icon->fWidth == 0)
96
icon->fWidth = myIcons.tIconAuthorizedWidth[iType];
91
icon->fWidth = myIconsParam.tIconAuthorizedWidth[iType];
97
92
if (icon->fHeight == 0)
98
icon->fHeight = myIcons.tIconAuthorizedHeight[iType];
93
icon->fHeight = myIconsParam.tIconAuthorizedHeight[iType];
102
icon->fWidth = myIcons.tIconAuthorizedWidth[iType];
103
icon->fHeight = myIcons.tIconAuthorizedHeight[iType];
97
icon->fWidth = myIconsParam.tIconAuthorizedWidth[iType];
98
icon->fHeight = myIconsParam.tIconAuthorizedHeight[iType];
113
108
pDock->iRefCount = 0; // c'est un dock racine par defaut.
114
109
pDock->container.fRatio = 1.;
115
110
pDock->iAvoidingMouseIconType = -1;
116
pDock->fFlatDockWidth = - myIcons.iIconGap;
111
pDock->fFlatDockWidth = - myIconsParam.iIconGap;
117
112
pDock->container.iMouseX = -1; // utile ?
118
113
pDock->container.iMouseY = -1;
119
114
pDock->fMagnitudeMax = 1.;
125
120
//\__________________ On cree la fenetre GTK.
126
121
GtkWidget *pWindow = cairo_dock_init_container (CAIRO_CONTAINER (pDock));
127
gtk_container_set_border_width (GTK_CONTAINER(pWindow), 0);
122
cairo_dock_install_notifications_on_object (pDock, NB_NOTIFICATIONS_DOCKS);
123
gtk_container_set_border_width (GTK_CONTAINER (pWindow), 0);
128
124
gtk_window_set_gravity (GTK_WINDOW (pWindow), GDK_GRAVITY_STATIC);
129
125
gtk_window_set_type_hint (GTK_WINDOW (pWindow), GDK_WINDOW_TYPE_HINT_DOCK);
130
126
gtk_window_set_title (GTK_WINDOW (pWindow), "cairo-dock");
259
255
g_source_remove (pDock->iSidDestroyEmptyDock);
260
256
if (pDock->iSidTestMouseOutside != 0)
261
257
g_source_remove (pDock->iSidTestMouseOutside);
262
cairo_dock_notify (CAIRO_DOCK_STOP_DOCK, pDock);
258
cairo_dock_notify_on_object (&myDocksMgr, NOTIFICATION_STOP_DOCK, pDock);
259
cairo_dock_notify_on_object (pDock, NOTIFICATION_STOP_DOCK, pDock);
264
261
g_list_foreach (pDock->icons, (GFunc) cairo_dock_free_icon, NULL);
265
262
g_list_free (pDock->icons);
306
303
pDock->bAutoHide = FALSE;
307
304
double fPrevRatio = pDock->container.fRatio;
308
pDock->container.fRatio = MIN (pDock->container.fRatio, myViews.fSubDockSizeRatio);
305
pDock->container.fRatio = MIN (pDock->container.fRatio, myBackendsParam.fSubDockSizeRatio);
312
pDock->fFlatDockWidth = - myIcons.iIconGap;
309
pDock->fFlatDockWidth = - myIconsParam.iIconGap;
313
310
for (ic = pDock->icons; ic != NULL; ic = ic->next)
316
313
icon->fWidth *= pDock->container.fRatio / fPrevRatio;
317
314
icon->fHeight *= pDock->container.fRatio / fPrevRatio;
318
pDock->fFlatDockWidth += icon->fWidth + myIcons.iIconGap;
315
pDock->fFlatDockWidth += icon->fWidth + myIconsParam.iIconGap;
320
317
pDock->iMaxIconHeight *= pDock->container.fRatio / fPrevRatio;
349
346
gboolean bSeparatorNeeded = FALSE;
350
347
if (bInsertSeparator && ! CAIRO_DOCK_ICON_TYPE_IS_SEPARATOR (icon))
352
Icon *pSameTypeIcon = cairo_dock_get_first_icon_of_order (pDock->icons, icon->iType);
349
Icon *pSameTypeIcon = cairo_dock_get_first_icon_of_order (pDock->icons, icon->iGroup);
353
350
if (pSameTypeIcon == NULL && pDock->icons != NULL)
355
352
bSeparatorNeeded = TRUE;
360
357
//\______________ On insere l'icone a sa place dans la liste.
361
358
if (icon->fOrder == CAIRO_DOCK_LAST_ORDER)
363
Icon *pLastIcon = cairo_dock_get_last_icon_of_order (pDock->icons, icon->iType);
360
Icon *pLastIcon = cairo_dock_get_last_icon_of_order (pDock->icons, icon->iGroup);
364
361
if (pLastIcon != NULL)
365
362
icon->fOrder = pLastIcon->fOrder + 1;
382
379
icon->fWidth *= pDock->container.fRatio;
383
380
icon->fHeight *= pDock->container.fRatio;
385
pDock->fFlatDockWidth += myIcons.iIconGap + icon->fWidth;
382
pDock->fFlatDockWidth += myIconsParam.iIconGap + icon->fWidth;
386
383
if (! CAIRO_DOCK_ICON_TYPE_IS_SEPARATOR (icon))
387
384
pDock->iMaxIconHeight = MAX (pDock->iMaxIconHeight, icon->fHeight);
390
387
if (bSeparatorNeeded)
392
389
int iOrder = cairo_dock_get_icon_order (icon);
393
if (iOrder + 1 < CAIRO_DOCK_NB_TYPES)
390
if (iOrder + 1 < CAIRO_DOCK_NB_GROUPS)
395
392
Icon *pNextIcon = cairo_dock_get_next_icon (pDock->icons, icon);
396
393
if (pNextIcon != NULL && ((cairo_dock_get_icon_order (pNextIcon) - cairo_dock_get_icon_order (icon)) % 2 == 0) && (cairo_dock_get_icon_order (pNextIcon) != cairo_dock_get_icon_order (icon)))
419
416
icon->fInsertRemoveFactor = - 0.95;
421
418
icon->fInsertRemoveFactor = - 0.05;
422
cairo_dock_notify (CAIRO_DOCK_INSERT_ICON, icon, pDock);
421
icon->fInsertRemoveFactor = 0.;
425
423
cairo_dock_update_dock_size (pDock);
432
430
cairo_dock_trigger_redraw_subdock_content (pDock);
435
if (CAIRO_DOCK_IS_STORED_LAUNCHER (icon) || CAIRO_DOCK_IS_USER_SEPARATOR (icon) || CAIRO_DOCK_ICON_TYPE_IS_APPLET (icon))
436
cairo_dock_trigger_refresh_launcher_gui ();
433
//\______________ Notify everybody.
434
cairo_dock_notify_on_object (&myDocksMgr, NOTIFICATION_INSERT_ICON, icon, pDock);
435
cairo_dock_notify_on_object (pDock, NOTIFICATION_INSERT_ICON, icon, pDock);
447
446
pDock->iSidDestroyEmptyDock = 0;
448
447
if (pDock->icons == NULL && pDock->iRefCount == 0 && ! pDock->bIsMainDock) // le dock est toujours a detruire.
450
g_print ("The dock '%s' is empty. No icon, no dock.\n", cDockName);
449
cd_debug ("The dock '%s' is empty. No icon, no dock.", cDockName);
451
450
cairo_dock_destroy_dock (pDock, cDockName);
507
506
pDock->icons = g_list_delete_link (pDock->icons, ic);
509
pDock->fFlatDockWidth -= icon->fWidth + myIcons.iIconGap;
508
pDock->fFlatDockWidth -= icon->fWidth + myIconsParam.iIconGap;
511
510
//\___________________ On enleve le separateur si c'est la derniere icone de son type.
512
511
if (bCheckUnusedSeparator && ! CAIRO_DOCK_IS_AUTOMATIC_SEPARATOR (icon))
516
515
pDock->icons = g_list_delete_link (pDock->icons, next_ic);
518
pDock->fFlatDockWidth -= pNextIcon->fWidth + myIcons.iIconGap;
517
pDock->fFlatDockWidth -= pNextIcon->fWidth + myIconsParam.iIconGap;
519
518
cairo_dock_free_icon (pNextIcon);
520
519
pNextIcon = NULL;
524
523
pDock->icons = g_list_delete_link (pDock->icons, prev_ic);
526
pDock->fFlatDockWidth -= pPrevIcon->fWidth + myIcons.iIconGap;
525
pDock->fFlatDockWidth -= pPrevIcon->fWidth + myIconsParam.iIconGap;
527
526
cairo_dock_free_icon (pPrevIcon);
528
527
pPrevIcon = NULL;
563
562
pDock->iSidDestroyEmptyDock = g_idle_add ((GSourceFunc) _destroy_empty_dock, pDock); // on ne passe pas le nom du dock en parametre, car le dock peut se faire renommer (improbable, mais bon).
566
//\___________________ On prevoit le rafraichissement de la fenetre de config des lanceurs.
567
if (CAIRO_DOCK_IS_STORED_LAUNCHER (icon) || CAIRO_DOCK_IS_USER_SEPARATOR (icon) || CAIRO_DOCK_ICON_TYPE_IS_APPLET (icon))
568
cairo_dock_trigger_refresh_launcher_gui ();
565
//\___________________ Notify everybody.
566
icon->fInsertRemoveFactor = 0.;
567
cairo_dock_notify_on_object (&myDocksMgr, NOTIFICATION_REMOVE_ICON, icon, pDock);
568
cairo_dock_notify_on_object (pDock, NOTIFICATION_REMOVE_ICON, icon, pDock);
571
572
void cairo_dock_remove_icon_from_dock_full (CairoDock *pDock, Icon *icon, gboolean bCheckUnusedSeparator)
620
621
next_icon = ic->next->data;
621
622
if (! CAIRO_DOCK_IS_AUTOMATIC_SEPARATOR (next_icon) && abs (cairo_dock_get_icon_order (icon) - cairo_dock_get_icon_order (next_icon)) > 1) // icon->iType != next_icon->iType
623
int iSeparatorType = myIcons.tIconTypeOrder[next_icon->iType] - 1;
624
cd_debug ("+ un separateur entre %s et %s, dans le groupe %d (=%d)\n", icon->cName, next_icon->cName, iSeparatorType, myIcons.tIconTypeOrder[iSeparatorType]);
624
///int iSeparatorType = myIconsParam.tIconTypeOrder[next_icon->iGroup] - 1;
625
int iSeparatorType = cairo_dock_get_icon_order (next_icon) - 1;
626
cd_debug ("+ un separateur entre %s et %s, dans le groupe %d\n", icon->cName, next_icon->cName, iSeparatorType);
625
627
cairo_dock_insert_automatic_separator_in_dock (iSeparatorType, next_icon->cParentDockName, pDock);
633
Icon *cairo_dock_add_new_launcher_by_uri_or_type (const gchar *cExternDesktopFileURI, CairoDockDesktopFileType iType, CairoDock *pReceivingDock, double fOrder, CairoDockIconType iGroup)
635
Icon *cairo_dock_add_new_launcher_by_uri_or_type (const gchar *cExternDesktopFileURI, CairoDockDesktopFileType iType, CairoDock *pReceivingDock, double fOrder, CairoDockIconGroup iGroup)
635
637
//\_________________ On ajoute un fichier desktop dans le repertoire des lanceurs du theme courant.
636
638
gchar *cPath = NULL;
679
681
if (pNewIcon != NULL)
681
683
cairo_dock_insert_icon_in_dock (pNewIcon, pReceivingDock, CAIRO_DOCK_UPDATE_DOCK_SIZE, CAIRO_DOCK_ANIMATE_ICON);
683
/**if (CAIRO_DOCK_IS_URI_LAUNCHER (pNewIcon))
685
cairo_dock_fm_add_monitor (pNewIcon);
688
685
if (pNewIcon->pSubDock != NULL)
689
686
cairo_dock_trigger_redraw_subdock_content (pNewIcon->pSubDock);