summary refs log tree commit diff
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
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.
-rw-r--r--calmwm.h21
-rw-r--r--conf.c96
-rw-r--r--kbfunc.c167
3 files changed, 150 insertions, 134 deletions
diff --git a/calmwm.h b/calmwm.h
index cf7a194..ddc0a4e 100644
--- a/calmwm.h
+++ b/calmwm.h
@@ -50,15 +50,13 @@
 #define KEYMASK		(KeyPressMask | ExposureMask)
 #define IGNOREMODMASK	(LockMask | Mod2Mask | 0x2000)
 
-/* kb movement */
-#define CWM_MOVE		0x0001
-#define CWM_RESIZE		0x0002
-#define CWM_PTRMOVE		0x0004
-#define CWM_BIGMOVE		0x0008
-#define CWM_UP			0x0010
-#define CWM_DOWN		0x0020
-#define CWM_LEFT		0x0040
-#define CWM_RIGHT		0x0080
+/* direction/amount */
+#define CWM_UP			0x0001
+#define CWM_DOWN		0x0002
+#define CWM_LEFT		0x0004
+#define CWM_RIGHT		0x0008
+#define CWM_BIGAMOUNT		0x0010
+#define DIRECTIONMASK	(CWM_UP | CWM_DOWN | CWM_LEFT | CWM_RIGHT)
 
 #define CWM_CLIENT_CYCLE	0x0001
 #define CWM_CLIENT_RCYCLE	0x0002
@@ -475,14 +473,14 @@ void			 kbfunc_client_grouptoggle(struct client_ctx *,
 void			 kbfunc_client_hide(struct client_ctx *, union arg *);
 void			 kbfunc_client_label(struct client_ctx *, union arg *);
 void			 kbfunc_client_lower(struct client_ctx *, union arg *);
-void			 kbfunc_client_moveresize(struct client_ctx *,
-			     union arg *);
+void			 kbfunc_client_move(struct client_ctx *, union arg *);
 void			 kbfunc_client_movetogroup(struct client_ctx *,
 			     union arg *);
 void			 kbfunc_client_nogroup(struct client_ctx *,
 			     union arg *);
 void			 kbfunc_client_raise(struct client_ctx *, union arg *);
 void			 kbfunc_client_rcycle(struct client_ctx *, union arg *);
+void			 kbfunc_client_resize(struct client_ctx *, union arg *);
 void 			 kbfunc_client_tile(struct client_ctx *, union arg *);
 void			 kbfunc_client_toggle_freeze(struct client_ctx *,
     			     union arg *);
@@ -505,6 +503,7 @@ void			 kbfunc_menu_client(struct client_ctx *, union arg *);
 void			 kbfunc_menu_cmd(struct client_ctx *, union arg *);
 void			 kbfunc_menu_group(struct client_ctx *, union arg *);
 void			 kbfunc_menu_ssh(struct client_ctx *, union arg *);
+void			 kbfunc_ptrmove(struct client_ctx *, union arg *);
 
 void			 mousefunc_client_move(struct client_ctx *,
     			    union arg *);
diff --git a/conf.c b/conf.c
index e270606..65300db 100644
--- a/conf.c
+++ b/conf.c
@@ -426,54 +426,54 @@ static const struct {
 	{ "ssh", kbfunc_menu_ssh, CWM_CONTEXT_SCREEN, {0} },
 	{ "terminal", kbfunc_exec_term, CWM_CONTEXT_SCREEN, {0} },
 	{ "lock", kbfunc_exec_lock, CWM_CONTEXT_SCREEN, {0} },
-	{ "moveup", kbfunc_client_moveresize, CWM_CONTEXT_CLIENT,
-	    {.i = (CWM_UP | CWM_MOVE)} },
-	{ "movedown", kbfunc_client_moveresize, CWM_CONTEXT_CLIENT,
-	    {.i = (CWM_DOWN | CWM_MOVE)} },
-	{ "moveright", kbfunc_client_moveresize, CWM_CONTEXT_CLIENT,
-	    {.i = (CWM_RIGHT | CWM_MOVE)} },
-	{ "moveleft", kbfunc_client_moveresize, CWM_CONTEXT_CLIENT,
-	    {.i = (CWM_LEFT | CWM_MOVE)} },
-	{ "bigmoveup", kbfunc_client_moveresize, CWM_CONTEXT_CLIENT,
-	    {.i = (CWM_UP | CWM_MOVE | CWM_BIGMOVE)} },
-	{ "bigmovedown", kbfunc_client_moveresize, CWM_CONTEXT_CLIENT,
-	    {.i = (CWM_DOWN | CWM_MOVE | CWM_BIGMOVE)} },
-	{ "bigmoveright", kbfunc_client_moveresize, CWM_CONTEXT_CLIENT,
-	    {.i = (CWM_RIGHT | CWM_MOVE | CWM_BIGMOVE)} },
-	{ "bigmoveleft", kbfunc_client_moveresize, CWM_CONTEXT_CLIENT,
-	    {.i = (CWM_LEFT | CWM_MOVE | CWM_BIGMOVE)} },
-	{ "resizeup", kbfunc_client_moveresize, CWM_CONTEXT_CLIENT,
-	    {.i = (CWM_UP | CWM_RESIZE)} },
-	{ "resizedown", kbfunc_client_moveresize, CWM_CONTEXT_CLIENT,
-	    {.i = (CWM_DOWN | CWM_RESIZE)} },
-	{ "resizeright", kbfunc_client_moveresize, CWM_CONTEXT_CLIENT,
-	    {.i = (CWM_RIGHT | CWM_RESIZE)} },
-	{ "resizeleft", kbfunc_client_moveresize, CWM_CONTEXT_CLIENT,
-	    {.i = (CWM_LEFT | CWM_RESIZE)} },
-	{ "bigresizeup", kbfunc_client_moveresize, CWM_CONTEXT_CLIENT,
-	    {.i = (CWM_UP | CWM_RESIZE | CWM_BIGMOVE)} },
-	{ "bigresizedown", kbfunc_client_moveresize, CWM_CONTEXT_CLIENT,
-	    {.i = (CWM_DOWN | CWM_RESIZE | CWM_BIGMOVE)} },
-	{ "bigresizeright", kbfunc_client_moveresize, CWM_CONTEXT_CLIENT,
-	    {.i = (CWM_RIGHT | CWM_RESIZE | CWM_BIGMOVE)} },
-	{ "bigresizeleft", kbfunc_client_moveresize, CWM_CONTEXT_CLIENT,
-	    {.i = (CWM_LEFT | CWM_RESIZE | CWM_BIGMOVE)} },
-	{ "ptrmoveup", kbfunc_client_moveresize, CWM_CONTEXT_SCREEN,
-	    {.i = (CWM_UP | CWM_PTRMOVE)} },
-	{ "ptrmovedown", kbfunc_client_moveresize, CWM_CONTEXT_SCREEN,
-	    {.i = (CWM_DOWN | CWM_PTRMOVE)} },
-	{ "ptrmoveleft", kbfunc_client_moveresize, CWM_CONTEXT_SCREEN,
-	    {.i = (CWM_LEFT | CWM_PTRMOVE)} },
-	{ "ptrmoveright", kbfunc_client_moveresize, CWM_CONTEXT_SCREEN,
-	    {.i = (CWM_RIGHT | CWM_PTRMOVE)} },
-	{ "bigptrmoveup", kbfunc_client_moveresize, CWM_CONTEXT_SCREEN,
-	    {.i = (CWM_UP | CWM_PTRMOVE | CWM_BIGMOVE)} },
-	{ "bigptrmovedown", kbfunc_client_moveresize, CWM_CONTEXT_SCREEN,
-	    {.i = (CWM_DOWN | CWM_PTRMOVE | CWM_BIGMOVE)} },
-	{ "bigptrmoveleft", kbfunc_client_moveresize, CWM_CONTEXT_SCREEN,
-	    {.i = (CWM_LEFT | CWM_PTRMOVE | CWM_BIGMOVE)} },
-	{ "bigptrmoveright", kbfunc_client_moveresize, CWM_CONTEXT_SCREEN,
-	    {.i = (CWM_RIGHT | CWM_PTRMOVE | CWM_BIGMOVE)} },
+	{ "moveup", kbfunc_client_move, CWM_CONTEXT_CLIENT,
+	    {.i = (CWM_UP)} },
+	{ "movedown", kbfunc_client_move, CWM_CONTEXT_CLIENT,
+	    {.i = (CWM_DOWN)} },
+	{ "moveright", kbfunc_client_move, CWM_CONTEXT_CLIENT,
+	    {.i = (CWM_RIGHT)} },
+	{ "moveleft", kbfunc_client_move, CWM_CONTEXT_CLIENT,
+	    {.i = (CWM_LEFT)} },
+	{ "bigmoveup", kbfunc_client_move, CWM_CONTEXT_CLIENT,
+	    {.i = (CWM_UP | CWM_BIGAMOUNT)} },
+	{ "bigmovedown", kbfunc_client_move, CWM_CONTEXT_CLIENT,
+	    {.i = (CWM_DOWN | CWM_BIGAMOUNT)} },
+	{ "bigmoveright", kbfunc_client_move, CWM_CONTEXT_CLIENT,
+	    {.i = (CWM_RIGHT | CWM_BIGAMOUNT)} },
+	{ "bigmoveleft", kbfunc_client_move, CWM_CONTEXT_CLIENT,
+	    {.i = (CWM_LEFT | CWM_BIGAMOUNT)} },
+	{ "resizeup", kbfunc_client_resize, CWM_CONTEXT_CLIENT,
+	    {.i = (CWM_UP)} },
+	{ "resizedown", kbfunc_client_resize, CWM_CONTEXT_CLIENT,
+	    {.i = (CWM_DOWN)} },
+	{ "resizeright", kbfunc_client_resize, CWM_CONTEXT_CLIENT,
+	    {.i = (CWM_RIGHT)} },
+	{ "resizeleft", kbfunc_client_resize, CWM_CONTEXT_CLIENT,
+	    {.i = (CWM_LEFT)} },
+	{ "bigresizeup", kbfunc_client_resize, CWM_CONTEXT_CLIENT,
+	    {.i = (CWM_UP | CWM_BIGAMOUNT)} },
+	{ "bigresizedown", kbfunc_client_resize, CWM_CONTEXT_CLIENT,
+	    {.i = (CWM_DOWN | CWM_BIGAMOUNT)} },
+	{ "bigresizeright", kbfunc_client_resize, CWM_CONTEXT_CLIENT,
+	    {.i = (CWM_RIGHT | CWM_BIGAMOUNT)} },
+	{ "bigresizeleft", kbfunc_client_resize, CWM_CONTEXT_CLIENT,
+	    {.i = (CWM_LEFT | CWM_BIGAMOUNT)} },
+	{ "ptrmoveup", kbfunc_ptrmove, CWM_CONTEXT_SCREEN,
+	    {.i = (CWM_UP)} },
+	{ "ptrmovedown", kbfunc_ptrmove, CWM_CONTEXT_SCREEN,
+	    {.i = (CWM_DOWN)} },
+	{ "ptrmoveleft", kbfunc_ptrmove, CWM_CONTEXT_SCREEN,
+	    {.i = (CWM_LEFT)} },
+	{ "ptrmoveright", kbfunc_ptrmove, CWM_CONTEXT_SCREEN,
+	    {.i = (CWM_RIGHT)} },
+	{ "bigptrmoveup", kbfunc_ptrmove, CWM_CONTEXT_SCREEN,
+	    {.i = (CWM_UP | CWM_BIGAMOUNT)} },
+	{ "bigptrmovedown", kbfunc_ptrmove, CWM_CONTEXT_SCREEN,
+	    {.i = (CWM_DOWN | CWM_BIGAMOUNT)} },
+	{ "bigptrmoveleft", kbfunc_ptrmove, CWM_CONTEXT_SCREEN,
+	    {.i = (CWM_LEFT | CWM_BIGAMOUNT)} },
+	{ "bigptrmoveright", kbfunc_ptrmove, CWM_CONTEXT_SCREEN,
+	    {.i = (CWM_RIGHT | CWM_BIGAMOUNT)} },
 	{ "htile", kbfunc_client_tile, CWM_CONTEXT_CLIENT,
 	    {.i = CWM_CLIENT_TILE_HORIZ} },
 	{ "vtile", kbfunc_client_tile, CWM_CONTEXT_CLIENT,
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