Hi Carlos,

I managed to trigger the same bug, this time when un-shading a window.
I couldn't duplicate again, must've just got lucky that time.

cheers
Paul

2009/12/27 Carlos R. Mafra <[email protected]>

> On Di  8.Dez'09 at  9:42:49 +0800, Paul Harris wrote:
> >
> > my setup: wheel mouse on background changes the desktop
> >
> > procedure:
> > - minimise a window
> > - move mouse over the icon, then twirl the mouse wheel down
> >
> > if you do it right, the window will restore, but the workspace will
> change
> > (from A to B), and the window is restored on the new desktop.
> > if you press F11 (or middle-mouse, or whatever) to bring up the Window
> List,
> > you'll see that the restored window is listed as still living on
> Workspace A
> > when its clearly visible on Workspace B.
> >
> > if you switch back to the original workspace (A), the restored window
> > "follows" you there.
> > if you return to the workspace B, the restore window is not there (which
> is
> > how it should have been from the start).
> >
> > so,  you can make a window restore onto the incorrect workspace.
>
> The patch below fixes the issue for me and I've just pushed it to 'next'.
> Paul, can you test it too?
>
> I am not sure if there are already some flags in Window Maker saying
> "don't do that while I am doing this", so I had to create a global
> variable to take care of this issue.
>
> ---8<------
> From a2133e8e2fa868e6284f78ec2ecb06294b2ee95d Mon Sep 17 00:00:00 2001
> From: Carlos R. Mafra <[email protected]>
> Date: Sat, 26 Dec 2009 21:09:10 +0100
> Subject: [PATCH] Do not change workspace during deiconify animation
>
> Paul Harris reported that using the mouse wheel over a miniwindow
> would deiconify it to a different workspace than the original one
> where it was iconified.
>
> This happens because after the window begins to be deiconified the
> "residual" mouse wheel scrolling hits the workspace background, and
> Window Maker changes workspace with wWorkspaceRelativeChange().
>
> But if it all happens fast enough (so the deiconification animation
> did not finish yet) the workspace will have changed before the
> window reaches its final deiconified destination, leading to
> the situation that Paul described in the link below.
>
> So to avoid this, let's set a 'ignore_wks_change' variable
> from wDeiconifyWindow() and make wWorkspaceRelativeChange() respect it.
>
> Original report: http://lists.windowmaker.info/dev/msg00821.html
> ---
>  src/actions.c   |    7 +++++++
>  src/workspace.c |    8 ++++++++
>  2 files changed, 15 insertions(+), 0 deletions(-)
>
> diff --git a/src/actions.c b/src/actions.c
> index c308ed0..891c4f2 100644
> --- a/src/actions.c
> +++ b/src/actions.c
> @@ -49,6 +49,8 @@
>  #include "xinerama.h"
>
>  /****** Global Variables ******/
> +
> +int ignore_wks_change = 0;
>  extern Time LastTimestamp;
>  extern Time LastFocusChange;
>
> @@ -1109,6 +1111,9 @@ void wIconifyWindow(WWindow * wwin)
>
>  void wDeiconifyWindow(WWindow * wwin)
>  {
> +       /* Let's avoid changing workspace while deiconifying */
> +       ignore_wks_change = 1;
> +
>        /* we're hiding for show_desktop */
>        int netwm_hidden = wwin->flags.net_show_desktop &&
>            wwin->frame->workspace != wwin->screen_ptr->current_workspace;
> @@ -1230,6 +1235,8 @@ void wDeiconifyWindow(WWindow * wwin)
>        /* In case we were shaded and iconified, also unshade */
>        if (!netwm_hidden)
>                wUnshadeWindow(wwin);
> +
> +       ignore_wks_change = 0;
>  }
>
>  static void hideWindow(WIcon * icon, int icon_x, int icon_y, WWindow *
> wwin, int animate)
> diff --git a/src/workspace.c b/src/workspace.c
> index 1178070..7374633 100644
> --- a/src/workspace.c
> +++ b/src/workspace.c
> @@ -54,6 +54,7 @@
>  #define MAX_SHORTCUT_LENGTH 32
>  #define WORKSPACE_NAME_DISPLAY_PADDING 32
>
> +extern int ignore_wks_change;
>  extern WPreferences wPreferences;
>  extern XContext wWinContext;
>  extern XContext wVEdgeContext;
> @@ -441,6 +442,13 @@ void wWorkspaceRelativeChange(WScreen * scr, int
> amount)
>  {
>        int w;
>
> +       /* While the deiconify animation is going on the window is
> +        * still "flying" to its final position and we don't want to
> +        * change workspace before the animation finishes, otherwise
> +        * the window will land in the new workspace */
> +       if (ignore_wks_change)
> +               return;
> +
>        w = scr->current_workspace + amount;
>
>        if (amount < 0) {
> --
> 1.6.6
>
>
> --
> To unsubscribe, send mail to [email protected]
> .
>

Reply via email to