~ubuntu-branches/ubuntu/precise/cairo-dock/precise

« back to all changes in this revision

Viewing changes to src/gldit/cairo-dock-dock-facility.c

  • Committer: Kees Cook
  • Date: 2011-08-11 19:31:26 UTC
  • mfrom: (19.1.1 cairo-dock)
  • Revision ID: kees@outflux.net-20110811193126-wh97aamdqx5gaf2f
Tags: 2.4.0~0beta2-0ubuntu1
releasing version 2.4.0~0beta2-0ubuntu1

Show diffs side-by-side

added added

removed removed

Lines of Context:
113
113
                        pDock->iMaxIconHeight = 10;
114
114
                pDock->container.fRatio = 1.;
115
115
        }
 
116
        
 
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;
117
123
        
118
124
        double hmax = pDock->iMaxIconHeight;
119
125
        int iMaxAuthorizedWidth = cairo_dock_get_max_authorized_dock_width (pDock);
158
164
                        }
159
165
                        hmax *= pDock->container.fRatio / fPrevRatio;
160
166
                        
 
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;
162
173
                }
163
174
                
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;
418
429
        }
 
430
        if (pDock->pActiveShapeBitmap != NULL)
 
431
        {
 
432
                g_object_unref ((gpointer) pDock->pActiveShapeBitmap);
 
433
                pDock->pActiveShapeBitmap = NULL;
 
434
        }
419
435
        
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)
432
448
        {
 
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)
434
452
                {
435
453
                        //g_print ("+++ input shape active on update input shape\n");
443
461
        pDock->pShapeBitmap = _cairo_dock_create_input_shape (pDock, w, h);
444
462
        
445
463
        pDock->pHiddenShapeBitmap = _cairo_dock_create_input_shape (pDock, w_, h_);
 
464
        
 
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);
446
467
}
447
468
 
448
469
 
737
758
{
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.
755
777
                {
756
778
                        if (iMouseY >= 0 && iMouseY < iHeight)
757
 
                                iMousePositionType = CAIRO_DOCK_MOUSE_INSIDE;
 
779
                                iMousePositionType = CAIRO_DOCK_MOUSE_ON_THE_EDGE;
758
780
                        else
759
781
                                iMousePositionType = CAIRO_DOCK_MOUSE_OUTSIDE;
760
782
                }
761
783
                else
762
784
                {
 
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;
 
788
                        else
 
789
                                iMousePositionType = CAIRO_DOCK_MOUSE_ON_THE_EDGE;*/
763
790
                        if (iMouseY >= 0 && iMouseY < iHeight)
764
791
                                iMousePositionType = CAIRO_DOCK_MOUSE_ON_THE_EDGE;
765
792
                        else
774
801
        }
775
802
        else
776
803
                iMousePositionType = CAIRO_DOCK_MOUSE_OUTSIDE;
777
 
 
 
804
        
778
805
        pDock->iMousePositionType = iMousePositionType;
779
806
}
780
807
 
821
848
                                if (pDock->iRefCount > 0)
822
849
                                {
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.
825
852
                                                return;
826
853
                                }
827
854
                                //g_print ("on force a quitter (iRefCount:%d; bIsGrowingUp:%d; iMagnitudeIndex:%d)\n", pDock->iRefCount, pDock->bIsGrowingUp, pDock->iMagnitudeIndex);
831
858
        }
832
859
}
833
860
 
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);
839
 
 
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)
841
867
{
842
868
        gboolean bCanDrop = FALSE;
843
869
        Icon *icon;
844
 
        GList *pFirstDrawnElement = (pDock->pFirstDrawnElement != NULL ? pDock->pFirstDrawnElement : pDock->icons);
845
 
        GList *ic = pFirstDrawnElement;
846
 
        do
 
870
        GList *ic;
 
871
        for (ic = pDock->icons; ic != NULL; ic = ic->next)
847
872
        {
848
873
                icon = ic->data;
849
 
                if (icon->bPointed)  // && icon->iAnimationState != CAIRO_DOCK_FOLLOW_MOUSE
 
874
                if (icon->bPointed)
850
875
                {
 
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
852
879
                        {
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)))
855
882
                                {
856
 
                                        make_icon_avoid_mouse (icon);
857
 
                                        make_icon_avoid_mouse (prev_icon);
 
883
                                        make_icon_avoid_mouse (icon, 1);
 
884
                                        if (prev_icon)
 
885
                                                make_icon_avoid_mouse (prev_icon, -1);
858
886
                                        //g_print ("%s> <%s\n", prev_icon->cName, icon->cName);
859
887
                                        bCanDrop = TRUE;
860
888
                                }
862
890
                        else if (pDock->container.iMouseX > icon->fDrawX + icon->fWidth * icon->fScale * (1 - fMargin))  // on est a droite.  // fDrawXAtRest
863
891
                        {
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)))
866
894
                                {
867
 
                                        make_icon_avoid_mouse (icon);
868
 
                                        make_icon_avoid_mouse (next_icon);
 
895
                                        make_icon_avoid_mouse (icon, -1);
 
896
                                        if (next_icon)
 
897
                                                make_icon_avoid_mouse (next_icon, 1);
869
898
                                        //g_print ("%s> <%s\n", icon->cName, next_icon->cName);
870
899
                                        bCanDrop = TRUE;
871
900
                                }
872
 
                                ic = cairo_dock_get_next_element (ic, pDock->icons);  // on la saute.
873
 
                                if (ic == pFirstDrawnElement)
874
 
                                        break ;
 
901
                                ic = ic->next;  // on la saute.
 
902
                                if (ic == NULL)
 
903
                                        break;
875
904
                        }  // else on est dessus.
876
905
                }
877
906
                else
878
907
                        cairo_dock_stop_marking_icon_as_avoiding_mouse (icon);
879
 
                
880
 
                ic = cairo_dock_get_next_element (ic, pDock->icons);
881
 
        } while (ic != pFirstDrawnElement);
 
908
        }
882
909
        
883
910
        return bCanDrop;
884
911
}
886
913
 
887
914
void cairo_dock_check_can_drop_linear (CairoDock *pDock)
888
915
{
889
 
        if (pDock->icons == NULL)
890
 
                return;
891
 
        
892
 
        if (pDock->bIsDragging)
 
916
        if (! pDock->bIsDragging)  // not dragging, so no drop possible.
 
917
        {
 
918
                pDock->bCanDrop = FALSE;
 
919
        }
 
920
        else if (pDock->icons == NULL)  // dragging but no icons, so drop always possible.
 
921
        {
 
922
                pDock->bCanDrop = TRUE;
 
923
        }
 
924
        else  // dragging and some icons.
 
925
        {
893
926
                pDock->bCanDrop = _cairo_dock_check_can_drop_linear (pDock, pDock->iAvoidingMouseIconType, pDock->fAvoidingMouseMargin);
894
 
        else
895
 
                pDock->bCanDrop = FALSE;
 
927
        }
896
928
}
897
929
 
898
930
void cairo_dock_stop_marking_icons (CairoDock *pDock)
919
951
        {
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;
923
955
        }
924
956
        else
925
957
        {
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.
930
962
                else
969
1001
        }
970
1002
        
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);
974
1006
        
975
1007
        if (pSubDock->icons != NULL)
976
1008
        {