~ubuntu-branches/ubuntu/utopic/cairo-dock/utopic

« back to all changes in this revision

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

Tags: upstream-2.3.0~1
ImportĀ upstreamĀ versionĀ 2.3.0~1

Show diffs side-by-side

added added

removed removed

Lines of Context:
41
41
 
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;
75
75
 
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.
79
79
static int s_iSidShowSubDockDemand = 0;
80
80
static int s_iSidActionOnDragHover = 0;
81
81
static CairoDock *s_pDockShowingSubDock = NULL;  // on n'accede pas a son contenu, seulement l'adresse.
 
82
static CairoDock *s_pSubDockShowing = NULL;  // on n'accede pas a son contenu, seulement l'adresse.
82
83
static CairoFlyingContainer *s_pFlyingContainer = NULL;
83
84
 
84
85
extern CairoDock *g_pMainDock;  // pour le raise-on-shortcut
91
92
 
92
93
static gboolean _check_mouse_outside (CairoDock *pDock);
93
94
 
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)
 
96
{
 
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
 
103
                        ||
 
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)
 
107
        {
 
108
                x1 = 0;
 
109
                x2 = pDock->container.iWidth;
 
110
                if (pDock->container.bDirectionUp)
 
111
                {
 
112
                        y1 = (pDock->fMagnitudeMax != 0 ? 0 : pDock->container.iHeight - pDock->iMinDockHeight);
 
113
                        y2 = pDock->container.iHeight;
 
114
                }
 
115
                else
 
116
                {
 
117
                        y1 = 0;
 
118
                        y2 = (pDock->fMagnitudeMax != 0 ? pDock->container.iHeight : pDock->iMinDockHeight);
 
119
                }
 
120
        }
 
121
        else if (pDock->iInputState == CAIRO_DOCK_INPUT_AT_REST)
 
122
        {
 
123
                x1 = (pDock->container.iWidth - pDock->iMinDockWidth) / 2;
 
124
                x2 = (pDock->container.iWidth + pDock->iMinDockWidth) / 2;
 
125
                if (pDock->container.bDirectionUp)
 
126
                {
 
127
                        y1 = pDock->container.iHeight - pDock->iMinDockHeight;
 
128
                        y2 = pDock->container.iHeight;
 
129
                }
 
130
                else
 
131
                {
 
132
                        y1 = 0;
 
133
                        y2 = pDock->iMinDockHeight;
 
134
                }               
 
135
        }
 
136
        else
 
137
                return FALSE;
 
138
        if (pDock->container.iMouseX <= x1
 
139
        || pDock->container.iMouseX >= x2)
 
140
                return TRUE;
 
141
        if (pDock->container.iMouseY <= y1
 
142
        || pDock->container.iMouseY >= y2)
 
143
                return TRUE;    
 
144
        
 
145
        return FALSE;
 
146
}
101
147
#define CD_CLICK_ZONE 5
102
148
 
103
149
void cairo_dock_freeze_docks (gboolean bFreeze)
109
155
{
110
156
        if (! pCairoContext)  // on n'a pas mis le rendu cairo ici a cause du rendu optimise.
111
157
        {
112
 
                glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | (pDock->pRenderer->bUseStencil ? GL_STENCIL_BUFFER_BIT : 0));
 
158
                glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | (pDock->pRenderer->bUseStencil && g_openglConfig.bStencilBufferAvailable ? GL_STENCIL_BUFFER_BIT : 0));
113
159
                
114
160
                cairo_dock_apply_desktop_background_opengl (CAIRO_CONTAINER (pDock));
115
161
                
117
163
                        g_pHidingBackend->pre_render_opengl (pDock, pDock->fHideOffset);
118
164
                
119
165
                if (pDock->iFadeCounter != 0 && g_pKeepingBelowBackend != NULL && g_pKeepingBelowBackend->pre_render_opengl)
120
 
                        g_pKeepingBelowBackend->pre_render_opengl (pDock, (double) pDock->iFadeCounter / mySystem.iHideNbSteps);
 
166
                        g_pKeepingBelowBackend->pre_render_opengl (pDock, (double) pDock->iFadeCounter / myBackendsParam.iHideNbSteps);
121
167
                
122
168
                pDock->pRenderer->render_opengl (pDock);
123
169
                
125
171
                        g_pHidingBackend->post_render_opengl (pDock, pDock->fHideOffset);
126
172
                
127
173
                if (pDock->iFadeCounter != 0 && g_pKeepingBelowBackend != NULL && g_pKeepingBelowBackend->post_render_opengl)
128
 
                        g_pKeepingBelowBackend->post_render_opengl (pDock, (double) pDock->iFadeCounter / mySystem.iHideNbSteps);
 
174
                        g_pKeepingBelowBackend->post_render_opengl (pDock, (double) pDock->iFadeCounter / myBackendsParam.iHideNbSteps);
129
175
        }
130
176
        return CAIRO_DOCK_LET_PASS_NOTIFICATION;
131
177
}
164
210
                }
165
211
                else
166
212
                {
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);
168
215
                }
169
216
                glDisable (GL_SCISSOR_TEST);
170
217
                
187
234
                                g_pHidingBackend->pre_render (pDock, pDock->fHideOffset, pCairoContext);
188
235
                        
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);
191
238
                        
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);
199
246
                
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);
202
249
                        
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);
204
252
                        
205
253
                        cairo_destroy (pCairoContext);
206
254
                }
224
272
                        g_pHidingBackend->pre_render (pDock, pDock->fHideOffset, pCairoContext);
225
273
                
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);
228
276
                
229
277
                pDock->pRenderer->render (pCairoContext, pDock);
230
278
                
232
280
                        g_pHidingBackend->post_render (pDock, pDock->fHideOffset, pCairoContext);
233
281
                
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);
236
284
                
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);
238
287
        }
239
288
        
240
289
        cairo_destroy (pCairoContext);
257
306
{
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)
273
323
{
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.
276
326
        pIcon = data[1];
277
327
        if (pIcon && pIcon->iface.action_on_drag_hover)
278
328
                pIcon->iface.action_on_drag_hover (pIcon);
281
331
}
282
332
void cairo_dock_on_change_icon (Icon *pLastPointedIcon, Icon *pPointedIcon, CairoDock *pDock)
283
333
{
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)
287
337
        {
289
339
                g_source_remove (s_iSidShowSubDockDemand);
290
340
                s_iSidShowSubDockDemand = 0;
291
341
                s_pDockShowingSubDock = NULL;
 
342
                s_pSubDockShowing = NULL;
292
343
        }
293
344
        
294
345
        if (s_iSidActionOnDragHover != 0)
297
348
                g_source_remove (s_iSidActionOnDragHover);
298
349
                s_iSidActionOnDragHover = 0;
299
350
        }
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)
302
354
        {
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)
314
366
                        {
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.
317
369
                        }
318
370
                }
319
371
        }
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.
321
373
        {
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;
327
379
                }
328
 
                if (myAccessibility.iShowSubDockDelay > 0)
 
380
                if (myDocksParam.iShowSubDockDelay > 0)
329
381
                {
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);
336
389
                }
337
390
                else
344
397
                //g_print ("pLastPointedDock n'est plus null\n");
345
398
                s_pLastPointedDock = pDock;
346
399
        }
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*/)
348
401
        {
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);
351
405
                
352
406
                if (bStartAnimation)
353
407
                {
400
454
                }
401
455
                else
402
456
                {
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.
405
459
                        {
406
460
                                //g_print ("  %s glisse vers la droite\n", icon->cName);
407
461
                                icon->iGlideDirection = 1;
408
462
                        }
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)
410
464
                        {
411
465
                                //g_print ("  %s glisse vers la gauche\n", icon->cName);
412
466
                                icon->iGlideDirection = -1;
434
488
        {
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))
438
492
                {
439
493
                        if (pDock->container.bIsHorizontal)
440
494
                        {
475
529
                }
476
530
                
477
531
                //\_______________ On elague le flux des MotionNotify, sinon X en envoie autant que le permet le CPU !
478
 
                if (pMotion->time != 0 && pMotion->time - fLastTime < mySystem.fRefreshInterval && s_pIconClicked == NULL)
 
532
                if (pMotion->time != 0 && pMotion->time - fLastTime < myBackendsParam.fRefreshInterval && s_pIconClicked == NULL)
479
533
                {
480
534
                        gdk_device_get_state (pMotion->device, pMotion->window, NULL, NULL);
481
535
                        return FALSE;
483
537
                
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;
488
543
                
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)
491
546
                {
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);
502
557
                }
503
558
 
527
582
        {
528
583
                cairo_dock_on_change_icon (pLastPointedIcon, pPointedIcon, pDock);
529
584
                
530
 
                if (pPointedIcon != NULL && s_pIconClicked != NULL && cairo_dock_get_icon_order (s_pIconClicked) == cairo_dock_get_icon_order (pPointedIcon) && ! myAccessibility.bLockIcons && ! myAccessibility.bLockAll && ! pDock->bPreventDraggingIcons)
 
585
                if (pPointedIcon != NULL && s_pIconClicked != NULL && cairo_dock_get_icon_order (s_pIconClicked) == cairo_dock_get_icon_order (pPointedIcon) && ! myDocksParam.bLockIcons && ! myDocksParam.bLockAll && ! pDock->bPreventDraggingIcons)
531
586
                {
532
587
                        _cairo_dock_make_icon_glide (pPointedIcon, s_pIconClicked, pDock);
533
588
                        bStartAnimation = TRUE;
535
590
        }
536
591
        
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));
541
597
        
542
598
        return FALSE;
543
599
}
544
600
 
 
601
gboolean cairo_dock_on_leave_dock_notification2 (gpointer data, CairoDock *pDock, gboolean *bStartAnimation)
 
602
{
 
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)
 
613
        {
 
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);
 
615
                
 
616
                //if (! cairo_dock_hide_child_docks (pDock))  // on quitte si on entre dans un sous-dock, pour rester en position "haute".
 
617
                //      return ;
 
618
                
 
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.
 
622
                {
 
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);
 
631
                        
 
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.
 
636
                        {
 
637
                                return CAIRO_DOCK_INTERCEPT_NOTIFICATION;
 
638
                        }
 
639
                }
 
640
        }
 
641
        else if (s_pFlyingContainer != NULL && s_pFlyingContainer->pIcon != NULL && pDock->iRefCount > 0)  // on evite les bouclages.
 
642
        {
 
643
                CairoDock *pOriginDock = cairo_dock_search_dock_from_name (s_pFlyingContainer->pIcon->cParentDockName);
 
644
                if (pOriginDock == pDock)
 
645
                        return CAIRO_DOCK_INTERCEPT_NOTIFICATION;
 
646
        }
 
647
        return CAIRO_DOCK_LET_PASS_NOTIFICATION;
 
648
}
545
649
gboolean cairo_dock_on_leave_dock_notification (gpointer data, CairoDock *pDock, gboolean *bStartAnimation)
546
650
{
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".
554
658
                return TRUE;
555
659
        
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.
557
661
        {
558
662
                g_source_remove (s_iSidShowSubDockDemand);
559
663
                s_iSidShowSubDockDemand = 0;
560
664
                s_pDockShowingSubDock = NULL;
 
665
                s_pSubDockShowing = NULL;
561
666
        }
 
667
        
562
668
        /// position de la souris
563
669
        
564
670
        //g_print ("%s (%d, %d)\n", __func__, pDock->iRefCount, pDock->bMenuVisible);
568
674
                return CAIRO_DOCK_INTERCEPT_NOTIFICATION;
569
675
        
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)
572
686
        {
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);
574
688
                
610
724
                //g_print ("%s (auto-hide:%d)\n", __func__, pDock->bAutoHide);
611
725
                if (pDock->bAutoHide)
612
726
                {
613
 
                        ///pDock->fFoldingFactor = (mySystem.bAnimateOnAutoHide ? 0.001 : 0.);
 
727
                        ///pDock->fFoldingFactor = (myBackendsParam.bAnimateOnAutoHide ? 0.001 : 0.);
614
728
                        cairo_dock_start_hiding (pDock);
615
729
                }
616
730
        }
617
731
        else if (pDock->icons != NULL)
618
732
        {
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);
623
738
        }
 
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;
626
742
}
630
746
{
631
747
        //g_print ("%s (bInside:%d; iState:%d; iRefCount:%d)\n", __func__, pDock->container.bInside, pDock->iInputState, pDock->iRefCount);
632
748
        //\_______________ On tire le dock => on ignore le signal.
633
 
        if (pEvent != NULL && (pEvent->state & (GDK_CONTROL_MASK | GDK_MOD1_MASK)) && (pEvent->state & GDK_BUTTON1_MASK))
 
749
        if (pEvent != NULL && (pEvent->state & GDK_MOD1_MASK) && (pEvent->state & GDK_BUTTON1_MASK))
634
750
        {
635
751
                return FALSE;
636
752
        }
638
754
        //\_______________ On ignore les signaux errones venant d'un WM buggue (Kwin) ou meme de X (changement de bureau).
639
755
        if (pEvent)
640
756
        {
 
757
                //g_print ("leave event: %d;%d\n", (int)pEvent->x, (int)pEvent->y);
641
758
                if (pDock->container.bIsHorizontal)
642
759
                {
643
760
                        pDock->container.iMouseX = pEvent->x;
648
765
                        pDock->container.iMouseX = pEvent->y;
649
766
                        pDock->container.iMouseY = pEvent->x;
650
767
                }
651
 
                if (!_mouse_is_really_outside(pDock))
 
768
        }
 
769
        else
 
770
        {
 
771
                //g_print ("forced leave event: %d;%d\n", pDock->container.iMouseX, pDock->container.iMouseY);
 
772
        }
 
773
        if (!_mouse_is_really_outside(pDock))
 
774
        {
 
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.
652
777
                {
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
 
                        }
658
 
                        return FALSE;
 
778
                        //g_print ("start checking mouse\n");
 
779
                        pDock->iSidTestMouseOutside = g_timeout_add (500, (GSourceFunc)_check_mouse_outside, pDock);
659
780
                }
 
781
                //g_print ("mouse: %d;%d\n", pDock->container.iMouseX, pDock->container.iMouseY);
 
782
                return FALSE;
660
783
        }
661
784
        
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))
672
795
                                {
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);
675
798
                                        return TRUE;
676
799
                                }
677
800
                        }
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.
679
802
                        {
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);
682
805
                                return TRUE;
683
806
                        }
684
807
                }
711
834
                        pDock->container.iMouseY = pEvent->x;
712
835
                }
713
836
        }
 
837
        //g_print (" notify leave...\n");
714
838
        
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));
719
844
        
720
845
        return TRUE;
721
846
}
722
847
 
 
848
gboolean cairo_dock_on_enter_notification (gpointer pData, CairoDock *pDock, gboolean *bStartAnimation)
 
849
{
 
850
        // si on rentre avec une icone volante, on la met dedans.
 
851
        if (s_pFlyingContainer != NULL)
 
852
        {
 
853
                Icon *pFlyingIcon = s_pFlyingContainer->pIcon;
 
854
                if (pDock != pFlyingIcon->pSubDock)  // on evite les boucles.
 
855
                {
 
856
                        struct timeval tv;
 
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.
 
860
                        {
 
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;
 
868
                        }
 
869
                }
 
870
        }
 
871
        
 
872
        return CAIRO_DOCK_LET_PASS_NOTIFICATION;
 
873
}
723
874
gboolean cairo_dock_on_enter_notify (GtkWidget* pWidget, GdkEventCrossing* pEvent, CairoDock *pDock)
724
875
{
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));
784
936
        
787
939
        
788
940
        if (s_pIconClicked != NULL)  // on pourrait le faire a chaque motion aussi.
789
941
        {
790
 
                pDock->iAvoidingMouseIconType = s_pIconClicked->iType;
 
942
                pDock->iAvoidingMouseIconType = s_pIconClicked->iGroup;
791
943
                pDock->fAvoidingMouseMargin = .5;  /// inutile il me semble ...
792
944
        }
793
945
        
827
979
        }
828
980
        
829
981
        // cas special.
830
 
        Icon *icon = cairo_dock_get_pointed_icon (pDock->icons);
831
 
        if (icon != NULL)
 
982
        if (pEvent != NULL)
832
983
        {
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.
836
 
                //else
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);
 
985
                if (icon != NULL)
 
986
                {
 
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.
 
989
                        {
 
990
                                icon->bPointed = FALSE;  // sinon on ne detecte pas l'arrive sur l'icone, c'est genant si elle a un sous-dock.
 
991
                        }
 
992
                        //else
 
993
                        //      cd_debug (">>> we already are inside the dock, why does this stupid WM make us enter one more time ???\n");
 
994
                }
838
995
        }
839
 
        
840
996
        // on lance le grossissement.
841
997
        cairo_dock_start_growing (pDock);
842
998
        
848
1004
        GdkEventKey *pKey,
849
1005
        CairoDock *pDock)
850
1006
{
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)
853
1009
        {
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);
855
1012
        }
856
1013
        else if (pKey->type == GDK_KEY_RELEASE)
857
1014
        {
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.
860
1017
                {
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);
863
1020
                }
864
1021
        }
865
1022
        return TRUE;
866
1023
}
867
1024
 
 
1025
 
 
1026
static gboolean _double_click_delay_over (Icon *icon)
 
1027
{
 
1028
        CairoDock *pDock = cairo_dock_search_dock_from_name (icon->cParentDockName);
 
1029
        if (pDock)
 
1030
        {
 
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;
 
1035
                
 
1036
                cairo_dock_start_icon_animation (icon, pDock);
 
1037
        }
 
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;
 
1040
        return FALSE;
 
1041
}
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.
869
1043
{
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.
872
1046
        {
873
1047
                pDock->iSidTestMouseOutside = 0;
877
1051
                gdk_window_get_pointer (pDock->container.pWidget->window, &pDock->container.iMouseX, &pDock->container.iMouseY, NULL);
878
1052
        else
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);
881
1055
        
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 :-/
883
1057
        return TRUE;
904
1078
                {
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)
 
1082
                                {
 
1083
                                        pDock->container.bIgnoreNextReleaseEvent = FALSE;
 
1084
                                        s_pIconClicked = NULL;
 
1085
                                        s_bIconDragged = FALSE;
 
1086
                                        return TRUE;
 
1087
                                }
 
1088
                                
 
1089
                                if ( ! (pButton->state & GDK_MOD1_MASK))
908
1090
                                {
909
1091
                                        if (s_pIconClicked != NULL)
910
1092
                                        {
913
1095
                                                pDock->iAvoidingMouseIconType = -1;
914
1096
                                                cairo_dock_stop_icon_glide (pDock);
915
1097
                                        }
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)
917
1099
                                        {
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.
921
1103
                                                {
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;
925
 
                                                        
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.
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);
 
1104
                                                        if (icon->iNbDoubleClickListeners > 0)
 
1105
                                                        {
 
1106
                                                                if (icon->iSidDoubleClickDelay == 0)  // 1er release.
 
1107
                                                                {
 
1108
                                                                        icon->iSidDoubleClickDelay = g_timeout_add (CD_DOUBLE_CLICK_DELAY, (GSourceFunc)_double_click_delay_over, icon);
 
1109
                                                                }
 
1110
                                                        }
 
1111
                                                        else
 
1112
                                                        {
 
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;
 
1117
                                                                
 
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.
932
1120
                                                        }
933
1121
                                                }
934
1122
                                        }
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
936
1124
                                        {
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));
970
1158
 
971
1159
                                                pDock->pRenderer->calculate_icons (pDock);
972
1160
 
973
 
                                                if (! CAIRO_DOCK_IS_SEPARATOR (s_pIconClicked))
 
1161
                                                if (! CAIRO_DOCK_ICON_TYPE_IS_SEPARATOR (s_pIconClicked))
974
1162
                                                {
975
1163
                                                        cairo_dock_request_icon_animation (s_pIconClicked, pDock, "bounce", 2);
976
1164
                                                }
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);
979
1166
                                        }
980
1167
                                        
981
1168
                                        if (s_pFlyingContainer != NULL)
999
1186
                                                pDock->bIconIsFlyingAway = FALSE;
1000
1187
                                                cairo_dock_stop_icon_glide (pDock);
1001
1188
                                        }
 
1189
                                        /// a implementer ...
 
1190
                                        ///cairo_dock_notify_on_container (CAIRO_CONTAINER (pDock), CAIRO_DOCK_RELEASE_ICON, icon, pDock);
1002
1191
                                }
1003
1192
                                else
1004
1193
                                {
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);
1007
1196
                                }
1008
1197
                                //g_print ("- apres clic : s_pIconClicked <- NULL\n");
1011
1200
                        break ;
1012
1201
                        
1013
1202
                        case GDK_BUTTON_PRESS :
1014
 
                                if ( ! (pButton->state & (GDK_CONTROL_MASK | GDK_MOD1_MASK)))
 
1203
                                if ( ! (pButton->state & GDK_MOD1_MASK))
1015
1204
                                {
1016
1205
                                        //g_print ("+ clic sur %s (%.2f)!\n", icon ? icon->cName : "rien", icon ? icon->fInsertRemoveFactor : 0.);
1017
1206
                                        s_iClickX = pButton->x;
1027
1216
                        break ;
1028
1217
 
1029
1218
                        case GDK_2BUTTON_PRESS :
 
1219
                                if (icon && ! cairo_dock_icon_is_being_removed (icon))
1030
1220
                                {
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)
 
1222
                                        {
 
1223
                                                g_source_remove (icon->iSidDoubleClickDelay);
 
1224
                                                icon->iSidDoubleClickDelay = 0;
 
1225
                                        }
 
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;
1033
1230
                                }
1034
1231
                        break ;
1035
1232
 
1041
1238
        {
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.
1043
1240
                
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));
1045
1243
        }
1046
1244
        else if (pButton->button == 2 && pButton->type == GDK_BUTTON_PRESS)  // clique milieu.
1047
1245
        {
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);
 
1247
                {
 
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);
 
1250
                }
1050
1251
        }
1051
1252
 
1052
1253
        return FALSE;
1060
1261
                return FALSE;
1061
1262
        }
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);
1064
 
        
1065
 
        if (pDock->iSidTestMouseOutside == 0)  // meme remarque que plus haut.
1066
 
        {
1067
 
                ///pDock->iSidTestMouseOutside = g_timeout_add (500, (GSourceFunc)_check_mouse_outside, pDock);
1068
 
        }
 
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);
1069
1266
        
1070
1267
        return FALSE;
1071
1268
}
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.
1281
1478
                        {
1282
 
                                if (myAccessibility.bLockIcons || myAccessibility.bLockAll)
 
1479
                                if (myDocksParam.bLockIcons || myDocksParam.bLockAll)
1283
1480
                                {
1284
1481
                                        gtk_drag_finish (dc, FALSE, FALSE, time);
1285
1482
                                        return ;
1292
1489
 
1293
1490
                        if (iDropX > icon->fX + icon->fWidth * icon->fScale * (1 - fMargin))  // on est apres.
1294
1491
                        {
1295
 
                                if (myAccessibility.bLockIcons || myAccessibility.bLockAll)
 
1492
                                if (myDocksParam.bLockIcons || myDocksParam.bLockAll)
1296
1493
                                {
1297
1494
                                        gtk_drag_finish (dc, FALSE, FALSE, time);
1298
1495
                                        return ;
1302
1499
                        }
1303
1500
                        else if (iDropX < icon->fX + icon->fWidth * icon->fScale * fMargin)  // on est avant.
1304
1501
                        {
1305
 
                                if (myAccessibility.bLockIcons || myAccessibility.bLockAll)
 
1502
                                if (myDocksParam.bLockIcons || myDocksParam.bLockAll)
1306
1503
                                {
1307
1504
                                        gtk_drag_finish (dc, FALSE, FALSE, time);
1308
1505
                                        return ;
1338
1535
        //\_________________ On simule les evenements souris habituels.
1339
1536
        if (! pDock->bIsDragging)
1340
1537
        {
1341
 
                g_print ("start dragging\n");
 
1538
                cd_debug ("start dragging");
1342
1539
                pDock->bIsDragging = TRUE;
1343
1540
                
1344
1541
                /*GdkAtom gdkAtom = gdk_drag_get_selection (dc);
1347
1544
                cd_debug (" <%s>\n", cairo_dock_get_property_name_on_xwindow (Xid, xAtom));*/
1348
1545
                
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));
1353
1551
                
1407
1605
                return FALSE;  // on n'accepte pas le drop.
1408
1606
        }
1409
1607
        
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.
1413
1611
}
1414
1612
 
1415
1613
void cairo_dock_on_drag_leave (GtkWidget *pWidget, GdkDragContext *dc, guint time, CairoDock *pDock)
1416
1614
{
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.
1420
1618
        {
1423
1621
                        gtk_main_iteration ();
1424
1622
                cd_debug (">>> pDock->container.bInside : %d", pDock->container.bInside);
1425
1623
        }
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));
 
1630
        
 
1631
        // emit a leave-event signal, since we don't get one if we leave the window too quickly (!)
 
1632
        if (pDock->iSidLeaveDemand == 0)
 
1633
        {
 
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.
 
1635
        }
 
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);
1433
1638
}
1434
1639
 
1435
1640
 
1441
1646
                gdk_window_get_pointer (pDock->container.pWidget->window, &iMouseX, &iMouseY, NULL);
1442
1647
        else
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);
1445
1650
        
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);
1451
1656
        
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)
 
1663
                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;
 
1666
        
 
1667
        if (iNewPositionY < 0)
 
1668
                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;
1456
1671
        
1457
1672
        gtk_window_move (GTK_WINDOW (pDock->container.pWidget),
1458
1673
                (pDock->container.bIsHorizontal ? iNewPositionX : iNewPositionY),