← Back to team overview

cairo-dock-team team mailing list archive

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

 

Matthieu Baerts has proposed merging lp:~cairo-dock-team/ubuntu/oneiric/cairo-dock/2.3.0-2.1 into lp:ubuntu/cairo-dock.

Requested reviews:
  Ubuntu Sponsors Team (ubuntu-sponsors)
Related bugs:
  Bug #786104 in cairo-dock (Ubuntu): "Please update Cairo-Dock to 2.3.0~2.1 version (bugs fixed only)"
  https://bugs.launchpad.net/ubuntu/+source/cairo-dock/+bug/786104

For more details, see:
https://code.launchpad.net/~cairo-dock-team/ubuntu/oneiric/cairo-dock/2.3.0-2.1/+merge/61870

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.
-- 
https://code.launchpad.net/~cairo-dock-team/ubuntu/oneiric/cairo-dock/2.3.0-2.1/+merge/61870
Your team Cairo-Dock Team is subscribed to branch lp:~cairo-dock-team/ubuntu/oneiric/cairo-dock/2.3.0-2.1.
=== 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 @@
+/**
+* This file is a part of the Cairo-Dock project
+*
+* Copyright : (C) see the 'copyright' file.
+* E-mail    : see the 'copyright' file.
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 3
+* of the License, or (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+* You should have received a copy of the GNU General Public License
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <math.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <glib/gstdio.h>
+#include <gtk/gtk.h>
+#include <gdk/gdkx.h>
+
+#include <cairo.h>
+#include <pango/pango.h>
+#include <librsvg/rsvg.h>
+#include <librsvg/rsvg-cairo.h>
+
+#ifdef HAVE_GLITZ
+#include <glitz-glx.h>
+#include <cairo-glitz.h>
+#endif
+
+#include <gtk/gtkgl.h>
+#include <X11/extensions/Xrender.h>
+#include <X11/extensions/shape.h>
+#include <GL/gl.h> 
+#include <GL/glu.h> 
+#include <GL/glx.h> 
+#include <gdk/x11/gdkglx.h>
+
+#include "cairo-dock-draw.h"
+#include "cairo-dock-applications-manager.h"
+#include "cairo-dock-image-buffer.h"
+#include "cairo-dock-config.h"
+#include "cairo-dock-module-factory.h"
+#include "cairo-dock-callbacks.h"
+#include "cairo-dock-icon-factory.h"
+#include "cairo-dock-icon-facility.h"
+#include "cairo-dock-separator-factory.h"
+#include "cairo-dock-launcher-factory.h"
+#include "cairo-dock-backends-manager.h"  // myBackendsParam.fSubDockSizeRatio
+#include "cairo-dock-X-utilities.h"
+#include "cairo-dock-log.h"
+#include "cairo-dock-keyfile-utilities.h"
+#include "cairo-dock-dock-manager.h"
+#include "cairo-dock-dialog-manager.h"
+#include "cairo-dock-notifications.h"
+#include "cairo-dock-indicator-manager.h"  // myIndicators.bUseClassIndic
+#include "cairo-dock-class-manager.h"
+#include "cairo-dock-animations.h"
+#include "cairo-dock-emblem.h"
+#include "cairo-dock-X-manager.h"
+#include "cairo-dock-dock-facility.h"
+
+extern CairoDockDesktopGeometry g_desktopGeometry;
+
+void cairo_dock_reload_reflects_in_dock (CairoDock *pDock)
+{
+	cairo_t *pCairoContext = cairo_dock_create_drawing_context_generic (CAIRO_CONTAINER (pDock));
+	Icon *icon;
+	GList *ic;
+	for (ic = pDock->icons; ic != NULL; ic = ic->next)
+	{
+		icon = ic->data;
+		if (icon->pReflectionBuffer != NULL)
+		{
+			cairo_dock_add_reflection_to_icon (icon, CAIRO_CONTAINER (pDock));
+		}
+	}
+	cairo_destroy (pCairoContext);
+}
+
+
+void cairo_dock_update_dock_size (CairoDock *pDock)  // iMaxIconHeight et fFlatDockWidth doivent avoir ete mis a jour au prealable.
+{
+	//g_print ("%s ()\n", __func__);
+	g_return_if_fail (pDock != NULL);
+	int iPrevMaxDockHeight = pDock->iMaxDockHeight;
+	int iPrevMaxDockWidth = pDock->iMaxDockWidth;
+	
+	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.
+	{
+		GList *ic;
+		Icon *icon;
+		pDock->fFlatDockWidth = -myIconsParam.iIconGap;
+		pDock->iMaxIconHeight = 0;
+		for (ic = pDock->icons; ic != NULL; ic = ic->next)
+		{
+			icon = ic->data;
+			icon->fWidth /= pDock->container.fRatio;
+			icon->fHeight /= pDock->container.fRatio;
+			pDock->fFlatDockWidth += icon->fWidth + myIconsParam.iIconGap;
+			if (! CAIRO_DOCK_ICON_TYPE_IS_SEPARATOR (icon))
+				pDock->iMaxIconHeight = MAX (pDock->iMaxIconHeight, icon->fHeight);
+		}
+		if (pDock->iMaxIconHeight == 0)
+			pDock->iMaxIconHeight = 10;
+		pDock->container.fRatio = 1.;
+	}
+	pDock->pRenderer->compute_size (pDock);
+	
+	double hmax = pDock->iMaxIconHeight;
+	int iMaxAuthorizedWidth = cairo_dock_get_max_authorized_dock_width (pDock);
+	int n = 0;
+	do
+	{
+		double fPrevRatio = pDock->container.fRatio;
+		//g_print ("  %s (%d / %d)\n", __func__, (int)pDock->iMaxDockWidth, iMaxAuthorizedWidth);
+		if (pDock->iMaxDockWidth > iMaxAuthorizedWidth)
+		{
+			pDock->container.fRatio *= 1. * iMaxAuthorizedWidth / pDock->iMaxDockWidth;
+		}
+		else
+		{
+			double fMaxRatio = (pDock->iRefCount == 0 ? 1 : myBackendsParam.fSubDockSizeRatio);
+			if (pDock->container.fRatio < fMaxRatio)
+			{
+				pDock->container.fRatio *= 1. * iMaxAuthorizedWidth / pDock->iMaxDockWidth;
+				pDock->container.fRatio = MIN (pDock->container.fRatio, fMaxRatio);
+			}
+			else
+				pDock->container.fRatio = fMaxRatio;
+		}
+		
+		if (pDock->iMaxDockHeight > g_desktopGeometry.iScreenHeight[pDock->container.bIsHorizontal])
+		{
+			pDock->container.fRatio = MIN (pDock->container.fRatio, fPrevRatio * g_desktopGeometry.iScreenHeight[pDock->container.bIsHorizontal] / pDock->iMaxDockHeight);
+		}
+		
+		if (fPrevRatio != pDock->container.fRatio)
+		{
+			//g_print ("  -> changement du ratio : %.3f -> %.3f (%d, %d try)\n", fPrevRatio, pDock->container.fRatio, pDock->iRefCount, n);
+			Icon *icon;
+			GList *ic;
+			pDock->fFlatDockWidth = -myIconsParam.iIconGap;
+			for (ic = pDock->icons; ic != NULL; ic = ic->next)
+			{
+				icon = ic->data;
+				icon->fWidth *= pDock->container.fRatio / fPrevRatio;
+				icon->fHeight *= pDock->container.fRatio / fPrevRatio;
+				pDock->fFlatDockWidth += icon->fWidth + myIconsParam.iIconGap;
+			}
+			hmax *= pDock->container.fRatio / fPrevRatio;
+			
+			pDock->pRenderer->compute_size (pDock);
+		}
+		
+		//g_print ("*** ratio : %.3f -> %.3f\n", fPrevRatio, pDock->container.fRatio);
+		n ++;
+	} while ((pDock->iMaxDockWidth > iMaxAuthorizedWidth || pDock->iMaxDockHeight > g_desktopGeometry.iScreenHeight[pDock->container.bIsHorizontal] || (pDock->container.fRatio < 1 && pDock->iMaxDockWidth < iMaxAuthorizedWidth-5)) && n < 8);
+	pDock->iMaxIconHeight = hmax;
+	//g_print (">>> iMaxIconHeight : %d, ratio : %.2f, fFlatDockWidth : %.2f\n", (int) pDock->iMaxIconHeight, pDock->container.fRatio, pDock->fFlatDockWidth);
+	
+	pDock->pRenderer->calculate_icons (pDock);  // le calcul de max_dock_size a altere les fX et fY.
+	
+	pDock->bWMIconsNeedUpdate = TRUE;
+	///cairo_dock_trigger_set_WM_icons_geometry (pDock);
+	
+	cairo_dock_update_input_shape (pDock);
+	
+	if (GTK_WIDGET_VISIBLE (pDock->container.pWidget) && (iPrevMaxDockHeight != pDock->iMaxDockHeight || iPrevMaxDockWidth != pDock->iMaxDockWidth))
+	{
+		//g_print ("*******%s (%dx%d -> %dx%d)\n", __func__, iPrevMaxDockWidth, iPrevMaxDockHeight, pDock->iMaxDockWidth, pDock->iMaxDockHeight);
+		cairo_dock_move_resize_dock (pDock);
+	}
+	
+	cairo_dock_trigger_load_dock_background (pDock);
+	
+	if (pDock->iRefCount == 0 && pDock->iVisibility == CAIRO_DOCK_VISI_RESERVE && iPrevMaxDockHeight != pDock->iMaxDockHeight)
+		cairo_dock_reserve_space_for_dock (pDock, TRUE);
+}
+
+Icon *cairo_dock_calculate_dock_icons (CairoDock *pDock)
+{
+	Icon *pPointedIcon = pDock->pRenderer->calculate_icons (pDock);
+	cairo_dock_manage_mouse_position (pDock);
+	return (pDock->iMousePositionType == CAIRO_DOCK_MOUSE_INSIDE ? pPointedIcon : NULL);
+}
+
+
+
+  ////////////////////////////////
+ /// WINDOW SIZE AND POSITION ///
+////////////////////////////////
+
+void cairo_dock_reserve_space_for_dock (CairoDock *pDock, gboolean bReserve)
+{
+	Window Xid = GDK_WINDOW_XID (pDock->container.pWidget->window);
+	int left=0, right=0, top=0, bottom=0;
+	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;
+
+	if (bReserve)
+	{
+		int iWindowPositionX = pDock->container.iWindowPositionX, iWindowPositionY = pDock->container.iWindowPositionY;
+		
+		int w = pDock->iMinDockWidth;
+		int h = pDock->iMinDockHeight;
+		int x, y;  // position qu'aurait la fenetre du dock s'il avait la taille minimale.
+		cairo_dock_get_window_position_at_balance (pDock, w, h, &x, &y);
+		
+		if (pDock->container.bDirectionUp)
+		{
+			if (pDock->container.bIsHorizontal)
+			{
+				bottom = h + pDock->iGapY;
+				bottom_start_x = x;
+				bottom_end_x = x + w;
+			}
+			else
+			{
+				right = h + pDock->iGapY;
+				right_start_y = x;
+				right_end_y = x + w;
+			}
+		}
+		else
+		{
+			if (pDock->container.bIsHorizontal)
+			{
+				top = h + pDock->iGapY;
+				top_start_x = x;
+				top_end_x = x + w;
+			}
+			else
+			{
+				left = h + pDock->iGapY;
+				left_start_y = x;
+				left_end_y = x + w;
+			}
+		}
+	}
+	
+	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);
+	/*if ((bReserve && ! pDock->container.bDirectionUp) || (g_iWmHint == GDK_WINDOW_TYPE_HINT_DOCK))  // merci a Robrob pour le patch !
+		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 !
+	else if (g_iWmHint == GDK_WINDOW_TYPE_HINT_NORMAL)
+		cairo_dock_set_xwindow_type_hint (Xid, "_NET_WM_WINDOW_TYPE_NORMAL");  // idem.
+	else if (g_iWmHint == GDK_WINDOW_TYPE_HINT_TOOLBAR)
+		cairo_dock_set_xwindow_type_hint (Xid, "_NET_WM_WINDOW_TYPE_TOOLBAR");  // idem.*/
+}
+
+void cairo_dock_prevent_dock_from_out_of_screen (CairoDock *pDock)
+{
+	int x, y;  // position du point invariant du dock.
+	x = pDock->container.iWindowPositionX +  pDock->container.iWidth * pDock->fAlign;
+	y = (pDock->container.bDirectionUp ? pDock->container.iWindowPositionY + pDock->container.iHeight : pDock->container.iWindowPositionY);
+	//cd_debug ("%s (%d;%d)", __func__, x, y);
+	
+	pDock->iGapX = x - g_desktopGeometry.iScreenWidth[pDock->container.bIsHorizontal] * pDock->fAlign;
+	pDock->iGapY = (pDock->container.bDirectionUp ? g_desktopGeometry.iScreenHeight[pDock->container.bIsHorizontal] - y : y);
+	//cd_debug (" -> (%d;%d)", pDock->iGapX, pDock->iGapY);
+	
+	if (pDock->iGapX < - g_desktopGeometry.iScreenWidth[pDock->container.bIsHorizontal]/2)
+		pDock->iGapX = - g_desktopGeometry.iScreenWidth[pDock->container.bIsHorizontal]/2;
+	if (pDock->iGapX > g_desktopGeometry.iScreenWidth[pDock->container.bIsHorizontal]/2)
+		pDock->iGapX = g_desktopGeometry.iScreenWidth[pDock->container.bIsHorizontal]/2;
+	if (pDock->iGapY < 0)
+		pDock->iGapY = 0;
+	if (pDock->iGapY > g_desktopGeometry.iScreenHeight[pDock->container.bIsHorizontal])
+		pDock->iGapY = g_desktopGeometry.iScreenHeight[pDock->container.bIsHorizontal];
+}
+
+#define CD_VISIBILITY_MARGIN 20
+void cairo_dock_get_window_position_at_balance (CairoDock *pDock, int iNewWidth, int iNewHeight, int *iNewPositionX, int *iNewPositionY)
+{
+	int iWindowPositionX = (g_desktopGeometry.iScreenWidth[pDock->container.bIsHorizontal] - iNewWidth) * pDock->fAlign + pDock->iGapX;
+	if (pDock->iRefCount == 0 && pDock->fAlign != .5)
+		iWindowPositionX += (.5 - pDock->fAlign) * (pDock->iMaxDockWidth - iNewWidth);
+	int iWindowPositionY = (pDock->container.bDirectionUp ? g_desktopGeometry.iScreenHeight[pDock->container.bIsHorizontal] - iNewHeight - pDock->iGapY : pDock->iGapY);
+	//g_print ("pDock->iGapX : %d => iWindowPositionX <- %d\n", pDock->iGapX, iWindowPositionX);
+	//g_print ("iNewHeight : %d -> pDock->container.iWindowPositionY <- %d\n", iNewHeight, iWindowPositionY);
+	
+	if (pDock->iRefCount == 0)
+	{
+		if (iWindowPositionX + iNewWidth < CD_VISIBILITY_MARGIN)
+			iWindowPositionX = CD_VISIBILITY_MARGIN - iNewWidth;
+		else if (iWindowPositionX > g_desktopGeometry.iScreenWidth[pDock->container.bIsHorizontal] - CD_VISIBILITY_MARGIN)
+			iWindowPositionX = g_desktopGeometry.iScreenWidth[pDock->container.bIsHorizontal] - CD_VISIBILITY_MARGIN;
+	}
+	else
+	{
+		if (iWindowPositionX < - pDock->iLeftMargin)
+			iWindowPositionX = - pDock->iLeftMargin;
+		else if (iWindowPositionX > g_desktopGeometry.iScreenWidth[pDock->container.bIsHorizontal] - iNewWidth + pDock->iMinRightMargin)
+			iWindowPositionX = g_desktopGeometry.iScreenWidth[pDock->container.bIsHorizontal] - iNewWidth + pDock->iMinRightMargin;
+	}
+	if (iWindowPositionY < - pDock->iMaxIconHeight)
+		iWindowPositionY = - pDock->iMaxIconHeight;
+	else if (iWindowPositionY > g_desktopGeometry.iScreenHeight[pDock->container.bIsHorizontal] - iNewHeight + pDock->iMaxIconHeight)
+		iWindowPositionY = g_desktopGeometry.iScreenHeight[pDock->container.bIsHorizontal] - iNewHeight + pDock->iMaxIconHeight;
+	
+	if (pDock->container.bIsHorizontal)
+	{
+		*iNewPositionX = iWindowPositionX + pDock->iScreenOffsetX;
+		*iNewPositionY = iWindowPositionY + pDock->iScreenOffsetY;
+	}
+	else
+	{
+		*iNewPositionX = iWindowPositionX + pDock->iScreenOffsetY;
+		*iNewPositionY = iWindowPositionY + pDock->iScreenOffsetX;
+	}
+	//g_print ("POSITION : %d+%d ; %d+%d\n", iWindowPositionX, pDock->iScreenOffsetX, iWindowPositionY, pDock->iScreenOffsetY);
+}
+
+static gboolean _move_resize_dock (CairoDock *pDock)
+{
+	int iNewWidth = pDock->iMaxDockWidth;
+	int iNewHeight = pDock->iMaxDockHeight;
+	int iNewPositionX, iNewPositionY;
+	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.
+	
+	//g_print (" -> %dx%d, %d;%d\n", iNewWidth, iNewHeight, iNewPositionX, iNewPositionY);
+	
+	if (pDock->container.bIsHorizontal)
+	{
+		gdk_window_move_resize (pDock->container.pWidget->window,
+			iNewPositionX,
+			iNewPositionY,
+			iNewWidth,
+			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.
+	}
+	else
+	{
+		gdk_window_move_resize (pDock->container.pWidget->window,
+			iNewPositionY,
+			iNewPositionX,
+			iNewHeight,
+			iNewWidth);
+	}
+	pDock->iSidMoveResize = 0;
+	return FALSE;
+}
+
+void cairo_dock_move_resize_dock (CairoDock *pDock)
+{
+	//g_print ("*********%s (current : %dx%d, %d;%d)\n", __func__, pDock->container.iWidth, pDock->container.iHeight, pDock->container.iWindowPositionX, pDock->container.iWindowPositionY);
+	if (pDock->iSidMoveResize == 0)
+	{
+		pDock->iSidMoveResize = g_idle_add ((GSourceFunc)_move_resize_dock, pDock);
+	}
+	return ;
+}
+
+
+  ///////////////////
+ /// INPUT SHAPE ///
+///////////////////
+
+static GdkBitmap *_cairo_dock_create_input_shape (CairoDock *pDock, int w, int h)
+{
+	int W = pDock->iMaxDockWidth;
+	int H = pDock->iMaxDockHeight;
+	//g_print ("%s (%dx%d / %dx%d)\n", __func__, w, h, W, H);
+	
+	GdkBitmap *pShapeBitmap = (GdkBitmap*) gdk_pixmap_new (NULL,
+		pDock->container.bIsHorizontal ? W : H,
+		pDock->container.bIsHorizontal ? H : W,
+		1);
+	
+	cairo_t *pCairoContext = gdk_cairo_create (pShapeBitmap);
+	cairo_set_source_rgba (pCairoContext, 0.0f, 0.0f, 0.0f, 0.0f);
+	cairo_set_operator (pCairoContext, CAIRO_OPERATOR_SOURCE);
+	cairo_paint (pCairoContext);
+	if (w != 0 && h != 0)
+	{
+		if (pDock->container.bIsHorizontal)
+		{
+			cairo_rectangle (pCairoContext,
+				(W - w) / 2,  // centre en x.
+				pDock->container.bDirectionUp ? H - h : 0,
+				w,
+				h);
+		}
+		else
+		{
+			cairo_rectangle (pCairoContext,
+				pDock->container.bDirectionUp ? H - h : 0,
+				(W - w) / 2,  // centre en x.
+				h,
+				w);
+		}
+		cairo_set_source_rgba (pCairoContext, 1., 1., 1., 1.);
+		cairo_fill (pCairoContext);
+	}
+	cairo_destroy (pCairoContext);
+
+	return pShapeBitmap;
+}
+
+void cairo_dock_update_input_shape (CairoDock *pDock)
+{
+	//\_______________ On detruit les zones d'input actuelles.
+	if (pDock->pShapeBitmap != NULL)
+	{
+		g_object_unref ((gpointer) pDock->pShapeBitmap);
+		pDock->pShapeBitmap = NULL;
+	}
+	if (pDock->pHiddenShapeBitmap != NULL)
+	{
+		g_object_unref ((gpointer) pDock->pHiddenShapeBitmap);
+		pDock->pHiddenShapeBitmap = NULL;
+	}
+	
+	//\_______________ on definit les tailles des zones.
+	int W = pDock->iMaxDockWidth;
+	int H = pDock->iMaxDockHeight;
+	int w = pDock->iMinDockWidth;
+	int h = pDock->iMinDockHeight;
+	///int w_ = MIN (myDocksParam.iVisibleZoneWidth, pDock->iMaxDockWidth);
+	///int h_ = MIN (myDocksParam.iVisibleZoneHeight, pDock->iMaxDockHeight);
+	int w_ = 1;
+	int h_ = 1;
+	
+	//\_______________ on verifie que les conditions sont toujours remplies.
+	if (w == 0 || h == 0 || pDock->iRefCount > 0 || W == 0 || H == 0)
+	{
+		if (pDock->iInputState != CAIRO_DOCK_INPUT_ACTIVE)
+		{
+			//g_print ("+++ input shape active on update input shape\n");
+			cairo_dock_set_input_shape_active (pDock);
+			pDock->iInputState = CAIRO_DOCK_INPUT_ACTIVE;
+		}
+		return ;
+	}
+	
+	//\_______________ on cree les zones.
+	pDock->pShapeBitmap = _cairo_dock_create_input_shape (pDock, w, h);
+	
+	pDock->pHiddenShapeBitmap = _cairo_dock_create_input_shape (pDock, w_, h_);
+}
+
+
+
+  ///////////////////
+ /// LINEAR DOCK ///
+///////////////////
+
+GList *cairo_dock_calculate_icons_positions_at_rest_linear (GList *pIconList, double fFlatDockWidth, int iXOffset)
+{
+	//g_print ("%s (%d, +%d)\n", __func__, fFlatDockWidth, iXOffset);
+	double x_cumulated = iXOffset;
+	double fXMin = 99999;
+	GList* ic, *pFirstDrawnElement = NULL;
+	Icon *icon;
+	for (ic = pIconList; ic != NULL; ic = ic->next)
+	{
+		icon = ic->data;
+
+		if (x_cumulated + icon->fWidth / 2 < 0)
+			icon->fXAtRest = x_cumulated + fFlatDockWidth;
+		else if (x_cumulated + icon->fWidth / 2 > fFlatDockWidth)
+			icon->fXAtRest = x_cumulated - fFlatDockWidth;
+		else
+			icon->fXAtRest = x_cumulated;
+
+		if (icon->fXAtRest < fXMin)
+		{
+			fXMin = icon->fXAtRest;
+			pFirstDrawnElement = ic;
+		}
+		//g_print ("%s : fXAtRest = %.2f\n", icon->cName, icon->fXAtRest);
+
+		x_cumulated += icon->fWidth + myIconsParam.iIconGap;
+	}
+
+	return pFirstDrawnElement;
+}
+
+double cairo_dock_calculate_max_dock_width (CairoDock *pDock, GList *pFirstDrawnElementGiven, double fFlatDockWidth, double fWidthConstraintFactor, double fExtraWidth)
+{
+	double fMaxDockWidth = 0.;
+	//g_print ("%s (%d)\n", __func__, (int)fFlatDockWidth);
+	GList *pIconList = pDock->icons;
+	if (pIconList == NULL)
+		return 2 * myDocksParam.iDockRadius + myDocksParam.iDockLineWidth + 2 * myDocksParam.iFrameMargin;
+
+	//\_______________ On remet a zero les positions extremales des icones.
+	GList* ic;
+	Icon *icon;
+	for (ic = pIconList; ic != NULL; ic = ic->next)
+	{
+		icon = ic->data;
+		icon->fXMax = -1e4;
+		icon->fXMin = 1e4;
+	}
+
+	//\_______________ 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.
+	GList *pFirstDrawnElement = (pFirstDrawnElementGiven != NULL ? pFirstDrawnElementGiven : pIconList);
+	//for (int iVirtualMouseX = 0; iVirtualMouseX < fFlatDockWidth; iVirtualMouseX ++)
+	GList *ic2;
+	for (ic = pIconList; ic != NULL; ic = ic->next)
+	{
+		icon = ic->data;
+
+		cairo_dock_calculate_wave_with_position_linear (pIconList, pFirstDrawnElement, icon->fXAtRest, pDock->fMagnitudeMax, fFlatDockWidth, 0, 0, 0.5, 0, pDock->container.bDirectionUp);
+		ic2 = pFirstDrawnElement;
+		do
+		{
+			icon = ic2->data;
+
+			if (icon->fX + icon->fWidth * icon->fScale > icon->fXMax)
+				icon->fXMax = icon->fX + icon->fWidth * icon->fScale;
+			if (icon->fX < icon->fXMin)
+				icon->fXMin = icon->fX;
+
+			ic2 = cairo_dock_get_next_element (ic2, pDock->icons);
+		} while (ic2 != pFirstDrawnElement);
+	}
+	cairo_dock_calculate_wave_with_position_linear (pIconList, pFirstDrawnElement, fFlatDockWidth - 1, pDock->fMagnitudeMax, fFlatDockWidth, 0, 0, pDock->fAlign, 0, pDock->container.bDirectionUp);  // pDock->fFoldingFactor
+	ic = pFirstDrawnElement;
+	do
+	{
+		icon = ic->data;
+
+		if (icon->fX + icon->fWidth * icon->fScale > icon->fXMax)
+			icon->fXMax = icon->fX + icon->fWidth * icon->fScale;
+		if (icon->fX < icon->fXMin)
+			icon->fXMin = icon->fX;
+
+		ic = cairo_dock_get_next_element (ic, pDock->icons);
+	} while (ic != pFirstDrawnElement);
+
+	fMaxDockWidth = (icon->fXMax - ((Icon *) pFirstDrawnElement->data)->fXMin) * fWidthConstraintFactor + fExtraWidth;
+	fMaxDockWidth = ceil (fMaxDockWidth) + 1;
+
+	for (ic = pIconList; ic != NULL; ic = ic->next)
+	{
+		icon = ic->data;
+		icon->fXMin += fMaxDockWidth / 2;
+		icon->fXMax += fMaxDockWidth / 2;
+		//g_print ("%s : [%d;%d]\n", icon->cName, (int) icon->fXMin, (int) icon->fXMax);
+		icon->fX = icon->fXAtRest;
+		icon->fScale = 1;
+	}
+
+	return fMaxDockWidth;
+}
+
+Icon * 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)
+{
+	//g_print (">>>>>%s (%d/%.2f, %dx%d, %.2f, %.2f)\n", __func__, x_abs, fFlatDockWidth, iWidth, iHeight, fAlign, fFoldingFactor);
+	if (pIconList == NULL)
+		return NULL;
+	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.
+		///x_abs = -1;
+		x_abs = 0;
+	else if (x_abs > fFlatDockWidth && iWidth > 0)
+		///x_abs = fFlatDockWidth+1;
+		x_abs = (int) fFlatDockWidth;
+	
+	
+	float x_cumulated = 0, fXMiddle, fDeltaExtremum;
+	GList* ic, *pointed_ic;
+	Icon *icon, *prev_icon;
+
+	double fScale = 0.;
+	double offset = 0.;
+	GList *pFirstDrawnElement = (pFirstDrawnElementGiven != NULL ? pFirstDrawnElementGiven : pIconList);
+	ic = pFirstDrawnElement;
+	pointed_ic = (x_abs < 0 ? ic : NULL);
+	do
+	{
+		icon = ic->data;
+		x_cumulated = icon->fXAtRest;
+		fXMiddle = icon->fXAtRest + icon->fWidth / 2;
+
+		//\_______________ On calcule sa phase (pi/2 au niveau du curseur).
+		icon->fPhase = (fXMiddle - x_abs) / myIconsParam.iSinusoidWidth * G_PI + G_PI / 2;
+		if (icon->fPhase < 0)
+		{
+			icon->fPhase = 0;
+		}
+		else if (icon->fPhase > G_PI)
+		{
+			icon->fPhase = G_PI;
+		}
+		
+		//\_______________ On en deduit l'amplitude de la sinusoide au niveau de cette icone, et donc son echelle.
+		icon->fScale = 1 + fMagnitude * myIconsParam.fAmplitude * sin (icon->fPhase);
+		if (iWidth > 0 && icon->fInsertRemoveFactor != 0)
+		{
+			fScale = icon->fScale;
+			///offset += (icon->fWidth * icon->fScale) * (pointed_ic == NULL ? 1 : -1);
+			if (icon->fInsertRemoveFactor > 0)
+				icon->fScale *= icon->fInsertRemoveFactor;
+			else
+				icon->fScale *= (1 + icon->fInsertRemoveFactor);
+			///offset -= (icon->fWidth * icon->fScale) * (pointed_ic == NULL ? 1 : -1);
+		}
+		
+		icon->fY = (bDirectionUp ? iHeight - myDocksParam.iDockLineWidth - myDocksParam.iFrameMargin - icon->fScale * icon->fHeight : myDocksParam.iDockLineWidth + myDocksParam.iFrameMargin);
+		//g_print ("%s fY : %d; %.2f\n", icon->cName, iHeight, icon->fHeight);
+		
+		//\_______________ Si on avait deja defini l'icone pointee, on peut placer l'icone courante par rapport a la precedente.
+		if (pointed_ic != NULL)
+		{
+			if (ic == pFirstDrawnElement)  // peut arriver si on est en dehors a gauche du dock.
+			{
+				icon->fX = x_cumulated - 1. * (fFlatDockWidth - iWidth) / 2;
+				//g_print ("  en dehors a gauche : icon->fX = %.2f (%.2f)\n", icon->fX, x_cumulated);
+			}
+			else
+			{
+				prev_icon = (ic->prev != NULL ? ic->prev->data : cairo_dock_get_last_icon (pIconList));
+				icon->fX = prev_icon->fX + (prev_icon->fWidth + myIconsParam.iIconGap) * prev_icon->fScale;
+
+				if (icon->fX + icon->fWidth * icon->fScale > icon->fXMax - myIconsParam.fAmplitude * fMagnitude * (icon->fWidth + 1.5*myIconsParam.iIconGap) / 8 && iWidth != 0)
+				{
+					//g_print ("  on contraint %s (fXMax=%.2f , fX=%.2f\n", prev_icon->cName, prev_icon->fXMax, prev_icon->fX);
+					fDeltaExtremum = icon->fX + icon->fWidth * icon->fScale - (icon->fXMax - myIconsParam.fAmplitude * fMagnitude * (icon->fWidth + 1.5*myIconsParam.iIconGap) / 16);
+					if (myIconsParam.fAmplitude != 0)
+						icon->fX -= fDeltaExtremum * (1 - (icon->fScale - 1) / myIconsParam.fAmplitude) * fMagnitude;
+				}
+			}
+			icon->fX = fAlign * iWidth + (icon->fX - fAlign * iWidth) * (1. - fFoldingFactor);
+			//g_print ("  a droite : icon->fX = %.2f (%.2f)\n", icon->fX, x_cumulated);
+		}
+		
+		//\_______________ On regarde si on pointe sur cette icone.
+		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.
+		{
+			pointed_ic = ic;
+			///icon->bPointed = TRUE;
+			icon->bPointed = (x_abs != (int) fFlatDockWidth && x_abs != 0);
+			icon->fX = x_cumulated - (fFlatDockWidth - iWidth) / 2 + (1 - icon->fScale) * (x_abs - x_cumulated + .5*myIconsParam.iIconGap);
+			icon->fX = fAlign * iWidth + (icon->fX - fAlign * iWidth) * (1. - fFoldingFactor);
+			//g_print ("  icone pointee : fX = %.2f (%.2f, %d)\n", icon->fX, x_cumulated, icon->bPointed);
+		}
+		else
+			icon->bPointed = FALSE;
+		
+		if (iWidth > 0 && icon->fInsertRemoveFactor != 0)
+		{
+			if (pointed_ic != ic)  // bPointed peut etre false a l'extremite droite.
+				offset += (icon->fWidth * (fScale - icon->fScale)) * (pointed_ic == NULL ? 1 : -1);
+			else
+				offset += (2*(fXMiddle - x_abs) * (fScale - icon->fScale)) * (pointed_ic == NULL ? 1 : -1);
+		}
+		
+		ic = cairo_dock_get_next_element (ic, pIconList);
+	} while (ic != pFirstDrawnElement);
+	
+	//\_______________ On place les icones precedant l'icone pointee par rapport a celle-ci.
+	if (pointed_ic == NULL)  // on est a droite des icones.
+	{
+		pointed_ic = (pFirstDrawnElement->prev == NULL ? g_list_last (pIconList) : pFirstDrawnElement->prev);
+		icon = pointed_ic->data;
+		icon->fX = x_cumulated - (fFlatDockWidth - iWidth) / 2 + (1 - icon->fScale) * (icon->fWidth + .5*myIconsParam.iIconGap);
+		icon->fX = fAlign * iWidth + (icon->fX - fAlign * iWidth) * (1 - fFoldingFactor);
+		//g_print ("  en dehors a droite : icon->fX = %.2f (%.2f)\n", icon->fX, x_cumulated);
+	}
+	
+	ic = pointed_ic;
+	while (ic != pFirstDrawnElement)
+	{
+		icon = ic->data;
+		
+		ic = ic->prev;
+		if (ic == NULL)
+			ic = g_list_last (pIconList);
+			
+		prev_icon = ic->data;
+		
+		prev_icon->fX = icon->fX - (prev_icon->fWidth + myIconsParam.iIconGap) * prev_icon->fScale;
+		//g_print ("fX <- %.2f; fXMin : %.2f\n", prev_icon->fX, prev_icon->fXMin);
+		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.
+		{
+			//g_print ("  on contraint %s (fXMin=%.2f , fX=%.2f\n", prev_icon->cName, prev_icon->fXMin, prev_icon->fX);
+			fDeltaExtremum = prev_icon->fX - (prev_icon->fXMin + myIconsParam.fAmplitude * fMagnitude * (prev_icon->fWidth + 1.5*myIconsParam.iIconGap) / 16);
+			if (myIconsParam.fAmplitude != 0)
+				prev_icon->fX -= fDeltaExtremum * (1 - (prev_icon->fScale - 1) / myIconsParam.fAmplitude) * fMagnitude;
+		}
+		prev_icon->fX = fAlign * iWidth + (prev_icon->fX - fAlign * iWidth) * (1. - fFoldingFactor);
+		//g_print ("  prev_icon->fX : %.2f\n", prev_icon->fX);
+	}
+	
+	if (offset != 0)
+	{
+		offset /= 2;
+		//g_print ("offset : %.2f (pointed:%s)\n", offset, pointed_ic?((Icon*)pointed_ic->data)->cName:"none");
+		for (ic = pIconList; ic != NULL; ic = ic->next)
+		{
+			icon = ic->data;
+			//if (ic == pIconList)
+			//	cd_debug ("fX : %.2f - %.2f\n", icon->fX, offset);
+			icon->fX -= offset;
+		}
+	}
+	
+	icon = pointed_ic->data;
+	return (icon->bPointed ? icon : NULL);
+}
+
+Icon *cairo_dock_apply_wave_effect_linear (CairoDock *pDock)
+{
+	//\_______________ On calcule la position du curseur dans le referentiel du dock a plat.
+	int dx = pDock->container.iMouseX - (pDock->iOffsetForExtend * (pDock->fAlign - .5) * 2) - pDock->container.iWidth / 2;  // ecart par rapport au milieu du dock a plat.
+	int x_abs = dx + pDock->fFlatDockWidth / 2;  // ecart par rapport a la gauche du dock minimal  plat.
+	//g_print ("%s (flat:%d, w:%d, x:%d)\n", __func__, (int)pDock->fFlatDockWidth, pDock->container.iWidth, pDock->container.iMouseX);
+	//\_______________ On calcule l'ensemble des parametres des icones.
+	double fMagnitude = cairo_dock_calculate_magnitude (pDock->iMagnitudeIndex) * pDock->fMagnitudeMax;
+	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
+	return pPointedIcon;
+}
+
+double cairo_dock_get_current_dock_width_linear (CairoDock *pDock)
+{
+	if (pDock->icons == NULL)
+		//return 2 * myDocksParam.iDockRadius + myDocksParam.iDockLineWidth + 2 * myDocksParam.iFrameMargin;
+		return 1 + 2 * myDocksParam.iFrameMargin;
+
+	Icon *pLastIcon = cairo_dock_get_last_drawn_icon (pDock);
+	Icon *pFirstIcon = cairo_dock_get_first_drawn_icon (pDock);
+	double fWidth = pLastIcon->fX - pFirstIcon->fX + pLastIcon->fWidth * pLastIcon->fScale + 2 * myDocksParam.iFrameMargin;  //  + 2 * myDocksParam.iDockRadius + myDocksParam.iDockLineWidth + 2 * myDocksParam.iFrameMargin
+
+	return fWidth;
+}
+
+
+void cairo_dock_check_if_mouse_inside_linear (CairoDock *pDock)
+{
+	CairoDockMousePositionType iMousePositionType;
+	int iWidth = pDock->container.iWidth;
+	int iHeight = (pDock->fMagnitudeMax != 0 ? pDock->container.iHeight : pDock->iMinDockHeight);
+	///int iExtraHeight = (pDock->bAtBottom ? 0 : myIconsParam.iLabelSize);
+	int iExtraHeight = 0;  /// il faudrait voir si on a un sous-dock ou un dialogue au dessus :-/
+	int iMouseX = pDock->container.iMouseX;
+	int iMouseY = (pDock->container.bDirectionUp ? pDock->container.iHeight - pDock->container.iMouseY : pDock->container.iMouseY);
+	//g_print ("%s (%dx%d, %dx%d, %f)\n", __func__, iMouseX, iMouseY, iWidth, iHeight, pDock->fFoldingFactor);
+
+	//\_______________ On regarde si le curseur est dans le dock ou pas, et on joue sur la taille des icones en consequence.
+	int x_abs = pDock->container.iMouseX + (pDock->fFlatDockWidth - iWidth) / 2;  // abscisse par rapport a la gauche du dock minimal plat.
+	gboolean bMouseInsideDock = (x_abs >= 0 && x_abs <= pDock->fFlatDockWidth && iMouseX > 0 && iMouseX < iWidth);
+	//g_print ("bMouseInsideDock : %d (%d;%d/%.2f)\n", bMouseInsideDock, pDock->container.bInside, x_abs, pDock->fFlatDockWidth);
+
+	if (! bMouseInsideDock)  // hors du dock par les cotes.
+	{
+		if (/*cairo_dock_is_extended_dock (pDock) && */pDock->bAutoHide)  // c'est penible de sortir du dock trop facilement avec l'auto-hide.
+		{
+			if (iMouseY >= 0 && iMouseY < iHeight)
+				iMousePositionType = CAIRO_DOCK_MOUSE_INSIDE;
+			else
+				iMousePositionType = CAIRO_DOCK_MOUSE_OUTSIDE;
+		}
+		else
+		{
+			double fSideMargin = fabs (pDock->fAlign - .5) * (iWidth - pDock->fFlatDockWidth);
+			if (x_abs < - fSideMargin || x_abs > pDock->fFlatDockWidth + fSideMargin)
+				iMousePositionType = CAIRO_DOCK_MOUSE_OUTSIDE;
+			else
+				iMousePositionType = CAIRO_DOCK_MOUSE_ON_THE_EDGE;
+		}
+	}
+	else if (iMouseY >= 0 && iMouseY < iHeight)  // et en plus on est dedans en y.  //  && pPointedIcon != NULL
+	{
+		//g_print ("on est dedans en x et en y (iMouseX=%d => x_abs=%d ; iMouseY=%d/%d)\n", iMouseX, x_abs, iMouseY, iHeight);
+		//pDock->container.bInside = TRUE;
+		iMousePositionType = CAIRO_DOCK_MOUSE_INSIDE;
+	}
+	else
+		iMousePositionType = CAIRO_DOCK_MOUSE_OUTSIDE;
+
+	pDock->iMousePositionType = iMousePositionType;
+}
+
+void cairo_dock_manage_mouse_position (CairoDock *pDock)
+{
+	switch (pDock->iMousePositionType)
+	{
+		case CAIRO_DOCK_MOUSE_INSIDE :
+			//g_print ("INSIDE (%d;%d;%d;%d;%d)\n", cairo_dock_entrance_is_allowed (pDock), pDock->iMagnitudeIndex, pDock->bIsGrowingUp, pDock->bIsShrinkingDown, pDock->iInputState);
+			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.
+			{
+				//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);
+				if (pDock->iRefCount != 0 && !pDock->container.bInside)
+				{
+					
+					break;
+				}
+				//pDock->container.bInside = TRUE;
+				///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.
+				if ((pDock->iMagnitudeIndex == 0 && pDock->iRefCount == 0 && ! pDock->bAutoHide) || !pDock->container.bInside)
+				{
+					//g_print ("  on emule une re-rentree (pDock->iMagnitudeIndex:%d)\n", pDock->iMagnitudeIndex);
+					cairo_dock_emit_enter_signal (CAIRO_CONTAINER (pDock));
+				}
+				else // on se contente de faire grossir les icones.
+				{
+					//g_print ("  on se contente de faire grossir les icones\n");
+					cairo_dock_start_growing (pDock);
+					if (pDock->bAutoHide && pDock->iRefCount == 0)
+						cairo_dock_start_showing (pDock);
+				}
+			}
+		break ;
+
+		case CAIRO_DOCK_MOUSE_ON_THE_EDGE :
+			if (pDock->iMagnitudeIndex > 0 && ! pDock->bIsGrowingUp)
+				cairo_dock_start_shrinking (pDock);
+		break ;
+
+		case CAIRO_DOCK_MOUSE_OUTSIDE :
+			//g_print ("en dehors du dock (bIsShrinkingDown:%d;bIsGrowingUp:%d;iMagnitudeIndex:%d)\n", pDock->bIsShrinkingDown, pDock->bIsGrowingUp, pDock->iMagnitudeIndex);
+			if (! pDock->bIsGrowingUp && ! pDock->bIsShrinkingDown && pDock->iSidLeaveDemand == 0 && pDock->iMagnitudeIndex > 0 && ! pDock->bIconIsFlyingAway)
+			{
+				if (pDock->iRefCount > 0)
+				{
+					Icon *pPointingIcon = cairo_dock_search_icon_pointing_on_dock (pDock, NULL);
+					if (pPointingIcon && pPointingIcon->bPointed)  // sous-dock pointe, n le laisse en position haute.
+						return;
+				}
+				//g_print ("on force a quitter (iRefCount:%d; bIsGrowingUp:%d; iMagnitudeIndex:%d)\n", pDock->iRefCount, pDock->bIsGrowingUp, pDock->iMagnitudeIndex);
+				pDock->iSidLeaveDemand = g_timeout_add (MAX (myDocksParam.iLeaveSubDockDelay, 330), (GSourceFunc) cairo_dock_emit_leave_signal, (gpointer) pDock);
+			}
+		break ;
+	}
+}
+
+#define make_icon_avoid_mouse(icon) \
+	cairo_dock_mark_icon_as_avoiding_mouse (icon);\
+	icon->fAlpha = 0.75;\
+	if (myIconsParam.fAmplitude != 0)\
+		icon->fDrawX += icon->fWidth / 2 * (icon->fScale - 1) / myIconsParam.fAmplitude * (icon->fPhase < G_PI/2 ? -1 : 1);
+
+static gboolean _cairo_dock_check_can_drop_linear (CairoDock *pDock, CairoDockIconGroup iGroup, double fMargin)
+{
+	gboolean bCanDrop = FALSE;
+	Icon *icon;
+	GList *pFirstDrawnElement = (pDock->pFirstDrawnElement != NULL ? pDock->pFirstDrawnElement : pDock->icons);
+	GList *ic = pFirstDrawnElement;
+	do
+	{
+		icon = ic->data;
+		if (icon->bPointed)  // && icon->iAnimationState != CAIRO_DOCK_FOLLOW_MOUSE
+		{
+			if (pDock->container.iMouseX < icon->fDrawX + icon->fWidth * icon->fScale * fMargin)  // on est a gauche.  // fDrawXAtRest
+			{
+				Icon *prev_icon = cairo_dock_get_previous_element (ic, pDock->icons) -> data;
+				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
+				{
+					make_icon_avoid_mouse (icon);
+					make_icon_avoid_mouse (prev_icon);
+					//g_print ("%s> <%s\n", prev_icon->cName, icon->cName);
+					bCanDrop = TRUE;
+				}
+			}
+			else if (pDock->container.iMouseX > icon->fDrawX + icon->fWidth * icon->fScale * (1 - fMargin))  // on est a droite.  // fDrawXAtRest
+			{
+				Icon *next_icon = cairo_dock_get_next_element (ic, pDock->icons) -> data;
+				if ((icon->iGroup == iGroup || next_icon->iGroup == iGroup))  // && next_icon->iAnimationType != CAIRO_DOCK_FOLLOW_MOUSE
+				{
+					make_icon_avoid_mouse (icon);
+					make_icon_avoid_mouse (next_icon);
+					//g_print ("%s> <%s\n", icon->cName, next_icon->cName);
+					bCanDrop = TRUE;
+				}
+				ic = cairo_dock_get_next_element (ic, pDock->icons);  // on la saute.
+				if (ic == pFirstDrawnElement)
+					break ;
+			}  // else on est dessus.
+		}
+		else
+			cairo_dock_stop_marking_icon_as_avoiding_mouse (icon);
+		
+		ic = cairo_dock_get_next_element (ic, pDock->icons);
+	} while (ic != pFirstDrawnElement);
+	
+	return bCanDrop;
+}
+
+
+void cairo_dock_check_can_drop_linear (CairoDock *pDock)
+{
+	if (pDock->icons == NULL)
+		return;
+	
+	if (pDock->bIsDragging)
+		pDock->bCanDrop = _cairo_dock_check_can_drop_linear (pDock, pDock->iAvoidingMouseIconType, pDock->fAvoidingMouseMargin);
+	else
+		pDock->bCanDrop = FALSE;
+}
+
+void cairo_dock_stop_marking_icons (CairoDock *pDock)
+{
+	if (pDock->icons == NULL)
+		return;
+	//g_print ("%s (%d)\n", __func__, iType);
+
+	Icon *icon;
+	GList *ic;
+	for (ic = pDock->icons; ic != NULL; ic = ic->next)
+	{
+		icon = ic->data;
+		cairo_dock_stop_marking_icon_as_avoiding_mouse (icon);
+	}
+}
+
+
+void cairo_dock_set_subdock_position_linear (Icon *pPointedIcon, CairoDock *pDock)
+{
+	CairoDock *pSubDock = pPointedIcon->pSubDock;
+	int iX = pPointedIcon->fXAtRest - (pDock->fFlatDockWidth - pDock->iMaxDockWidth) / 2 + pPointedIcon->fWidth / 2 + (pDock->iOffsetForExtend * (pDock->fAlign - .5) * 2);
+	if (pSubDock->container.bIsHorizontal == pDock->container.bIsHorizontal)
+	{
+		pSubDock->fAlign = 0.5;
+		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
+		pSubDock->iGapY = pDock->iGapY + pDock->iMaxDockHeight;
+	}
+	else
+	{
+		pSubDock->fAlign = (pDock->container.bDirectionUp ? 1 : 0);
+		pSubDock->iGapX = (pDock->iGapY + pDock->iMaxDockHeight) * (pDock->container.bDirectionUp ? -1 : 1);
+		if (pDock->container.bDirectionUp)
+			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.
+		else
+			pSubDock->iGapY = iX + pDock->container.iWindowPositionX - pSubDock->iMaxDockHeight / 2;  // les sous-dock ont un alignement egal a 0.
+	}
+}
+
+
+GList *cairo_dock_get_first_drawn_element_linear (GList *icons)
+{
+	Icon *icon;
+	GList *ic;
+	GList *pFirstDrawnElement = NULL;
+	for (ic = icons; ic != NULL; ic = ic->next)
+	{
+		icon = ic->data;
+		if (icon->bPointed)
+			break ;
+	}
+	
+	if (ic == NULL || ic->next == NULL)  // derniere icone ou aucune pointee.
+		pFirstDrawnElement = icons;
+	else
+		pFirstDrawnElement = ic->next;
+	return pFirstDrawnElement;
+}
+
+
+void cairo_dock_show_subdock (Icon *pPointedIcon, CairoDock *pParentDock)
+{
+	cd_debug ("on montre le dock fils");
+	CairoDock *pSubDock = pPointedIcon->pSubDock;
+	g_return_if_fail (pSubDock != NULL);
+	
+	if (GTK_WIDGET_VISIBLE (pSubDock->container.pWidget))  // il est deja visible.
+	{
+		if (pSubDock->bIsShrinkingDown)  // il est en cours de diminution, on renverse le processus.
+		{
+			cairo_dock_start_growing (pSubDock);
+		}
+		return ;
+	}
+	
+	pSubDock->pRenderer->set_subdock_position (pPointedIcon, pParentDock);
+	if (pParentDock->fMagnitudeMax == 0)  // son input shape n'est pas la taille max mais iMinDockHeight.
+		pSubDock->iGapY -= (pParentDock->container.iHeight - pParentDock->iMinDockHeight);
+	
+	if (pSubDock->icons != NULL)
+	{
+		pSubDock->fFoldingFactor = (myDocksParam.bAnimateSubDock ? .99 : 0.);
+		cairo_dock_notify_on_object (&myIconsMgr, NOTIFICATION_UNFOLD_SUBDOCK, pPointedIcon);
+		cairo_dock_notify_on_object (pPointedIcon, NOTIFICATION_UNFOLD_SUBDOCK, pPointedIcon);
+	}
+	else
+		pSubDock->fFoldingFactor = 0.;
+	
+	int iNewWidth = pSubDock->iMaxDockWidth;
+	int iNewHeight = pSubDock->iMaxDockHeight;
+	int iNewPositionX, iNewPositionY;
+	cairo_dock_get_window_position_at_balance (pSubDock, iNewWidth, iNewHeight, &iNewPositionX, &iNewPositionY);
+	
+	gtk_window_present (GTK_WINDOW (pSubDock->container.pWidget));
+	
+	if (pSubDock->container.bIsHorizontal)
+		gdk_window_move_resize (pSubDock->container.pWidget->window,
+			iNewPositionX,
+			iNewPositionY,
+			iNewWidth,
+			iNewHeight);
+	else
+		gdk_window_move_resize (pSubDock->container.pWidget->window,
+			iNewPositionY,
+			iNewPositionX,
+			iNewHeight,
+			iNewWidth);
+	
+	if (pSubDock->fFoldingFactor == 0.)
+	{
+		cd_debug ("  on montre le sous-dock sans animation");
+		gtk_widget_queue_draw (pSubDock->container.pWidget);
+	}
+	else
+	{
+		cd_debug ("  on montre le sous-dock avec animation");
+		cairo_dock_start_growing (pSubDock);  // on commence a faire grossir les icones.
+		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.
+	}
+	//g_print ("  -> Gap %d;%d -> W(%d;%d) (%d)\n", pSubDock->iGapX, pSubDock->iGapY, pSubDock->container.iWindowPositionX, pSubDock->container.iWindowPositionY, pSubDock->container.bIsHorizontal);
+	
+	///gtk_window_set_keep_above (GTK_WINDOW (pSubDock->container.pWidget), myDocksParam.bPopUp);
+	
+	cairo_dock_replace_all_dialogs ();
+}
+
+
+
+static gboolean _redraw_subdock_content_idle (Icon *pIcon)
+{
+	cd_debug ("%s()", __func__);
+	cd_debug (" %s", pIcon->cName);
+	CairoDock *pDock = cairo_dock_search_dock_from_name (pIcon->cParentDockName);
+	if (pDock != NULL)
+	{
+		if (pIcon->pSubDock != NULL)
+		{
+			cairo_dock_draw_subdock_content_on_icon (pIcon, pDock);
+		}
+		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.
+		{
+			cairo_dock_reload_icon_image (pIcon, CAIRO_CONTAINER (pDock));
+		}
+		cairo_dock_redraw_icon (pIcon, CAIRO_CONTAINER (pDock));
+	}
+	pIcon->iSidRedrawSubdockContent = 0;
+	return FALSE;
+}
+void cairo_dock_trigger_redraw_subdock_content (CairoDock *pDock)
+{
+	Icon *pPointingIcon = cairo_dock_search_icon_pointing_on_dock (pDock, NULL);
+	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)))))
+	{
+		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.
+			g_source_remove (pPointingIcon->iSidRedrawSubdockContent);
+		pPointingIcon->iSidRedrawSubdockContent = g_idle_add ((GSourceFunc) _redraw_subdock_content_idle, pPointingIcon);
+	}
+}
+
+void cairo_dock_trigger_redraw_subdock_content_on_icon (Icon *icon)
+{
+	if (icon->iSidRedrawSubdockContent == 0)
+		icon->iSidRedrawSubdockContent = g_idle_add ((GSourceFunc) _redraw_subdock_content_idle, icon);
+}
+
+void cairo_dock_redraw_subdock_content (CairoDock *pDock)
+{
+	CairoDock *pParentDock = NULL;
+	Icon *pPointingIcon = cairo_dock_search_icon_pointing_on_dock (pDock, &pParentDock);
+	if (pPointingIcon != NULL && pPointingIcon->iSubdockViewType != 0 && pPointingIcon->iSidRedrawSubdockContent == 0 && pParentDock != NULL)
+	{
+		cairo_dock_draw_subdock_content_on_icon (pPointingIcon, pParentDock);
+		cairo_dock_redraw_icon (pPointingIcon, CAIRO_CONTAINER (pParentDock));
+	}
+}
+
+static gboolean _update_WM_icons (CairoDock *pDock)
+{
+	cairo_dock_set_icons_geometry_for_window_manager (pDock);
+	pDock->iSidUpdateWMIcons = 0;
+	return FALSE;
+}
+void cairo_dock_trigger_set_WM_icons_geometry (CairoDock *pDock)
+{
+	if (pDock->iSidUpdateWMIcons == 0)
+	{
+		pDock->iSidUpdateWMIcons = g_idle_add ((GSourceFunc) _update_WM_icons, pDock);
+	}
+}
+
+
+  ///////////////////////
+ /// DOCK BACKGROUND ///
+///////////////////////
+
+static cairo_surface_t *_cairo_dock_make_stripes_background (int iWidth, int iHeight, double *fStripesColorBright, double *fStripesColorDark, int iNbStripes, double fStripesWidth, double fStripesAngle)
+{
+	cairo_pattern_t *pStripesPattern;
+	double fWidth = iWidth;
+	if (fabs (fStripesAngle) != 90)
+		pStripesPattern = cairo_pattern_create_linear (0.0f,
+			0.0f,
+			iWidth,
+			iWidth * tan (fStripesAngle * G_PI/180.));
+	else
+		pStripesPattern = cairo_pattern_create_linear (0.0f,
+			0.0f,
+			0.,
+			(fStripesAngle == 90) ? iHeight : - iHeight);
+	g_return_val_if_fail (cairo_pattern_status (pStripesPattern) == CAIRO_STATUS_SUCCESS, NULL);
+
+	cairo_pattern_set_extend (pStripesPattern, CAIRO_EXTEND_REPEAT);
+
+	if (iNbStripes > 0)
+	{
+		gdouble fStep;
+		int i;
+		for (i = 0; i < iNbStripes+1; i ++)
+		{
+			fStep = (double)i / iNbStripes;
+			cairo_pattern_add_color_stop_rgba (pStripesPattern,
+				fStep - fStripesWidth / 2.,
+				fStripesColorBright[0],
+				fStripesColorBright[1],
+				fStripesColorBright[2],
+				fStripesColorBright[3]);
+			cairo_pattern_add_color_stop_rgba (pStripesPattern,
+				fStep,
+				fStripesColorDark[0],
+				fStripesColorDark[1],
+				fStripesColorDark[2],
+				fStripesColorDark[3]);
+			cairo_pattern_add_color_stop_rgba (pStripesPattern,
+				fStep + fStripesWidth / 2.,
+				fStripesColorBright[0],
+				fStripesColorBright[1],
+				fStripesColorBright[2],
+				fStripesColorBright[3]);
+		}
+	}
+	else
+	{
+		cairo_pattern_add_color_stop_rgba (pStripesPattern,
+			0.,
+			fStripesColorDark[0],
+			fStripesColorDark[1],
+			fStripesColorDark[2],
+			fStripesColorDark[3]);
+		cairo_pattern_add_color_stop_rgba (pStripesPattern,
+			1.,
+			fStripesColorBright[0],
+			fStripesColorBright[1],
+			fStripesColorBright[2],
+			fStripesColorBright[3]);
+	}
+
+	cairo_surface_t *pNewSurface = cairo_dock_create_blank_surface (
+			iWidth,
+			iHeight);
+	cairo_t *pImageContext = cairo_create (pNewSurface);
+	cairo_set_source (pImageContext, pStripesPattern);
+	cairo_paint (pImageContext);
+
+	cairo_pattern_destroy (pStripesPattern);
+	cairo_destroy (pImageContext);
+	
+	return pNewSurface;
+}
+static void _cairo_dock_load_default_background (CairoDockImageBuffer *pImage, int iWidth, int iHeight)
+{
+	//g_print ("%s (%s, %d)\n", __func__, myDocksParam.cBackgroundImageFile, myDocksParam.bBackgroundImageRepeat);
+	if (myDocksParam.cBackgroundImageFile != NULL)
+	{
+		if (myDocksParam.bBackgroundImageRepeat)
+		{
+			cairo_surface_t *pBgSurface = cairo_dock_create_surface_from_pattern (myDocksParam.cBackgroundImageFile,
+				iWidth,
+				iHeight,
+				myDocksParam.fBackgroundImageAlpha);
+			cairo_dock_load_image_buffer_from_surface (pImage,
+				pBgSurface,
+				iWidth,
+				iHeight);
+		}
+		else
+		{
+			cairo_dock_load_image_buffer_full (pImage,
+				myDocksParam.cBackgroundImageFile,
+				iWidth,
+				iHeight,
+				CAIRO_DOCK_FILL_SPACE,
+				myDocksParam.fBackgroundImageAlpha);
+		}
+	}
+	if (pImage->pSurface == NULL)
+	{
+		cairo_surface_t *pBgSurface = _cairo_dock_make_stripes_background (
+			iWidth,
+			iHeight,
+			myDocksParam.fStripesColorBright,
+			myDocksParam.fStripesColorDark,
+			myDocksParam.iNbStripes,
+			myDocksParam.fStripesWidth,
+			myDocksParam.fStripesAngle);
+		cairo_dock_load_image_buffer_from_surface (pImage,
+			pBgSurface,
+			iWidth,
+			iHeight);
+	}
+}
+
+void cairo_dock_load_dock_background (CairoDock *pDock)
+{
+	cairo_dock_unload_image_buffer (&pDock->backgroundBuffer);
+	
+	int iWidth = pDock->iDecorationsWidth;
+	int iHeight = pDock->iDecorationsHeight;
+	
+	if (pDock->bGlobalBg || pDock->iRefCount > 0)
+	{
+		_cairo_dock_load_default_background (&pDock->backgroundBuffer, iWidth, iHeight);
+	}
+	else if (pDock->cBgImagePath != NULL)
+	{
+		cairo_dock_load_image_buffer (&pDock->backgroundBuffer, pDock->cBgImagePath, iWidth, iHeight, CAIRO_DOCK_FILL_SPACE);
+	}
+	if (pDock->backgroundBuffer.pSurface == NULL)
+	{
+		cairo_surface_t *pSurface = _cairo_dock_make_stripes_background (iWidth, iHeight, pDock->fBgColorBright, pDock->fBgColorDark, 0, 0., 90);
+		cairo_dock_load_image_buffer_from_surface (&pDock->backgroundBuffer, pSurface, iWidth, iHeight);
+	}
+}
+
+static gboolean _load_background_idle (CairoDock *pDock)
+{
+	cairo_dock_load_dock_background (pDock);
+	
+	pDock->iSidLoadBg = 0;
+	return FALSE;
+}
+void cairo_dock_trigger_load_dock_background (CairoDock *pDock)
+{
+	if (pDock->iDecorationsWidth == pDock->backgroundBuffer.iWidth && pDock->iDecorationsHeight == pDock->backgroundBuffer.iHeight)  // mise a jour inutile.
+		return;
+	if (pDock->iSidLoadBg == 0)
+		pDock->iSidLoadBg = g_idle_add ((GSourceFunc)_load_background_idle, pDock);
+}

=== 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 @@
 01-default_theme_with_default_apps
+02-mouse-leaves-on-the-edge_upstream-version-2.3.0~2.1.patch

=== 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 @@
 ########### project ###############
 
 project ("cairo-dock")
-set (VERSION "2.3.0~1")
+set (VERSION "2.3.0~2")
 
 add_definitions (-std=c99 -Wstrict-prototypes -Wextra -Wwrite-strings -Wuninitialized -Werror-implicit-function-declaration) #-Wunreachable-code -Wno-unused-parameter -Wall 
 if (NOT ${CMAKE_BUILD_TYPE})

=== 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 @@
+cairo-dock (2.3.0~2-0ubuntu1) UNRELEASED; urgency=low
+
+  * New upstream release. (LP: #786104)
+  * Upstream ChangeLog:
+   - Fixed a crash that occured when a class sub-dock was destroyed
+      (LP: #773280)
+   - Fixed a major bug where the dock couldn't re-appear after a
+      menu has been triggerd from outside the dock (ie, from a shortcut)
+  * debian/patches:
+   - Added an upstream's patch to fix an annoying bug when we slowly
+      leave the dock with the cursor on the edge of it
+
+ -- Matthieu Baerts (matttbe) <matttbe@xxxxxxxxx>  Sat, 21 May 2011 21:03:26 +0200
+
 cairo-dock (2.3.0~1-0ubuntu1) natty; urgency=low
 
   * New Upstream Version (LP: #723994)

=== 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 @@
+From: Matthieu Baerts <matttbe@xxxxxxxxx>
+Subject: Fixed an annoying bug when we slowly leave the dock with the cursor on the edge of it
+Origin: upstream, http://bazaar.launchpad.net/~cairo-dock-team/cairo-dock-core/2.3.x/revision/757
+Bug: http://www.glx-dock.org/tt_task.php?p=1&t=174
+Forwarded: yes
+
+Index: cairo-dock/src/gldit/cairo-dock-dock-facility.c
+===================================================================
+--- cairo-dock.orig/src/gldit/cairo-dock-dock-facility.c	2011-05-21 10:52:15.504630255 +0200
++++ cairo-dock/src/gldit/cairo-dock-dock-facility.c	2011-05-21 10:52:38.494663981 +0200
+@@ -760,11 +760,10 @@
+ 		}
+ 		else
+ 		{
+-			double fSideMargin = fabs (pDock->fAlign - .5) * (iWidth - pDock->fFlatDockWidth);
+-			if (x_abs < - fSideMargin || x_abs > pDock->fFlatDockWidth + fSideMargin)
+-				iMousePositionType = CAIRO_DOCK_MOUSE_OUTSIDE;
+-			else
++			if (iMouseY >= 0 && iMouseY < iHeight)
+ 				iMousePositionType = CAIRO_DOCK_MOUSE_ON_THE_EDGE;
++			else
++				iMousePositionType = CAIRO_DOCK_MOUSE_OUTSIDE;
+ 		}
+ 	}
+ 	else if (iMouseY >= 0 && iMouseY < iHeight)  // et en plus on est dedans en y.  //  && pPointedIcon != NULL

=== 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 @@
 01-default_theme_with_default_apps
+02-mouse-leaves-on-the-edge_upstream-version-2.3.0~2.1.patch

=== 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 @@
 				pIcon->fInsertRemoveFactor = 0.;  // on le fait avant le reload, sinon l'icone n'est pas rechargee.
 				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.
 					cairo_dock_reload_icon_image (pIcon, CAIRO_CONTAINER (pDock));
-				cairo_dock_detach_appli (pIcon);
+				pDock = cairo_dock_detach_appli (pIcon);
+				if (pDock == NULL)
+				{
+					cairo_dock_free_icon (pIcon);
+					return FALSE;
+				}
 			}
 			else
 			{

=== 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 @@
 		}
 		else
 		{
-			double fSideMargin = fabs (pDock->fAlign - .5) * (iWidth - pDock->fFlatDockWidth);
-			if (x_abs < - fSideMargin || x_abs > pDock->fFlatDockWidth + fSideMargin)
-				iMousePositionType = CAIRO_DOCK_MOUSE_OUTSIDE;
-			else
+			if (iMouseY >= 0 && iMouseY < iHeight)
 				iMousePositionType = CAIRO_DOCK_MOUSE_ON_THE_EDGE;
+			else
+				iMousePositionType = CAIRO_DOCK_MOUSE_OUTSIDE;
 		}
 	}
 	else if (iMouseY >= 0 && iMouseY < iHeight)  // et en plus on est dedans en y.  //  && pPointedIcon != NULL

=== 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 @@
 }
 static gboolean _cairo_dock_unhide_dock_delayed (CairoDock *pDock)
 {
-	if (pDock->container.bInside)  // on est deja dedans, inutile de le re-montrer.
+	if (pDock->container.bInside && pDock->iInputState != CAIRO_DOCK_INPUT_HIDDEN && !pDock->bIsBelow)  // already inside and reachable (caution) => no need to show it again.
 	{
 		pDock->iSidUnhideDelayed = 0;
 		return FALSE;


Follow ups