myvxwm

[fork] my vxwm config (optimised for my T480)
git clone https://git.lukeonline.net/repos/myvxwm
Log | Files | Refs | README | LICENSE

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:
Mconfig.def.h | 32++++++++++++++------------------
Mconfig.mk | 2+-
Mmodules.def.h | 13++++++++++++-
Mmodules/directionalmove/directionalmove.c | 1+
Mmodules/moveresizekbd/moveresizekbd.c | 140+++++++++++++++++++++++++++++++++++++++++++++++--------------------------------
Mvxwm.c | 2+-
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);