diff options
author | okan <okan> | 2015-11-12 18:26:41 +0000 |
---|---|---|
committer | okan <okan> | 2015-11-12 18:26:41 +0000 |
commit | 9a48836ceb40313cd12c05781d57f291401de7b0 (patch) | |
tree | 9c7894f80ec83b915bc3eef072c8154122510814 | |
parent | a2c066e447f8c3f754cc5559066b09f80e4c148e (diff) | |
download | cwm-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.h | 21 | ||||
-rw-r--r-- | conf.c | 96 | ||||
-rw-r--r-- | kbfunc.c | 167 |
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 |