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.
This commit is contained in:
parent
4db32a8463
commit
db0907a53d
@ -15,7 +15,7 @@
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*
|
||||
* $OpenBSD: calmwm.h,v 1.309 2015/11/11 14:22:01 okan Exp $
|
||||
* $OpenBSD: calmwm.h,v 1.310 2015/11/12 18:26:41 okan Exp $
|
||||
*/
|
||||
|
||||
#ifndef _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 *);
|
||||
|
@ -15,7 +15,7 @@
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*
|
||||
* $OpenBSD: conf.c,v 1.199 2015/11/10 20:05:33 okan Exp $
|
||||
* $OpenBSD: conf.c,v 1.200 2015/11/12 18:26:41 okan Exp $
|
||||
*/
|
||||
|
||||
#include <sys/types.h>
|
||||
@ -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,
|
||||
|
167
app/cwm/kbfunc.c
167
app/cwm/kbfunc.c
@ -15,7 +15,7 @@
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*
|
||||
* $OpenBSD: kbfunc.c,v 1.122 2015/11/11 14:22:01 okan Exp $
|
||||
* $OpenBSD: kbfunc.c,v 1.123 2015/11/12 18:26:41 okan Exp $
|
||||
*/
|
||||
|
||||
#include <sys/types.h>
|
||||
@ -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)
|
||||
static void
|
||||
kbfunc_amount(int flags, unsigned int *mx, unsigned int *my)
|
||||
{
|
||||
#define CWM_FACTOR 10
|
||||
int amt;
|
||||
|
||||
amt = Conf.mamount;
|
||||
if (flags & CWM_BIGAMOUNT)
|
||||
amt *= CWM_FACTOR;
|
||||
|
||||
switch (flags & DIRECTIONMASK) {
|
||||
case CWM_UP:
|
||||
*my -= amt;
|
||||
break;
|
||||
case CWM_DOWN:
|
||||
*my += amt;
|
||||
break;
|
||||
case CWM_RIGHT:
|
||||
*mx += amt;
|
||||
break;
|
||||
case CWM_LEFT:
|
||||
*mx -= amt;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
kbfunc_client_moveresize(struct client_ctx *cc, union arg *arg)
|
||||
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, flags, amt;
|
||||
unsigned int mx, my;
|
||||
int x, y;
|
||||
unsigned int mx = 0, my = 0;
|
||||
|
||||
if (cc->flags & CLIENT_FREEZE)
|
||||
return;
|
||||
|
||||
mx = my = 0;
|
||||
kbfunc_amount(arg->i, &mx, &my);
|
||||
|
||||
flags = arg->i;
|
||||
amt = Conf.mamount;
|
||||
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;
|
||||
|
||||
if (flags & CWM_BIGMOVE) {
|
||||
flags -= CWM_BIGMOVE;
|
||||
amt = amt * 10;
|
||||
}
|
||||
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);
|
||||
|
||||
switch (flags & MOVEMASK) {
|
||||
case CWM_UP:
|
||||
my -= amt;
|
||||
break;
|
||||
case CWM_DOWN:
|
||||
my += amt;
|
||||
break;
|
||||
case CWM_RIGHT:
|
||||
mx += amt;
|
||||
break;
|
||||
case CWM_LEFT:
|
||||
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;
|
||||
xu_ptr_getpos(cc->win, &x, &y);
|
||||
cc->ptr.x = x + mx;
|
||||
cc->ptr.y = y + my;
|
||||
client_ptrwarp(cc);
|
||||
}
|
||||
|
||||
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);
|
||||
void
|
||||
kbfunc_client_resize(struct client_ctx *cc, union arg *arg)
|
||||
{
|
||||
unsigned int mx = 0, my = 0;
|
||||
|
||||
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);
|
||||
if (cc->flags & CLIENT_FREEZE)
|
||||
return;
|
||||
|
||||
/* 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");
|
||||
}
|
||||
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
|
||||
|
Loading…
Reference in New Issue
Block a user