113
113
pDock->iMaxIconHeight = 10;
114
114
pDock->container.fRatio = 1.;
117
pDock->iActiveWidth = pDock->iActiveHeight = 0;
116
118
pDock->pRenderer->compute_size (pDock);
119
if (pDock->iActiveWidth == 0)
120
pDock->iActiveWidth = pDock->iMaxDockWidth;
121
if (pDock->iActiveHeight == 0)
122
pDock->iActiveHeight = pDock->iMaxDockHeight;
118
124
double hmax = pDock->iMaxIconHeight;
119
125
int iMaxAuthorizedWidth = cairo_dock_get_max_authorized_dock_width (pDock);
159
165
hmax *= pDock->container.fRatio / fPrevRatio;
167
pDock->iActiveWidth = pDock->iActiveHeight = 0;
161
168
pDock->pRenderer->compute_size (pDock);
169
if (pDock->iActiveWidth == 0)
170
pDock->iActiveWidth = pDock->iMaxDockWidth;
171
if (pDock->iActiveHeight == 0)
172
pDock->iActiveHeight = pDock->iMaxDockHeight;
164
175
//g_print ("*** ratio : %.3f -> %.3f\n", fPrevRatio, pDock->container.fRatio);
416
427
g_object_unref ((gpointer) pDock->pHiddenShapeBitmap);
417
428
pDock->pHiddenShapeBitmap = NULL;
430
if (pDock->pActiveShapeBitmap != NULL)
432
g_object_unref ((gpointer) pDock->pActiveShapeBitmap);
433
pDock->pActiveShapeBitmap = NULL;
420
436
//\_______________ on definit les tailles des zones.
421
437
int W = pDock->iMaxDockWidth;
430
446
//\_______________ on verifie que les conditions sont toujours remplies.
431
447
if (w == 0 || h == 0 || pDock->iRefCount > 0 || W == 0 || H == 0)
449
if (pDock->iActiveWidth != pDock->iMaxDockWidth || pDock->iActiveHeight != pDock->iMaxDockHeight) // else all the dock is active when the mouse is inside, so we can just set a NULL shape.
450
pDock->pActiveShapeBitmap = _cairo_dock_create_input_shape (pDock, pDock->iActiveWidth, pDock->iActiveHeight);
433
451
if (pDock->iInputState != CAIRO_DOCK_INPUT_ACTIVE)
435
453
//g_print ("+++ input shape active on update input shape\n");
443
461
pDock->pShapeBitmap = _cairo_dock_create_input_shape (pDock, w, h);
445
463
pDock->pHiddenShapeBitmap = _cairo_dock_create_input_shape (pDock, w_, h_);
465
if (pDock->iActiveWidth != pDock->iMaxDockWidth || pDock->iActiveHeight != pDock->iMaxDockHeight) // else all the dock is active when the mouse is inside, so we can just set a NULL shape.
466
pDock->pActiveShapeBitmap = _cairo_dock_create_input_shape (pDock, pDock->iActiveWidth, pDock->iActiveHeight);
738
759
CairoDockMousePositionType iMousePositionType;
739
760
int iWidth = pDock->container.iWidth;
740
int iHeight = (pDock->fMagnitudeMax != 0 ? pDock->container.iHeight : pDock->iMinDockHeight);
761
///int iHeight = (pDock->fMagnitudeMax != 0 ? pDock->container.iHeight : pDock->iMinDockHeight);
762
int iHeight = pDock->iActiveHeight;
741
763
///int iExtraHeight = (pDock->bAtBottom ? 0 : myIconsParam.iLabelSize);
742
764
int iExtraHeight = 0; /// il faudrait voir si on a un sous-dock ou un dialogue au dessus :-/
743
765
int iMouseX = pDock->container.iMouseX;
754
776
if (/*cairo_dock_is_extended_dock (pDock) && */pDock->bAutoHide) // c'est penible de sortir du dock trop facilement avec l'auto-hide.
756
778
if (iMouseY >= 0 && iMouseY < iHeight)
757
iMousePositionType = CAIRO_DOCK_MOUSE_INSIDE;
779
iMousePositionType = CAIRO_DOCK_MOUSE_ON_THE_EDGE;
759
781
iMousePositionType = CAIRO_DOCK_MOUSE_OUTSIDE;
785
/**double fSideMargin = fabs (pDock->fAlign - .5) * (iWidth - pDock->fFlatDockWidth);
786
if (x_abs < - fSideMargin || x_abs > pDock->fFlatDockWidth + fSideMargin)
787
iMousePositionType = CAIRO_DOCK_MOUSE_OUTSIDE;
789
iMousePositionType = CAIRO_DOCK_MOUSE_ON_THE_EDGE;*/
763
790
if (iMouseY >= 0 && iMouseY < iHeight)
764
791
iMousePositionType = CAIRO_DOCK_MOUSE_ON_THE_EDGE;
821
848
if (pDock->iRefCount > 0)
823
850
Icon *pPointingIcon = cairo_dock_search_icon_pointing_on_dock (pDock, NULL);
824
if (pPointingIcon && pPointingIcon->bPointed) // sous-dock pointe, n le laisse en position haute.
851
if (pPointingIcon && pPointingIcon->bPointed) // sous-dock pointe, on le laisse en position haute.
827
854
//g_print ("on force a quitter (iRefCount:%d; bIsGrowingUp:%d; iMagnitudeIndex:%d)\n", pDock->iRefCount, pDock->bIsGrowingUp, pDock->iMagnitudeIndex);
834
#define make_icon_avoid_mouse(icon) \
861
#define make_icon_avoid_mouse(icon, sens) do { \
835
862
cairo_dock_mark_icon_as_avoiding_mouse (icon);\
836
863
icon->fAlpha = 0.75;\
837
864
if (myIconsParam.fAmplitude != 0)\
838
icon->fDrawX += icon->fWidth / 2 * (icon->fScale - 1) / myIconsParam.fAmplitude * (icon->fPhase < G_PI/2 ? -1 : 1);
840
static gboolean _cairo_dock_check_can_drop_linear (CairoDock *pDock, CairoDockIconGroup iGroup, double fMargin)
865
icon->fDrawX += icon->fWidth / 2 * (icon->fScale - 1) / myIconsParam.fAmplitude * sens; } while (0)
866
static inline gboolean _cairo_dock_check_can_drop_linear (CairoDock *pDock, CairoDockIconGroup iGroup, double fMargin)
842
868
gboolean bCanDrop = FALSE;
844
GList *pFirstDrawnElement = (pDock->pFirstDrawnElement != NULL ? pDock->pFirstDrawnElement : pDock->icons);
845
GList *ic = pFirstDrawnElement;
871
for (ic = pDock->icons; ic != NULL; ic = ic->next)
849
if (icon->bPointed) // && icon->iAnimationState != CAIRO_DOCK_FOLLOW_MOUSE
876
g_print ("icon->fWidth: %d, %.2f\n", (int)icon->fWidth, icon->fScale);
877
g_print ("x: %d / %d\n", pDock->container.iMouseX, (int)icon->fDrawX);
851
878
if (pDock->container.iMouseX < icon->fDrawX + icon->fWidth * icon->fScale * fMargin) // on est a gauche. // fDrawXAtRest
853
880
Icon *prev_icon = cairo_dock_get_previous_element (ic, pDock->icons) -> data;
854
if ((cairo_dock_get_icon_order (icon) == cairo_dock_get_group_order (iGroup) || cairo_dock_get_icon_order (prev_icon) == cairo_dock_get_group_order (iGroup))) // && prev_icon->iAnimationType != CAIRO_DOCK_FOLLOW_MOUSE
881
if ((cairo_dock_get_icon_order (icon) == cairo_dock_get_group_order (iGroup) || cairo_dock_get_icon_order (prev_icon) == cairo_dock_get_group_order (iGroup)))
856
make_icon_avoid_mouse (icon);
857
make_icon_avoid_mouse (prev_icon);
883
make_icon_avoid_mouse (icon, 1);
885
make_icon_avoid_mouse (prev_icon, -1);
858
886
//g_print ("%s> <%s\n", prev_icon->cName, icon->cName);
862
890
else if (pDock->container.iMouseX > icon->fDrawX + icon->fWidth * icon->fScale * (1 - fMargin)) // on est a droite. // fDrawXAtRest
864
892
Icon *next_icon = cairo_dock_get_next_element (ic, pDock->icons) -> data;
865
if ((icon->iGroup == iGroup || next_icon->iGroup == iGroup)) // && next_icon->iAnimationType != CAIRO_DOCK_FOLLOW_MOUSE
893
if ((cairo_dock_get_icon_order (icon) == cairo_dock_get_group_order (iGroup) || cairo_dock_get_icon_order (next_icon) == cairo_dock_get_group_order (iGroup)))
867
make_icon_avoid_mouse (icon);
868
make_icon_avoid_mouse (next_icon);
895
make_icon_avoid_mouse (icon, -1);
897
make_icon_avoid_mouse (next_icon, 1);
869
898
//g_print ("%s> <%s\n", icon->cName, next_icon->cName);
872
ic = cairo_dock_get_next_element (ic, pDock->icons); // on la saute.
873
if (ic == pFirstDrawnElement)
901
ic = ic->next; // on la saute.
875
904
} // else on est dessus.
878
907
cairo_dock_stop_marking_icon_as_avoiding_mouse (icon);
880
ic = cairo_dock_get_next_element (ic, pDock->icons);
881
} while (ic != pFirstDrawnElement);
887
914
void cairo_dock_check_can_drop_linear (CairoDock *pDock)
889
if (pDock->icons == NULL)
892
if (pDock->bIsDragging)
916
if (! pDock->bIsDragging) // not dragging, so no drop possible.
918
pDock->bCanDrop = FALSE;
920
else if (pDock->icons == NULL) // dragging but no icons, so drop always possible.
922
pDock->bCanDrop = TRUE;
924
else // dragging and some icons.
893
926
pDock->bCanDrop = _cairo_dock_check_can_drop_linear (pDock, pDock->iAvoidingMouseIconType, pDock->fAvoidingMouseMargin);
895
pDock->bCanDrop = FALSE;
898
930
void cairo_dock_stop_marking_icons (CairoDock *pDock)
920
952
pSubDock->fAlign = 0.5;
921
953
pSubDock->iGapX = iX + pDock->container.iWindowPositionX - (pDock->container.bIsHorizontal ? pDock->iScreenOffsetX : pDock->iScreenOffsetY) - g_desktopGeometry.iScreenWidth[pDock->container.bIsHorizontal] / 2; // ici les sous-dock ont un alignement egal a 0.5
922
pSubDock->iGapY = pDock->iGapY + pDock->iMaxDockHeight;
954
pSubDock->iGapY = pDock->iGapY + pDock->iActiveHeight;
926
958
pSubDock->fAlign = (pDock->container.bDirectionUp ? 1 : 0);
927
pSubDock->iGapX = (pDock->iGapY + pDock->iMaxDockHeight) * (pDock->container.bDirectionUp ? -1 : 1);
959
pSubDock->iGapX = (pDock->iGapY + pDock->iActiveHeight) * (pDock->container.bDirectionUp ? -1 : 1);
928
960
if (pDock->container.bDirectionUp)
929
961
pSubDock->iGapY = g_desktopGeometry.iScreenWidth[pDock->container.bIsHorizontal] - (iX + pDock->container.iWindowPositionX - (pDock->container.bIsHorizontal ? pDock->iScreenOffsetX : pDock->iScreenOffsetY)) - pSubDock->iMaxDockHeight / 2; // les sous-dock ont un alignement egal a 1.
971
1003
pSubDock->pRenderer->set_subdock_position (pPointedIcon, pParentDock);
972
if (pParentDock->fMagnitudeMax == 0) // son input shape n'est pas la taille max mais iMinDockHeight.
973
pSubDock->iGapY -= (pParentDock->container.iHeight - pParentDock->iMinDockHeight);
1004
///if (pParentDock->fMagnitudeMax == 0) // son input shape n'est pas la taille max mais iMinDockHeight.
1005
/// pSubDock->iGapY -= (pParentDock->container.iHeight - pParentDock->iMinDockHeight);
975
1007
if (pSubDock->icons != NULL)