[patch] [FIX] Reverse Task Switch (Alt+Shift+Tab)

Dan Compton gtg786g at mail.gatech.edu
Wed Oct 29 21:52:31 CET 2003


Olivier,

Oh I'm sorry, I forgot to mention that.  I thought it was an error 
because usually developers comment that they want the fall-through to 
happen on purpose.  I'm going to remove that.  What about the other changes?

Dan

Olivier Fourdan wrote:

>Dan,
>
>Why do you add the "break" in the case switches? By adding those, you
>break the logic and that won't work... The walkthru is on purpose.
>
>Cheers,
>Olivier.
>
>On Wed, 2003-10-29 at 19:58, Dan Compton wrote:
>  
>
>>I'm sorry but the previous patch had a small bug if your 
>>cycle_windows_key included the Shift key (Mainly, when you let go of 
>>Shift, the cycle windows window would not be relinguished).  This is a 
>>replacement patch, it doesn't patch on top of the last patch because I 
>>assume almost no one or no one has actually tried the original since 
>>there have been no responses yet.
>>
>>This applies to xfwm4-4.0.0.  Apply it by "patch -p0 < 
>>xfwm4-4.0.0.shiftalttab-0.1.patch" above the xfwm4-4.0.0 directory.
>>
>>Dan Compton
>>
>>______________________________________________________________________
>>diff -aur xfwm4-4.0.0/src/client.c xfwm4-4.0.0.new/src/client.c
>>--- xfwm4-4.0.0/src/client.c	2003-09-21 17:39:55.000000000 -0400
>>+++ xfwm4-4.0.0.new/src/client.c	2003-10-29 13:43:50.000000000 -0500
>>@@ -3547,6 +3547,33 @@
>>     return NULL;
>> }
>> 
>>+Client *
>>+clientGetPrevious (Client * c, int mask)
>>+{
>>+    Client *c2;
>>+    unsigned int i;
>>+
>>+    TRACE ("entering clientGetPrevious");
>>+
>>+    if (c)
>>+    {
>>+        for (c2 = c->prev, i = 0; (c2) && (i < client_count);
>>+            c2 = c2->prev, i++)
>>+        {
>>+            if ((c2->type == WINDOW_SPLASHSCREEN)
>>+                || (c2->type == WINDOW_DESKTOP))
>>+            {
>>+                continue;
>>+            }
>>+            if (clientSelectMask (c2, mask))
>>+            {
>>+                return c2;
>>+            }
>>+        }
>>+    }
>>+    return NULL;
>>+}
>>+
>> /* Build a GList of clients that have a transient relationship */
>> static GList *
>> clientListTransient (Client * c)
>>@@ -5617,12 +5644,14 @@
>>                 clientGetFromWindow (((XDestroyWindowEvent *) xevent)->window,
>>                     WINDOW));
>>             status = XEV_FILTER_CONTINUE;
>>+            break;
>>         case UnmapNotify:
>>             gone |=
>>                 (passdata->c ==
>>                 clientGetFromWindow (((XUnmapEvent *) xevent)->window,
>>                     WINDOW));
>>             status = XEV_FILTER_CONTINUE;
>>+            break;
>>         case KeyPress:
>>             if (gone
>>                 || (xevent->xkey.keycode ==
>>@@ -5630,8 +5659,19 @@
>>             {
>>                 /* Hide frame draw */
>>                 clientDrawOutline (passdata->c);
>>-                passdata->c =
>>-                    clientGetNext (passdata->c, passdata->cycle_range);
>>+
>>+                /* If KEY_CYCLE_WINDOWS has Shift, then do not reverse */
>>+                if (!(params.keys[KEY_CYCLE_WINDOWS].modifier & ShiftMask)
>>+                        && xevent->xkey.state & ShiftMask) {
>>+                    passdata->c =
>>+                        clientGetPrevious (passdata->c, passdata->cycle_range);
>>+                }
>>+                else
>>+                {
>>+                    passdata->c =
>>+                        clientGetNext (passdata->c, passdata->cycle_range);
>>+                }
>>+
>>                 if (passdata->c)
>>                 {
>>                     /* Redraw frame draw */
>>@@ -5645,10 +5685,19 @@
>>             }
>>             break;
>>         case KeyRelease:
>>-            if (IsModifierKey (XKeycodeToKeysym (dpy, xevent->xkey.keycode,
>>-                        0)))
>>             {
>>-                cycling = FALSE;
>>+                int keysym = XKeycodeToKeysym (dpy, xevent->xkey.keycode, 0);
>>+
>>+                /* If KEY_CYCE_WINDOWS has Shift, then stop cycling on Shift
>>+                 * release.
>>+                 */
>>+                if (IsModifierKey (keysym)
>>+                        && ( (params.keys[KEY_CYCLE_WINDOWS].modifier
>>+                             & ShiftMask)
>>+                        || (keysym != XK_Shift_L && keysym != XK_Shift_R) ) )
>>+                {
>>+                    cycling = FALSE;
>>+                }
>>             }
>>             break;
>>         case ButtonPress:
>>diff -aur xfwm4-4.0.0/src/client.h xfwm4-4.0.0.new/src/client.h
>>--- xfwm4-4.0.0/src/client.h	2003-09-12 16:28:30.000000000 -0400
>>+++ xfwm4-4.0.0.new/src/client.h	2003-10-29 01:38:51.000000000 -0500
>>@@ -263,6 +263,7 @@
>> Client *clientGetFromWindow (Window, int);
>> Client *clientAtPosition (int, int, Client *);
>> Client *clientGetNext (Client *, int);
>>+Client *clientGetPrevious (Client *, int);
>> void clientPassFocus (Client *);
>> void clientShow (Client *, gboolean);
>> void clientHide (Client *, int, gboolean);
>>
>>______________________________________________________________________
>>_______________________________________________
>>Xfce4-dev mailing list
>>Xfce4-dev at xfce.org
>>http://moongroup.com/mailman/listinfo/xfce4-dev
>>    
>>





More information about the Xfce4-dev mailing list