Dimanche le 03 juillet 2005, vers 02:19:11 (CEST), Marcelo E. Magallon
a écrit:

>  > 1. hold down the [Alt] key 
[...]
>
>  No, I've been trying to reproduce this for a while with no luck.
>
>  Do you have the switch panel enabled? (I don't)

Hello Marcelo,

What do you call the "switch panel"?  If it is the ability to cycle
windows with Alt+Tab, I have it enabled.  Furthermore, I use the
sloppy focus mode.

The bug I reported looks like some race condition.  Your machine is
maybe faster than mine, which makes the bug harder to reproduce for
you.

I looked at the code, and the culprit seems to be the
ProcessPendingEvents() call in function wWorkspaceForceChange of file
src/workspace.c (around line 569).  With this line, it is possible to
have another instance of wWorkspaceForceChange called while the first
one is not finished, which leeds to strange behaviour.

I am sorry, but I have not enough free time to write a clean patch.
As a quick hack, removing the call to ProcessPendingEvents fixes the
problem, but I am not sure that it is the right thing to do.

If you still want to reproduce the bug, try the following.  First,
insert a sleep(1) just before the ProcessPendingEvent call in
src/workspace.c.  Then, proceed as follows (sloppy focus mode seems to
be required):

0. open some windows on workspaces 1 and 2, 
   move the mouse so as to have the pointer over a window on both
   workspaces
1. switch to workspace 1
2. within less than one second, press Alt+2, followed by Alt+1

=> note that, while the displayed windows are from workspace 1, the
   text "Workspace 2" is printed on screen

3. wait 1 or 2 seconds
4. press Alt+2

=> normally, you shouldn't see any window.

I inserted printf in the code to trace some function calls.  Here is
what I got.  The first number is the value of argument "workspace".
The second number, between parentheses, is the value of
scr->current_workspace.

    ENTER wWorkspaceChange 1 (0)
    ENTER wWorkspaceForceChange 1 (0)
       before ProcessPendingEvents 1
    
    ENTER wWorkspaceChange 0 (1)
    ENTER wWorkspaceForceChange 0 (1)
       before ProcessPendingEvents 0
       after ProcessPendingEvents 0
     EXIT wWorkspaceForceChange 0 (0)
    
       after ProcessPendingEvents 1
     EXIT wWorkspaceForceChange 1 (0)   <= note the value of 
                                           scr->current_workspace
    ENTER wWorkspaceChange 1 (0)
    ENTER wWorkspaceForceChange 1 (0)
       before ProcessPendingEvents 1
       after ProcessPendingEvents 1
     EXIT wWorkspaceForceChange 1 (1)

I hope it helps.

        Arnaud

Reply via email to