add window grow/shrink, add snap grid

This commit is contained in:
Michael Weber 2012-06-27 23:52:10 +02:00
parent 961f21a790
commit d61e5289bd
3 changed files with 88 additions and 1 deletions

View File

@ -75,6 +75,9 @@ size_t strlcat(char *, const char *, size_t);
#define CWM_DOWN 0x0020 #define CWM_DOWN 0x0020
#define CWM_LEFT 0x0040 #define CWM_LEFT 0x0040
#define CWM_RIGHT 0x0080 #define CWM_RIGHT 0x0080
#define CWM_GROW 0x0100
#define CWM_SHRINK 0x0200
#define CWM_SNAP 0x0400
/* exec */ /* exec */
#define CWM_EXEC_PROGRAM 0x0001 #define CWM_EXEC_PROGRAM 0x0001

18
conf.c
View File

@ -169,6 +169,12 @@ static struct {
{ "CS-Down", "bigptrmovedown" }, { "CS-Down", "bigptrmovedown" },
{ "CS-Up", "bigptrmoveup" }, { "CS-Up", "bigptrmoveup" },
{ "CS-Right", "bigptrmoveright" }, { "CS-Right", "bigptrmoveright" },
{ "4-Page_Up", "grow" },
{ "4-Page_Down", "shrink" },
{ "4-Insert", "snapleft" },
{ "4-Home", "snapup" },
{ "4-Delete", "snapdown" },
{ "4-End", "snapright" },
}, },
m_binds[] = { m_binds[] = {
{ "1", "menu_unhide" }, { "1", "menu_unhide" },
@ -422,6 +428,18 @@ static struct {
{.i = (CWM_LEFT|CWM_PTRMOVE|CWM_BIGMOVE)} }, {.i = (CWM_LEFT|CWM_PTRMOVE|CWM_BIGMOVE)} },
{ "bigptrmoveright", kbfunc_moveresize, 0, { "bigptrmoveright", kbfunc_moveresize, 0,
{.i = (CWM_RIGHT|CWM_PTRMOVE|CWM_BIGMOVE)} }, {.i = (CWM_RIGHT|CWM_PTRMOVE|CWM_BIGMOVE)} },
{ "grow", kbfunc_moveresize, KBFLAG_NEEDCLIENT,
{.i = (CWM_GROW|CWM_SNAP)} },
{ "shrink", kbfunc_moveresize, KBFLAG_NEEDCLIENT,
{.i = (CWM_SHRINK|CWM_SNAP)} },
{ "snapup", kbfunc_moveresize, KBFLAG_NEEDCLIENT,
{.i = (CWM_UP|CWM_SNAP)} },
{ "snapdown", kbfunc_moveresize, KBFLAG_NEEDCLIENT,
{.i = (CWM_DOWN|CWM_SNAP)} },
{ "snapleft", kbfunc_moveresize, KBFLAG_NEEDCLIENT,
{.i = (CWM_LEFT|CWM_SNAP)} },
{ "snapright", kbfunc_moveresize, KBFLAG_NEEDCLIENT,
{.i = (CWM_RIGHT|CWM_SNAP)} },
}; };
/* /*

View File

@ -50,7 +50,7 @@ kbfunc_client_raise(struct client_ctx *cc, union arg *arg)
client_raise(cc); client_raise(cc);
} }
#define TYPEMASK (CWM_MOVE | CWM_RESIZE | CWM_PTRMOVE) #define TYPEMASK (CWM_MOVE | CWM_RESIZE | CWM_PTRMOVE | CWM_SNAP)
#define MOVEMASK (CWM_UP | CWM_DOWN | CWM_LEFT | CWM_RIGHT) #define MOVEMASK (CWM_UP | CWM_DOWN | CWM_LEFT | CWM_RIGHT)
void void
kbfunc_moveresize(struct client_ctx *cc, union arg *arg) kbfunc_moveresize(struct client_ctx *cc, union arg *arg)
@ -58,6 +58,7 @@ kbfunc_moveresize(struct client_ctx *cc, union arg *arg)
struct screen_ctx *sc; struct screen_ctx *sc;
int x, y, flags, amt; int x, y, flags, amt;
u_int mx, my; u_int mx, my;
int ox, oy, ow, oh;
if (cc->flags & CLIENT_FREEZE) if (cc->flags & CLIENT_FREEZE)
return; return;
@ -133,6 +134,71 @@ kbfunc_moveresize(struct client_ctx *cc, union arg *arg)
xu_ptr_getpos(sc->rootwin, &x, &y); xu_ptr_getpos(sc->rootwin, &x, &y);
xu_ptr_setpos(sc->rootwin, x + mx, y + my); xu_ptr_setpos(sc->rootwin, x + mx, y + my);
break; break;
case CWM_SNAP:
ox = cc->geom.x; ow = cc->geom.width;
oy = cc->geom.y; oh = cc->geom.height;
#define sw cc->sc->xmax
#define sh cc->sc->ymax
#define bw 2 * cc->bwidth
#define nw cc->geom.width
#define nh cc->geom.height
#define nx cc->geom.x
#define ny cc->geom.y
if (flags & CWM_UP) {
if (oy > sh - oh - bw) ny = sh - oh - bw;
else if ( oy > (sh - oh - bw) / 2 ) ny = (sh - oh - bw) / 2;
else ny = 0;
} else if (flags & CWM_DOWN) {
if (oy < 0) ny = 0;
else if (oy < (sh - oh - bw) / 2) ny = (sh - oh - bw)/2;
else ny = sh - oh - bw;
} else if (flags & CWM_LEFT) {
if (ox + bw > sw - ow) nx = sw - ow - bw;
else if (ox > (sw - ow - bw) / 2) nx = (sw - ow - bw) / 2;
else cc->geom.x = 0;
} else if (flags & CWM_RIGHT) {
if (ox < 0) nx = 0;
else if (ox < (sw - ow - bw) / 2) nx = (sw - ow - bw) / 2;
else nx = sw - ow - bw;
} else if (flags & CWM_GROW) {
if ((cc->flags & CLIENT_MAXFLAGS) == CLIENT_MAXIMIZED) {
} else if (ow + bw < sw / 3) {
nw = sw / 3 - bw;
nh = sh / 3 - bw;
} else if (ow + bw < sw / 2) {
nw = sw / 2 - bw;
nh = sh / 2 - bw;
} else if (ow + bw < sw * 2 / 3) {
nw = sw * 2 / 3 - bw;
nh = sh * 2 / 3 - bw;
} else {
client_maximize(cc);
goto end;
}
} else if (flags & CWM_SHRINK) {
if ((cc->flags & CLIENT_MAXFLAGS) == CLIENT_MAXIMIZED) {
client_maximize(cc);
goto end;
} else if (ow + bw > sw * 2 / 3) {
nw = sw * 2 / 3 - bw;
nh = sh * 2 / 3 - bw;
} else if (ow + bw> sw / 2) {
nw = sw / 2 - bw;
nh = sh / 2 - bw;
} else if (ow + bw > sw / 3) {
nw = sw / 3 - bw;
nh = sh / 3 - bw;
}
}
nx += (ow - nw)/2;
ny += (oh - nh)/2;
client_ptrsave(cc);
client_resize(cc);
cc->ptr.x += (nw - ow)/2;
cc->ptr.y += (nh - oh)/2;
client_ptrwarp(cc);
end:
break;
default: default:
warnx("invalid flags passed to kbfunc_client_moveresize"); warnx("invalid flags passed to kbfunc_client_moveresize");
} }