From 9a48836ceb40313cd12c05781d57f291401de7b0 Mon Sep 17 00:00:00 2001 From: okan Date: Thu, 12 Nov 2015 18:26:41 +0000 Subject: 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. --- kbfunc.c | 167 +++++++++++++++++++++++++++++++++++---------------------------- 1 file changed, 92 insertions(+), 75 deletions(-) (limited to 'kbfunc.c') 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 -- cgit 1.4.1