42
42
#include "cairo-dock-draw.h"
43
43
#include "cairo-dock-animations.h"
44
#include "cairo-dock-load.h"
45
#include "cairo-dock-icons.h"
44
#include "cairo-dock-image-buffer.h"
45
#include "cairo-dock-module-factory.h"
46
#include "cairo-dock-icon-factory.h"
47
#include "cairo-dock-icon-facility.h"
46
48
#include "cairo-dock-applications-manager.h"
47
49
#include "cairo-dock-application-facility.h"
48
50
#include "cairo-dock-desktop-file-factory.h"
56
58
#include "cairo-dock-dock-manager.h"
57
59
#include "cairo-dock-keybinder.h"
58
60
#include "cairo-dock-draw-opengl.h"
61
#include "cairo-dock-opengl.h"
59
62
#include "cairo-dock-flying-container.h"
60
63
#include "cairo-dock-animations.h"
61
64
#include "cairo-dock-backends-manager.h"
62
#include "cairo-dock-internal-accessibility.h"
63
#include "cairo-dock-internal-system.h"
64
#include "cairo-dock-internal-taskbar.h"
65
#include "cairo-dock-internal-icons.h"
66
65
#include "cairo-dock-class-manager.h"
67
66
#include "cairo-dock-X-manager.h"
68
67
#include "cairo-dock-X-utilities.h"
72
71
extern CairoDockDesktopGeometry g_desktopGeometry;
73
72
extern CairoDockHidingEffect *g_pHidingBackend;
74
73
extern CairoDockHidingEffect *g_pKeepingBelowBackend;
74
extern CairoDockGLConfig g_openglConfig;
76
76
static Icon *s_pIconClicked = NULL; // pour savoir quand on deplace une icone a la souris. Dangereux si l'icone se fait effacer en cours ...
77
77
static int s_iClickX, s_iClickY; // coordonnees du clic dans le dock, pour pouvoir initialiser le deplacement apres un seuil.
92
93
static gboolean _check_mouse_outside (CairoDock *pDock);
94
#define _mouse_is_really_outside(pDock) (pDock->container.iMouseX <= 0 ||\
95
pDock->container.iMouseX >= pDock->container.iWidth ||\
96
(pDock->container.bDirectionUp ?\
97
(pDock->container.iMouseY > pDock->container.iHeight ||\
98
pDock->container.iMouseY <= (pDock->fMagnitudeMax != 0 ? 0 : pDock->container.iHeight - pDock->iMinDockHeight)) :\
99
(pDock->container.iMouseY < 0 ||\
100
pDock->container.iMouseY >= (pDock->fMagnitudeMax != 0 ? pDock->container.iHeight : pDock->iMinDockHeight))))
95
static inline gboolean _mouse_is_really_outside (CairoDock *pDock)
97
/**return (pDock->container.iMouseX <= 0
98
|| pDock->container.iMouseX >= pDock->container.iWidth
99
|| (pDock->container.bDirectionUp ?
100
(pDock->container.iMouseY > pDock->container.iHeight
101
|| pDock->container.iMouseY <= (pDock->fMagnitudeMax != 0 ? 0 : pDock->container.iHeight - pDock->iMinDockHeight))
102
: (pDock->container.iMouseY < 0
104
pDock->container.iMouseY >= (pDock->fMagnitudeMax != 0 ? pDock->container.iHeight : pDock->iMinDockHeight))));*/
105
double x1, x2, y1, y2;
106
if (pDock->iInputState == CAIRO_DOCK_INPUT_ACTIVE)
109
x2 = pDock->container.iWidth;
110
if (pDock->container.bDirectionUp)
112
y1 = (pDock->fMagnitudeMax != 0 ? 0 : pDock->container.iHeight - pDock->iMinDockHeight);
113
y2 = pDock->container.iHeight;
118
y2 = (pDock->fMagnitudeMax != 0 ? pDock->container.iHeight : pDock->iMinDockHeight);
121
else if (pDock->iInputState == CAIRO_DOCK_INPUT_AT_REST)
123
x1 = (pDock->container.iWidth - pDock->iMinDockWidth) / 2;
124
x2 = (pDock->container.iWidth + pDock->iMinDockWidth) / 2;
125
if (pDock->container.bDirectionUp)
127
y1 = pDock->container.iHeight - pDock->iMinDockHeight;
128
y2 = pDock->container.iHeight;
133
y2 = pDock->iMinDockHeight;
138
if (pDock->container.iMouseX <= x1
139
|| pDock->container.iMouseX >= x2)
141
if (pDock->container.iMouseY <= y1
142
|| pDock->container.iMouseY >= y2)
101
147
#define CD_CLICK_ZONE 5
103
149
void cairo_dock_freeze_docks (gboolean bFreeze)
167
cairo_dock_notify_on_container (CAIRO_CONTAINER (pDock), CAIRO_DOCK_RENDER_DOCK, pDock, NULL);
213
cairo_dock_notify_on_object (&myDocksMgr, NOTIFICATION_RENDER_DOCK, pDock, NULL);
214
cairo_dock_notify_on_object (pDock, NOTIFICATION_RENDER_DOCK, pDock, NULL);
169
216
glDisable (GL_SCISSOR_TEST);
187
234
g_pHidingBackend->pre_render (pDock, pDock->fHideOffset, pCairoContext);
189
236
if (pDock->iFadeCounter != 0 && g_pKeepingBelowBackend != NULL && g_pKeepingBelowBackend->pre_render)
190
g_pKeepingBelowBackend->pre_render (pDock, (double) pDock->iFadeCounter / mySystem.iHideNbSteps, pCairoContext);
237
g_pKeepingBelowBackend->pre_render (pDock, (double) pDock->iFadeCounter / myBackendsParam.iHideNbSteps, pCairoContext);
192
239
if (pDock->pRenderer->render_optimized != NULL)
193
240
pDock->pRenderer->render_optimized (pCairoContext, pDock, &pExpose->area);
198
245
g_pHidingBackend->post_render (pDock, pDock->fHideOffset, pCairoContext);
200
247
if (pDock->iFadeCounter != 0 && g_pKeepingBelowBackend != NULL && g_pKeepingBelowBackend->post_render)
201
g_pKeepingBelowBackend->post_render (pDock, (double) pDock->iFadeCounter / mySystem.iHideNbSteps, pCairoContext);
248
g_pKeepingBelowBackend->post_render (pDock, (double) pDock->iFadeCounter / myBackendsParam.iHideNbSteps, pCairoContext);
203
cairo_dock_notify_on_container (CAIRO_CONTAINER (pDock), CAIRO_DOCK_RENDER_DOCK, pDock, pCairoContext);
250
cairo_dock_notify_on_object (&myDocksMgr, NOTIFICATION_RENDER_DOCK, pDock, pCairoContext);
251
cairo_dock_notify_on_object (pDock, NOTIFICATION_RENDER_DOCK, pDock, pCairoContext);
205
253
cairo_destroy (pCairoContext);
224
272
g_pHidingBackend->pre_render (pDock, pDock->fHideOffset, pCairoContext);
226
274
if (pDock->iFadeCounter != 0 && g_pKeepingBelowBackend != NULL && g_pKeepingBelowBackend->pre_render)
227
g_pKeepingBelowBackend->pre_render (pDock, (double) pDock->iFadeCounter / mySystem.iHideNbSteps, pCairoContext);
275
g_pKeepingBelowBackend->pre_render (pDock, (double) pDock->iFadeCounter / myBackendsParam.iHideNbSteps, pCairoContext);
229
277
pDock->pRenderer->render (pCairoContext, pDock);
232
280
g_pHidingBackend->post_render (pDock, pDock->fHideOffset, pCairoContext);
234
282
if (pDock->iFadeCounter != 0 && g_pKeepingBelowBackend != NULL && g_pKeepingBelowBackend->post_render)
235
g_pKeepingBelowBackend->post_render (pDock, (double) pDock->iFadeCounter / mySystem.iHideNbSteps, pCairoContext);
283
g_pKeepingBelowBackend->post_render (pDock, (double) pDock->iFadeCounter / myBackendsParam.iHideNbSteps, pCairoContext);
237
cairo_dock_notify_on_container (CAIRO_CONTAINER (pDock), CAIRO_DOCK_RENDER_DOCK, pDock, pCairoContext);
285
cairo_dock_notify_on_object (&myDocksMgr, NOTIFICATION_RENDER_DOCK, pDock, pCairoContext);
286
cairo_dock_notify_on_object (pDock, NOTIFICATION_RENDER_DOCK, pDock, pCairoContext);
240
289
cairo_destroy (pCairoContext);
258
307
s_iSidShowSubDockDemand = 0;
259
308
s_pDockShowingSubDock = NULL;
309
s_pSubDockShowing = NULL;
260
310
Icon *icon = cairo_dock_get_pointed_icon (pDock->icons);
261
311
//g_print ("%s (%x, %x)", __func__, icon, icon ? icon->pSubDock:0);
262
312
if (icon != NULL && icon->pSubDock != NULL)
272
322
static gboolean _cairo_dock_action_on_drag_hover (Icon *pIcon)
274
324
gpointer data[2] = {pIcon, NULL};
275
cairo_dock_foreach_icons_in_docks ((CairoDockForeachIconFunc)_search_icon, data); // on verifie que l'icone ne s'est pas faite effacee entre-temps?
325
cairo_dock_foreach_icons_in_docks ((CairoDockForeachIconFunc)_search_icon, data); // on verifie que l'icone ne s'est pas faite effacee entre-temps.
277
327
if (pIcon && pIcon->iface.action_on_drag_hover)
278
328
pIcon->iface.action_on_drag_hover (pIcon);
282
332
void cairo_dock_on_change_icon (Icon *pLastPointedIcon, Icon *pPointedIcon, CairoDock *pDock)
284
//g_print ("%s (%x;%x)\n", __func__, pLastPointedIcon, pPointedIcon);
334
//g_print ("%s (%s -> %s)\n", __func__, pLastPointedIcon?pLastPointedIcon->cName:"none", pPointedIcon?pPointedIcon->cName:"none");
285
335
//cd_debug ("on change d'icone dans %x (-> %s)", pDock, (pPointedIcon != NULL ? pPointedIcon->cName : "rien"));
286
336
if (s_iSidShowSubDockDemand != 0 && pDock == s_pDockShowingSubDock)
297
348
g_source_remove (s_iSidActionOnDragHover);
298
349
s_iSidActionOnDragHover = 0;
300
cairo_dock_replace_all_dialogs ();
351
///cairo_dock_replace_all_dialogs ();
352
cairo_dock_refresh_all_dialogs (FALSE);
301
353
if (pDock->bIsDragging && pPointedIcon && pPointedIcon->iface.action_on_drag_hover)
303
355
s_iSidActionOnDragHover = g_timeout_add (600, (GSourceFunc) _cairo_dock_action_on_drag_hover, pPointedIcon);
312
364
//g_print ("on cache %s en changeant d'icone\n", pLastPointedIcon->cName);
313
365
if (pSubDock->iSidLeaveDemand == 0)
315
//g_print (" on retarde le cachage du dock de %dms\n", MAX (myAccessibility.iLeaveSubDockDelay, 330));
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.
367
//g_print (" on retarde le cachage du dock de %dms\n", MAX (myDocksParam.iLeaveSubDockDelay, 330));
368
pSubDock->iSidLeaveDemand = g_timeout_add (MAX (myDocksParam.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.
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.
372
if (pPointedIcon != NULL && pPointedIcon->pSubDock != NULL && pPointedIcon->pSubDock != s_pLastPointedDock && (! myDocksParam.bShowSubDockOnClick || CAIRO_DOCK_IS_APPLI (pPointedIcon) || pDock->bIsDragging)) // on entre sur une icone ayant un sous-dock.
322
374
//cd_debug ("il faut montrer un sous-dock");
323
375
if (pPointedIcon->pSubDock->iSidLeaveDemand != 0)
325
377
g_source_remove (pPointedIcon->pSubDock->iSidLeaveDemand);
326
378
pPointedIcon->pSubDock->iSidLeaveDemand = 0;
328
if (myAccessibility.iShowSubDockDelay > 0)
380
if (myDocksParam.iShowSubDockDelay > 0)
330
382
//pDock->container.iMouseX = iX;
331
383
if (s_iSidShowSubDockDemand != 0)
332
384
g_source_remove (s_iSidShowSubDockDemand);
333
s_iSidShowSubDockDemand = g_timeout_add (myAccessibility.iShowSubDockDelay, (GSourceFunc) _cairo_dock_show_sub_dock_delayed, pDock);
385
s_iSidShowSubDockDemand = g_timeout_add (myDocksParam.iShowSubDockDelay, (GSourceFunc) _cairo_dock_show_sub_dock_delayed, pDock);
334
386
s_pDockShowingSubDock = pDock;
387
s_pSubDockShowing = pPointedIcon->pSubDock;
335
388
//g_print ("s_iSidShowSubDockDemand <- %d\n", s_iSidShowSubDockDemand);
344
397
//g_print ("pLastPointedDock n'est plus null\n");
345
398
s_pLastPointedDock = pDock;
347
if (pPointedIcon != NULL && pDock->pRenderer->render_opengl != NULL && ! CAIRO_DOCK_IS_SEPARATOR (pPointedIcon) && pPointedIcon->iAnimationState <= CAIRO_DOCK_STATE_MOUSE_HOVERED)
400
if (pPointedIcon != NULL /**&& pDock->pRenderer->render_opengl != NULL */&& ! CAIRO_DOCK_ICON_TYPE_IS_SEPARATOR (pPointedIcon)/** && pPointedIcon->iAnimationState <= CAIRO_DOCK_STATE_MOUSE_HOVERED*/)
349
402
gboolean bStartAnimation = FALSE;
350
cairo_dock_notify_on_container (CAIRO_CONTAINER (pDock), CAIRO_DOCK_ENTER_ICON, pPointedIcon, pDock, &bStartAnimation);
403
cairo_dock_notify_on_object (&myContainersMgr, NOTIFICATION_ENTER_ICON, pPointedIcon, pDock, &bStartAnimation);
404
cairo_dock_notify_on_object (CAIRO_CONTAINER (pDock), NOTIFICATION_ENTER_ICON, pPointedIcon, pDock, &bStartAnimation);
352
406
if (bStartAnimation)
403
//g_print ("deplacement de %s vers la gauche (%.2f / %d)\n", icon->cName, icon->fDrawX + icon->fWidth * (1+myIcons.fAmplitude) + myIcons.iIconGap, pDock->container.iMouseX);
404
if (icon->fXAtRest < pMovingicon->fXAtRest && icon->fDrawX + icon->fWidth * (1+myIcons.fAmplitude) + myIcons.iIconGap >= pDock->container.iMouseX && icon->fGlideOffset == 0) // icone entre l'icone deplacee et le curseur.
457
//g_print ("deplacement de %s vers la gauche (%.2f / %d)\n", icon->cName, icon->fDrawX + icon->fWidth * (1+myIconsParam.fAmplitude) + myIconsParam.iIconGap, pDock->container.iMouseX);
458
if (icon->fXAtRest < pMovingicon->fXAtRest && icon->fDrawX + icon->fWidth * (1+myIconsParam.fAmplitude) + myIconsParam.iIconGap >= pDock->container.iMouseX && icon->fGlideOffset == 0) // icone entre l'icone deplacee et le curseur.
406
460
//g_print (" %s glisse vers la droite\n", icon->cName);
407
461
icon->iGlideDirection = 1;
409
else if (icon->fXAtRest < pMovingicon->fXAtRest && icon->fDrawX + icon->fWidth * (1+myIcons.fAmplitude) + myIcons.iIconGap <= pDock->container.iMouseX && icon->fGlideOffset != 0)
463
else if (icon->fXAtRest < pMovingicon->fXAtRest && icon->fDrawX + icon->fWidth * (1+myIconsParam.fAmplitude) + myIconsParam.iIconGap <= pDock->container.iMouseX && icon->fGlideOffset != 0)
411
465
//g_print (" %s glisse vers la gauche\n", icon->cName);
412
466
icon->iGlideDirection = -1;
435
489
//g_print ("%s (%d,%d) (%d, %.2fms, bAtBottom:%d; bIsShrinkingDown:%d)\n", __func__, (int) pMotion->x, (int) pMotion->y, pMotion->is_hint, pMotion->time - fLastTime, pDock->bAtBottom, pDock->bIsShrinkingDown);
436
490
//\_______________ On deplace le dock si ALT est enfoncee.
437
if ((pMotion->state & (GDK_CONTROL_MASK | GDK_MOD1_MASK)) && (pMotion->state & GDK_BUTTON1_MASK))
491
if ((pMotion->state & GDK_MOD1_MASK) && (pMotion->state & GDK_BUTTON1_MASK))
439
493
if (pDock->container.bIsHorizontal)
484
538
//\_______________ On recalcule toutes les icones et on redessine.
485
539
pPointedIcon = cairo_dock_calculate_dock_icons (pDock);
540
//g_print ("pPointedIcon: %s\n", pPointedIcon?pPointedIcon->cName:"none");
486
541
gtk_widget_queue_draw (pWidget);
487
542
fLastTime = pMotion->time;
489
544
//\_______________ On tire l'icone cliquee.
490
if (s_pIconClicked != NULL && s_pIconClicked->iAnimationState != CAIRO_DOCK_STATE_REMOVE_INSERT && ! myAccessibility.bLockIcons && ! myAccessibility.bLockAll && (fabs (pMotion->x - s_iClickX) > CD_CLICK_ZONE || fabs (pMotion->y - s_iClickY) > CD_CLICK_ZONE) && ! pDock->bPreventDraggingIcons)
545
if (s_pIconClicked != NULL && s_pIconClicked->iAnimationState != CAIRO_DOCK_STATE_REMOVE_INSERT && ! myDocksParam.bLockIcons && ! myDocksParam.bLockAll && (fabs (pMotion->x - s_iClickX) > CD_CLICK_ZONE || fabs (pMotion->y - s_iClickY) > CD_CLICK_ZONE) && ! pDock->bPreventDraggingIcons)
492
547
s_bIconDragged = TRUE;
493
548
s_pIconClicked->iAnimationState = CAIRO_DOCK_STATE_FOLLOW_MOUSE;
494
549
//pDock->fAvoidingMouseMargin = .5;
495
pDock->iAvoidingMouseIconType = s_pIconClicked->iType; // on pourrait le faire lors du clic aussi.
496
s_pIconClicked->fScale = 1 + myIcons.fAmplitude * pDock->fMagnitudeMax;
550
pDock->iAvoidingMouseIconType = s_pIconClicked->iGroup; // on pourrait le faire lors du clic aussi.
551
s_pIconClicked->fScale = 1 + myIconsParam.fAmplitude * pDock->fMagnitudeMax;
497
552
s_pIconClicked->fDrawX = pDock->container.iMouseX - s_pIconClicked->fWidth * s_pIconClicked->fScale / 2;
498
553
s_pIconClicked->fDrawY = pDock->container.iMouseY - s_pIconClicked->fHeight * s_pIconClicked->fScale / 2 ;
499
554
s_pIconClicked->fAlpha = 0.75;
500
if (myIcons.fAmplitude == 0)
555
if (myIconsParam.fAmplitude == 0)
501
556
gtk_widget_queue_draw (pWidget);
537
592
//\_______________ On notifie tout le monde.
538
cairo_dock_notify_on_container (CAIRO_CONTAINER (pDock), CAIRO_DOCK_MOUSE_MOVED, pDock, &bStartAnimation);
593
cairo_dock_notify_on_object (&myContainersMgr, NOTIFICATION_MOUSE_MOVED, pDock, &bStartAnimation);
594
cairo_dock_notify_on_object (CAIRO_CONTAINER (pDock), NOTIFICATION_MOUSE_MOVED, pDock, &bStartAnimation);
539
595
if (bStartAnimation)
540
596
cairo_dock_launch_animation (CAIRO_CONTAINER (pDock));
601
gboolean cairo_dock_on_leave_dock_notification2 (gpointer data, CairoDock *pDock, gboolean *bStartAnimation)
603
//\_______________ On gere le drag d'une icone hors du dock.
604
if (s_pIconClicked != NULL
605
&& (CAIRO_DOCK_ICON_TYPE_IS_LAUNCHER (s_pIconClicked)
606
|| CAIRO_DOCK_ICON_TYPE_IS_CONTAINER (s_pIconClicked)
607
|| (CAIRO_DOCK_ICON_TYPE_IS_SEPARATOR (s_pIconClicked) && s_pIconClicked->cDesktopFileName)
608
|| CAIRO_DOCK_IS_DETACHABLE_APPLET (s_pIconClicked))
609
&& s_pFlyingContainer == NULL
610
&& ! myDocksParam.bLockIcons
611
&& ! myDocksParam.bLockAll
612
&& ! pDock->bPreventDraggingIcons)
614
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);
616
//if (! cairo_dock_hide_child_docks (pDock)) // on quitte si on entre dans un sous-dock, pour rester en position "haute".
619
CairoDock *pOriginDock = cairo_dock_search_dock_from_name (s_pIconClicked->cParentDockName);
620
g_return_val_if_fail (pOriginDock != NULL, TRUE);
621
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.
623
cd_debug (" on detache l'icone");
624
pOriginDock->bIconIsFlyingAway = TRUE;
625
gchar *cParentDockName = s_pIconClicked->cParentDockName;
626
s_pIconClicked->cParentDockName = NULL;
627
cairo_dock_detach_icon_from_dock (s_pIconClicked, pOriginDock, TRUE);
628
s_pIconClicked->cParentDockName = cParentDockName;
629
cairo_dock_update_dock_size (pOriginDock);
630
cairo_dock_stop_icon_glide (pOriginDock);
632
s_pFlyingContainer = cairo_dock_create_flying_container (s_pIconClicked, pOriginDock, TRUE);
633
//g_print ("- s_pIconClicked <- NULL\n");
634
s_pIconClicked = NULL;
635
if (pDock->iRefCount > 0 || pDock->bAutoHide) // pour garder le dock visible.
637
return CAIRO_DOCK_INTERCEPT_NOTIFICATION;
641
else if (s_pFlyingContainer != NULL && s_pFlyingContainer->pIcon != NULL && pDock->iRefCount > 0) // on evite les bouclages.
643
CairoDock *pOriginDock = cairo_dock_search_dock_from_name (s_pFlyingContainer->pIcon->cParentDockName);
644
if (pOriginDock == pDock)
645
return CAIRO_DOCK_INTERCEPT_NOTIFICATION;
647
return CAIRO_DOCK_LET_PASS_NOTIFICATION;
545
649
gboolean cairo_dock_on_leave_dock_notification (gpointer data, CairoDock *pDock, gboolean *bStartAnimation)
547
651
//\_______________ Arrive ici, on est sorti du dock.
553
657
if (! cairo_dock_hide_child_docks (pDock)) // on quitte si l'un des sous-docks reste visible (on est entre dedans), pour rester en position "haute".
556
if (s_iSidShowSubDockDemand != 0 && pDock->iRefCount == 0) // si l'un des sous-docks etait programme pour se montrer, on annule.
660
if (s_iSidShowSubDockDemand != 0 && (pDock->iRefCount == 0 || s_pSubDockShowing == pDock)) // si ce dock ou l'un des sous-docks etait programme pour se montrer, on annule.
558
662
g_source_remove (s_iSidShowSubDockDemand);
559
663
s_iSidShowSubDockDemand = 0;
560
664
s_pDockShowingSubDock = NULL;
665
s_pSubDockShowing = NULL;
562
668
/// position de la souris
564
670
//g_print ("%s (%d, %d)\n", __func__, pDock->iRefCount, pDock->bMenuVisible);
568
674
return CAIRO_DOCK_INTERCEPT_NOTIFICATION;
570
676
//\_______________ On gere le drag d'une icone hors du dock.
571
if (s_pIconClicked != NULL && (CAIRO_DOCK_IS_LAUNCHER (s_pIconClicked) || CAIRO_DOCK_IS_DETACHABLE_APPLET (s_pIconClicked)/** || CAIRO_DOCK_IS_USER_SEPARATOR(s_pIconClicked)*/) && s_pFlyingContainer == NULL && ! myAccessibility.bLockIcons && ! myAccessibility.bLockAll && ! pDock->bPreventDraggingIcons)
677
if (s_pIconClicked != NULL
678
&& (CAIRO_DOCK_ICON_TYPE_IS_LAUNCHER (s_pIconClicked)
679
|| CAIRO_DOCK_ICON_TYPE_IS_CONTAINER (s_pIconClicked)
680
|| (CAIRO_DOCK_ICON_TYPE_IS_SEPARATOR (s_pIconClicked) && s_pIconClicked->cDesktopFileName)
681
|| CAIRO_DOCK_IS_DETACHABLE_APPLET (s_pIconClicked))
682
&& s_pFlyingContainer == NULL
683
&& ! myDocksParam.bLockIcons
684
&& ! myDocksParam.bLockAll
685
&& ! pDock->bPreventDraggingIcons)
573
687
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);
610
724
//g_print ("%s (auto-hide:%d)\n", __func__, pDock->bAutoHide);
611
725
if (pDock->bAutoHide)
613
///pDock->fFoldingFactor = (mySystem.bAnimateOnAutoHide ? 0.001 : 0.);
727
///pDock->fFoldingFactor = (myBackendsParam.bAnimateOnAutoHide ? 0.001 : 0.);
614
728
cairo_dock_start_hiding (pDock);
617
731
else if (pDock->icons != NULL)
619
pDock->fFoldingFactor = (mySystem.bAnimateSubDock ? 0.001 : 0.);
733
pDock->fFoldingFactor = (myDocksParam.bAnimateSubDock ? 0.001 : 0.);
620
734
Icon *pIcon = cairo_dock_search_icon_pointing_on_dock (pDock, NULL);
621
735
//g_print ("'%s' se replie\n", pIcon?pIcon->cName:"none");
622
cairo_dock_notify_on_icon (pIcon, CAIRO_DOCK_UNFOLD_SUBDOCK, pIcon);
736
cairo_dock_notify_on_object (&myIconsMgr, NOTIFICATION_UNFOLD_SUBDOCK, pIcon);
737
cairo_dock_notify_on_object (pIcon, NOTIFICATION_UNFOLD_SUBDOCK, pIcon);
739
//g_print ("start shrinking\n");
624
740
cairo_dock_start_shrinking (pDock); // on commence a faire diminuer la taille des icones.
625
741
return CAIRO_DOCK_LET_PASS_NOTIFICATION;
648
765
pDock->container.iMouseX = pEvent->y;
649
766
pDock->container.iMouseY = pEvent->x;
651
if (!_mouse_is_really_outside(pDock))
771
//g_print ("forced leave event: %d;%d\n", pDock->container.iMouseX, pDock->container.iMouseY);
773
if (!_mouse_is_really_outside(pDock))
775
//g_print ("not really outside (%d;%d ; %d/%d)\n", pDock->container.iMouseX, pDock->container.iMouseY, pDock->iMaxDockHeight, pDock->iMinDockHeight);
776
if (pDock->iSidTestMouseOutside == 0 && pEvent) // 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.
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);
778
//g_print ("start checking mouse\n");
779
pDock->iSidTestMouseOutside = g_timeout_add (500, (GSourceFunc)_check_mouse_outside, pDock);
781
//g_print ("mouse: %d;%d\n", pDock->container.iMouseX, pDock->container.iMouseY);
662
785
//\_______________ On retarde la sortie.
670
793
Icon *pPointedIcon = cairo_dock_get_pointed_icon (pDock->icons);
671
794
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);
796
//g_print (" on retarde la sortie du dock de %dms\n", MAX (myDocksParam.iLeaveSubDockDelay, 330));
797
pDock->iSidLeaveDemand = g_timeout_add (MAX (myDocksParam.iLeaveSubDockDelay, 330), (GSourceFunc) _emit_leave_signal_delayed, (gpointer) pDock);
678
else if (myAccessibility.iLeaveSubDockDelay != 0) // cas d'un sous-dock : on retarde le cachage.
801
else if (myDocksParam.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);
803
//g_print (" on retarde la sortie du sous-dock de %dms\n", myDocksParam.iLeaveSubDockDelay);
804
pDock->iSidLeaveDemand = g_timeout_add (myDocksParam.iLeaveSubDockDelay, (GSourceFunc) _emit_leave_signal_delayed, (gpointer) pDock);
711
834
pDock->container.iMouseY = pEvent->x;
837
//g_print (" notify leave...\n");
715
839
gboolean bStartAnimation = FALSE;
716
cairo_dock_notify_on_container (CAIRO_CONTAINER (pDock), CAIRO_DOCK_LEAVE_DOCK, pDock, &bStartAnimation);
840
cairo_dock_notify_on_object (&myDocksMgr, NOTIFICATION_LEAVE_DOCK, pDock, &bStartAnimation);
841
cairo_dock_notify_on_object (pDock, NOTIFICATION_LEAVE_DOCK, pDock, &bStartAnimation);
717
842
if (bStartAnimation)
718
843
cairo_dock_launch_animation (CAIRO_CONTAINER (pDock));
848
gboolean cairo_dock_on_enter_notification (gpointer pData, CairoDock *pDock, gboolean *bStartAnimation)
850
// si on rentre avec une icone volante, on la met dedans.
851
if (s_pFlyingContainer != NULL)
853
Icon *pFlyingIcon = s_pFlyingContainer->pIcon;
854
if (pDock != pFlyingIcon->pSubDock) // on evite les boucles.
857
int r = gettimeofday (&tv, NULL);
858
double t = tv.tv_sec + tv.tv_usec * 1e-6;
859
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.
861
cd_debug ("on remet l'icone volante dans un dock (dock d'origine : %s)\n", pFlyingIcon->cParentDockName);
862
cairo_dock_free_flying_container (s_pFlyingContainer);
863
cairo_dock_stop_icon_animation (pFlyingIcon);
864
cairo_dock_insert_icon_in_dock (pFlyingIcon, pDock, CAIRO_DOCK_UPDATE_DOCK_SIZE, CAIRO_DOCK_ANIMATE_ICON);
865
cairo_dock_start_icon_animation (pFlyingIcon, pDock);
866
s_pFlyingContainer = NULL;
867
pDock->bIconIsFlyingAway = FALSE;
872
return CAIRO_DOCK_LET_PASS_NOTIFICATION;
723
874
gboolean cairo_dock_on_enter_notify (GtkWidget* pWidget, GdkEventCrossing* pEvent, CairoDock *pDock)
725
876
//g_print ("%s (bIsMainDock : %d; bInside:%d; state:%d; iMagnitudeIndex:%d; input shape:%x; event:%ld)\n", __func__, pDock->bIsMainDock, pDock->container.bInside, pDock->iInputState, pDock->iMagnitudeIndex, pDock->pShapeBitmap, pEvent);
778
929
pDock->container.bInside = TRUE;
779
930
// animation d'entree.
780
931
gboolean bStartAnimation = FALSE;
781
cairo_dock_notify (CAIRO_DOCK_ENTER_DOCK, pDock, &bStartAnimation);
932
cairo_dock_notify_on_object (&myDocksMgr, NOTIFICATION_ENTER_DOCK, pDock, &bStartAnimation);
933
cairo_dock_notify_on_object (pDock, NOTIFICATION_ENTER_DOCK, pDock, &bStartAnimation);
782
934
if (bStartAnimation)
783
935
cairo_dock_launch_animation (CAIRO_CONTAINER (pDock));
830
Icon *icon = cairo_dock_get_pointed_icon (pDock->icons);
833
//g_print (">>> we've just entered the dock, pointed icon becomes NULL\n");
834
if (_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.
835
icon->bPointed = FALSE; // sinon on ne detecte pas l'arrive sur l'icone, c'est genant si elle a un sous-dock.
837
// cd_debug (">>> we already are inside the dock, why does this stupid WM make us enter one more time ???\n");
984
Icon *icon = cairo_dock_get_pointed_icon (pDock->icons);
987
//g_print (">>> we've just entered the dock, pointed icon becomes NULL\n");
988
if (_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.
990
icon->bPointed = FALSE; // sinon on ne detecte pas l'arrive sur l'icone, c'est genant si elle a un sous-dock.
993
// cd_debug (">>> we already are inside the dock, why does this stupid WM make us enter one more time ???\n");
840
996
// on lance le grossissement.
841
997
cairo_dock_start_growing (pDock);
848
1004
GdkEventKey *pKey,
849
1005
CairoDock *pDock)
851
g_print ("on a appuye sur une touche (%d)\n", pKey->keyval);
1007
cd_debug ("on a appuye sur une touche (%d)", pKey->keyval);
852
1008
if (pKey->type == GDK_KEY_PRESS)
854
cairo_dock_notify (CAIRO_DOCK_KEY_PRESSED, pDock, pKey->keyval, pKey->state, pKey->string);
1010
cairo_dock_notify_on_object (&myContainersMgr, NOTIFICATION_KEY_PRESSED, pDock, pKey->keyval, pKey->state, pKey->string);
1011
cairo_dock_notify_on_object (CAIRO_CONTAINER (pDock), NOTIFICATION_KEY_PRESSED, pDock, pKey->keyval, pKey->state, pKey->string);
856
1013
else if (pKey->type == GDK_KEY_RELEASE)
858
1015
//g_print ("release : pKey->keyval = %d\n", pKey->keyval);
859
if ((pKey->state & (GDK_CONTROL_MASK | GDK_MOD1_MASK)) && pKey->keyval == 0) // On relache la touche ALT, typiquement apres avoir fait un ALT + clique gauche + deplacement.
1016
if ((pKey->state & GDK_MOD1_MASK) && pKey->keyval == 0) // On relache la touche ALT, typiquement apres avoir fait un ALT + clique gauche + deplacement.
861
if (pDock->iRefCount == 0)
1018
if (pDock->iRefCount == 0 && pDock->iVisibility != CAIRO_DOCK_VISI_SHORTKEY)
862
1019
cairo_dock_write_root_dock_gaps (pDock);
1026
static gboolean _double_click_delay_over (Icon *icon)
1028
CairoDock *pDock = cairo_dock_search_dock_from_name (icon->cParentDockName);
1031
cairo_dock_notify_on_object (&myContainersMgr, NOTIFICATION_CLICK_ICON, icon, pDock, GDK_BUTTON1_MASK);
1032
cairo_dock_notify_on_object (CAIRO_CONTAINER (pDock), NOTIFICATION_CLICK_ICON, icon, pDock, GDK_BUTTON1_MASK);
1033
if (myDocksParam.cRaiseDockShortcut != NULL)
1034
s_bHideAfterShortcut = TRUE;
1036
cairo_dock_start_icon_animation (icon, pDock);
1038
icon->bIsDemandingAttention = FALSE; // on considere que si l'utilisateur clique sur l'icone, c'est qu'il a pris acte de la notification.
1039
icon->iSidDoubleClickDelay = 0;
868
1042
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);
1044
cd_debug ("%s (%d, %d, %d)\n", __func__, pDock->bIsShrinkingDown, pDock->iMagnitudeIndex, pDock->container.bInside);
871
1045
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
1047
pDock->iSidTestMouseOutside = 0;
877
1051
gdk_window_get_pointer (pDock->container.pWidget->window, &pDock->container.iMouseX, &pDock->container.iMouseY, NULL);
879
1053
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);
1054
cd_debug (" -> (%d, %d)\n", pDock->container.iMouseX, pDock->container.iMouseY);
882
1056
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 :-/
905
1079
case GDK_BUTTON_RELEASE :
906
1080
//g_print ("+ GDK_BUTTON_RELEASE (%d/%d sur %s/%s)\n", pButton->state, GDK_CONTROL_MASK | GDK_MOD1_MASK, icon ? icon->cName : "personne", icon ? icon->cCommand : ""); // 272 = 100010000
907
if ( ! (pButton->state & (GDK_CONTROL_MASK | GDK_MOD1_MASK)))
1081
if (pDock->container.bIgnoreNextReleaseEvent)
1083
pDock->container.bIgnoreNextReleaseEvent = FALSE;
1084
s_pIconClicked = NULL;
1085
s_bIconDragged = FALSE;
1089
if ( ! (pButton->state & GDK_MOD1_MASK))
909
1091
if (s_pIconClicked != NULL)
913
1095
pDock->iAvoidingMouseIconType = -1;
914
1096
cairo_dock_stop_icon_glide (pDock);
916
if (icon != NULL && ! CAIRO_DOCK_IS_SEPARATOR (icon) && icon == s_pIconClicked)
1098
if (icon != NULL && ! CAIRO_DOCK_ICON_TYPE_IS_SEPARATOR (icon) && icon == s_pIconClicked)
918
1100
s_pIconClicked = NULL; // il faut le faire ici au cas ou le clic induirait un dialogue bloquant qui nous ferait sortir du dock par exemple.
919
1101
//g_print ("+ click on '%s' (%s)\n", icon->cName, icon->cCommand);
920
1102
if (! s_bIconDragged) // on ignore le drag'n'drop sur elle-meme.
922
cairo_dock_notify_on_container (CAIRO_CONTAINER (pDock), CAIRO_DOCK_CLICK_ICON, icon, pDock, pButton->state);
923
if (myAccessibility.cRaiseDockShortcut != NULL)
924
s_bHideAfterShortcut = TRUE;
926
cairo_dock_start_icon_animation (icon, pDock);
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);
1104
if (icon->iNbDoubleClickListeners > 0)
1106
if (icon->iSidDoubleClickDelay == 0) // 1er release.
1108
icon->iSidDoubleClickDelay = g_timeout_add (CD_DOUBLE_CLICK_DELAY, (GSourceFunc)_double_click_delay_over, icon);
1113
cairo_dock_notify_on_object (&myContainersMgr, NOTIFICATION_CLICK_ICON, icon, pDock, pButton->state);
1114
cairo_dock_notify_on_object (CAIRO_CONTAINER (pDock), NOTIFICATION_CLICK_ICON, icon, pDock, pButton->state);
1115
if (myDocksParam.cRaiseDockShortcut != NULL)
1116
s_bHideAfterShortcut = TRUE;
1118
cairo_dock_start_icon_animation (icon, pDock);
1119
icon->bIsDemandingAttention = FALSE; // on considere que si l'utilisateur clique sur l'icone, c'est qu'il a pris acte de la notification.
935
else if (s_pIconClicked != NULL && icon != NULL && icon != s_pIconClicked && ! myAccessibility.bLockIcons && ! myAccessibility.bLockAll && ! pDock->bPreventDraggingIcons) // && icon->iType == s_pIconClicked->iType
1123
else if (s_pIconClicked != NULL && icon != NULL && icon != s_pIconClicked && ! myDocksParam.bLockIcons && ! myDocksParam.bLockAll && ! pDock->bPreventDraggingIcons) // && icon->iType == s_pIconClicked->iType
937
1125
//g_print ("deplacement de %s\n", s_pIconClicked->cName);
938
1126
CairoDock *pOriginDock = CAIRO_DOCK (cairo_dock_search_container_from_icon (s_pIconClicked));
971
1159
pDock->pRenderer->calculate_icons (pDock);
973
if (! CAIRO_DOCK_IS_SEPARATOR (s_pIconClicked))
1161
if (! CAIRO_DOCK_ICON_TYPE_IS_SEPARATOR (s_pIconClicked))
975
1163
cairo_dock_request_icon_animation (s_pIconClicked, pDock, "bounce", 2);
977
if (pDock->container.iSidGLAnimation == 0 || ! CAIRO_CONTAINER_IS_OPENGL (CAIRO_CONTAINER (pDock)))
978
gtk_widget_queue_draw (pDock->container.pWidget);
1165
gtk_widget_queue_draw (pDock->container.pWidget);
981
1168
if (s_pFlyingContainer != NULL)
999
1186
pDock->bIconIsFlyingAway = FALSE;
1000
1187
cairo_dock_stop_icon_glide (pDock);
1189
/// a implementer ...
1190
///cairo_dock_notify_on_container (CAIRO_CONTAINER (pDock), CAIRO_DOCK_RELEASE_ICON, icon, pDock);
1005
if (pDock->iRefCount == 0)
1194
if (pDock->iRefCount == 0 && pDock->iVisibility != CAIRO_DOCK_VISI_SHORTKEY)
1006
1195
cairo_dock_write_root_dock_gaps (pDock);
1008
1197
//g_print ("- apres clic : s_pIconClicked <- NULL\n");
1029
1218
case GDK_2BUTTON_PRESS :
1219
if (icon && ! cairo_dock_icon_is_being_removed (icon))
1031
if (icon && ! cairo_dock_icon_is_being_removed (icon))
1032
cairo_dock_notify_on_container (CAIRO_CONTAINER (pDock), CAIRO_DOCK_DOUBLE_CLICK_ICON, icon, pDock);
1221
if (icon->iSidDoubleClickDelay != 0)
1223
g_source_remove (icon->iSidDoubleClickDelay);
1224
icon->iSidDoubleClickDelay = 0;
1226
cairo_dock_notify_on_object (&myContainersMgr, NOTIFICATION_DOUBLE_CLICK_ICON, icon, pDock);
1227
cairo_dock_notify_on_object (CAIRO_CONTAINER (pDock), NOTIFICATION_DOUBLE_CLICK_ICON, icon, pDock);
1228
if (icon->iNbDoubleClickListeners > 0)
1229
pDock->container.bIgnoreNextReleaseEvent = TRUE;
1042
1239
GtkWidget *menu = cairo_dock_build_menu (icon, CAIRO_CONTAINER (pDock)); // genere un CAIRO_DOCK_BUILD_CONTAINER_MENU et CAIRO_DOCK_BUILD_ICON_MENU.
1044
cairo_dock_popup_menu_on_container (menu, CAIRO_CONTAINER (pDock));
1241
///cairo_dock_popup_menu_on_container (menu, CAIRO_CONTAINER (pDock));
1242
cairo_dock_popup_menu_on_icon (menu, icon, CAIRO_CONTAINER (pDock));
1046
1244
else if (pButton->button == 2 && pButton->type == GDK_BUTTON_PRESS) // clique milieu.
1048
1246
if (icon && ! cairo_dock_icon_is_being_removed (icon))
1049
cairo_dock_notify_on_container (CAIRO_CONTAINER (pDock), CAIRO_DOCK_MIDDLE_CLICK_ICON, icon, pDock);
1248
cairo_dock_notify_on_object (&myContainersMgr, NOTIFICATION_MIDDLE_CLICK_ICON, icon, pDock);
1249
cairo_dock_notify_on_object (CAIRO_CONTAINER (pDock), NOTIFICATION_MIDDLE_CLICK_ICON, icon, pDock);
1062
1263
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.
1067
///pDock->iSidTestMouseOutside = g_timeout_add (500, (GSourceFunc)_check_mouse_outside, pDock);
1264
cairo_dock_notify_on_object (&myContainersMgr, NOTIFICATION_SCROLL_ICON, icon, pDock, pScroll->direction);
1265
cairo_dock_notify_on_object (CAIRO_CONTAINER (pDock), NOTIFICATION_SCROLL_ICON, icon, pDock, pScroll->direction);
1279
1476
double fMargin; /// deviendra obsolete si le drag-received fonctionne.
1280
1477
if (g_str_has_suffix (cReceivedData, ".desktop")/** || g_str_has_suffix (cReceivedData, ".sh")*/) // si c'est un .desktop, on l'ajoute.
1282
if (myAccessibility.bLockIcons || myAccessibility.bLockAll)
1479
if (myDocksParam.bLockIcons || myDocksParam.bLockAll)
1284
1481
gtk_drag_finish (dc, FALSE, FALSE, time);
1347
1544
cd_debug (" <%s>\n", cairo_dock_get_property_name_on_xwindow (Xid, xAtom));*/
1349
1546
gboolean bStartAnimation = FALSE;
1350
cairo_dock_notify (CAIRO_DOCK_START_DRAG_DATA, pDock, &bStartAnimation);
1547
cairo_dock_notify_on_object (&myContainersMgr, NOTIFICATION_START_DRAG_DATA, pDock, &bStartAnimation);
1548
cairo_dock_notify_on_object (CAIRO_CONTAINER (pDock), NOTIFICATION_START_DRAG_DATA, pDock, &bStartAnimation);
1351
1549
if (bStartAnimation)
1352
1550
cairo_dock_launch_animation (CAIRO_CONTAINER (pDock));
1407
1605
return FALSE; // on n'accepte pas le drop.
1410
g_print ("take the drop\n");
1608
//g_print ("take the drop\n");
1411
1609
gdk_drag_status (dc, GDK_ACTION_COPY, time);
1412
1610
return TRUE; // on accepte le drop.
1415
1613
void cairo_dock_on_drag_leave (GtkWidget *pWidget, GdkDragContext *dc, guint time, CairoDock *pDock)
1417
cd_debug ("stop dragging1\n");
1615
//g_print ("stop dragging 1\n");
1418
1616
Icon *icon = cairo_dock_get_pointed_icon (pDock->icons);
1419
1617
if ((icon && icon->pSubDock) || pDock->iRefCount > 0) // on retarde l'evenement, car il arrive avant le leave-event, et donc le sous-dock se cache avant qu'on puisse y entrer.
1423
1621
gtk_main_iteration ();
1424
1622
cd_debug (">>> pDock->container.bInside : %d", pDock->container.bInside);
1426
cd_debug ("stop dragging2\n");
1624
//g_print ("stop dragging 2\n");
1427
1625
s_bWaitForData = FALSE;
1428
1626
pDock->bIsDragging = FALSE;
1429
1627
pDock->bCanDrop = FALSE;
1430
1628
//cairo_dock_stop_marking_icons (pDock);
1431
1629
pDock->iAvoidingMouseIconType = -1;
1432
cairo_dock_emit_leave_signal (CAIRO_CONTAINER (pDock));
1631
// emit a leave-event signal, since we don't get one if we leave the window too quickly (!)
1632
if (pDock->iSidLeaveDemand == 0)
1634
pDock->iSidLeaveDemand = g_timeout_add (MAX (myDocksParam.iLeaveSubDockDelay, 330), (GSourceFunc) _emit_leave_signal_delayed, (gpointer) pDock); // emit with a delay, so that we can leave and enter the dock for a few ms without making it hide.
1636
// emulate a motion event so that the mouse position is up-to-date (which is not the case if we leave the window too quickly).
1637
cairo_dock_on_motion_notify (pWidget, NULL, pDock);
1441
1646
gdk_window_get_pointer (pDock->container.pWidget->window, &iMouseX, &iMouseY, NULL);
1443
1648
gdk_window_get_pointer (pDock->container.pWidget->window, &iMouseY, &iMouseX, NULL);
1444
//g_print (" %d;%d\n", iMouseX, iMouseY);
1649
cd_debug (" %d;%d", iMouseX, iMouseY);
1446
1651
///pDock->iGapX = pDock->container.iWindowPositionX + iMouseX - g_desktopGeometry.iScreenWidth[pDock->container.bIsHorizontal] * pDock->fAlign;
1447
1652
///pDock->iGapY = (pDock->container.bDirectionUp ? g_desktopGeometry.iScreenHeight[pDock->container.bIsHorizontal] - (pDock->container.iWindowPositionY + iMouseY) : pDock->container.iWindowPositionY + iMouseY);
1448
pDock->iGapX = iMouseX - (g_desktopGeometry.iScreenWidth[pDock->container.bIsHorizontal] - pDock->container.iWidth) * pDock->fAlign - pDock->iScreenOffsetX;
1449
pDock->iGapY = iMouseY - (pDock->container.bDirectionUp ? g_desktopGeometry.iScreenHeight[pDock->container.bIsHorizontal] - pDock->container.iHeight : 0) - pDock->iScreenOffsetY;
1450
//g_print (" => %d;%d\n", g_pMainDock->iGapX, g_pMainDock->iGapY);
1653
pDock->iGapX = pDock->container.iWindowPositionX + iMouseX - (g_desktopGeometry.iScreenWidth[pDock->container.bIsHorizontal] - pDock->container.iWidth) * pDock->fAlign - pDock->container.iWidth/2 - pDock->iScreenOffsetX;
1654
pDock->iGapY = (pDock->container.bDirectionUp ? g_desktopGeometry.iScreenHeight[pDock->container.bIsHorizontal] - (pDock->container.iWindowPositionY + iMouseY) : pDock->container.iWindowPositionY + iMouseY) - pDock->iScreenOffsetY;
1655
cd_debug (" => %d;%d", g_pMainDock->iGapX, g_pMainDock->iGapY);
1452
1657
int iNewPositionX, iNewPositionY;
1453
1658
cairo_dock_get_window_position_at_balance (pDock,
1454
1659
pDock->container.iWidth, pDock->container.iHeight,
1455
1660
&iNewPositionX, &iNewPositionY);
1661
cd_debug (" ==> %d;%d", iNewPositionX, iNewPositionY);
1662
if (iNewPositionX < 0)
1664
else if (iNewPositionX + pDock->container.iWidth > g_desktopGeometry.iScreenWidth[pDock->container.bIsHorizontal])
1665
iNewPositionX = g_desktopGeometry.iScreenWidth[pDock->container.bIsHorizontal] - pDock->container.iWidth;
1667
if (iNewPositionY < 0)
1669
else if (iNewPositionY + pDock->container.iHeight > g_desktopGeometry.iScreenHeight[pDock->container.bIsHorizontal])
1670
iNewPositionY = g_desktopGeometry.iScreenHeight[pDock->container.bIsHorizontal] - pDock->container.iHeight;
1457
1672
gtk_window_move (GTK_WINDOW (pDock->container.pWidget),
1458
1673
(pDock->container.bIsHorizontal ? iNewPositionX : iNewPositionY),