aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorokan2015-11-12 18:26:41 +0000
committerokan2015-11-12 18:26:41 +0000
commit1cebeb1917e2f144081c3dea62073ffe65a6e5d8 (patch)
treebbae36cc3e4bee82b184299500b486e4b1c1a477
parentea9b9d8cd8863bb57a4413454173571925a00474 (diff)
downloadcwm-1cebeb1917e2f144081c3dea62073ffe65a6e5d8.tar.gz
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.h23
-rw-r--r--conf.c98
-rw-r--r--kbfunc.c169
3 files changed, 153 insertions, 137 deletions
diff --git a/calmwm.h b/calmwm.h
index 72f6d21..0e4b101 100644
--- a/calmwm.h
+++ b/calmwm.h
@@ -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 *);
diff --git a/conf.c b/conf.c
index 92f775b..82ca358 100644
--- a/conf.c
+++ b/conf.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: 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,
diff --git a/kbfunc.c b/kbfunc.c
index 2a180e2..0ba60c4 100644
--- a/kbfunc.c
+++ b/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)
-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