~ubuntu-branches/ubuntu/oneiric/cairo-dock/oneiric

« back to all changes in this revision

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

  • Committer: Bazaar Package Importer
  • Author(s): Matthieu Baerts (matttbe)
  • Date: 2010-09-07 20:31:25 UTC
  • mto: (18.1.1 cairo-dock) (19.1.1 cairo-dock)
  • mto: This revision was merged to the branch mainline in revision 14.
  • Revision ID: james.westby@ubuntu.com-20100907203125-a91ch8odv2r6ziic
Tags: upstream-2.2.0~0rc1
ImportĀ upstreamĀ versionĀ 2.2.0~0rc1

Show diffs side-by-side

added added

removed removed

Lines of Context:
89
89
static gboolean s_bFrozenDock = FALSE;
90
90
static gboolean s_bIconDragged = FALSE;
91
91
 
 
92
static gboolean _check_mouse_outside (CairoDock *pDock);
 
93
 
92
94
#define _mouse_is_really_outside(pDock) (pDock->container.iMouseX <= 0 ||\
93
95
        pDock->container.iMouseX >= pDock->container.iWidth ||\
94
96
        (pDock->container.bDirectionUp ?\
245
247
}
246
248
 
247
249
 
 
250
static gboolean _emit_leave_signal_delayed (CairoDock *pDock)
 
251
{
 
252
        cairo_dock_emit_leave_signal (CAIRO_CONTAINER (pDock));
 
253
        pDock->iSidLeaveDemand = 0;
 
254
        return FALSE;
 
255
}
248
256
static gboolean _cairo_dock_show_sub_dock_delayed (CairoDock *pDock)
249
257
{
250
258
        s_iSidShowSubDockDemand = 0;
299
307
        if ((pDock == s_pLastPointedDock || s_pLastPointedDock == NULL) && pLastPointedIcon != NULL && pLastPointedIcon->pSubDock != NULL)  // on a quitte une icone ayant un sous-dock.
300
308
        {
301
309
                CairoDock *pSubDock = pLastPointedIcon->pSubDock;
302
 
                if (GTK_WIDGET_VISIBLE (pSubDock->container.pWidget))
 
310
                if (GTK_WIDGET_VISIBLE (pSubDock->container.pWidget))  // le sous-dock est visible, on retarde son cachage.
303
311
                {
304
312
                        //g_print ("on cache %s en changeant d'icone\n", pLastPointedIcon->cName);
305
313
                        if (pSubDock->iSidLeaveDemand == 0)
306
314
                        {
307
315
                                //g_print ("  on retarde le cachage du dock de %dms\n", MAX (myAccessibility.iLeaveSubDockDelay, 330));
308
 
                                pSubDock->iSidLeaveDemand = g_timeout_add (MAX (myAccessibility.iLeaveSubDockDelay, 330), (GSourceFunc) cairo_dock_emit_leave_signal, (gpointer) pSubDock);
 
316
                                pSubDock->iSidLeaveDemand = g_timeout_add (MAX (myAccessibility.iLeaveSubDockDelay, 330), (GSourceFunc) _emit_leave_signal_delayed, (gpointer) pSubDock);  // on force le retard meme si iLeaveSubDockDelay est a 0, car lorsqu'on entre dans un sous-dock, il arrive frequemment qu'on glisse hors de l'icone qui pointe dessus, et c'est tres desagreable d'avoir le dock qui se ferme avant d'avoir pu entre dedans.
309
317
                        }
310
318
                }
311
 
                //else
312
 
                //      cd_debug ("pas encore visible !\n");
313
319
        }
314
320
        if (pPointedIcon != NULL && pPointedIcon->pSubDock != NULL && pPointedIcon->pSubDock != s_pLastPointedDock && (! myAccessibility.bShowSubDockOnClick || CAIRO_DOCK_IS_APPLI (pPointedIcon) || pDock->bIsDragging))  // on entre sur une icone ayant un sous-dock.
315
321
        {
629
635
                return FALSE;
630
636
        }
631
637
        
632
 
        //\_______________ On ignore les signaux errones venant d'un WM buggue (Kwin).
 
638
        //\_______________ On ignore les signaux errones venant d'un WM buggue (Kwin) ou meme de X (changement de bureau).
633
639
        if (pEvent)
634
640
        {
635
641
                if (pDock->container.bIsHorizontal)
645
651
                if (!_mouse_is_really_outside(pDock))
646
652
                {
647
653
                        //g_print ("not really outside (%d;%d ; %d/%d)\n", (int)pEvent->x, (int)pEvent->y, pDock->iMaxDockHeight, pDock->iMinDockHeight);
 
654
                        if (pDock->iSidTestMouseOutside == 0)  // si l'action induit un changement de bureau, ou une appli qui bloque le focus (gksu), X envoit un signal de sortie alors qu'on est encore dans le dock, et donc n'en n'envoit plus lorsqu'on en sort reellement. On teste donc pendant qques secondes apres l'evenement.
 
655
                        {
 
656
                                pDock->iSidTestMouseOutside = g_timeout_add (500, (GSourceFunc)_check_mouse_outside, pDock);
 
657
                        }
648
658
                        return FALSE;
649
659
                }
650
660
        }
651
661
        
652
662
        //\_______________ On retarde la sortie.
653
 
        if (pDock->iSidLeaveDemand == 0 && pEvent != NULL)  // pas encore de demande de sortie et sortie naturelle.
 
663
        if (pEvent != NULL)  // sortie naturelle.
654
664
        {
655
 
                if (pDock->iRefCount == 0)  // cas du main dock : on retarde si on pointe sur un sous-dock (pour laisser le temps au signal d'entree dans le sous-dock d'etre traite) ou si l'on a l'auto-hide.
 
665
                if (pDock->iSidLeaveDemand == 0)  // pas encore de demande de sortie.
656
666
                {
657
 
                        //g_print (" leave event : %.1f;%.1f (%dx%d)\n", pEvent->x, pEvent->y, pDock->container.iWidth, pDock->container.iHeight);
658
 
                        Icon *pPointedIcon = cairo_dock_get_pointed_icon (pDock->icons);
659
 
                        if ((pPointedIcon != NULL && pPointedIcon->pSubDock != NULL && GTK_WIDGET_VISIBLE (pPointedIcon->pSubDock->container.pWidget)) || (pDock->bAutoHide))
660
 
                        {
661
 
                                //g_print ("  on retarde la sortie du dock de %dms\n", MAX (myAccessibility.iLeaveSubDockDelay, 330));
662
 
                                pDock->iSidLeaveDemand = g_timeout_add (MAX (myAccessibility.iLeaveSubDockDelay, 330), (GSourceFunc) cairo_dock_emit_leave_signal, (gpointer) pDock);
 
667
                        if (pDock->iRefCount == 0)  // cas du main dock : on retarde si on pointe sur un sous-dock (pour laisser le temps au signal d'entree dans le sous-dock d'etre traite) ou si l'on a l'auto-hide.
 
668
                        {
 
669
                                //g_print (" leave event : %.1f;%.1f (%dx%d)\n", pEvent->x, pEvent->y, pDock->container.iWidth, pDock->container.iHeight);
 
670
                                Icon *pPointedIcon = cairo_dock_get_pointed_icon (pDock->icons);
 
671
                                if ((pPointedIcon != NULL && pPointedIcon->pSubDock != NULL && GTK_WIDGET_VISIBLE (pPointedIcon->pSubDock->container.pWidget)) || (pDock->bAutoHide))
 
672
                                {
 
673
                                        //g_print ("  on retarde la sortie du dock de %dms\n", MAX (myAccessibility.iLeaveSubDockDelay, 330));
 
674
                                        pDock->iSidLeaveDemand = g_timeout_add (MAX (myAccessibility.iLeaveSubDockDelay, 330), (GSourceFunc) _emit_leave_signal_delayed, (gpointer) pDock);
 
675
                                        return TRUE;
 
676
                                }
 
677
                        }
 
678
                        else if (myAccessibility.iLeaveSubDockDelay != 0)  // cas d'un sous-dock : on retarde le cachage.
 
679
                        {
 
680
                                //g_print ("  on retarde la sortie du sous-dock de %dms\n", myAccessibility.iLeaveSubDockDelay);
 
681
                                pDock->iSidLeaveDemand = g_timeout_add (myAccessibility.iLeaveSubDockDelay, (GSourceFunc) _emit_leave_signal_delayed, (gpointer) pDock);
663
682
                                return TRUE;
664
683
                        }
665
684
                }
666
 
                else if (myAccessibility.iLeaveSubDockDelay != 0)  // cas d'un sous-dock : on retarde le cachage.
 
685
                else if (pDock->iSidLeaveDemand != 0)  // deja une sortie en attente.
667
686
                {
668
 
                        //g_print ("  on retarde la sortie du sous-dock de %dms\n", myAccessibility.iLeaveSubDockDelay);
669
 
                        pDock->iSidLeaveDemand = g_timeout_add (myAccessibility.iLeaveSubDockDelay, (GSourceFunc) cairo_dock_emit_leave_signal, (gpointer) pDock);
 
687
                        //g_print ("une sortie est deja programmee\n");
670
688
                        return TRUE;
671
689
                }
672
 
        }
673
 
        else if (pDock->iSidLeaveDemand != 0 && pEvent != NULL)  // sortie naturelle et deja une sortie en attente.
 
690
        }  // sinon c'est nous qui avons explicitement demande cette sortie, donc on continue.
 
691
        pDock->iSidLeaveDemand = 0;
 
692
        
 
693
        if (pDock->iSidTestMouseOutside != 0)
674
694
        {
675
 
                //g_print ("une sortie est deja programmee\n");
676
 
                return TRUE;
 
695
                //g_print ("stop checking mouse (leave)\n");
 
696
                g_source_remove (pDock->iSidTestMouseOutside);
 
697
                pDock->iSidTestMouseOutside = 0;
677
698
        }
678
 
        pDock->iSidLeaveDemand = 0;
679
699
        
680
700
        //\_______________ On enregistre la position de la souris.
681
701
        if (pEvent != NULL)
724
744
        if (pDock->iSidHideBack != 0)
725
745
        {
726
746
                //g_print ("remove hide back timeout\n");
727
 
                g_source_remove(pDock->iSidHideBack);
 
747
                g_source_remove (pDock->iSidHideBack);
728
748
                pDock->iSidHideBack = 0;
729
749
        }
 
750
        if (pDock->iSidTestMouseOutside != 0)
 
751
        {
 
752
                //g_print ("stop checking mouse (enter)\n");
 
753
                g_source_remove (pDock->iSidTestMouseOutside);
 
754
                pDock->iSidTestMouseOutside = 0;
 
755
        }
730
756
        
731
757
        // input shape desactivee, le dock devient actif.
732
758
        if ((pDock->pShapeBitmap || pDock->pHiddenShapeBitmap) && pDock->iInputState != CAIRO_DOCK_INPUT_ACTIVE)
839
865
        return TRUE;
840
866
}
841
867
 
842
 
 
 
868
static gboolean _check_mouse_outside (CairoDock *pDock)  // ce test est principalement fait pour detecter les cas ou X nous envoit un signal leave errone alors qu'on est dedans (=> sortie refusee, bInside reste a TRUE), puis du coup ne nous en envoit pas de leave lorsqu'on quitte reellement le dock.
 
869
{
 
870
        //g_print ("%s (%d, %d, %d)\n", __func__, pDock->bIsShrinkingDown, pDock->iMagnitudeIndex, pDock->container.bInside);
 
871
        if (pDock->bIsShrinkingDown || pDock->iMagnitudeIndex == 0 || ! pDock->container.bInside)  // cas triviaux : si le dock est deja retrcit, ou qu'on est deja plus dedans, on peut quitter.
 
872
        {
 
873
                pDock->iSidTestMouseOutside = 0;
 
874
                return FALSE;
 
875
        }
 
876
        if (pDock->container.bIsHorizontal)
 
877
                gdk_window_get_pointer (pDock->container.pWidget->window, &pDock->container.iMouseX, &pDock->container.iMouseY, NULL);
 
878
        else
 
879
                gdk_window_get_pointer (pDock->container.pWidget->window, &pDock->container.iMouseY, &pDock->container.iMouseX, NULL);
 
880
        //g_print (" -> (%d, %d)\n", pDock->container.iMouseX, pDock->container.iMouseY);
 
881
        
 
882
        cairo_dock_calculate_dock_icons (pDock);  // pour faire retrecir le dock si on n'est pas dedans, merci X de nous faire sortir du dock alors que la souris est toujours dedans :-/
 
883
        return TRUE;
 
884
}
843
885
gboolean cairo_dock_on_button_press (GtkWidget* pWidget, GdkEventButton* pButton, CairoDock *pDock)
844
886
{
845
887
        //g_print ("+ %s (%d/%d, %x)\n", __func__, pButton->type, pButton->button, pWidget);
877
919
                                                //g_print ("+ click on '%s' (%s)\n", icon->cName, icon->cCommand);
878
920
                                                if (! s_bIconDragged)  // on ignore le drag'n'drop sur elle-meme.
879
921
                                                {
880
 
                                                        cairo_dock_notify (CAIRO_DOCK_CLICK_ICON, icon, pDock, pButton->state);
 
922
                                                        cairo_dock_notify_on_container (CAIRO_CONTAINER (pDock), CAIRO_DOCK_CLICK_ICON, icon, pDock, pButton->state);
881
923
                                                        if (myAccessibility.cRaiseDockShortcut != NULL)
882
924
                                                                s_bHideAfterShortcut = TRUE;
883
925
                                                        
884
926
                                                        cairo_dock_start_icon_animation (icon, pDock);
885
927
                                                        icon->bIsDemandingAttention = FALSE;  // on considere que si l'utilisateur clique sur l'icone, c'est qu'il a pris acte de la notification.
 
928
                                                        
 
929
                                                        if (pDock->iSidTestMouseOutside == 0)  // si l'action induit un changement de bureau, ou une appli qui bloque le focus (gksu), X envoit un signal de sortie alors qu'on est encore dans le dock, et donc n'en n'envoit plus lorsqu'on en sort reellement. On teste donc pendant qques secondes apres l'evenement.
 
930
                                                        {
 
931
                                                                ///pDock->iSidTestMouseOutside = g_timeout_add (500, (GSourceFunc)_check_mouse_outside, pDock);
 
932
                                                        }
886
933
                                                }
887
934
                                        }
888
935
                                        else if (s_pIconClicked != NULL && icon != NULL && icon != s_pIconClicked && ! myAccessibility.bLockIcons && ! myAccessibility.bLockAll && ! pDock->bPreventDraggingIcons)  //  && icon->iType == s_pIconClicked->iType
982
1029
                        case GDK_2BUTTON_PRESS :
983
1030
                                {
984
1031
                                        if (icon && ! cairo_dock_icon_is_being_removed (icon))
985
 
                                                cairo_dock_notify (CAIRO_DOCK_DOUBLE_CLICK_ICON, icon, pDock);
 
1032
                                                cairo_dock_notify_on_container (CAIRO_CONTAINER (pDock), CAIRO_DOCK_DOUBLE_CLICK_ICON, icon, pDock);
986
1033
                                }
987
1034
                        break ;
988
1035
 
999
1046
        else if (pButton->button == 2 && pButton->type == GDK_BUTTON_PRESS)  // clique milieu.
1000
1047
        {
1001
1048
                if (icon && ! cairo_dock_icon_is_being_removed (icon))
1002
 
                        cairo_dock_notify (CAIRO_DOCK_MIDDLE_CLICK_ICON, icon, pDock);
 
1049
                        cairo_dock_notify_on_container (CAIRO_CONTAINER (pDock), CAIRO_DOCK_MIDDLE_CLICK_ICON, icon, pDock);
1003
1050
        }
1004
1051
 
1005
1052
        return FALSE;
1012
1059
        {
1013
1060
                return FALSE;
1014
1061
        }
1015
 
        Icon *icon = cairo_dock_get_pointed_icon (pDock->icons);
1016
 
        ///if (icon != NULL)
 
1062
        Icon *icon = cairo_dock_get_pointed_icon (pDock->icons);  // can be NULL
 
1063
        cairo_dock_notify_on_container (CAIRO_CONTAINER (pDock), CAIRO_DOCK_SCROLL_ICON, icon, pDock, pScroll->direction);
 
1064
        
 
1065
        if (pDock->iSidTestMouseOutside == 0)  // meme remarque que plus haut.
1017
1066
        {
1018
 
                cairo_dock_notify_on_container (CAIRO_CONTAINER (pDock), CAIRO_DOCK_SCROLL_ICON, icon, pDock, pScroll->direction);
 
1067
                ///pDock->iSidTestMouseOutside = g_timeout_add (500, (GSourceFunc)_check_mouse_outside, pDock);
1019
1068
        }
1020
 
 
 
1069
        
1021
1070
        return FALSE;
1022
1071
}
1023
1072