summary refs log tree commit diff
path: root/kbfunc.c
diff options
context:
space:
mode:
authorokan <okan>2015-11-12 18:26:41 +0000
committerokan <okan>2015-11-12 18:26:41 +0000
commit9a48836ceb40313cd12c05781d57f291401de7b0 (patch)
tree9c7894f80ec83b915bc3eef072c8154122510814 /kbfunc.c
parenta2c066e447f8c3f754cc5559066b09f80e4c148e (diff)
downloadcwm-9a48836ceb40313cd12c05781d57f291401de7b0.tar.gz
cwm-9a48836ceb40313cd12c05781d57f291401de7b0.tar.xz
cwm-9a48836ceb40313cd12c05781d57f291401de7b0.zip
Move kb pointer movement out of the kbfunc_client_moveresize since it's
got nothing to do with clients, thus doing flags work causes lots of
waste and almost useless jumpy pointer movements; while here, split out
move and resize since they share almost no code, just like mouse client
move/resize; factor out amount and factor. Still wonder why this is
here, but it works now.
Diffstat (limited to 'kbfunc.c')
-rw-r--r--kbfunc.c167
1 files changed, 92 insertions, 75 deletions
diff --git a/kbfunc.c b/kbfunc.c
index 8e2f579..121ae7d 100644
--- a/kbfunc.c
+++ b/kbfunc.c
@@ -38,6 +38,8 @@
 
 extern sig_atomic_t	 cwm_status;
 
+static void kbfunc_amount(int, unsigned int *, unsigned int *);
+
 void
 kbfunc_client_lower(struct client_ctx *cc, union arg *arg)
 {
@@ -51,94 +53,109 @@ kbfunc_client_raise(struct client_ctx *cc, union arg *arg)
 	client_raise(cc);
 }
 
-#define TYPEMASK	(CWM_MOVE | CWM_RESIZE | CWM_PTRMOVE)
-#define MOVEMASK	(CWM_UP | CWM_DOWN | CWM_LEFT | CWM_RIGHT)
-void
-kbfunc_client_moveresize(struct client_ctx *cc, union arg *arg)
+static void
+kbfunc_amount(int flags, unsigned int *mx, unsigned int *my)
 {
-	struct screen_ctx	*sc = cc->sc;
-	struct geom		 area;
-	int			 x, y, flags, amt;
-	unsigned int		 mx, my;
+#define CWM_FACTOR 10
+	int	amt;
 
-	if (cc->flags & CLIENT_FREEZE)
-		return;
-
-	mx = my = 0;
-
-	flags = arg->i;
 	amt = Conf.mamount;
+	if (flags & CWM_BIGAMOUNT)
+		amt *= CWM_FACTOR;
 
-	if (flags & CWM_BIGMOVE) {
-		flags -= CWM_BIGMOVE;
-		amt = amt * 10;
-	}
-
-	switch (flags & MOVEMASK) {
+	switch (flags & DIRECTIONMASK) {
 	case CWM_UP:
-		my -= amt;
+		*my -= amt;
 		break;
 	case CWM_DOWN:
-		my += amt;
+		*my += amt;
 		break;
 	case CWM_RIGHT:
-		mx += amt;
+		*mx += amt;
 		break;
 	case CWM_LEFT:
-		mx -= amt;
+		*mx -= amt;
 		break;
 	}
-	switch (flags & TYPEMASK) {
-	case CWM_MOVE:
-		cc->geom.x += mx;
-		if (cc->geom.x + cc->geom.w < 0)
-			cc->geom.x = -cc->geom.w;
-		if (cc->geom.x > sc->view.w - 1)
-			cc->geom.x = sc->view.w - 1;
-		cc->geom.y += my;
-		if (cc->geom.y + cc->geom.h < 0)
-			cc->geom.y = -cc->geom.h;
-		if (cc->geom.y > sc->view.h - 1)
-			cc->geom.y = sc->view.h - 1;
-
-		area = screen_area(sc,
-		    cc->geom.x + cc->geom.w / 2,
-		    cc->geom.y + cc->geom.h / 2, CWM_GAP);
-		cc->geom.x += client_snapcalc(cc->geom.x,
-		    cc->geom.x + cc->geom.w + (cc->bwidth * 2),
-		    area.x, area.x + area.w, sc->snapdist);
-		cc->geom.y += client_snapcalc(cc->geom.y,
-		    cc->geom.y + cc->geom.h + (cc->bwidth * 2),
-		    area.y, area.y + area.h, sc->snapdist);
-
-		client_move(cc);
-		xu_ptr_getpos(cc->win, &x, &y);
-		cc->ptr.x = x + mx;
-		cc->ptr.y = y + my;
-		client_ptrwarp(cc);
-		break;
-	case CWM_RESIZE:
-		if ((cc->geom.w += mx) < 1)
-			cc->geom.w = 1;
-		if ((cc->geom.h += my) < 1)
-			cc->geom.h = 1;
-		client_resize(cc, 1);
-
-		/* Make sure the pointer stays within the window. */
-		xu_ptr_getpos(cc->win, &cc->ptr.x, &cc->ptr.y);
-		if (cc->ptr.x > cc->geom.w)
-			cc->ptr.x = cc->geom.w - cc->bwidth;
-		if (cc->ptr.y > cc->geom.h)
-			cc->ptr.y = cc->geom.h - cc->bwidth;
-		client_ptrwarp(cc);
-		break;
-	case CWM_PTRMOVE:
-		xu_ptr_getpos(sc->rootwin, &x, &y);
-		xu_ptr_setpos(sc->rootwin, x + mx, y + my);
-		break;
-	default:
-		warnx("invalid flags passed to kbfunc_client_moveresize");
-	}
+}
+
+void
+kbfunc_ptrmove(struct client_ctx *cc, union arg *arg)
+{
+	struct screen_ctx	*sc = cc->sc;
+	int			 x, y;
+	unsigned int		 mx = 0, my = 0;
+
+	kbfunc_amount(arg->i, &mx, &my);
+
+	xu_ptr_getpos(sc->rootwin, &x, &y);
+	xu_ptr_setpos(sc->rootwin, x + mx, y + my);
+}
+
+void
+kbfunc_client_move(struct client_ctx *cc, union arg *arg)
+{
+	struct screen_ctx	*sc = cc->sc;
+	struct geom		 area;
+	int			 x, y;
+	unsigned int		 mx = 0, my = 0;
+
+	if (cc->flags & CLIENT_FREEZE)
+		return;
+
+	kbfunc_amount(arg->i, &mx, &my);
+
+	cc->geom.x += mx;
+	if (cc->geom.x + cc->geom.w < 0)
+		cc->geom.x = -cc->geom.w;
+	if (cc->geom.x > sc->view.w - 1)
+		cc->geom.x = sc->view.w - 1;
+	cc->geom.y += my;
+	if (cc->geom.y + cc->geom.h < 0)
+		cc->geom.y = -cc->geom.h;
+	if (cc->geom.y > sc->view.h - 1)
+		cc->geom.y = sc->view.h - 1;
+
+	area = screen_area(sc,
+	    cc->geom.x + cc->geom.w / 2,
+	    cc->geom.y + cc->geom.h / 2, CWM_GAP);
+	cc->geom.x += client_snapcalc(cc->geom.x,
+	    cc->geom.x + cc->geom.w + (cc->bwidth * 2),
+	    area.x, area.x + area.w, sc->snapdist);
+	cc->geom.y += client_snapcalc(cc->geom.y,
+	    cc->geom.y + cc->geom.h + (cc->bwidth * 2),
+	    area.y, area.y + area.h, sc->snapdist);
+	client_move(cc);
+
+	xu_ptr_getpos(cc->win, &x, &y);
+	cc->ptr.x = x + mx;
+	cc->ptr.y = y + my;
+	client_ptrwarp(cc);
+}
+
+void
+kbfunc_client_resize(struct client_ctx *cc, union arg *arg)
+{
+	unsigned int		 mx = 0, my = 0;
+
+	if (cc->flags & CLIENT_FREEZE)
+		return;
+
+	kbfunc_amount(arg->i, &mx, &my);
+
+	if ((cc->geom.w += mx) < 1)
+		cc->geom.w = 1;
+	if ((cc->geom.h += my) < 1)
+		cc->geom.h = 1;
+	client_resize(cc, 1);
+
+	/* Make sure the pointer stays within the window. */
+	xu_ptr_getpos(cc->win, &cc->ptr.x, &cc->ptr.y);
+	if (cc->ptr.x > cc->geom.w)
+		cc->ptr.x = cc->geom.w - cc->bwidth;
+	if (cc->ptr.y > cc->geom.h)
+		cc->ptr.y = cc->geom.h - cc->bwidth;
+	client_ptrwarp(cc);
 }
 
 void