299
307
if ((pDock == s_pLastPointedDock || s_pLastPointedDock == NULL) && pLastPointedIcon != NULL && pLastPointedIcon->pSubDock != NULL) // on a quitte une icone ayant un sous-dock.
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.
304
312
//g_print ("on cache %s en changeant d'icone\n", pLastPointedIcon->cName);
305
313
if (pSubDock->iSidLeaveDemand == 0)
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.
312
// cd_debug ("pas encore visible !\n");
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.
645
651
if (!_mouse_is_really_outside(pDock))
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.
656
pDock->iSidTestMouseOutside = g_timeout_add (500, (GSourceFunc)_check_mouse_outside, pDock);
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.
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.
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))
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.
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))
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);
678
else if (myAccessibility.iLeaveSubDockDelay != 0) // cas d'un sous-dock : on retarde le cachage.
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);
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.
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");
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;
693
if (pDock->iSidTestMouseOutside != 0)
675
//g_print ("une sortie est deja programmee\n");
695
//g_print ("stop checking mouse (leave)\n");
696
g_source_remove (pDock->iSidTestMouseOutside);
697
pDock->iSidTestMouseOutside = 0;
678
pDock->iSidLeaveDemand = 0;
680
700
//\_______________ On enregistre la position de la souris.
681
701
if (pEvent != NULL)
724
744
if (pDock->iSidHideBack != 0)
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;
750
if (pDock->iSidTestMouseOutside != 0)
752
//g_print ("stop checking mouse (enter)\n");
753
g_source_remove (pDock->iSidTestMouseOutside);
754
pDock->iSidTestMouseOutside = 0;
731
757
// input shape desactivee, le dock devient actif.
732
758
if ((pDock->pShapeBitmap || pDock->pHiddenShapeBitmap) && pDock->iInputState != CAIRO_DOCK_INPUT_ACTIVE)
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.
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.
873
pDock->iSidTestMouseOutside = 0;
876
if (pDock->container.bIsHorizontal)
877
gdk_window_get_pointer (pDock->container.pWidget->window, &pDock->container.iMouseX, &pDock->container.iMouseY, NULL);
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);
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 :-/
843
885
gboolean cairo_dock_on_button_press (GtkWidget* pWidget, GdkEventButton* pButton, CairoDock *pDock)
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.
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;
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.
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.
931
///pDock->iSidTestMouseOutside = g_timeout_add (500, (GSourceFunc)_check_mouse_outside, pDock);
888
935
else if (s_pIconClicked != NULL && icon != NULL && icon != s_pIconClicked && ! myAccessibility.bLockIcons && ! myAccessibility.bLockAll && ! pDock->bPreventDraggingIcons) // && icon->iType == s_pIconClicked->iType
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);
1065
if (pDock->iSidTestMouseOutside == 0) // meme remarque que plus haut.
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);