36
36
#include "cairo-dock-icon-factory.h"
37
37
#include "cairo-dock-icon-facility.h"
38
38
#include "cairo-dock-applications-manager.h"
39
#include "cairo-dock-stack-icon-manager.h"
40
#include "cairo-dock-separator-manager.h"
41
#include "cairo-dock-class-icon-manager.h"
39
42
#include "cairo-dock-application-facility.h"
40
#include "cairo-dock-desktop-file-factory.h"
41
43
#include "cairo-dock-launcher-manager.h"
42
44
#include "cairo-dock-config.h"
43
45
#include "cairo-dock-container.h"
405
gboolean cairo_dock_on_leave_dock_notification (G_GNUC_UNUSED gpointer data, CairoDock *pDock, G_GNUC_UNUSED gboolean *bStartAnimation)
407
//g_print ("%s (%d, %d)\n", __func__, pDock->iRefCount, pDock->bHasModalWindow);
409
//\_______________ If a modal window is raised, we discard the 'leave-event' to stay in the up position.
410
if (pDock->bHasModalWindow)
411
return GLDI_NOTIFICATION_INTERCEPT;
413
//\_______________ On gere le drag d'une icone hors du dock.
414
if (s_pIconClicked != NULL
415
&& (CAIRO_DOCK_ICON_TYPE_IS_LAUNCHER (s_pIconClicked)
416
|| CAIRO_DOCK_ICON_TYPE_IS_CONTAINER (s_pIconClicked)
417
|| (CAIRO_DOCK_ICON_TYPE_IS_SEPARATOR (s_pIconClicked) && s_pIconClicked->cDesktopFileName && pDock->iMaxDockHeight > 30) // if the dock is narrow (like a panel), prevent from dragging separators outside of the dock. TODO: maybe we need a parameter in the view...
418
|| CAIRO_DOCK_IS_DETACHABLE_APPLET (s_pIconClicked))
419
&& s_pFlyingContainer == NULL
420
&& ! myDocksParam.bLockIcons
421
&& ! myDocksParam.bLockAll
422
&& ! pDock->bPreventDraggingIcons)
424
cd_debug ("on a sorti %s du dock (%d;%d) / %dx%d", s_pIconClicked->cName, pDock->container.iMouseX, pDock->container.iMouseY, pDock->container.iWidth, pDock->container.iHeight);
426
//if (! cairo_dock_hide_child_docks (pDock)) // on quitte si on entre dans un sous-dock, pour rester en position "haute".
429
CairoDock *pOriginDock = gldi_dock_get (s_pIconClicked->cParentDockName);
430
g_return_val_if_fail (pOriginDock != NULL, TRUE);
431
if (pOriginDock == pDock && _mouse_is_really_outside (pDock)) // ce test est la pour parer aux WM deficients mentaux comme KWin qui nous font sortir/rentrer lors d'un clic.
433
cd_debug (" on detache l'icone");
434
pOriginDock->bIconIsFlyingAway = TRUE;
435
/**gchar *cParentDockName = s_pIconClicked->cParentDockName;
436
s_pIconClicked->cParentDockName = NULL;*/
437
cairo_dock_detach_icon_from_dock (s_pIconClicked, pOriginDock);
438
/**s_pIconClicked->cParentDockName = cParentDockName; // we keep the parent dock name, to be able to re-insert it. we'll have to remove it when the icon is dropped.
439
cairo_dock_update_dock_size (pOriginDock);*/
440
cairo_dock_stop_icon_glide (pOriginDock);
442
s_pFlyingContainer = gldi_flying_container_new (s_pIconClicked, pOriginDock);
443
//g_print ("- s_pIconClicked <- NULL\n");
444
s_pIconClicked = NULL;
445
if (pDock->iRefCount > 0 || pDock->bAutoHide) // pour garder le dock visible.
447
return GLDI_NOTIFICATION_INTERCEPT;
451
/**else if (s_pFlyingContainer != NULL && s_pFlyingContainer->pIcon != NULL && pDock->iRefCount > 0) // on evite les bouclages.
453
CairoDock *pOriginDock = gldi_dock_get (s_pFlyingContainer->pIcon->cParentDockName);
454
if (pOriginDock == pDock)
455
return GLDI_NOTIFICATION_INTERCEPT;
458
//\_______________ On lance l'animation du dock.
459
if (pDock->iRefCount == 0)
461
//g_print ("%s (auto-hide:%d)\n", __func__, pDock->bAutoHide);
462
if (pDock->bAutoHide)
464
///pDock->fFoldingFactor = (myBackendsParam.bAnimateOnAutoHide ? 0.001 : 0.);
465
cairo_dock_start_hiding (pDock);
468
else if (pDock->icons != NULL)
470
pDock->fFoldingFactor = (myDocksParam.bAnimateSubDock ? 0.001 : 0.);
471
Icon *pIcon = cairo_dock_search_icon_pointing_on_dock (pDock, NULL);
472
//g_print ("'%s' se replie\n", pIcon?pIcon->cName:"none");
473
gldi_object_notify (pIcon, NOTIFICATION_UNFOLD_SUBDOCK, pIcon);
475
//g_print ("start shrinking\n");
476
cairo_dock_start_shrinking (pDock); // on commence a faire diminuer la taille des icones.
477
return GLDI_NOTIFICATION_LET_PASS;
480
405
static void cairo_dock_stop_icon_glide (CairoDock *pDock)
660
/*static gboolean _on_leave_dock_notification2 (G_GNUC_UNUSED gpointer data, CairoDock *pDock, G_GNUC_UNUSED gboolean *bStartAnimation)
662
//\_______________ On gere le drag d'une icone hors du dock.
663
if (s_pIconClicked != NULL
664
&& (CAIRO_DOCK_ICON_TYPE_IS_LAUNCHER (s_pIconClicked)
665
|| CAIRO_DOCK_ICON_TYPE_IS_CONTAINER (s_pIconClicked)
666
|| (CAIRO_DOCK_ICON_TYPE_IS_SEPARATOR (s_pIconClicked) && s_pIconClicked->cDesktopFileName)
667
|| CAIRO_DOCK_IS_DETACHABLE_APPLET (s_pIconClicked))
668
&& s_pFlyingContainer == NULL
669
&& ! myDocksParam.bLockIcons
670
&& ! myDocksParam.bLockAll
671
&& ! pDock->bPreventDraggingIcons)
673
cd_debug ("on a sorti %s du dock (%d;%d) / %dx%d", s_pIconClicked->cName, pDock->container.iMouseX, pDock->container.iMouseY, pDock->container.iWidth, pDock->container.iHeight);
675
//if (! cairo_dock_hide_child_docks (pDock)) // on quitte si on entre dans un sous-dock, pour rester en position "haute".
678
CairoDock *pOriginDock = gldi_dock_get (s_pIconClicked->cParentDockName);
679
g_return_val_if_fail (pOriginDock != NULL, TRUE);
680
if (pOriginDock == pDock && _mouse_is_really_outside (pDock)) // ce test est la pour parer aux WM deficients mentaux comme KWin qui nous font sortir/rentrer lors d'un clic.
682
cd_debug (" on detache l'icone");
683
pOriginDock->bIconIsFlyingAway = TRUE;
684
cairo_dock_detach_icon_from_dock (s_pIconClicked, pOriginDock);
685
///cairo_dock_update_dock_size (pOriginDock);
686
cairo_dock_stop_icon_glide (pOriginDock);
688
s_pFlyingContainer = gldi_flying_container_new (s_pIconClicked, pOriginDock);
689
//g_print ("- s_pIconClicked <- NULL\n");
690
s_pIconClicked = NULL;
691
if (pDock->iRefCount > 0 || pDock->bAutoHide) // pour garder le dock visible.
693
return GLDI_NOTIFICATION_INTERCEPT;
697
else if (s_pFlyingContainer != NULL && s_pFlyingContainer->pIcon != NULL && pDock->iRefCount > 0) // on evite les bouclages.
699
CairoDock *pOriginDock = gldi_dock_get (s_pFlyingContainer->pIcon->cParentDockName);
700
if (pOriginDock == pDock)
701
return GLDI_NOTIFICATION_INTERCEPT;
703
return GLDI_NOTIFICATION_LET_PASS;
706
585
static gboolean _on_leave_notify (G_GNUC_UNUSED GtkWidget* pWidget, GdkEventCrossing* pEvent, CairoDock *pDock)
708
587
//g_print ("%s (bInside:%d; iState:%d; iRefCount:%d)\n", __func__, pDock->container.bInside, pDock->iInputState, pDock->iRefCount);
809
687
s_pSubDockShowing = NULL;
690
//\_______________ If a modal window is raised, we discard the 'leave-event' to stay in the up position.
691
if (pDock->bHasModalWindow)
692
return GLDI_NOTIFICATION_INTERCEPT;
694
//\_______________ On gere le drag d'une icone hors du dock.
695
if (s_pIconClicked != NULL
696
&& (CAIRO_DOCK_ICON_TYPE_IS_LAUNCHER (s_pIconClicked)
697
|| CAIRO_DOCK_ICON_TYPE_IS_CONTAINER (s_pIconClicked)
698
|| (CAIRO_DOCK_ICON_TYPE_IS_SEPARATOR (s_pIconClicked) && s_pIconClicked->cDesktopFileName && pDock->iMaxDockHeight > 30) // if the dock is narrow (like a panel), prevent from dragging separators outside of the dock. TODO: maybe we need a parameter in the view...
699
|| CAIRO_DOCK_IS_DETACHABLE_APPLET (s_pIconClicked))
700
&& s_pFlyingContainer == NULL
701
&& ! myDocksParam.bLockIcons
702
&& ! myDocksParam.bLockAll
703
&& ! pDock->bPreventDraggingIcons)
705
cd_debug ("on a sorti %s du dock (%d;%d) / %dx%d", s_pIconClicked->cName, pDock->container.iMouseX, pDock->container.iMouseY, pDock->container.iWidth, pDock->container.iHeight);
707
//if (! cairo_dock_hide_child_docks (pDock)) // on quitte si on entre dans un sous-dock, pour rester en position "haute".
710
CairoDock *pOriginDock = gldi_dock_get (s_pIconClicked->cParentDockName);
711
g_return_val_if_fail (pOriginDock != NULL, TRUE);
712
if (pOriginDock == pDock && _mouse_is_really_outside (pDock)) // ce test est la pour parer aux WM deficients mentaux comme KWin qui nous font sortir/rentrer lors d'un clic.
714
cd_debug (" on detache l'icone");
715
pOriginDock->bIconIsFlyingAway = TRUE;
716
/**gchar *cParentDockName = s_pIconClicked->cParentDockName;
717
s_pIconClicked->cParentDockName = NULL;*/
718
cairo_dock_detach_icon_from_dock (s_pIconClicked, pOriginDock);
719
/**s_pIconClicked->cParentDockName = cParentDockName; // we keep the parent dock name, to be able to re-insert it. we'll have to remove it when the icon is dropped.
720
cairo_dock_update_dock_size (pOriginDock);*/
721
cairo_dock_stop_icon_glide (pOriginDock);
723
s_pFlyingContainer = gldi_flying_container_new (s_pIconClicked, pOriginDock);
724
//g_print ("- s_pIconClicked <- NULL\n");
725
s_pIconClicked = NULL;
726
if (pDock->iRefCount > 0 || pDock->bAutoHide) // pour garder le dock visible.
732
/**else if (s_pFlyingContainer != NULL && s_pFlyingContainer->pIcon != NULL && pDock->iRefCount > 0) // on evite les bouclages.
734
CairoDock *pOriginDock = gldi_dock_get (s_pFlyingContainer->pIcon->cParentDockName);
735
if (pOriginDock == pDock)
736
return GLDI_NOTIFICATION_INTERCEPT;
813
739
gboolean bStartAnimation = FALSE;
814
740
gldi_object_notify (pDock, NOTIFICATION_LEAVE_DOCK, pDock, &bStartAnimation);
821
/**static gboolean _on_enter_notification (G_GNUC_UNUSED gpointer pData, CairoDock *pDock, G_GNUC_UNUSED gboolean *bStartAnimation)
823
// si on rentre avec une icone volante, on la met dedans.
824
if (s_pFlyingContainer != NULL)
826
Icon *pFlyingIcon = s_pFlyingContainer->pIcon;
827
if (pDock != pFlyingIcon->pSubDock) // on evite les boucles.
830
int r = gettimeofday (&tv, NULL);
833
t = tv.tv_sec + tv.tv_usec * 1e-6;
834
if (t - s_pFlyingContainer->fCreationTime > 1) // on empeche le cas ou enlever l'icone fait augmenter le ratio du dock, et donc sa hauteur, et nous fait rentrer dedans des qu'on sort l'icone.
836
cd_debug ("on remet l'icone volante dans un dock (dock d'origine : %s)", pFlyingIcon->cParentDockName);
837
gldi_object_unref (GLDI_OBJECT(s_pFlyingContainer));
838
gldi_icon_stop_animation (pFlyingIcon);
839
cairo_dock_insert_icon_in_dock (pFlyingIcon, pDock, CAIRO_DOCK_ANIMATE_ICON);
840
s_pFlyingContainer = NULL;
841
pDock->bIconIsFlyingAway = FALSE;
846
return GLDI_NOTIFICATION_LET_PASS;
848
747
static gboolean _on_enter_notify (G_GNUC_UNUSED GtkWidget* pWidget, GdkEventCrossing* pEvent, CairoDock *pDock)
850
749
//g_print ("%s (bIsMainDock : %d; bInside:%d; state:%d; iMagnitudeIndex:%d; input shape:%x; event:%p)\n", __func__, pDock->bIsMainDock, pDock->container.bInside, pDock->iInputState, pDock->iMagnitudeIndex, pDock->pShapeBitmap, pEvent);
1337
1235
cairo_dock_calculate_dock_icons (pDock);
1338
//g_print ("configure size\n");
1236
//g_print ("configure size %s\n", pDock->cDockName);
1339
1237
cairo_dock_trigger_set_WM_icons_geometry (pDock); // changement de position ou de taille du dock => on replace les icones.
1341
1239
gldi_dialogs_replace_all ();
1343
if (bIsNowSized && g_bUseOpenGL) // in OpenGL, the context is linked to the window; now that the window has a correct size, the context is ready -> draw things that couldn't be drawn until now.
1241
if (/**bIsNowSized*/bSizeUpdated && g_bUseOpenGL) // in OpenGL, the context is linked to the window; now that the window has a correct size, the context is ready -> draw things that couldn't be drawn until now.
1358
//g_print ("This icon %s is damaged\n", icon->cName);
1256
//g_print ("This icon %s is damaged (%d)\n", icon->cName, icon->iSubdockViewType);
1359
1257
icon->bDamaged = FALSE;
1360
1258
if (cairo_dock_get_icon_data_renderer (icon) != NULL)
1362
1260
cairo_dock_refresh_data_renderer (icon, CAIRO_CONTAINER (pDock));
1364
else if (icon->iSubdockViewType != 0)
1262
else if (icon->iSubdockViewType != 0
1263
|| (icon->cClass != NULL && ! myIndicatorsParam.bUseClassIndic && (CAIRO_DOCK_ICON_TYPE_IS_CLASS_CONTAINER (icon) || GLDI_OBJECT_IS_LAUNCHER_ICON (icon))))
1366
1265
cairo_dock_draw_subdock_content_on_icon (icon, pDock);
1867
1766
pDock = cairo_dock_detach_appli (pIcon);
1868
1767
if (pDock == NULL) // the dock has been destroyed (empty class sub-dock).
1870
cairo_dock_free_icon (pIcon);
1769
gldi_object_unref (GLDI_OBJECT (pIcon));
1876
1775
cd_message (" - %s va etre supprimee", pIcon->cName);
1877
cairo_dock_remove_icon_from_dock (pDock, pIcon); // enleve le separateur automatique avec; supprime le .desktop et le sous-dock des lanceurs; stoppe les applets; marque le theme.
1776
/// TODO: do that in the 'reset_object'...
1777
cairo_dock_detach_icon_from_dock (pIcon, pDock);
1879
1778
if (pIcon->cClass != NULL && pDock == cairo_dock_get_class_subdock (pIcon->cClass)) // appli icon in its class sub-dock => destroy the class sub-dock if it becomes empty (we don't want an empty sub-dock).
1881
1780
gboolean bEmptyClassSubDock = cairo_dock_check_class_subdock_is_empty (pDock, pIcon->cClass);
1882
1781
if (bEmptyClassSubDock)
1884
cairo_dock_free_icon (pIcon);
1783
gldi_object_unref (GLDI_OBJECT (pIcon));
1889
cairo_dock_free_icon (pIcon);
1788
gldi_object_delete (GLDI_OBJECT(pIcon));
1892
1791
else if (pIcon->fInsertRemoveFactor == (gdouble)-0.05)