summary refs log tree commit diff
path: root/mousefunc.c
diff options
context:
space:
mode:
authorokan <okan>2009-04-15 14:10:07 +0000
committerokan <okan>2009-04-15 14:10:07 +0000
commitcc68490fe12513394e9218740d28ba23ec158cbd (patch)
tree039810ab1638675485ee37d91df422efe5429093 /mousefunc.c
parentea96e92ac8ab68439f7cafa294e3905818324960 (diff)
downloadcwm-cc68490fe12513394e9218740d28ba23ec158cbd.tar.gz
cwm-cc68490fe12513394e9218740d28ba23ec158cbd.tar.xz
cwm-cc68490fe12513394e9218740d28ba23ec158cbd.zip
don't sync more than 60 times per sec on resize and move; idea from scrotwm.
ok oga@ sometime ago
Diffstat (limited to 'mousefunc.c')
-rw-r--r--mousefunc.c26
1 files changed, 24 insertions, 2 deletions
diff --git a/mousefunc.c b/mousefunc.c
index a12d04a..979bb03 100644
--- a/mousefunc.c
+++ b/mousefunc.c
@@ -88,6 +88,7 @@ void
 mousefunc_window_resize(struct client_ctx *cc, void *arg)
 {
 	XEvent			 ev;
+	Time			 time = 0;
 	struct screen_ctx	*sc = CCTOSC(cc);
 	int			 dx, dy;
 	int			 x = cc->geom.x, y = cc->geom.y;
@@ -116,9 +117,19 @@ mousefunc_window_resize(struct client_ctx *cc, void *arg)
 			    ev.xmotion.x, ev.xmotion.y))
 				/* Recompute window output */
 				_mousefunc_sweep_draw(cc, dx, dy);
-			client_resize(cc);
+
+			/* don't sync more than 60 times / second */
+			if ((ev.xmotion.time - time) > (1000 / 60) ) {
+				time = ev.xmotion.time;
+				XSync(X_Dpy, False);
+				client_resize(cc);
+			}
 			break;
 		case ButtonRelease:
+			if (time) {
+				XSync(X_Dpy, False);
+				client_resize(cc);
+			}
 			XUnmapWindow(X_Dpy, sc->menuwin);
 			XReparentWindow(X_Dpy, sc->menuwin, sc->rootwin, 0, 0);
 			xu_ptr_ungrab();
@@ -140,6 +151,7 @@ void
 mousefunc_window_move(struct client_ctx *cc, void *arg)
 {
 	XEvent			 ev;
+	Time			 time = 0;
 	struct screen_ctx	*sc = CCTOSC(cc);
 	int			 mx, my;
 	int			 x = cc->geom.x, y = cc->geom.y;
@@ -161,9 +173,19 @@ mousefunc_window_move(struct client_ctx *cc, void *arg)
 		case MotionNotify:
 			cc->geom.x = x + (ev.xmotion.x - mx);
 			cc->geom.y = y + (ev.xmotion.y - my);
-			client_move(cc);
+
+			/* don't sync more than 60 times / second */
+			if ((ev.xmotion.time - time) > (1000 / 60) ) {
+				time = ev.xmotion.time;
+				XSync(X_Dpy, False);
+				client_move(cc);
+			}
 			break;
 		case ButtonRelease:
+			if (time) {
+				XSync(X_Dpy, False);
+				client_move(cc);
+			}
 			xu_ptr_ungrab();
 			return;
 		}