Merge lp:~cairo-dock-team/ubuntu/oneiric/cairo-dock/2.3.0-2.1 into lp:ubuntu/oneiric/cairo-dock

Proposed by Matthieu Baerts
Status: Merged
Merged at revision: 18
Proposed branch: lp:~cairo-dock-team/ubuntu/oneiric/cairo-dock/2.3.0-2.1
Merge into: lp:ubuntu/oneiric/cairo-dock
Diff against target: 1379 lines (+1295/-7)
9 files modified
.pc/02-mouse-leaves-on-the-edge_upstream-version-2.3.0~2.1.patch/src/gldit/cairo-dock-dock-facility.c (+1243/-0)
.pc/applied-patches (+1/-0)
CMakeLists.txt (+1/-1)
debian/changelog (+14/-0)
debian/patches/02-mouse-leaves-on-the-edge_upstream-version-2.3.0~2.1.patch (+25/-0)
debian/patches/series (+1/-0)
src/gldit/cairo-dock-animations.c (+6/-1)
src/gldit/cairo-dock-dock-facility.c (+3/-4)
src/gldit/cairo-dock-dock-manager.c (+1/-1)
To merge this branch: bzr merge lp:~cairo-dock-team/ubuntu/oneiric/cairo-dock/2.3.0-2.1
Reviewer Review Type Date Requested Status
Daniel Holbach (community) Approve
Review via email: mp+61870@code.launchpad.net

Description of the change

This is a bugs fixed version.

How to reproduce the bugs:
* Cairo-Dock (without the OpenGL backend, version 2.3.0~1) crashes if we group windows with the same class in a subdock and then we click on the subdock to maximise windows.
* Slowly leave the dock with the cursor on the edge of it and the dock will stay zoomed and active.

To post a comment you must log in.
Revision history for this message
Daniel Holbach (dholbach) wrote :

Good work!

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== added directory '.pc/02-mouse-leaves-on-the-edge_upstream-version-2.3.0~2.1.patch'
=== added directory '.pc/02-mouse-leaves-on-the-edge_upstream-version-2.3.0~2.1.patch/src'
=== added directory '.pc/02-mouse-leaves-on-the-edge_upstream-version-2.3.0~2.1.patch/src/gldit'
=== added file '.pc/02-mouse-leaves-on-the-edge_upstream-version-2.3.0~2.1.patch/src/gldit/cairo-dock-dock-facility.c'
--- .pc/02-mouse-leaves-on-the-edge_upstream-version-2.3.0~2.1.patch/src/gldit/cairo-dock-dock-facility.c 1970-01-01 00:00:00 +0000
+++ .pc/02-mouse-leaves-on-the-edge_upstream-version-2.3.0~2.1.patch/src/gldit/cairo-dock-dock-facility.c 2011-05-21 19:26:06 +0000
@@ -0,0 +1,1243 @@
1/**
2* This file is a part of the Cairo-Dock project
3*
4* Copyright : (C) see the 'copyright' file.
5* E-mail : see the 'copyright' file.
6*
7* This program is free software; you can redistribute it and/or
8* modify it under the terms of the GNU General Public License
9* as published by the Free Software Foundation; either version 3
10* of the License, or (at your option) any later version.
11*
12* This program is distributed in the hope that it will be useful,
13* but WITHOUT ANY WARRANTY; without even the implied warranty of
14* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15* GNU General Public License for more details.
16* You should have received a copy of the GNU General Public License
17* along with this program. If not, see <http://www.gnu.org/licenses/>.
18*/
19
20#include <math.h>
21#include <string.h>
22#include <stdio.h>
23#include <stdlib.h>
24
25#include <glib/gstdio.h>
26#include <gtk/gtk.h>
27#include <gdk/gdkx.h>
28
29#include <cairo.h>
30#include <pango/pango.h>
31#include <librsvg/rsvg.h>
32#include <librsvg/rsvg-cairo.h>
33
34#ifdef HAVE_GLITZ
35#include <glitz-glx.h>
36#include <cairo-glitz.h>
37#endif
38
39#include <gtk/gtkgl.h>
40#include <X11/extensions/Xrender.h>
41#include <X11/extensions/shape.h>
42#include <GL/gl.h>
43#include <GL/glu.h>
44#include <GL/glx.h>
45#include <gdk/x11/gdkglx.h>
46
47#include "cairo-dock-draw.h"
48#include "cairo-dock-applications-manager.h"
49#include "cairo-dock-image-buffer.h"
50#include "cairo-dock-config.h"
51#include "cairo-dock-module-factory.h"
52#include "cairo-dock-callbacks.h"
53#include "cairo-dock-icon-factory.h"
54#include "cairo-dock-icon-facility.h"
55#include "cairo-dock-separator-factory.h"
56#include "cairo-dock-launcher-factory.h"
57#include "cairo-dock-backends-manager.h" // myBackendsParam.fSubDockSizeRatio
58#include "cairo-dock-X-utilities.h"
59#include "cairo-dock-log.h"
60#include "cairo-dock-keyfile-utilities.h"
61#include "cairo-dock-dock-manager.h"
62#include "cairo-dock-dialog-manager.h"
63#include "cairo-dock-notifications.h"
64#include "cairo-dock-indicator-manager.h" // myIndicators.bUseClassIndic
65#include "cairo-dock-class-manager.h"
66#include "cairo-dock-animations.h"
67#include "cairo-dock-emblem.h"
68#include "cairo-dock-X-manager.h"
69#include "cairo-dock-dock-facility.h"
70
71extern CairoDockDesktopGeometry g_desktopGeometry;
72
73void cairo_dock_reload_reflects_in_dock (CairoDock *pDock)
74{
75 cairo_t *pCairoContext = cairo_dock_create_drawing_context_generic (CAIRO_CONTAINER (pDock));
76 Icon *icon;
77 GList *ic;
78 for (ic = pDock->icons; ic != NULL; ic = ic->next)
79 {
80 icon = ic->data;
81 if (icon->pReflectionBuffer != NULL)
82 {
83 cairo_dock_add_reflection_to_icon (icon, CAIRO_CONTAINER (pDock));
84 }
85 }
86 cairo_destroy (pCairoContext);
87}
88
89
90void cairo_dock_update_dock_size (CairoDock *pDock) // iMaxIconHeight et fFlatDockWidth doivent avoir ete mis a jour au prealable.
91{
92 //g_print ("%s ()\n", __func__);
93 g_return_if_fail (pDock != NULL);
94 int iPrevMaxDockHeight = pDock->iMaxDockHeight;
95 int iPrevMaxDockWidth = pDock->iMaxDockWidth;
96
97 if (pDock->container.fRatio != 0/* && pDock->container.fRatio != 1*/) // on remet leur taille reelle aux icones, sinon le calcul de max_dock_size sera biaise.
98 {
99 GList *ic;
100 Icon *icon;
101 pDock->fFlatDockWidth = -myIconsParam.iIconGap;
102 pDock->iMaxIconHeight = 0;
103 for (ic = pDock->icons; ic != NULL; ic = ic->next)
104 {
105 icon = ic->data;
106 icon->fWidth /= pDock->container.fRatio;
107 icon->fHeight /= pDock->container.fRatio;
108 pDock->fFlatDockWidth += icon->fWidth + myIconsParam.iIconGap;
109 if (! CAIRO_DOCK_ICON_TYPE_IS_SEPARATOR (icon))
110 pDock->iMaxIconHeight = MAX (pDock->iMaxIconHeight, icon->fHeight);
111 }
112 if (pDock->iMaxIconHeight == 0)
113 pDock->iMaxIconHeight = 10;
114 pDock->container.fRatio = 1.;
115 }
116 pDock->pRenderer->compute_size (pDock);
117
118 double hmax = pDock->iMaxIconHeight;
119 int iMaxAuthorizedWidth = cairo_dock_get_max_authorized_dock_width (pDock);
120 int n = 0;
121 do
122 {
123 double fPrevRatio = pDock->container.fRatio;
124 //g_print (" %s (%d / %d)\n", __func__, (int)pDock->iMaxDockWidth, iMaxAuthorizedWidth);
125 if (pDock->iMaxDockWidth > iMaxAuthorizedWidth)
126 {
127 pDock->container.fRatio *= 1. * iMaxAuthorizedWidth / pDock->iMaxDockWidth;
128 }
129 else
130 {
131 double fMaxRatio = (pDock->iRefCount == 0 ? 1 : myBackendsParam.fSubDockSizeRatio);
132 if (pDock->container.fRatio < fMaxRatio)
133 {
134 pDock->container.fRatio *= 1. * iMaxAuthorizedWidth / pDock->iMaxDockWidth;
135 pDock->container.fRatio = MIN (pDock->container.fRatio, fMaxRatio);
136 }
137 else
138 pDock->container.fRatio = fMaxRatio;
139 }
140
141 if (pDock->iMaxDockHeight > g_desktopGeometry.iScreenHeight[pDock->container.bIsHorizontal])
142 {
143 pDock->container.fRatio = MIN (pDock->container.fRatio, fPrevRatio * g_desktopGeometry.iScreenHeight[pDock->container.bIsHorizontal] / pDock->iMaxDockHeight);
144 }
145
146 if (fPrevRatio != pDock->container.fRatio)
147 {
148 //g_print (" -> changement du ratio : %.3f -> %.3f (%d, %d try)\n", fPrevRatio, pDock->container.fRatio, pDock->iRefCount, n);
149 Icon *icon;
150 GList *ic;
151 pDock->fFlatDockWidth = -myIconsParam.iIconGap;
152 for (ic = pDock->icons; ic != NULL; ic = ic->next)
153 {
154 icon = ic->data;
155 icon->fWidth *= pDock->container.fRatio / fPrevRatio;
156 icon->fHeight *= pDock->container.fRatio / fPrevRatio;
157 pDock->fFlatDockWidth += icon->fWidth + myIconsParam.iIconGap;
158 }
159 hmax *= pDock->container.fRatio / fPrevRatio;
160
161 pDock->pRenderer->compute_size (pDock);
162 }
163
164 //g_print ("*** ratio : %.3f -> %.3f\n", fPrevRatio, pDock->container.fRatio);
165 n ++;
166 } while ((pDock->iMaxDockWidth > iMaxAuthorizedWidth || pDock->iMaxDockHeight > g_desktopGeometry.iScreenHeight[pDock->container.bIsHorizontal] || (pDock->container.fRatio < 1 && pDock->iMaxDockWidth < iMaxAuthorizedWidth-5)) && n < 8);
167 pDock->iMaxIconHeight = hmax;
168 //g_print (">>> iMaxIconHeight : %d, ratio : %.2f, fFlatDockWidth : %.2f\n", (int) pDock->iMaxIconHeight, pDock->container.fRatio, pDock->fFlatDockWidth);
169
170 pDock->pRenderer->calculate_icons (pDock); // le calcul de max_dock_size a altere les fX et fY.
171
172 pDock->bWMIconsNeedUpdate = TRUE;
173 ///cairo_dock_trigger_set_WM_icons_geometry (pDock);
174
175 cairo_dock_update_input_shape (pDock);
176
177 if (GTK_WIDGET_VISIBLE (pDock->container.pWidget) && (iPrevMaxDockHeight != pDock->iMaxDockHeight || iPrevMaxDockWidth != pDock->iMaxDockWidth))
178 {
179 //g_print ("*******%s (%dx%d -> %dx%d)\n", __func__, iPrevMaxDockWidth, iPrevMaxDockHeight, pDock->iMaxDockWidth, pDock->iMaxDockHeight);
180 cairo_dock_move_resize_dock (pDock);
181 }
182
183 cairo_dock_trigger_load_dock_background (pDock);
184
185 if (pDock->iRefCount == 0 && pDock->iVisibility == CAIRO_DOCK_VISI_RESERVE && iPrevMaxDockHeight != pDock->iMaxDockHeight)
186 cairo_dock_reserve_space_for_dock (pDock, TRUE);
187}
188
189Icon *cairo_dock_calculate_dock_icons (CairoDock *pDock)
190{
191 Icon *pPointedIcon = pDock->pRenderer->calculate_icons (pDock);
192 cairo_dock_manage_mouse_position (pDock);
193 return (pDock->iMousePositionType == CAIRO_DOCK_MOUSE_INSIDE ? pPointedIcon : NULL);
194}
195
196
197
198 ////////////////////////////////
199 /// WINDOW SIZE AND POSITION ///
200////////////////////////////////
201
202void cairo_dock_reserve_space_for_dock (CairoDock *pDock, gboolean bReserve)
203{
204 Window Xid = GDK_WINDOW_XID (pDock->container.pWidget->window);
205 int left=0, right=0, top=0, bottom=0;
206 int left_start_y=0, left_end_y=0, right_start_y=0, right_end_y=0, top_start_x=0, top_end_x=0, bottom_start_x=0, bottom_end_x=0;
207
208 if (bReserve)
209 {
210 int iWindowPositionX = pDock->container.iWindowPositionX, iWindowPositionY = pDock->container.iWindowPositionY;
211
212 int w = pDock->iMinDockWidth;
213 int h = pDock->iMinDockHeight;
214 int x, y; // position qu'aurait la fenetre du dock s'il avait la taille minimale.
215 cairo_dock_get_window_position_at_balance (pDock, w, h, &x, &y);
216
217 if (pDock->container.bDirectionUp)
218 {
219 if (pDock->container.bIsHorizontal)
220 {
221 bottom = h + pDock->iGapY;
222 bottom_start_x = x;
223 bottom_end_x = x + w;
224 }
225 else
226 {
227 right = h + pDock->iGapY;
228 right_start_y = x;
229 right_end_y = x + w;
230 }
231 }
232 else
233 {
234 if (pDock->container.bIsHorizontal)
235 {
236 top = h + pDock->iGapY;
237 top_start_x = x;
238 top_end_x = x + w;
239 }
240 else
241 {
242 left = h + pDock->iGapY;
243 left_start_y = x;
244 left_end_y = x + w;
245 }
246 }
247 }
248
249 cairo_dock_set_strut_partial (Xid, left, right, top, bottom, left_start_y, left_end_y, right_start_y, right_end_y, top_start_x, top_end_x, bottom_start_x, bottom_end_x);
250 /*if ((bReserve && ! pDock->container.bDirectionUp) || (g_iWmHint == GDK_WINDOW_TYPE_HINT_DOCK)) // merci a Robrob pour le patch !
251 cairo_dock_set_xwindow_type_hint (Xid, "_NET_WM_WINDOW_TYPE_DOCK"); // gtk_window_set_type_hint ne marche que sur une fenetre avant de la rendre visible !
252 else if (g_iWmHint == GDK_WINDOW_TYPE_HINT_NORMAL)
253 cairo_dock_set_xwindow_type_hint (Xid, "_NET_WM_WINDOW_TYPE_NORMAL"); // idem.
254 else if (g_iWmHint == GDK_WINDOW_TYPE_HINT_TOOLBAR)
255 cairo_dock_set_xwindow_type_hint (Xid, "_NET_WM_WINDOW_TYPE_TOOLBAR"); // idem.*/
256}
257
258void cairo_dock_prevent_dock_from_out_of_screen (CairoDock *pDock)
259{
260 int x, y; // position du point invariant du dock.
261 x = pDock->container.iWindowPositionX + pDock->container.iWidth * pDock->fAlign;
262 y = (pDock->container.bDirectionUp ? pDock->container.iWindowPositionY + pDock->container.iHeight : pDock->container.iWindowPositionY);
263 //cd_debug ("%s (%d;%d)", __func__, x, y);
264
265 pDock->iGapX = x - g_desktopGeometry.iScreenWidth[pDock->container.bIsHorizontal] * pDock->fAlign;
266 pDock->iGapY = (pDock->container.bDirectionUp ? g_desktopGeometry.iScreenHeight[pDock->container.bIsHorizontal] - y : y);
267 //cd_debug (" -> (%d;%d)", pDock->iGapX, pDock->iGapY);
268
269 if (pDock->iGapX < - g_desktopGeometry.iScreenWidth[pDock->container.bIsHorizontal]/2)
270 pDock->iGapX = - g_desktopGeometry.iScreenWidth[pDock->container.bIsHorizontal]/2;
271 if (pDock->iGapX > g_desktopGeometry.iScreenWidth[pDock->container.bIsHorizontal]/2)
272 pDock->iGapX = g_desktopGeometry.iScreenWidth[pDock->container.bIsHorizontal]/2;
273 if (pDock->iGapY < 0)
274 pDock->iGapY = 0;
275 if (pDock->iGapY > g_desktopGeometry.iScreenHeight[pDock->container.bIsHorizontal])
276 pDock->iGapY = g_desktopGeometry.iScreenHeight[pDock->container.bIsHorizontal];
277}
278
279#define CD_VISIBILITY_MARGIN 20
280void cairo_dock_get_window_position_at_balance (CairoDock *pDock, int iNewWidth, int iNewHeight, int *iNewPositionX, int *iNewPositionY)
281{
282 int iWindowPositionX = (g_desktopGeometry.iScreenWidth[pDock->container.bIsHorizontal] - iNewWidth) * pDock->fAlign + pDock->iGapX;
283 if (pDock->iRefCount == 0 && pDock->fAlign != .5)
284 iWindowPositionX += (.5 - pDock->fAlign) * (pDock->iMaxDockWidth - iNewWidth);
285 int iWindowPositionY = (pDock->container.bDirectionUp ? g_desktopGeometry.iScreenHeight[pDock->container.bIsHorizontal] - iNewHeight - pDock->iGapY : pDock->iGapY);
286 //g_print ("pDock->iGapX : %d => iWindowPositionX <- %d\n", pDock->iGapX, iWindowPositionX);
287 //g_print ("iNewHeight : %d -> pDock->container.iWindowPositionY <- %d\n", iNewHeight, iWindowPositionY);
288
289 if (pDock->iRefCount == 0)
290 {
291 if (iWindowPositionX + iNewWidth < CD_VISIBILITY_MARGIN)
292 iWindowPositionX = CD_VISIBILITY_MARGIN - iNewWidth;
293 else if (iWindowPositionX > g_desktopGeometry.iScreenWidth[pDock->container.bIsHorizontal] - CD_VISIBILITY_MARGIN)
294 iWindowPositionX = g_desktopGeometry.iScreenWidth[pDock->container.bIsHorizontal] - CD_VISIBILITY_MARGIN;
295 }
296 else
297 {
298 if (iWindowPositionX < - pDock->iLeftMargin)
299 iWindowPositionX = - pDock->iLeftMargin;
300 else if (iWindowPositionX > g_desktopGeometry.iScreenWidth[pDock->container.bIsHorizontal] - iNewWidth + pDock->iMinRightMargin)
301 iWindowPositionX = g_desktopGeometry.iScreenWidth[pDock->container.bIsHorizontal] - iNewWidth + pDock->iMinRightMargin;
302 }
303 if (iWindowPositionY < - pDock->iMaxIconHeight)
304 iWindowPositionY = - pDock->iMaxIconHeight;
305 else if (iWindowPositionY > g_desktopGeometry.iScreenHeight[pDock->container.bIsHorizontal] - iNewHeight + pDock->iMaxIconHeight)
306 iWindowPositionY = g_desktopGeometry.iScreenHeight[pDock->container.bIsHorizontal] - iNewHeight + pDock->iMaxIconHeight;
307
308 if (pDock->container.bIsHorizontal)
309 {
310 *iNewPositionX = iWindowPositionX + pDock->iScreenOffsetX;
311 *iNewPositionY = iWindowPositionY + pDock->iScreenOffsetY;
312 }
313 else
314 {
315 *iNewPositionX = iWindowPositionX + pDock->iScreenOffsetY;
316 *iNewPositionY = iWindowPositionY + pDock->iScreenOffsetX;
317 }
318 //g_print ("POSITION : %d+%d ; %d+%d\n", iWindowPositionX, pDock->iScreenOffsetX, iWindowPositionY, pDock->iScreenOffsetY);
319}
320
321static gboolean _move_resize_dock (CairoDock *pDock)
322{
323 int iNewWidth = pDock->iMaxDockWidth;
324 int iNewHeight = pDock->iMaxDockHeight;
325 int iNewPositionX, iNewPositionY;
326 cairo_dock_get_window_position_at_balance (pDock, iNewWidth, iNewHeight, &iNewPositionX, &iNewPositionY); // on ne peut pas intercepter le cas ou les nouvelles dimensions sont egales aux dimensions courantes de la fenetre, car il se peut qu'il y'ait 2 redimensionnements d'affilee s'annulant mutuellement (remove + insert d'une icone). Il faut donc avoir les 2 configure, sinon la taille reste bloquee aux valeurs fournies par le 1er configure.
327
328 //g_print (" -> %dx%d, %d;%d\n", iNewWidth, iNewHeight, iNewPositionX, iNewPositionY);
329
330 if (pDock->container.bIsHorizontal)
331 {
332 gdk_window_move_resize (pDock->container.pWidget->window,
333 iNewPositionX,
334 iNewPositionY,
335 iNewWidth,
336 iNewHeight); // lorsqu'on a 2 gdk_window_move_resize d'affilee, Compiz deconne et bloque le dock (il est toujours actif mais n'est plus redessine). Compiz envoit un configure de trop par rapport a Metacity.
337 }
338 else
339 {
340 gdk_window_move_resize (pDock->container.pWidget->window,
341 iNewPositionY,
342 iNewPositionX,
343 iNewHeight,
344 iNewWidth);
345 }
346 pDock->iSidMoveResize = 0;
347 return FALSE;
348}
349
350void cairo_dock_move_resize_dock (CairoDock *pDock)
351{
352 //g_print ("*********%s (current : %dx%d, %d;%d)\n", __func__, pDock->container.iWidth, pDock->container.iHeight, pDock->container.iWindowPositionX, pDock->container.iWindowPositionY);
353 if (pDock->iSidMoveResize == 0)
354 {
355 pDock->iSidMoveResize = g_idle_add ((GSourceFunc)_move_resize_dock, pDock);
356 }
357 return ;
358}
359
360
361 ///////////////////
362 /// INPUT SHAPE ///
363///////////////////
364
365static GdkBitmap *_cairo_dock_create_input_shape (CairoDock *pDock, int w, int h)
366{
367 int W = pDock->iMaxDockWidth;
368 int H = pDock->iMaxDockHeight;
369 //g_print ("%s (%dx%d / %dx%d)\n", __func__, w, h, W, H);
370
371 GdkBitmap *pShapeBitmap = (GdkBitmap*) gdk_pixmap_new (NULL,
372 pDock->container.bIsHorizontal ? W : H,
373 pDock->container.bIsHorizontal ? H : W,
374 1);
375
376 cairo_t *pCairoContext = gdk_cairo_create (pShapeBitmap);
377 cairo_set_source_rgba (pCairoContext, 0.0f, 0.0f, 0.0f, 0.0f);
378 cairo_set_operator (pCairoContext, CAIRO_OPERATOR_SOURCE);
379 cairo_paint (pCairoContext);
380 if (w != 0 && h != 0)
381 {
382 if (pDock->container.bIsHorizontal)
383 {
384 cairo_rectangle (pCairoContext,
385 (W - w) / 2, // centre en x.
386 pDock->container.bDirectionUp ? H - h : 0,
387 w,
388 h);
389 }
390 else
391 {
392 cairo_rectangle (pCairoContext,
393 pDock->container.bDirectionUp ? H - h : 0,
394 (W - w) / 2, // centre en x.
395 h,
396 w);
397 }
398 cairo_set_source_rgba (pCairoContext, 1., 1., 1., 1.);
399 cairo_fill (pCairoContext);
400 }
401 cairo_destroy (pCairoContext);
402
403 return pShapeBitmap;
404}
405
406void cairo_dock_update_input_shape (CairoDock *pDock)
407{
408 //\_______________ On detruit les zones d'input actuelles.
409 if (pDock->pShapeBitmap != NULL)
410 {
411 g_object_unref ((gpointer) pDock->pShapeBitmap);
412 pDock->pShapeBitmap = NULL;
413 }
414 if (pDock->pHiddenShapeBitmap != NULL)
415 {
416 g_object_unref ((gpointer) pDock->pHiddenShapeBitmap);
417 pDock->pHiddenShapeBitmap = NULL;
418 }
419
420 //\_______________ on definit les tailles des zones.
421 int W = pDock->iMaxDockWidth;
422 int H = pDock->iMaxDockHeight;
423 int w = pDock->iMinDockWidth;
424 int h = pDock->iMinDockHeight;
425 ///int w_ = MIN (myDocksParam.iVisibleZoneWidth, pDock->iMaxDockWidth);
426 ///int h_ = MIN (myDocksParam.iVisibleZoneHeight, pDock->iMaxDockHeight);
427 int w_ = 1;
428 int h_ = 1;
429
430 //\_______________ on verifie que les conditions sont toujours remplies.
431 if (w == 0 || h == 0 || pDock->iRefCount > 0 || W == 0 || H == 0)
432 {
433 if (pDock->iInputState != CAIRO_DOCK_INPUT_ACTIVE)
434 {
435 //g_print ("+++ input shape active on update input shape\n");
436 cairo_dock_set_input_shape_active (pDock);
437 pDock->iInputState = CAIRO_DOCK_INPUT_ACTIVE;
438 }
439 return ;
440 }
441
442 //\_______________ on cree les zones.
443 pDock->pShapeBitmap = _cairo_dock_create_input_shape (pDock, w, h);
444
445 pDock->pHiddenShapeBitmap = _cairo_dock_create_input_shape (pDock, w_, h_);
446}
447
448
449
450 ///////////////////
451 /// LINEAR DOCK ///
452///////////////////
453
454GList *cairo_dock_calculate_icons_positions_at_rest_linear (GList *pIconList, double fFlatDockWidth, int iXOffset)
455{
456 //g_print ("%s (%d, +%d)\n", __func__, fFlatDockWidth, iXOffset);
457 double x_cumulated = iXOffset;
458 double fXMin = 99999;
459 GList* ic, *pFirstDrawnElement = NULL;
460 Icon *icon;
461 for (ic = pIconList; ic != NULL; ic = ic->next)
462 {
463 icon = ic->data;
464
465 if (x_cumulated + icon->fWidth / 2 < 0)
466 icon->fXAtRest = x_cumulated + fFlatDockWidth;
467 else if (x_cumulated + icon->fWidth / 2 > fFlatDockWidth)
468 icon->fXAtRest = x_cumulated - fFlatDockWidth;
469 else
470 icon->fXAtRest = x_cumulated;
471
472 if (icon->fXAtRest < fXMin)
473 {
474 fXMin = icon->fXAtRest;
475 pFirstDrawnElement = ic;
476 }
477 //g_print ("%s : fXAtRest = %.2f\n", icon->cName, icon->fXAtRest);
478
479 x_cumulated += icon->fWidth + myIconsParam.iIconGap;
480 }
481
482 return pFirstDrawnElement;
483}
484
485double cairo_dock_calculate_max_dock_width (CairoDock *pDock, GList *pFirstDrawnElementGiven, double fFlatDockWidth, double fWidthConstraintFactor, double fExtraWidth)
486{
487 double fMaxDockWidth = 0.;
488 //g_print ("%s (%d)\n", __func__, (int)fFlatDockWidth);
489 GList *pIconList = pDock->icons;
490 if (pIconList == NULL)
491 return 2 * myDocksParam.iDockRadius + myDocksParam.iDockLineWidth + 2 * myDocksParam.iFrameMargin;
492
493 //\_______________ On remet a zero les positions extremales des icones.
494 GList* ic;
495 Icon *icon;
496 for (ic = pIconList; ic != NULL; ic = ic->next)
497 {
498 icon = ic->data;
499 icon->fXMax = -1e4;
500 icon->fXMin = 1e4;
501 }
502
503 //\_______________ On simule le passage du curseur sur toute la largeur du dock, et on chope la largeur maximale qui s'en degage, ainsi que les positions d'equilibre de chaque icone.
504 GList *pFirstDrawnElement = (pFirstDrawnElementGiven != NULL ? pFirstDrawnElementGiven : pIconList);
505 //for (int iVirtualMouseX = 0; iVirtualMouseX < fFlatDockWidth; iVirtualMouseX ++)
506 GList *ic2;
507 for (ic = pIconList; ic != NULL; ic = ic->next)
508 {
509 icon = ic->data;
510
511 cairo_dock_calculate_wave_with_position_linear (pIconList, pFirstDrawnElement, icon->fXAtRest, pDock->fMagnitudeMax, fFlatDockWidth, 0, 0, 0.5, 0, pDock->container.bDirectionUp);
512 ic2 = pFirstDrawnElement;
513 do
514 {
515 icon = ic2->data;
516
517 if (icon->fX + icon->fWidth * icon->fScale > icon->fXMax)
518 icon->fXMax = icon->fX + icon->fWidth * icon->fScale;
519 if (icon->fX < icon->fXMin)
520 icon->fXMin = icon->fX;
521
522 ic2 = cairo_dock_get_next_element (ic2, pDock->icons);
523 } while (ic2 != pFirstDrawnElement);
524 }
525 cairo_dock_calculate_wave_with_position_linear (pIconList, pFirstDrawnElement, fFlatDockWidth - 1, pDock->fMagnitudeMax, fFlatDockWidth, 0, 0, pDock->fAlign, 0, pDock->container.bDirectionUp); // pDock->fFoldingFactor
526 ic = pFirstDrawnElement;
527 do
528 {
529 icon = ic->data;
530
531 if (icon->fX + icon->fWidth * icon->fScale > icon->fXMax)
532 icon->fXMax = icon->fX + icon->fWidth * icon->fScale;
533 if (icon->fX < icon->fXMin)
534 icon->fXMin = icon->fX;
535
536 ic = cairo_dock_get_next_element (ic, pDock->icons);
537 } while (ic != pFirstDrawnElement);
538
539 fMaxDockWidth = (icon->fXMax - ((Icon *) pFirstDrawnElement->data)->fXMin) * fWidthConstraintFactor + fExtraWidth;
540 fMaxDockWidth = ceil (fMaxDockWidth) + 1;
541
542 for (ic = pIconList; ic != NULL; ic = ic->next)
543 {
544 icon = ic->data;
545 icon->fXMin += fMaxDockWidth / 2;
546 icon->fXMax += fMaxDockWidth / 2;
547 //g_print ("%s : [%d;%d]\n", icon->cName, (int) icon->fXMin, (int) icon->fXMax);
548 icon->fX = icon->fXAtRest;
549 icon->fScale = 1;
550 }
551
552 return fMaxDockWidth;
553}
554
555Icon * cairo_dock_calculate_wave_with_position_linear (GList *pIconList, GList *pFirstDrawnElementGiven, int x_abs, gdouble fMagnitude, double fFlatDockWidth, int iWidth, int iHeight, double fAlign, double fFoldingFactor, gboolean bDirectionUp)
556{
557 //g_print (">>>>>%s (%d/%.2f, %dx%d, %.2f, %.2f)\n", __func__, x_abs, fFlatDockWidth, iWidth, iHeight, fAlign, fFoldingFactor);
558 if (pIconList == NULL)
559 return NULL;
560 if (x_abs < 0 && iWidth > 0) // ces cas limite sont la pour empecher les icones de retrecir trop rapidement quand on sort par les cotes.
561 ///x_abs = -1;
562 x_abs = 0;
563 else if (x_abs > fFlatDockWidth && iWidth > 0)
564 ///x_abs = fFlatDockWidth+1;
565 x_abs = (int) fFlatDockWidth;
566
567
568 float x_cumulated = 0, fXMiddle, fDeltaExtremum;
569 GList* ic, *pointed_ic;
570 Icon *icon, *prev_icon;
571
572 double fScale = 0.;
573 double offset = 0.;
574 GList *pFirstDrawnElement = (pFirstDrawnElementGiven != NULL ? pFirstDrawnElementGiven : pIconList);
575 ic = pFirstDrawnElement;
576 pointed_ic = (x_abs < 0 ? ic : NULL);
577 do
578 {
579 icon = ic->data;
580 x_cumulated = icon->fXAtRest;
581 fXMiddle = icon->fXAtRest + icon->fWidth / 2;
582
583 //\_______________ On calcule sa phase (pi/2 au niveau du curseur).
584 icon->fPhase = (fXMiddle - x_abs) / myIconsParam.iSinusoidWidth * G_PI + G_PI / 2;
585 if (icon->fPhase < 0)
586 {
587 icon->fPhase = 0;
588 }
589 else if (icon->fPhase > G_PI)
590 {
591 icon->fPhase = G_PI;
592 }
593
594 //\_______________ On en deduit l'amplitude de la sinusoide au niveau de cette icone, et donc son echelle.
595 icon->fScale = 1 + fMagnitude * myIconsParam.fAmplitude * sin (icon->fPhase);
596 if (iWidth > 0 && icon->fInsertRemoveFactor != 0)
597 {
598 fScale = icon->fScale;
599 ///offset += (icon->fWidth * icon->fScale) * (pointed_ic == NULL ? 1 : -1);
600 if (icon->fInsertRemoveFactor > 0)
601 icon->fScale *= icon->fInsertRemoveFactor;
602 else
603 icon->fScale *= (1 + icon->fInsertRemoveFactor);
604 ///offset -= (icon->fWidth * icon->fScale) * (pointed_ic == NULL ? 1 : -1);
605 }
606
607 icon->fY = (bDirectionUp ? iHeight - myDocksParam.iDockLineWidth - myDocksParam.iFrameMargin - icon->fScale * icon->fHeight : myDocksParam.iDockLineWidth + myDocksParam.iFrameMargin);
608 //g_print ("%s fY : %d; %.2f\n", icon->cName, iHeight, icon->fHeight);
609
610 //\_______________ Si on avait deja defini l'icone pointee, on peut placer l'icone courante par rapport a la precedente.
611 if (pointed_ic != NULL)
612 {
613 if (ic == pFirstDrawnElement) // peut arriver si on est en dehors a gauche du dock.
614 {
615 icon->fX = x_cumulated - 1. * (fFlatDockWidth - iWidth) / 2;
616 //g_print (" en dehors a gauche : icon->fX = %.2f (%.2f)\n", icon->fX, x_cumulated);
617 }
618 else
619 {
620 prev_icon = (ic->prev != NULL ? ic->prev->data : cairo_dock_get_last_icon (pIconList));
621 icon->fX = prev_icon->fX + (prev_icon->fWidth + myIconsParam.iIconGap) * prev_icon->fScale;
622
623 if (icon->fX + icon->fWidth * icon->fScale > icon->fXMax - myIconsParam.fAmplitude * fMagnitude * (icon->fWidth + 1.5*myIconsParam.iIconGap) / 8 && iWidth != 0)
624 {
625 //g_print (" on contraint %s (fXMax=%.2f , fX=%.2f\n", prev_icon->cName, prev_icon->fXMax, prev_icon->fX);
626 fDeltaExtremum = icon->fX + icon->fWidth * icon->fScale - (icon->fXMax - myIconsParam.fAmplitude * fMagnitude * (icon->fWidth + 1.5*myIconsParam.iIconGap) / 16);
627 if (myIconsParam.fAmplitude != 0)
628 icon->fX -= fDeltaExtremum * (1 - (icon->fScale - 1) / myIconsParam.fAmplitude) * fMagnitude;
629 }
630 }
631 icon->fX = fAlign * iWidth + (icon->fX - fAlign * iWidth) * (1. - fFoldingFactor);
632 //g_print (" a droite : icon->fX = %.2f (%.2f)\n", icon->fX, x_cumulated);
633 }
634
635 //\_______________ On regarde si on pointe sur cette icone.
636 if (x_cumulated + icon->fWidth + .5*myIconsParam.iIconGap >= x_abs && x_cumulated - .5*myIconsParam.iIconGap <= x_abs && pointed_ic == NULL) // on a trouve l'icone sur laquelle on pointe.
637 {
638 pointed_ic = ic;
639 ///icon->bPointed = TRUE;
640 icon->bPointed = (x_abs != (int) fFlatDockWidth && x_abs != 0);
641 icon->fX = x_cumulated - (fFlatDockWidth - iWidth) / 2 + (1 - icon->fScale) * (x_abs - x_cumulated + .5*myIconsParam.iIconGap);
642 icon->fX = fAlign * iWidth + (icon->fX - fAlign * iWidth) * (1. - fFoldingFactor);
643 //g_print (" icone pointee : fX = %.2f (%.2f, %d)\n", icon->fX, x_cumulated, icon->bPointed);
644 }
645 else
646 icon->bPointed = FALSE;
647
648 if (iWidth > 0 && icon->fInsertRemoveFactor != 0)
649 {
650 if (pointed_ic != ic) // bPointed peut etre false a l'extremite droite.
651 offset += (icon->fWidth * (fScale - icon->fScale)) * (pointed_ic == NULL ? 1 : -1);
652 else
653 offset += (2*(fXMiddle - x_abs) * (fScale - icon->fScale)) * (pointed_ic == NULL ? 1 : -1);
654 }
655
656 ic = cairo_dock_get_next_element (ic, pIconList);
657 } while (ic != pFirstDrawnElement);
658
659 //\_______________ On place les icones precedant l'icone pointee par rapport a celle-ci.
660 if (pointed_ic == NULL) // on est a droite des icones.
661 {
662 pointed_ic = (pFirstDrawnElement->prev == NULL ? g_list_last (pIconList) : pFirstDrawnElement->prev);
663 icon = pointed_ic->data;
664 icon->fX = x_cumulated - (fFlatDockWidth - iWidth) / 2 + (1 - icon->fScale) * (icon->fWidth + .5*myIconsParam.iIconGap);
665 icon->fX = fAlign * iWidth + (icon->fX - fAlign * iWidth) * (1 - fFoldingFactor);
666 //g_print (" en dehors a droite : icon->fX = %.2f (%.2f)\n", icon->fX, x_cumulated);
667 }
668
669 ic = pointed_ic;
670 while (ic != pFirstDrawnElement)
671 {
672 icon = ic->data;
673
674 ic = ic->prev;
675 if (ic == NULL)
676 ic = g_list_last (pIconList);
677
678 prev_icon = ic->data;
679
680 prev_icon->fX = icon->fX - (prev_icon->fWidth + myIconsParam.iIconGap) * prev_icon->fScale;
681 //g_print ("fX <- %.2f; fXMin : %.2f\n", prev_icon->fX, prev_icon->fXMin);
682 if (prev_icon->fX < prev_icon->fXMin + myIconsParam.fAmplitude * fMagnitude * (prev_icon->fWidth + 1.5*myIconsParam.iIconGap) / 8 && iWidth != 0 && x_abs < iWidth && fMagnitude > 0) /// && prev_icon->fPhase == 0 // on rajoute 'fMagnitude > 0' sinon il y'a un leger "saut" du aux contraintes a gauche de l'icone pointee.
683 {
684 //g_print (" on contraint %s (fXMin=%.2f , fX=%.2f\n", prev_icon->cName, prev_icon->fXMin, prev_icon->fX);
685 fDeltaExtremum = prev_icon->fX - (prev_icon->fXMin + myIconsParam.fAmplitude * fMagnitude * (prev_icon->fWidth + 1.5*myIconsParam.iIconGap) / 16);
686 if (myIconsParam.fAmplitude != 0)
687 prev_icon->fX -= fDeltaExtremum * (1 - (prev_icon->fScale - 1) / myIconsParam.fAmplitude) * fMagnitude;
688 }
689 prev_icon->fX = fAlign * iWidth + (prev_icon->fX - fAlign * iWidth) * (1. - fFoldingFactor);
690 //g_print (" prev_icon->fX : %.2f\n", prev_icon->fX);
691 }
692
693 if (offset != 0)
694 {
695 offset /= 2;
696 //g_print ("offset : %.2f (pointed:%s)\n", offset, pointed_ic?((Icon*)pointed_ic->data)->cName:"none");
697 for (ic = pIconList; ic != NULL; ic = ic->next)
698 {
699 icon = ic->data;
700 //if (ic == pIconList)
701 // cd_debug ("fX : %.2f - %.2f\n", icon->fX, offset);
702 icon->fX -= offset;
703 }
704 }
705
706 icon = pointed_ic->data;
707 return (icon->bPointed ? icon : NULL);
708}
709
710Icon *cairo_dock_apply_wave_effect_linear (CairoDock *pDock)
711{
712 //\_______________ On calcule la position du curseur dans le referentiel du dock a plat.
713 int dx = pDock->container.iMouseX - (pDock->iOffsetForExtend * (pDock->fAlign - .5) * 2) - pDock->container.iWidth / 2; // ecart par rapport au milieu du dock a plat.
714 int x_abs = dx + pDock->fFlatDockWidth / 2; // ecart par rapport a la gauche du dock minimal plat.
715 //g_print ("%s (flat:%d, w:%d, x:%d)\n", __func__, (int)pDock->fFlatDockWidth, pDock->container.iWidth, pDock->container.iMouseX);
716 //\_______________ On calcule l'ensemble des parametres des icones.
717 double fMagnitude = cairo_dock_calculate_magnitude (pDock->iMagnitudeIndex) * pDock->fMagnitudeMax;
718 Icon *pPointedIcon = cairo_dock_calculate_wave_with_position_linear (pDock->icons, pDock->pFirstDrawnElement, x_abs, fMagnitude, pDock->fFlatDockWidth, pDock->container.iWidth, pDock->container.iHeight, pDock->fAlign, pDock->fFoldingFactor, pDock->container.bDirectionUp); // iMaxDockWidth
719 return pPointedIcon;
720}
721
722double cairo_dock_get_current_dock_width_linear (CairoDock *pDock)
723{
724 if (pDock->icons == NULL)
725 //return 2 * myDocksParam.iDockRadius + myDocksParam.iDockLineWidth + 2 * myDocksParam.iFrameMargin;
726 return 1 + 2 * myDocksParam.iFrameMargin;
727
728 Icon *pLastIcon = cairo_dock_get_last_drawn_icon (pDock);
729 Icon *pFirstIcon = cairo_dock_get_first_drawn_icon (pDock);
730 double fWidth = pLastIcon->fX - pFirstIcon->fX + pLastIcon->fWidth * pLastIcon->fScale + 2 * myDocksParam.iFrameMargin; // + 2 * myDocksParam.iDockRadius + myDocksParam.iDockLineWidth + 2 * myDocksParam.iFrameMargin
731
732 return fWidth;
733}
734
735
736void cairo_dock_check_if_mouse_inside_linear (CairoDock *pDock)
737{
738 CairoDockMousePositionType iMousePositionType;
739 int iWidth = pDock->container.iWidth;
740 int iHeight = (pDock->fMagnitudeMax != 0 ? pDock->container.iHeight : pDock->iMinDockHeight);
741 ///int iExtraHeight = (pDock->bAtBottom ? 0 : myIconsParam.iLabelSize);
742 int iExtraHeight = 0; /// il faudrait voir si on a un sous-dock ou un dialogue au dessus :-/
743 int iMouseX = pDock->container.iMouseX;
744 int iMouseY = (pDock->container.bDirectionUp ? pDock->container.iHeight - pDock->container.iMouseY : pDock->container.iMouseY);
745 //g_print ("%s (%dx%d, %dx%d, %f)\n", __func__, iMouseX, iMouseY, iWidth, iHeight, pDock->fFoldingFactor);
746
747 //\_______________ On regarde si le curseur est dans le dock ou pas, et on joue sur la taille des icones en consequence.
748 int x_abs = pDock->container.iMouseX + (pDock->fFlatDockWidth - iWidth) / 2; // abscisse par rapport a la gauche du dock minimal plat.
749 gboolean bMouseInsideDock = (x_abs >= 0 && x_abs <= pDock->fFlatDockWidth && iMouseX > 0 && iMouseX < iWidth);
750 //g_print ("bMouseInsideDock : %d (%d;%d/%.2f)\n", bMouseInsideDock, pDock->container.bInside, x_abs, pDock->fFlatDockWidth);
751
752 if (! bMouseInsideDock) // hors du dock par les cotes.
753 {
754 if (/*cairo_dock_is_extended_dock (pDock) && */pDock->bAutoHide) // c'est penible de sortir du dock trop facilement avec l'auto-hide.
755 {
756 if (iMouseY >= 0 && iMouseY < iHeight)
757 iMousePositionType = CAIRO_DOCK_MOUSE_INSIDE;
758 else
759 iMousePositionType = CAIRO_DOCK_MOUSE_OUTSIDE;
760 }
761 else
762 {
763 double fSideMargin = fabs (pDock->fAlign - .5) * (iWidth - pDock->fFlatDockWidth);
764 if (x_abs < - fSideMargin || x_abs > pDock->fFlatDockWidth + fSideMargin)
765 iMousePositionType = CAIRO_DOCK_MOUSE_OUTSIDE;
766 else
767 iMousePositionType = CAIRO_DOCK_MOUSE_ON_THE_EDGE;
768 }
769 }
770 else if (iMouseY >= 0 && iMouseY < iHeight) // et en plus on est dedans en y. // && pPointedIcon != NULL
771 {
772 //g_print ("on est dedans en x et en y (iMouseX=%d => x_abs=%d ; iMouseY=%d/%d)\n", iMouseX, x_abs, iMouseY, iHeight);
773 //pDock->container.bInside = TRUE;
774 iMousePositionType = CAIRO_DOCK_MOUSE_INSIDE;
775 }
776 else
777 iMousePositionType = CAIRO_DOCK_MOUSE_OUTSIDE;
778
779 pDock->iMousePositionType = iMousePositionType;
780}
781
782void cairo_dock_manage_mouse_position (CairoDock *pDock)
783{
784 switch (pDock->iMousePositionType)
785 {
786 case CAIRO_DOCK_MOUSE_INSIDE :
787 //g_print ("INSIDE (%d;%d;%d;%d;%d)\n", cairo_dock_entrance_is_allowed (pDock), pDock->iMagnitudeIndex, pDock->bIsGrowingUp, pDock->bIsShrinkingDown, pDock->iInputState);
788 if (cairo_dock_entrance_is_allowed (pDock) && ((pDock->iMagnitudeIndex < CAIRO_DOCK_NB_MAX_ITERATIONS && ! pDock->bIsGrowingUp) || pDock->bIsShrinkingDown) && pDock->iInputState != CAIRO_DOCK_INPUT_HIDDEN && (pDock->iInputState != CAIRO_DOCK_INPUT_AT_REST || pDock->bIsDragging)) // on est dedans et la taille des icones est non maximale bien que le dock ne soit pas en train de grossir, cependant on respecte l'etat 'cache', et l'etat repos.
789 {
790 //g_print ("on est dedans en x et en y et la taille des icones est non maximale bien qu'aucune icone ne soit animee (%d;%d)\n", pDock->iMagnitudeIndex, pDock->container.bInside);
791 if (pDock->iRefCount != 0 && !pDock->container.bInside)
792 {
793
794 break;
795 }
796 //pDock->container.bInside = TRUE;
797 ///if ((pDock->bAtBottom && pDock->iRefCount == 0 && ! pDock->bAutoHide) || (pDock->container.iWidth != pDock->iMaxDockWidth || pDock->container.iHeight != pDock->iMaxDockHeight) || (!pDock->container.bInside)) // on le fait pas avec l'auto-hide, car un signal d'entree est deja emis a cause des mouvements/redimensionnements de la fenetre, et en rajouter un ici fout le boxon. // !pDock->container.bInside ajoute pour le bug du chgt de bureau.
798 if ((pDock->iMagnitudeIndex == 0 && pDock->iRefCount == 0 && ! pDock->bAutoHide) || !pDock->container.bInside)
799 {
800 //g_print (" on emule une re-rentree (pDock->iMagnitudeIndex:%d)\n", pDock->iMagnitudeIndex);
801 cairo_dock_emit_enter_signal (CAIRO_CONTAINER (pDock));
802 }
803 else // on se contente de faire grossir les icones.
804 {
805 //g_print (" on se contente de faire grossir les icones\n");
806 cairo_dock_start_growing (pDock);
807 if (pDock->bAutoHide && pDock->iRefCount == 0)
808 cairo_dock_start_showing (pDock);
809 }
810 }
811 break ;
812
813 case CAIRO_DOCK_MOUSE_ON_THE_EDGE :
814 if (pDock->iMagnitudeIndex > 0 && ! pDock->bIsGrowingUp)
815 cairo_dock_start_shrinking (pDock);
816 break ;
817
818 case CAIRO_DOCK_MOUSE_OUTSIDE :
819 //g_print ("en dehors du dock (bIsShrinkingDown:%d;bIsGrowingUp:%d;iMagnitudeIndex:%d)\n", pDock->bIsShrinkingDown, pDock->bIsGrowingUp, pDock->iMagnitudeIndex);
820 if (! pDock->bIsGrowingUp && ! pDock->bIsShrinkingDown && pDock->iSidLeaveDemand == 0 && pDock->iMagnitudeIndex > 0 && ! pDock->bIconIsFlyingAway)
821 {
822 if (pDock->iRefCount > 0)
823 {
824 Icon *pPointingIcon = cairo_dock_search_icon_pointing_on_dock (pDock, NULL);
825 if (pPointingIcon && pPointingIcon->bPointed) // sous-dock pointe, n le laisse en position haute.
826 return;
827 }
828 //g_print ("on force a quitter (iRefCount:%d; bIsGrowingUp:%d; iMagnitudeIndex:%d)\n", pDock->iRefCount, pDock->bIsGrowingUp, pDock->iMagnitudeIndex);
829 pDock->iSidLeaveDemand = g_timeout_add (MAX (myDocksParam.iLeaveSubDockDelay, 330), (GSourceFunc) cairo_dock_emit_leave_signal, (gpointer) pDock);
830 }
831 break ;
832 }
833}
834
835#define make_icon_avoid_mouse(icon) \
836 cairo_dock_mark_icon_as_avoiding_mouse (icon);\
837 icon->fAlpha = 0.75;\
838 if (myIconsParam.fAmplitude != 0)\
839 icon->fDrawX += icon->fWidth / 2 * (icon->fScale - 1) / myIconsParam.fAmplitude * (icon->fPhase < G_PI/2 ? -1 : 1);
840
841static gboolean _cairo_dock_check_can_drop_linear (CairoDock *pDock, CairoDockIconGroup iGroup, double fMargin)
842{
843 gboolean bCanDrop = FALSE;
844 Icon *icon;
845 GList *pFirstDrawnElement = (pDock->pFirstDrawnElement != NULL ? pDock->pFirstDrawnElement : pDock->icons);
846 GList *ic = pFirstDrawnElement;
847 do
848 {
849 icon = ic->data;
850 if (icon->bPointed) // && icon->iAnimationState != CAIRO_DOCK_FOLLOW_MOUSE
851 {
852 if (pDock->container.iMouseX < icon->fDrawX + icon->fWidth * icon->fScale * fMargin) // on est a gauche. // fDrawXAtRest
853 {
854 Icon *prev_icon = cairo_dock_get_previous_element (ic, pDock->icons) -> data;
855 if ((cairo_dock_get_icon_order (icon) == cairo_dock_get_group_order (iGroup) || cairo_dock_get_icon_order (prev_icon) == cairo_dock_get_group_order (iGroup))) // && prev_icon->iAnimationType != CAIRO_DOCK_FOLLOW_MOUSE
856 {
857 make_icon_avoid_mouse (icon);
858 make_icon_avoid_mouse (prev_icon);
859 //g_print ("%s> <%s\n", prev_icon->cName, icon->cName);
860 bCanDrop = TRUE;
861 }
862 }
863 else if (pDock->container.iMouseX > icon->fDrawX + icon->fWidth * icon->fScale * (1 - fMargin)) // on est a droite. // fDrawXAtRest
864 {
865 Icon *next_icon = cairo_dock_get_next_element (ic, pDock->icons) -> data;
866 if ((icon->iGroup == iGroup || next_icon->iGroup == iGroup)) // && next_icon->iAnimationType != CAIRO_DOCK_FOLLOW_MOUSE
867 {
868 make_icon_avoid_mouse (icon);
869 make_icon_avoid_mouse (next_icon);
870 //g_print ("%s> <%s\n", icon->cName, next_icon->cName);
871 bCanDrop = TRUE;
872 }
873 ic = cairo_dock_get_next_element (ic, pDock->icons); // on la saute.
874 if (ic == pFirstDrawnElement)
875 break ;
876 } // else on est dessus.
877 }
878 else
879 cairo_dock_stop_marking_icon_as_avoiding_mouse (icon);
880
881 ic = cairo_dock_get_next_element (ic, pDock->icons);
882 } while (ic != pFirstDrawnElement);
883
884 return bCanDrop;
885}
886
887
888void cairo_dock_check_can_drop_linear (CairoDock *pDock)
889{
890 if (pDock->icons == NULL)
891 return;
892
893 if (pDock->bIsDragging)
894 pDock->bCanDrop = _cairo_dock_check_can_drop_linear (pDock, pDock->iAvoidingMouseIconType, pDock->fAvoidingMouseMargin);
895 else
896 pDock->bCanDrop = FALSE;
897}
898
899void cairo_dock_stop_marking_icons (CairoDock *pDock)
900{
901 if (pDock->icons == NULL)
902 return;
903 //g_print ("%s (%d)\n", __func__, iType);
904
905 Icon *icon;
906 GList *ic;
907 for (ic = pDock->icons; ic != NULL; ic = ic->next)
908 {
909 icon = ic->data;
910 cairo_dock_stop_marking_icon_as_avoiding_mouse (icon);
911 }
912}
913
914
915void cairo_dock_set_subdock_position_linear (Icon *pPointedIcon, CairoDock *pDock)
916{
917 CairoDock *pSubDock = pPointedIcon->pSubDock;
918 int iX = pPointedIcon->fXAtRest - (pDock->fFlatDockWidth - pDock->iMaxDockWidth) / 2 + pPointedIcon->fWidth / 2 + (pDock->iOffsetForExtend * (pDock->fAlign - .5) * 2);
919 if (pSubDock->container.bIsHorizontal == pDock->container.bIsHorizontal)
920 {
921 pSubDock->fAlign = 0.5;
922 pSubDock->iGapX = iX + pDock->container.iWindowPositionX - (pDock->container.bIsHorizontal ? pDock->iScreenOffsetX : pDock->iScreenOffsetY) - g_desktopGeometry.iScreenWidth[pDock->container.bIsHorizontal] / 2; // ici les sous-dock ont un alignement egal a 0.5
923 pSubDock->iGapY = pDock->iGapY + pDock->iMaxDockHeight;
924 }
925 else
926 {
927 pSubDock->fAlign = (pDock->container.bDirectionUp ? 1 : 0);
928 pSubDock->iGapX = (pDock->iGapY + pDock->iMaxDockHeight) * (pDock->container.bDirectionUp ? -1 : 1);
929 if (pDock->container.bDirectionUp)
930 pSubDock->iGapY = g_desktopGeometry.iScreenWidth[pDock->container.bIsHorizontal] - (iX + pDock->container.iWindowPositionX - (pDock->container.bIsHorizontal ? pDock->iScreenOffsetX : pDock->iScreenOffsetY)) - pSubDock->iMaxDockHeight / 2; // les sous-dock ont un alignement egal a 1.
931 else
932 pSubDock->iGapY = iX + pDock->container.iWindowPositionX - pSubDock->iMaxDockHeight / 2; // les sous-dock ont un alignement egal a 0.
933 }
934}
935
936
937GList *cairo_dock_get_first_drawn_element_linear (GList *icons)
938{
939 Icon *icon;
940 GList *ic;
941 GList *pFirstDrawnElement = NULL;
942 for (ic = icons; ic != NULL; ic = ic->next)
943 {
944 icon = ic->data;
945 if (icon->bPointed)
946 break ;
947 }
948
949 if (ic == NULL || ic->next == NULL) // derniere icone ou aucune pointee.
950 pFirstDrawnElement = icons;
951 else
952 pFirstDrawnElement = ic->next;
953 return pFirstDrawnElement;
954}
955
956
957void cairo_dock_show_subdock (Icon *pPointedIcon, CairoDock *pParentDock)
958{
959 cd_debug ("on montre le dock fils");
960 CairoDock *pSubDock = pPointedIcon->pSubDock;
961 g_return_if_fail (pSubDock != NULL);
962
963 if (GTK_WIDGET_VISIBLE (pSubDock->container.pWidget)) // il est deja visible.
964 {
965 if (pSubDock->bIsShrinkingDown) // il est en cours de diminution, on renverse le processus.
966 {
967 cairo_dock_start_growing (pSubDock);
968 }
969 return ;
970 }
971
972 pSubDock->pRenderer->set_subdock_position (pPointedIcon, pParentDock);
973 if (pParentDock->fMagnitudeMax == 0) // son input shape n'est pas la taille max mais iMinDockHeight.
974 pSubDock->iGapY -= (pParentDock->container.iHeight - pParentDock->iMinDockHeight);
975
976 if (pSubDock->icons != NULL)
977 {
978 pSubDock->fFoldingFactor = (myDocksParam.bAnimateSubDock ? .99 : 0.);
979 cairo_dock_notify_on_object (&myIconsMgr, NOTIFICATION_UNFOLD_SUBDOCK, pPointedIcon);
980 cairo_dock_notify_on_object (pPointedIcon, NOTIFICATION_UNFOLD_SUBDOCK, pPointedIcon);
981 }
982 else
983 pSubDock->fFoldingFactor = 0.;
984
985 int iNewWidth = pSubDock->iMaxDockWidth;
986 int iNewHeight = pSubDock->iMaxDockHeight;
987 int iNewPositionX, iNewPositionY;
988 cairo_dock_get_window_position_at_balance (pSubDock, iNewWidth, iNewHeight, &iNewPositionX, &iNewPositionY);
989
990 gtk_window_present (GTK_WINDOW (pSubDock->container.pWidget));
991
992 if (pSubDock->container.bIsHorizontal)
993 gdk_window_move_resize (pSubDock->container.pWidget->window,
994 iNewPositionX,
995 iNewPositionY,
996 iNewWidth,
997 iNewHeight);
998 else
999 gdk_window_move_resize (pSubDock->container.pWidget->window,
1000 iNewPositionY,
1001 iNewPositionX,
1002 iNewHeight,
1003 iNewWidth);
1004
1005 if (pSubDock->fFoldingFactor == 0.)
1006 {
1007 cd_debug (" on montre le sous-dock sans animation");
1008 gtk_widget_queue_draw (pSubDock->container.pWidget);
1009 }
1010 else
1011 {
1012 cd_debug (" on montre le sous-dock avec animation");
1013 cairo_dock_start_growing (pSubDock); // on commence a faire grossir les icones.
1014 pSubDock->pRenderer->calculate_icons (pSubDock); // on recalcule les icones car sinon le 1er dessin se fait avec les parametres tels qu'ils etaient lorsque le dock s'est cache; or l'animation de pliage peut prendre plus de temps que celle de cachage.
1015 }
1016 //g_print (" -> Gap %d;%d -> W(%d;%d) (%d)\n", pSubDock->iGapX, pSubDock->iGapY, pSubDock->container.iWindowPositionX, pSubDock->container.iWindowPositionY, pSubDock->container.bIsHorizontal);
1017
1018 ///gtk_window_set_keep_above (GTK_WINDOW (pSubDock->container.pWidget), myDocksParam.bPopUp);
1019
1020 cairo_dock_replace_all_dialogs ();
1021}
1022
1023
1024
1025static gboolean _redraw_subdock_content_idle (Icon *pIcon)
1026{
1027 cd_debug ("%s()", __func__);
1028 cd_debug (" %s", pIcon->cName);
1029 CairoDock *pDock = cairo_dock_search_dock_from_name (pIcon->cParentDockName);
1030 if (pDock != NULL)
1031 {
1032 if (pIcon->pSubDock != NULL)
1033 {
1034 cairo_dock_draw_subdock_content_on_icon (pIcon, pDock);
1035 }
1036 else // l'icone a pu perdre son sous-dock entre-temps (exemple : une classe d'appli contenant 2 icones, dont on enleve l'une des 2.
1037 {
1038 cairo_dock_reload_icon_image (pIcon, CAIRO_CONTAINER (pDock));
1039 }
1040 cairo_dock_redraw_icon (pIcon, CAIRO_CONTAINER (pDock));
1041 }
1042 pIcon->iSidRedrawSubdockContent = 0;
1043 return FALSE;
1044}
1045void cairo_dock_trigger_redraw_subdock_content (CairoDock *pDock)
1046{
1047 Icon *pPointingIcon = cairo_dock_search_icon_pointing_on_dock (pDock, NULL);
1048 if (pPointingIcon != NULL && (pPointingIcon->iSubdockViewType != 0 || (pPointingIcon->cClass != NULL && ! myIndicatorsParam.bUseClassIndic && (CAIRO_DOCK_ICON_TYPE_IS_CLASS_CONTAINER (pPointingIcon) || CAIRO_DOCK_ICON_TYPE_IS_LAUNCHER (pPointingIcon)))))
1049 {
1050 if (pPointingIcon->iSidRedrawSubdockContent != 0) // s'il y'a deja un redessin de prevu, on le passe a la fin de facon a ce qu'il ne se fasse pas avant le redessin de l'icone responsable de ce trigger.
1051 g_source_remove (pPointingIcon->iSidRedrawSubdockContent);
1052 pPointingIcon->iSidRedrawSubdockContent = g_idle_add ((GSourceFunc) _redraw_subdock_content_idle, pPointingIcon);
1053 }
1054}
1055
1056void cairo_dock_trigger_redraw_subdock_content_on_icon (Icon *icon)
1057{
1058 if (icon->iSidRedrawSubdockContent == 0)
1059 icon->iSidRedrawSubdockContent = g_idle_add ((GSourceFunc) _redraw_subdock_content_idle, icon);
1060}
1061
1062void cairo_dock_redraw_subdock_content (CairoDock *pDock)
1063{
1064 CairoDock *pParentDock = NULL;
1065 Icon *pPointingIcon = cairo_dock_search_icon_pointing_on_dock (pDock, &pParentDock);
1066 if (pPointingIcon != NULL && pPointingIcon->iSubdockViewType != 0 && pPointingIcon->iSidRedrawSubdockContent == 0 && pParentDock != NULL)
1067 {
1068 cairo_dock_draw_subdock_content_on_icon (pPointingIcon, pParentDock);
1069 cairo_dock_redraw_icon (pPointingIcon, CAIRO_CONTAINER (pParentDock));
1070 }
1071}
1072
1073static gboolean _update_WM_icons (CairoDock *pDock)
1074{
1075 cairo_dock_set_icons_geometry_for_window_manager (pDock);
1076 pDock->iSidUpdateWMIcons = 0;
1077 return FALSE;
1078}
1079void cairo_dock_trigger_set_WM_icons_geometry (CairoDock *pDock)
1080{
1081 if (pDock->iSidUpdateWMIcons == 0)
1082 {
1083 pDock->iSidUpdateWMIcons = g_idle_add ((GSourceFunc) _update_WM_icons, pDock);
1084 }
1085}
1086
1087
1088 ///////////////////////
1089 /// DOCK BACKGROUND ///
1090///////////////////////
1091
1092static cairo_surface_t *_cairo_dock_make_stripes_background (int iWidth, int iHeight, double *fStripesColorBright, double *fStripesColorDark, int iNbStripes, double fStripesWidth, double fStripesAngle)
1093{
1094 cairo_pattern_t *pStripesPattern;
1095 double fWidth = iWidth;
1096 if (fabs (fStripesAngle) != 90)
1097 pStripesPattern = cairo_pattern_create_linear (0.0f,
1098 0.0f,
1099 iWidth,
1100 iWidth * tan (fStripesAngle * G_PI/180.));
1101 else
1102 pStripesPattern = cairo_pattern_create_linear (0.0f,
1103 0.0f,
1104 0.,
1105 (fStripesAngle == 90) ? iHeight : - iHeight);
1106 g_return_val_if_fail (cairo_pattern_status (pStripesPattern) == CAIRO_STATUS_SUCCESS, NULL);
1107
1108 cairo_pattern_set_extend (pStripesPattern, CAIRO_EXTEND_REPEAT);
1109
1110 if (iNbStripes > 0)
1111 {
1112 gdouble fStep;
1113 int i;
1114 for (i = 0; i < iNbStripes+1; i ++)
1115 {
1116 fStep = (double)i / iNbStripes;
1117 cairo_pattern_add_color_stop_rgba (pStripesPattern,
1118 fStep - fStripesWidth / 2.,
1119 fStripesColorBright[0],
1120 fStripesColorBright[1],
1121 fStripesColorBright[2],
1122 fStripesColorBright[3]);
1123 cairo_pattern_add_color_stop_rgba (pStripesPattern,
1124 fStep,
1125 fStripesColorDark[0],
1126 fStripesColorDark[1],
1127 fStripesColorDark[2],
1128 fStripesColorDark[3]);
1129 cairo_pattern_add_color_stop_rgba (pStripesPattern,
1130 fStep + fStripesWidth / 2.,
1131 fStripesColorBright[0],
1132 fStripesColorBright[1],
1133 fStripesColorBright[2],
1134 fStripesColorBright[3]);
1135 }
1136 }
1137 else
1138 {
1139 cairo_pattern_add_color_stop_rgba (pStripesPattern,
1140 0.,
1141 fStripesColorDark[0],
1142 fStripesColorDark[1],
1143 fStripesColorDark[2],
1144 fStripesColorDark[3]);
1145 cairo_pattern_add_color_stop_rgba (pStripesPattern,
1146 1.,
1147 fStripesColorBright[0],
1148 fStripesColorBright[1],
1149 fStripesColorBright[2],
1150 fStripesColorBright[3]);
1151 }
1152
1153 cairo_surface_t *pNewSurface = cairo_dock_create_blank_surface (
1154 iWidth,
1155 iHeight);
1156 cairo_t *pImageContext = cairo_create (pNewSurface);
1157 cairo_set_source (pImageContext, pStripesPattern);
1158 cairo_paint (pImageContext);
1159
1160 cairo_pattern_destroy (pStripesPattern);
1161 cairo_destroy (pImageContext);
1162
1163 return pNewSurface;
1164}
1165static void _cairo_dock_load_default_background (CairoDockImageBuffer *pImage, int iWidth, int iHeight)
1166{
1167 //g_print ("%s (%s, %d)\n", __func__, myDocksParam.cBackgroundImageFile, myDocksParam.bBackgroundImageRepeat);
1168 if (myDocksParam.cBackgroundImageFile != NULL)
1169 {
1170 if (myDocksParam.bBackgroundImageRepeat)
1171 {
1172 cairo_surface_t *pBgSurface = cairo_dock_create_surface_from_pattern (myDocksParam.cBackgroundImageFile,
1173 iWidth,
1174 iHeight,
1175 myDocksParam.fBackgroundImageAlpha);
1176 cairo_dock_load_image_buffer_from_surface (pImage,
1177 pBgSurface,
1178 iWidth,
1179 iHeight);
1180 }
1181 else
1182 {
1183 cairo_dock_load_image_buffer_full (pImage,
1184 myDocksParam.cBackgroundImageFile,
1185 iWidth,
1186 iHeight,
1187 CAIRO_DOCK_FILL_SPACE,
1188 myDocksParam.fBackgroundImageAlpha);
1189 }
1190 }
1191 if (pImage->pSurface == NULL)
1192 {
1193 cairo_surface_t *pBgSurface = _cairo_dock_make_stripes_background (
1194 iWidth,
1195 iHeight,
1196 myDocksParam.fStripesColorBright,
1197 myDocksParam.fStripesColorDark,
1198 myDocksParam.iNbStripes,
1199 myDocksParam.fStripesWidth,
1200 myDocksParam.fStripesAngle);
1201 cairo_dock_load_image_buffer_from_surface (pImage,
1202 pBgSurface,
1203 iWidth,
1204 iHeight);
1205 }
1206}
1207
1208void cairo_dock_load_dock_background (CairoDock *pDock)
1209{
1210 cairo_dock_unload_image_buffer (&pDock->backgroundBuffer);
1211
1212 int iWidth = pDock->iDecorationsWidth;
1213 int iHeight = pDock->iDecorationsHeight;
1214
1215 if (pDock->bGlobalBg || pDock->iRefCount > 0)
1216 {
1217 _cairo_dock_load_default_background (&pDock->backgroundBuffer, iWidth, iHeight);
1218 }
1219 else if (pDock->cBgImagePath != NULL)
1220 {
1221 cairo_dock_load_image_buffer (&pDock->backgroundBuffer, pDock->cBgImagePath, iWidth, iHeight, CAIRO_DOCK_FILL_SPACE);
1222 }
1223 if (pDock->backgroundBuffer.pSurface == NULL)
1224 {
1225 cairo_surface_t *pSurface = _cairo_dock_make_stripes_background (iWidth, iHeight, pDock->fBgColorBright, pDock->fBgColorDark, 0, 0., 90);
1226 cairo_dock_load_image_buffer_from_surface (&pDock->backgroundBuffer, pSurface, iWidth, iHeight);
1227 }
1228}
1229
1230static gboolean _load_background_idle (CairoDock *pDock)
1231{
1232 cairo_dock_load_dock_background (pDock);
1233
1234 pDock->iSidLoadBg = 0;
1235 return FALSE;
1236}
1237void cairo_dock_trigger_load_dock_background (CairoDock *pDock)
1238{
1239 if (pDock->iDecorationsWidth == pDock->backgroundBuffer.iWidth && pDock->iDecorationsHeight == pDock->backgroundBuffer.iHeight) // mise a jour inutile.
1240 return;
1241 if (pDock->iSidLoadBg == 0)
1242 pDock->iSidLoadBg = g_idle_add ((GSourceFunc)_load_background_idle, pDock);
1243}
01244
=== modified file '.pc/applied-patches'
--- .pc/applied-patches 2011-03-17 14:08:48 +0000
+++ .pc/applied-patches 2011-05-21 19:26:06 +0000
@@ -1,1 +1,2 @@
101-default_theme_with_default_apps101-default_theme_with_default_apps
202-mouse-leaves-on-the-edge_upstream-version-2.3.0~2.1.patch
23
=== modified file 'CMakeLists.txt'
--- CMakeLists.txt 2011-03-17 14:08:48 +0000
+++ CMakeLists.txt 2011-05-21 19:26:06 +0000
@@ -10,7 +10,7 @@
10########### project ###############10########### project ###############
1111
12project ("cairo-dock")12project ("cairo-dock")
13set (VERSION "2.3.0~1")13set (VERSION "2.3.0~2")
1414
15add_definitions (-std=c99 -Wstrict-prototypes -Wextra -Wwrite-strings -Wuninitialized -Werror-implicit-function-declaration) #-Wunreachable-code -Wno-unused-parameter -Wall 15add_definitions (-std=c99 -Wstrict-prototypes -Wextra -Wwrite-strings -Wuninitialized -Werror-implicit-function-declaration) #-Wunreachable-code -Wno-unused-parameter -Wall
16if (NOT ${CMAKE_BUILD_TYPE})16if (NOT ${CMAKE_BUILD_TYPE})
1717
=== modified file 'debian/changelog'
--- debian/changelog 2011-03-17 14:08:48 +0000
+++ debian/changelog 2011-05-21 19:26:06 +0000
@@ -1,3 +1,17 @@
1cairo-dock (2.3.0~2-0ubuntu1) UNRELEASED; urgency=low
2
3 * New upstream release. (LP: #786104)
4 * Upstream ChangeLog:
5 - Fixed a crash that occured when a class sub-dock was destroyed
6 (LP: #773280)
7 - Fixed a major bug where the dock couldn't re-appear after a
8 menu has been triggerd from outside the dock (ie, from a shortcut)
9 * debian/patches:
10 - Added an upstream's patch to fix an annoying bug when we slowly
11 leave the dock with the cursor on the edge of it
12
13 -- Matthieu Baerts (matttbe) <matttbe@gmail.com> Sat, 21 May 2011 21:03:26 +0200
14
1cairo-dock (2.3.0~1-0ubuntu1) natty; urgency=low15cairo-dock (2.3.0~1-0ubuntu1) natty; urgency=low
216
3 * New Upstream Version (LP: #723994)17 * New Upstream Version (LP: #723994)
418
=== added file 'debian/patches/02-mouse-leaves-on-the-edge_upstream-version-2.3.0~2.1.patch'
--- debian/patches/02-mouse-leaves-on-the-edge_upstream-version-2.3.0~2.1.patch 1970-01-01 00:00:00 +0000
+++ debian/patches/02-mouse-leaves-on-the-edge_upstream-version-2.3.0~2.1.patch 2011-05-21 19:26:06 +0000
@@ -0,0 +1,25 @@
1From: Matthieu Baerts <matttbe@gmail.com>
2Subject: Fixed an annoying bug when we slowly leave the dock with the cursor on the edge of it
3Origin: upstream, http://bazaar.launchpad.net/~cairo-dock-team/cairo-dock-core/2.3.x/revision/757
4Bug: http://www.glx-dock.org/tt_task.php?p=1&t=174
5Forwarded: yes
6
7Index: cairo-dock/src/gldit/cairo-dock-dock-facility.c
8===================================================================
9--- cairo-dock.orig/src/gldit/cairo-dock-dock-facility.c 2011-05-21 10:52:15.504630255 +0200
10+++ cairo-dock/src/gldit/cairo-dock-dock-facility.c 2011-05-21 10:52:38.494663981 +0200
11@@ -760,11 +760,10 @@
12 }
13 else
14 {
15- double fSideMargin = fabs (pDock->fAlign - .5) * (iWidth - pDock->fFlatDockWidth);
16- if (x_abs < - fSideMargin || x_abs > pDock->fFlatDockWidth + fSideMargin)
17- iMousePositionType = CAIRO_DOCK_MOUSE_OUTSIDE;
18- else
19+ if (iMouseY >= 0 && iMouseY < iHeight)
20 iMousePositionType = CAIRO_DOCK_MOUSE_ON_THE_EDGE;
21+ else
22+ iMousePositionType = CAIRO_DOCK_MOUSE_OUTSIDE;
23 }
24 }
25 else if (iMouseY >= 0 && iMouseY < iHeight) // et en plus on est dedans en y. // && pPointedIcon != NULL
026
=== modified file 'debian/patches/series'
--- debian/patches/series 2011-03-17 14:08:48 +0000
+++ debian/patches/series 2011-05-21 19:26:06 +0000
@@ -1,1 +1,2 @@
101-default_theme_with_default_apps101-default_theme_with_default_apps
202-mouse-leaves-on-the-edge_upstream-version-2.3.0~2.1.patch
23
=== modified file 'src/gldit/cairo-dock-animations.c'
--- src/gldit/cairo-dock-animations.c 2011-03-17 14:08:48 +0000
+++ src/gldit/cairo-dock-animations.c 2011-05-21 19:26:06 +0000
@@ -378,7 +378,12 @@
378 pIcon->fInsertRemoveFactor = 0.; // on le fait avant le reload, sinon l'icone n'est pas rechargee.378 pIcon->fInsertRemoveFactor = 0.; // on le fait avant le reload, sinon l'icone n'est pas rechargee.
379 if (!pIcon->bIsHidden && myTaskbarParam.bHideVisibleApplis) // on lui remet l'image normale qui servira d'embleme lorsque l'icone sera inseree a nouveau dans le dock.379 if (!pIcon->bIsHidden && myTaskbarParam.bHideVisibleApplis) // on lui remet l'image normale qui servira d'embleme lorsque l'icone sera inseree a nouveau dans le dock.
380 cairo_dock_reload_icon_image (pIcon, CAIRO_CONTAINER (pDock));380 cairo_dock_reload_icon_image (pIcon, CAIRO_CONTAINER (pDock));
381 cairo_dock_detach_appli (pIcon);381 pDock = cairo_dock_detach_appli (pIcon);
382 if (pDock == NULL)
383 {
384 cairo_dock_free_icon (pIcon);
385 return FALSE;
386 }
382 }387 }
383 else388 else
384 {389 {
385390
=== modified file 'src/gldit/cairo-dock-dock-facility.c'
--- src/gldit/cairo-dock-dock-facility.c 2011-03-17 14:08:48 +0000
+++ src/gldit/cairo-dock-dock-facility.c 2011-05-21 19:26:06 +0000
@@ -760,11 +760,10 @@
760 }760 }
761 else761 else
762 {762 {
763 double fSideMargin = fabs (pDock->fAlign - .5) * (iWidth - pDock->fFlatDockWidth);763 if (iMouseY >= 0 && iMouseY < iHeight)
764 if (x_abs < - fSideMargin || x_abs > pDock->fFlatDockWidth + fSideMargin)
765 iMousePositionType = CAIRO_DOCK_MOUSE_OUTSIDE;
766 else
767 iMousePositionType = CAIRO_DOCK_MOUSE_ON_THE_EDGE;764 iMousePositionType = CAIRO_DOCK_MOUSE_ON_THE_EDGE;
765 else
766 iMousePositionType = CAIRO_DOCK_MOUSE_OUTSIDE;
768 }767 }
769 }768 }
770 else if (iMouseY >= 0 && iMouseY < iHeight) // et en plus on est dedans en y. // && pPointedIcon != NULL769 else if (iMouseY >= 0 && iMouseY < iHeight) // et en plus on est dedans en y. // && pPointedIcon != NULL
771770
=== modified file 'src/gldit/cairo-dock-dock-manager.c'
--- src/gldit/cairo-dock-dock-manager.c 2011-03-17 14:08:48 +0000
+++ src/gldit/cairo-dock-dock-manager.c 2011-05-21 19:26:06 +0000
@@ -992,7 +992,7 @@
992}992}
993static gboolean _cairo_dock_unhide_dock_delayed (CairoDock *pDock)993static gboolean _cairo_dock_unhide_dock_delayed (CairoDock *pDock)
994{994{
995 if (pDock->container.bInside) // on est deja dedans, inutile de le re-montrer.995 if (pDock->container.bInside && pDock->iInputState != CAIRO_DOCK_INPUT_HIDDEN && !pDock->bIsBelow) // already inside and reachable (caution) => no need to show it again.
996 {996 {
997 pDock->iSidUnhideDelayed = 0;997 pDock->iSidUnhideDelayed = 0;
998 return FALSE;998 return FALSE;

Subscribers

People subscribed via source and target branches