commit d356e43d9cd411486b8939d9f2d2c81c9836bf75
parent fc23b8e713c6ff4d21bccfe9526325fe481e4f77
Author: Christoph Lohmann <20h@r-36.net>
Date:   Fri, 26 Oct 2012 23:53:29 +0200
Fixing the problem of repeating keys.
Diffstat:
| svkbd.c | | | 34 | +++++++++++++++++----------------- | 
1 file changed, 17 insertions(+), 17 deletions(-)
diff --git a/svkbd.c b/svkbd.c
@@ -63,7 +63,6 @@ static void buttonrelease(XEvent *e);
 static void cleanup(void);
 static void configurenotify(XEvent *e);
 static void countrows();
-static void unmapnotify(XEvent *e);
 static void die(const char *errstr, ...);
 static void drawkeyboard(void);
 static void drawkey(Key *k);
@@ -85,7 +84,6 @@ static void (*handler[LASTEvent]) (XEvent *) = {
 	[ButtonPress] = buttonpress,
 	[ButtonRelease] = buttonrelease,
 	[ConfigureNotify] = configurenotify,
-	[UnmapNotify] = unmapnotify,
 	[Expose] = expose,
 	[LeaveNotify] = leavenotify,
 	[MotionNotify] = motionnotify
@@ -128,7 +126,8 @@ motionnotify(XEvent *e)
 		}
 
 		if(!IsModifierKey(keys[i].keysym) && keys[i].pressed == True) {
-			keys[i].pressed = False;
+			unpress(&keys[i], 0);
+
 			drawkey(&keys[i]);
 		}
 		if(keys[i].highlighted == True) {
@@ -172,8 +171,13 @@ buttonrelease(XEvent *e) {
 			break;
 		}
 	}
-	if((k = findkey(ev->x, ev->y)))
-		unpress(k, mod);
+
+	if(ev->x < 0 || ev->y < 0) {
+		unpress(NULL, mod);
+	} else {
+		if((k = findkey(ev->x, ev->y)))
+			unpress(k, mod);
+	}
 }
 
 void
@@ -275,11 +279,6 @@ drawkey(Key *k) {
 }
 
 void
-unmapnotify(XEvent *e) {
-	running = False;
-}
-
-void
 expose(XEvent *e) {
 	XExposeEvent *ev = &e->xexpose;
 
@@ -399,14 +398,15 @@ unpress(Key *k, KeySym mod) {
 			break;
 		}
 	}
-	if(i !=  LENGTH(keys)) {
+	if(i != LENGTH(keys)) {
+		if(pressedmod) {
+			XTestFakeKeyEvent(dpy,
+				XKeysymToKeycode(dpy, pressedmod),
+				False, 0);
+		}
+		pressedmod = 0;
+
 		for(i = 0; i < LENGTH(keys); i++) {
-			if(pressedmod) {
-				XTestFakeKeyEvent(dpy,
-					XKeysymToKeycode(dpy, pressedmod),
-					False, 0);
-			}
-			pressedmod = 0;
 			if(keys[i].pressed) {
 				XTestFakeKeyEvent(dpy,
 					XKeysymToKeycode(dpy,