On Sun, 29 Sep 2013, Rodolfo kix Garcia escribió:

> Hi,
> 
> sources are different from version 0.8 to now, but I found this patch in the 
> Debian BTS and the problem probably exists yet.
> 
> See this: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=256792
> 
> I tryied it here, and something odd happends following the steps that 
> "Fernando M. Maresca" (8/Jul/2004) points.
> 
> I check with this behaviour:
> 
> 1. Create a new user and set the options like Fernando says (really, default 
> config).
> 2. Open the two windows.
> 3. Hold Alt+Tab -> switchpanel is painted
> 4. Press any key -> switchpanel is closed
> 5. Hold Alt+Tab again
> 6. Move the mouse over the Clip. Press left button and try to move the Clip. 
> -> Nothing happends
> 7. Press a key -> switchpanel is closed AND the Clip is attached to the mouse 
> pointer (move a bit the mouse).
> 
> Cheers,
> kix

Hi,

I check the code again, I think is the same idea, but with different lines. The 
new code doesn't process the modifiers in the first lines of the function, 
does't it later.

I attached the patch updated.

While Alt+Tab, if the key press is not a WKBD_FOCUSNEXT|WKBD_FOCUSPREV|... 
breaks. The code is more clear, and with less lines.

---------------8<-----------
        case KeyRelease:

                if (ev.xkey.keycode == shiftLKey || ev.xkey.keycode == 
shiftRKey)
                        if (wPreferences.strict_windoze_cycle)
                                break;

                if (ev.xkey.keycode == XK_Return)
                        break;

                if (ev.xkey.keycode != binding.keycode)
                        done = True;

                break;
---------------8<-----------

I tested it here, and seems to be fine. Please, test it and if all is ok, 
Carlos, feel free to include a description. Please, don't remember the patch 
was written by "David Butts", is not mine (I only updated it).

This is the idea of the patch:

1. First, save the binding, do not process it yet:
---------------8<-----------
        if (next) {
                if (class_only)
-                       hasModifier = (wKeyBindings[WKBD_GROUPNEXT].modifier != 
0);
+                       binding = wKeyBindings[WKBD_GROUPNEXT];
                else
-                       hasModifier = (wKeyBindings[WKBD_FOCUSNEXT].modifier != 
0);
+                       binding = wKeyBindings[WKBD_FOCUSNEXT];
        } else {
                if (class_only)
-                       hasModifier = (wKeyBindings[WKBD_GROUPPREV].modifier != 
0);
+                       binding = wKeyBindings[WKBD_GROUPPREV];
                else
-                       hasModifier = (wKeyBindings[WKBD_FOCUSPREV].modifier != 
0);
+                       binding = wKeyBindings[WKBD_FOCUSPREV];
        }
---------------8<-----------

2. We don't need the keymap variable below, so we can delete this line (I 
removed the curly brackets too).
---------------8<-----------
-       if (hasModifier) {
-               keymap = XGetModifierMapping(dpy);
+       hasModifier = (binding.modifier != 0);
+       if (hasModifier)
                XGrabKeyboard(dpy, scr->root_win, False, GrabModeAsync, 
GrabModeAsync, CurrentTime);
-       }
---------------8<-----------


3. This is the new idea, if the key is not valid, work is done.
---------------8<-----------
-                       for (i = 0; i < 8 * keymap->max_keypermod; i++) {
-
-                               int mask = 1 << (i / keymap->max_keypermod);
+                       if (ev.xkey.keycode != binding.keycode)
+                               done = True;

-                               if (keymap->modifiermap[i] == ev.xkey.keycode &&
-                                   ((wKeyBindings[WKBD_FOCUSNEXT].modifier & 
mask)
-                                    || (wKeyBindings[WKBD_FOCUSPREV].modifier 
& mask)
-                                    || (wKeyBindings[WKBD_GROUPNEXT].modifier 
& mask)
-                                    || (wKeyBindings[WKBD_GROUPPREV].modifier 
& mask))) {
-                                       done = True;
-                                       break;
-                               }
-                       }
---------------8<-----------


Cheers,
kix
--
||// //\\// Rodolfo "kix" Garcia
||\\// //\\ http://www.kix.es/
>From b81c13dac8152755720132ecf440e80a63778e54 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Rodolfo=20Garc=C3=ADa=20Pe=C3=B1as=20=28kix=29?=
 <k...@kix.es>
Date: Sun, 29 Sep 2013 13:59:38 +0200
Subject: [PATCH] Test cycling.

---
 src/cycling.c | 36 ++++++++++--------------------------
 1 file changed, 10 insertions(+), 26 deletions(-)

diff --git a/src/cycling.c b/src/cycling.c
index 291a28a..bc5f347 100644
--- a/src/cycling.c
+++ b/src/cycling.c
@@ -82,7 +82,7 @@ static WWindow *change_focus_and_raise(WWindow *newFocused, WWindow *oldFocused,
 void StartWindozeCycle(WWindow * wwin, XEvent * event, Bool next, Bool class_only)
 {
 
-	XModifierKeymap *keymap        = NULL;
+	WShortKey binding;
 	WSwitchPanel    *swpanel       = NULL;
 	WScreen         *scr           = wScreenForRootWindow(event->xkey.root);
 	KeyCode         leftKey        = XKeysymToKeycode(dpy, XK_Left);
@@ -108,20 +108,19 @@ void StartWindozeCycle(WWindow * wwin, XEvent * event, Bool next, Bool class_onl
 
 	if (next) {
 		if (class_only)
-			hasModifier = (wKeyBindings[WKBD_GROUPNEXT].modifier != 0);
+			binding = wKeyBindings[WKBD_GROUPNEXT];
 		else
-			hasModifier = (wKeyBindings[WKBD_FOCUSNEXT].modifier != 0);
+			binding = wKeyBindings[WKBD_FOCUSNEXT];
 	} else {
 		if (class_only)
-			hasModifier = (wKeyBindings[WKBD_GROUPPREV].modifier != 0);
+			binding = wKeyBindings[WKBD_GROUPPREV];
 		else
-			hasModifier = (wKeyBindings[WKBD_FOCUSPREV].modifier != 0);
+			binding = wKeyBindings[WKBD_FOCUSPREV];
 	}
 
-	if (hasModifier) {
-		keymap = XGetModifierMapping(dpy);
+	hasModifier = (binding.modifier != 0);
+	if (hasModifier)
 		XGrabKeyboard(dpy, scr->root_win, False, GrabModeAsync, GrabModeAsync, CurrentTime);
-	}
 
 	scr->flags.doing_alt_tab = 1;
 
@@ -144,7 +143,6 @@ void StartWindozeCycle(WWindow * wwin, XEvent * event, Bool next, Bool class_onl
 	}
 
 	while (hasModifier && !done) {
-		int i;
 
 		WMMaskEvent(dpy, KeyPressMask | KeyReleaseMask | ExposureMask
 			    | PointerMotionMask | ButtonReleaseMask | EnterWindowMask, &ev);
@@ -211,19 +209,9 @@ void StartWindozeCycle(WWindow * wwin, XEvent * event, Bool next, Bool class_onl
 			if (ev.xkey.keycode == XK_Return)
 				break;
 
-			for (i = 0; i < 8 * keymap->max_keypermod; i++) {
-
-				int mask = 1 << (i / keymap->max_keypermod);
+			if (ev.xkey.keycode != binding.keycode)
+				done = True;
 
-				if (keymap->modifiermap[i] == ev.xkey.keycode &&
-				    ((wKeyBindings[WKBD_FOCUSNEXT].modifier & mask)
-				     || (wKeyBindings[WKBD_FOCUSPREV].modifier & mask)
-				     || (wKeyBindings[WKBD_GROUPNEXT].modifier & mask)
-				     || (wKeyBindings[WKBD_GROUPPREV].modifier & mask))) {
-					done = True;
-					break;
-				}
-			}
 			break;
 
 		case EnterNotify:
@@ -253,13 +241,9 @@ void StartWindozeCycle(WWindow * wwin, XEvent * event, Bool next, Bool class_onl
 			break;
 		}
 	}
-	if (keymap)
-		XFreeModifiermap(keymap);
-
-	if (hasModifier) {
 
+	if (hasModifier)
 		XUngrabKeyboard(dpy, CurrentTime);
-	}
 
 	if (swpanel)
 		wSwitchPanelDestroy(swpanel);
-- 
1.8.4.rc3

Reply via email to