commit 224f4cdf6ae30c1c48cde31bba53f2e5c3350219
parent 9ac4de66537b1b224124bc5f163e603dc5d16af8
Author: wh1tepearl <wh1tepearl@gmail.com>
Date: Wed, 25 Feb 2026 20:36:52 +0000
Make moveresizekbd + directional move easier to use, bump version to 2.1
Diffstat:
6 files changed, 112 insertions(+), 78 deletions(-)
diff --git a/config.def.h b/config.def.h
@@ -95,6 +95,8 @@ static const Layout layouts[] = {
/* key definitions */
#define MODKEY Mod4Mask
+#define ALTERNATE_MODKEY Mod1Mask
+
#define TAGKEYS(KEY,TAG) \
{ MODKEY, KEY, view, {.ui = 1 << TAG} }, \
{ MODKEY|ControlMask, KEY, toggleview, {.ui = 1 << TAG} }, \
@@ -165,14 +167,14 @@ static const Key keys[] = {
{ MODKEY|ShiftMask, XK_equal, setgaps, {.i = 0 } },
#endif
#if MOVE_RESIZE_WITH_KEYBOARD
-{ MODKEY|Mod1Mask, XK_Down, moveresize, {.v = (int []){ 0, MOVE_WITH_KEYBOARD_STEP, 0, 0 }}},
-{ MODKEY|Mod1Mask, XK_Up, moveresize, {.v = (int []){ 0, -MOVE_WITH_KEYBOARD_STEP, 0, 0 }}},
-{ MODKEY|Mod1Mask, XK_Right, moveresize, {.v = (int []){ MOVE_WITH_KEYBOARD_STEP, 0, 0, 0 }}},
-{ MODKEY|Mod1Mask, XK_Left, moveresize, {.v = (int []){ -MOVE_WITH_KEYBOARD_STEP, 0, 0, 0 }}},
-{ MODKEY|ControlMask, XK_Down, moveresize, {.v = (int []){ 0, 0, 0, RESIZE_WITH_KEYBOARD_STEP }}},
-{ MODKEY|ControlMask, XK_Up, moveresize, {.v = (int []){ 0, 0, 0, -RESIZE_WITH_KEYBOARD_STEP }}},
-{ MODKEY|ControlMask, XK_Right, moveresize, {.v = (int []){ 0, 0, RESIZE_WITH_KEYBOARD_STEP, 0 }}},
-{ MODKEY|ControlMask, XK_Left, moveresize, {.v = (int []){ 0, 0, -RESIZE_WITH_KEYBOARD_STEP, 0 }}},
+ { MODKEY, XK_Down, moveresize, {.v = (int []){ 0, MOVE_WITH_KEYBOARD_STEP, 0, 0 }}}, // Move window to down
+ { MODKEY, XK_Up, moveresize, {.v = (int []){ 0, -MOVE_WITH_KEYBOARD_STEP, 0, 0 }}}, // Move window to up
+ { MODKEY, XK_Right, moveresize, {.v = (int []){ MOVE_WITH_KEYBOARD_STEP, 0, 0, 0 }}}, // Move window to right
+ { MODKEY, XK_Left, moveresize, {.v = (int []){ -MOVE_WITH_KEYBOARD_STEP, 0, 0, 0 }}}, // Move window to left
+ { MODKEY|ControlMask, XK_Down, moveresize, {.v = (int []){ 0, 0, 0, RESIZE_WITH_KEYBOARD_STEP }}}, // Resize window
+ { MODKEY|ControlMask, XK_Up, moveresize, {.v = (int []){ 0, 0, 0, -RESIZE_WITH_KEYBOARD_STEP }}}, // Resize window
+ { MODKEY|ControlMask, XK_Right, moveresize, {.v = (int []){ 0, 0, RESIZE_WITH_KEYBOARD_STEP, 0 }}}, // Resize window
+ { MODKEY|ControlMask, XK_Left, moveresize, {.v = (int []){ 0, 0, -RESIZE_WITH_KEYBOARD_STEP, 0 }}}, // Resize window
#endif
#if INFINITE_TAGS
{ MODKEY, XK_r, homecanvas, {0} }, // Return to x:0, y:0 position
@@ -183,16 +185,10 @@ static const Key keys[] = {
{ MODKEY|ShiftMask, XK_d, centerwindow, {0} },
#endif
#if DIRECTIONAL_FOCUS
- { MODKEY, XK_Left, focusdir, {.i = 0 } }, // left
- { MODKEY, XK_Right, focusdir, {.i = 1 } }, // right
- { MODKEY, XK_Up, focusdir, {.i = 2 } }, // up
- { MODKEY, XK_Down, focusdir, {.i = 3 } }, // down
-#endif
-#if DIRECTIONAL_MOVE
- { Mod1Mask, XK_Left, movedir, {.i = 0} },
- { Mod1Mask, XK_Right, movedir, {.i = 1} },
- { Mod1Mask, XK_Up, movedir, {.i = 2} },
- { Mod1Mask, XK_Down, movedir, {.i = 3} },
+ { ALTERNATE_MODKEY, XK_Left, focusdir, {.i = 0 } }, // left
+ { ALTERNATE_MODKEY, XK_Right, focusdir, {.i = 1 } }, // right
+ { ALTERNATE_MODKEY, XK_Up, focusdir, {.i = 2 } }, // up
+ { ALTERNATE_MODKEY, XK_Down, focusdir, {.i = 3 } }, // down
#endif
};
diff --git a/config.mk b/config.mk
@@ -1,5 +1,5 @@
# vxwm version
-VERSION = 2.0
+VERSION = 2.1
# Customize below to fit your system
diff --git a/modules.def.h b/modules.def.h
@@ -79,7 +79,18 @@ Even though this sounds complex, it is actually pretty lightweight ~250 l.o.c, a
#define MOVE_IN_TILED 0 // Support for moving windows in tiled mode.
#define EWMH_TAGS 0 // Support for EWMH tags, recommended if you want to use external bars with less pain
#define DIRECTIONAL_FOCUS 0 // yeah.
-#define DIRECTIONAL_MOVE 0 // yeah.
+#define DIRECTIONAL_MOVE 0
+/* Makes moving windows in tiled layout possible with keyboard and it is directional,
+ bind for move is in #if MOVE_RESIZE_WITH_KEYBOARD section which makes it depending on
+ MOVE_RESIZE_WITH_KEYBOARD at the first sight but, it doesn't. You can bind the movedir
+ function manually which makes it independent like this:
+#if DIRECTIONAL_MOVE
+ { MODKEY|ALTERNATE_MODKEY, XK_Left, movedir, {.i = 0} }, // Left
+ { MODKEY|ALTERNATE_MODKEY, XK_Right, movedir, {.i = 1} }, // Right
+ { MODKEY|ALTERNATE_MODKEY, XK_Up, movedir, {.i = 2} }, // Up
+ { MODKEY|ALTERNATE_MODKEY, XK_Down, movedir, {.i = 3} }, // Down
+#endif
+*/
diff --git a/modules/directionalmove/directionalmove.c b/modules/directionalmove/directionalmove.c
@@ -1,6 +1,7 @@
void
movedir(const Arg *arg)
{
+ if (selmon->lt[selmon->sellt]->arrange != tile) return;
Client *s = selmon->sel, *f = NULL, *c, *next;
if (!s)
return;
diff --git a/modules/moveresizekbd/moveresizekbd.c b/modules/moveresizekbd/moveresizekbd.c
@@ -5,8 +5,17 @@ moveresize(const Arg *arg)
XEvent ev;
Monitor *m = selmon;
- if(!(m->sel && arg && arg->v && m->sel->isfloating))
+ if(!(m->sel && arg && arg->v && m->sel->isfloating)) {
+#if DIRECTIONAL_MOVE
+ if (((int *)arg->v)[0] != 0 || ((int *)arg->v)[1] != 0) {
+ if (((int *)arg->v)[1] > 0) movedir(&(Arg){.i = 3}); // Down
+ if (((int *)arg->v)[1] < 0) movedir(&(Arg){.i = 2}); // Up
+ if (((int *)arg->v)[0] > 0) movedir(&(Arg){.i = 1}); // Right
+ if (((int *)arg->v)[0] < 0) movedir(&(Arg){.i = 0}); // Left
+ }
+#endif
return;
+ }
XRaiseWindow(dpy, m->sel->win);
resize(m->sel, m->sel->x + ((int *)arg->v)[0],
m->sel->y + ((int *)arg->v)[1],
@@ -21,80 +30,97 @@ moveresize(const Arg *arg)
#else
+
void
moveresize(const Arg *arg)
{
+ int dx = ((int *)arg->v)[0];
+ int dy = ((int *)arg->v)[1];
+ int dw = ((int *)arg->v)[2];
+ int dh = ((int *)arg->v)[3];
XEvent ev;
Monitor *m = selmon;
- if(!(m->sel && arg && arg->v && m->sel->isfloating))
- if (selmon->lt[selmon->sellt]->arrange != NULL) return;
- XRaiseWindow(dpy, m->sel->win);
- if (selmon->lt[selmon->sellt]->arrange != NULL) {
- resize(m->sel, m->sel->x + ((int *)arg->v)[0],
- m->sel->y + ((int *)arg->v)[1],
- m->sel->w + ((int *)arg->v)[2],
- m->sel->h + ((int *)arg->v)[3],
- True);
-#if WARP_TO_CLIENT && WARP_TO_CENTER_OF_WINDOW_MOVED_BY_KEYBOARD
- warptoclient(m->sel);
+
+ if (!m->sel || !arg || !arg->v)
+ return;
+
+ if (!m->sel->isfloating) {
+#if DIRECTIONAL_MOVE
+ if (selmon->lt[selmon->sellt]->arrange != NULL && (dx || dy)) {
+ if (dy > 0) movedir(&(Arg){.i = 3}); // Down
+ if (dy < 0) movedir(&(Arg){.i = 2}); // Up
+ if (dx > 0) movedir(&(Arg){.i = 1}); // Right
+ if (dx < 0) movedir(&(Arg){.i = 0}); // Left
+ }
#endif
- while(XCheckMaskEvent(dpy, EnterWindowMask, &ev));
- return;
+ return;
}
+
+
Client *c = m->sel;
- int tagidx = getcurrenttag(m);
- int dx = ((int *)arg->v)[0];
- int dy = ((int *)arg->v)[1];
- int dw = ((int *)arg->v)[2];
- int dh = ((int *)arg->v)[3];
+ XRaiseWindow(dpy, c->win);
+
+ if (selmon->lt[selmon->sellt]->arrange != NULL) {
+ resize(c,
+ c->x + dx,
+ c->y + dy,
+ c->w + dw,
+ c->h + dh,
+ True);
+ }
+ else {
+ int nx = c->x + dx;
+ int ny = c->y + dy;
+ int nw = c->w + dw;
+ int nh = c->h + dh;
+ int canvas_dx = 0, canvas_dy = 0;
+ int tagidx = getcurrenttag(m);
- int nx = c->x + dx;
- int ny = c->y + dy;
- int nw = c->w + dw;
- int nh = c->h + dh;
-
- int canvas_dx = 0, canvas_dy = 0;
-
- if (dx != 0 || dy != 0) {
- if (nx < m->wx) {
- canvas_dx = nx - m->wx;
- nx = m->wx;
- } else if (nx + nw + 2 * c->bw > m->wx + m->ww) {
- canvas_dx = (nx + nw + 2 * c->bw) - (m->wx + m->ww);
- nx = m->wx + m->ww - nw - 2 * c->bw;
- }
-
- if (ny < m->wy) {
- canvas_dy = ny - m->wy;
- ny = m->wy;
- } else if (ny + nh + 2 * c->bw > m->wy + m->wh) {
- canvas_dy = (ny + nh + 2 * c->bw) - (m->wy + m->wh);
- ny = m->wy + m->wh - nh - 2 * c->bw;
- }
-
- if (canvas_dx != 0 || canvas_dy != 0) {
- m->canvas[tagidx].cx -= canvas_dx;
- m->canvas[tagidx].cy -= canvas_dy;
-
- Client *tmp;
- for (tmp = m->clients; tmp; tmp = tmp->next) {
- if (ISVISIBLE(tmp) && tmp != c) {
- tmp->x -= canvas_dx;
- tmp->y -= canvas_dy;
- XMoveWindow(dpy, tmp->win, tmp->x, tmp->y);
- }
+ if (dx || dy) {
+ if (nx < m->wx) {
+ canvas_dx = nx - m->wx;
+ nx = m->wx;
+ } else if (nx + nw + 2 * c->bw > m->wx + m->ww) {
+ canvas_dx = (nx + nw + 2 * c->bw) - (m->wx + m->ww);
+ nx = m->wx + m->ww - nw - 2 * c->bw;
+ }
+
+ if (ny < m->wy) {
+ canvas_dy = ny - m->wy;
+ ny = m->wy;
+ } else if (ny + nh + 2 * c->bw > m->wy + m->wh) {
+ canvas_dy = (ny + nh + 2 * c->bw) - (m->wy + m->wh);
+ ny = m->wy + m->wh - nh - 2 * c->bw;
+ }
+
+ if (canvas_dx || canvas_dy) {
+ m->canvas[tagidx].cx -= canvas_dx;
+ m->canvas[tagidx].cy -= canvas_dy;
+
+ Client *tmp;
+ for (tmp = m->clients; tmp; tmp = tmp->next) {
+ if (ISVISIBLE(tmp) && tmp != c) {
+ tmp->x -= canvas_dx;
+ tmp->y -= canvas_dy;
+ XMoveWindow(dpy, tmp->win, tmp->x, tmp->y);
+ }
+ }
+ }
}
- }
+
+ resize(c, nx, ny, nw, nh, True);
}
- resize(c, nx, ny, nw, nh, True);
focus(c);
+
#if WARP_TO_CLIENT && WARP_TO_CENTER_OF_WINDOW_MOVED_BY_KEYBOARD
warptoclient(c);
#endif
- while(XCheckMaskEvent(dpy, EnterWindowMask, &ev));
+
+ while (XCheckMaskEvent(dpy, EnterWindowMask, &ev));
+
drawbar(m);
}
#endif
diff --git a/vxwm.c b/vxwm.c
@@ -851,7 +851,7 @@ drawbar(Monitor *m)
#if INFINITE_TAGS && IT_SHOW_COORDINATES_IN_BAR
int tagidx = getcurrenttag(m);
char coords[64];
- snprintf(coords, sizeof(coords), "x:%d y:%d",
+ snprintf(coords, sizeof(coords), "[x%d y%d]",
m->canvas[tagidx].cx / 10,
m->canvas[tagidx].cy / 10); // Delete 10 if you want to get the most accurate values
w = TEXTW(coords);