From d61e5289bddc4ea0a8c4e6158e09dc2b28abd500 Mon Sep 17 00:00:00 2001 From: Michael Weber Date: Wed, 27 Jun 2012 23:52:10 +0200 Subject: [PATCH] add window grow/shrink, add snap grid --- calmwm.h | 3 +++ conf.c | 18 +++++++++++++++ kbfunc.c | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 88 insertions(+), 1 deletion(-) diff --git a/calmwm.h b/calmwm.h index bf08c93..2272d69 100644 --- a/calmwm.h +++ b/calmwm.h @@ -75,6 +75,9 @@ size_t strlcat(char *, const char *, size_t); #define CWM_DOWN 0x0020 #define CWM_LEFT 0x0040 #define CWM_RIGHT 0x0080 +#define CWM_GROW 0x0100 +#define CWM_SHRINK 0x0200 +#define CWM_SNAP 0x0400 /* exec */ #define CWM_EXEC_PROGRAM 0x0001 diff --git a/conf.c b/conf.c index 8812c4f..a5e307e 100644 --- a/conf.c +++ b/conf.c @@ -169,6 +169,12 @@ static struct { { "CS-Down", "bigptrmovedown" }, { "CS-Up", "bigptrmoveup" }, { "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[] = { { "1", "menu_unhide" }, @@ -422,6 +428,18 @@ static struct { {.i = (CWM_LEFT|CWM_PTRMOVE|CWM_BIGMOVE)} }, { "bigptrmoveright", kbfunc_moveresize, 0, {.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)} }, }; /* diff --git a/kbfunc.c b/kbfunc.c index 106bf95..8b9b9e6 100644 --- a/kbfunc.c +++ b/kbfunc.c @@ -50,7 +50,7 @@ kbfunc_client_raise(struct client_ctx *cc, union arg *arg) 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) void 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; int x, y, flags, amt; u_int mx, my; + int ox, oy, ow, oh; if (cc->flags & CLIENT_FREEZE) return; @@ -133,6 +134,71 @@ kbfunc_moveresize(struct client_ctx *cc, union arg *arg) xu_ptr_getpos(sc->rootwin, &x, &y); xu_ptr_setpos(sc->rootwin, x + mx, y + my); 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: warnx("invalid flags passed to kbfunc_client_moveresize"); }