commit 1afa5f5a4ffd0c9116b62f3f6d2ec6d48ee87e09
parent 95cef2c53f2b8139c8c0ad0f060c96c8885c1038
Author: wh1tepearl <wh1tepearl@gmail.com>
Date: Thu, 15 Jan 2026 21:30:14 +0000
Added support for: xrdb, alternative center of bar color, bar height, bar padding
Diffstat:
| M | config.def.h | | | 35 | ++++++++++++++++++++++++++++++++++- |
| M | config.mk | | | 2 | +- |
| M | drw.c | | | 4 | ++++ |
| M | drw.h | | | 4 | ++++ |
| M | vxwm.c | | | 152 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- |
5 files changed, 193 insertions(+), 4 deletions(-)
diff --git a/config.def.h b/config.def.h
@@ -7,6 +7,8 @@ static const int showbar = 1; /* 0 means no bar */
static const int topbar = 1; /* 0 means bottom bar */
static const char *fonts[] = { "monospace:size=10" };
static const char dmenufont[] = "monospace:size=10";
+
+#if !XRDB //when xrdb is turned off
static const char col_gray1[] = "#222222";
static const char col_gray2[] = "#444444";
static const char col_gray3[] = "#bbbbbb";
@@ -17,9 +19,31 @@ static const char *colors[][3] = {
[SchemeNorm] = { col_gray3, col_gray1, col_gray2 },
[SchemeSel] = { col_gray4, col_cyan, col_cyan },
};
+#else //when xrdb is turned on
+static char normbgcolor[] = "#222222";
+static char normbordercolor[] = "#444444";
+static char normfgcolor[] = "#bbbbbb";
+static char selfgcolor[] = "#eeeeee";
+static char selbordercolor[] = "#005577";
+static char selbgcolor[] = "#005577";
+static char *colors[][3] = {
+ /* fg bg border */
+ [SchemeNorm] = { normfgcolor, normbgcolor, normbordercolor },
+ [SchemeSel] = { selfgcolor, selbgcolor, selbordercolor },
+};
+#endif
#if GAPS
-static const unsigned int gappx = 5;
+static const unsigned int gappx = 15;
+#endif
+
+#if BAR_HEIGHT
+static const int user_bh = 30;
+#endif
+
+#if BAR_PADDING
+static const int vertpad = 5; /* vertical padding of bar */
+static const int sidepad = 5; /* horizontal padding of bar */
#endif
/* tagging */
@@ -63,7 +87,13 @@ static const Layout layouts[] = {
/* commands */
static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn() */
+
+#if !XRDB //when xrdb is turned off
static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL };
+#else //when xrdb is on
+static const char *dmenucmd[] = { "dmenu_run", "-fn", dmenufont, "-nb", normbgcolor, "-nf", normfgcolor, "-sb", selbordercolor, "-sf", selfgcolor, NULL };
+#endif
+
static const char *termcmd[] = { "st", NULL };
static const char *termalacmd[] = { "alacritty", NULL };
@@ -103,6 +133,9 @@ static const Key keys[] = {
TAGKEYS( XK_8, 7)
TAGKEYS( XK_9, 8)
{ MODKEY|ShiftMask, XK_q, quit, {0} },
+#if XRDB
+ { MODKEY, XK_F5, xrdb, {.v = NULL } },
+#endif
};
/* button definitions */
diff --git a/config.mk b/config.mk
@@ -1,5 +1,5 @@
# vxwm version
-VERSION = 0.dev
+VERSION = 1.1
# Customize below to fit your system
diff --git a/drw.c b/drw.c
@@ -180,7 +180,11 @@ drw_clr_create(Drw *drw, Clr *dest, const char *clrname)
/* Create color schemes. */
Clr *
+#if !XRDB
drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount)
+#else
+drw_scm_create(Drw *drw, char *clrnames[], size_t clrcount)
+#endif
{
size_t i;
Clr *ret;
diff --git a/drw.h b/drw.h
@@ -41,7 +41,11 @@ void drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned in
/* Colorscheme abstraction */
void drw_clr_create(Drw *drw, Clr *dest, const char *clrname);
void drw_clr_free(Drw *drw, Clr *c);
+#if !XRDB
Clr *drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount);
+#else
+Clr *drw_scm_create(Drw *drw, char *clrnames[], size_t clrcount);
+#endif
void drw_scm_free(Drw *drw, Clr *scm, size_t clrcount);
/* Cursor abstraction */
diff --git a/vxwm.c b/vxwm.c
@@ -1,14 +1,23 @@
/* See LICENSE file for copyright and license details.
This wm is forked from dwm 6.7, thanks suckless for their incredible work on dwm!
-vxwm 0.dev // by wh1tepearl
+vxwm 0.dev // by wh1tepearl
+
+Known issues for 15/01/2026:
+1. When using BETTER_RESIZE and resizing window on top of bar, bar will start to erase as window resizes
+2. Windows teleports when hitting its minimum size when using BETTER_RESIZE
+3. When usinng BAR_PADDING status text doesn't show.
*/
/* vxwm compile-time options */
-#define BETTER_RESIZE 1 // yeah its better resize support
+#define BETTER_RESIZE 1 // yeah it's better resize support, currently has some minor bugs but it's still very usable
#define LOCK_MOVE_RESIZE_REFRESH_RATE 1 // recomended to use on every pc, because cpu (software) rendered apps like ST will lagg when resizing even if you have a good pc.
#define USE_RESIZECLIENT_FUNC 0 // use resizeclient function of instead of resize function, not recommended
#define GAPS 0 // gaps support
+#define XRDB 0 //xrdb support
+#define ALT_CENTER_OF_BAR_COLOR 0 //changes center of bar color to a dark color
+#define BAR_HEIGHT 0 //support for changing bar height
+#define BAR_PADDING 0 //support for changing the bar padding
#include <errno.h>
#include <locale.h>
@@ -31,6 +40,10 @@ vxwm 0.dev // by wh1tepearl
#endif /* XINERAMA */
#include <X11/Xft/Xft.h>
+#if XRDB
+#include <X11/Xresource.h>
+#endif
+
#include "drw.h"
#include "util.h"
@@ -46,6 +59,23 @@ vxwm 0.dev // by wh1tepearl
#define TAGMASK ((1 << LENGTH(tags)) - 1)
#define TEXTW(X) (drw_fontset_getwidth(drw, (X)) + lrpad)
+#if XRDB
+#define XRDB_LOAD_COLOR(R,V) if (XrmGetResource(xrdb, R, NULL, &type, &value) == True) { \
+ if (value.addr != NULL && strnlen(value.addr, 8) == 7 && value.addr[0] == '#') { \
+ int i = 1; \
+ for (; i <= 6; i++) { \
+ if (value.addr[i] < 48) break; \
+ if (value.addr[i] > 57 && value.addr[i] < 65) break; \
+ if (value.addr[i] > 70 && value.addr[i] < 97) break; \
+ if (value.addr[i] > 102) break; \
+ } \
+ if (i == 7) { \
+ strncpy(V, value.addr, 7); \
+ V[7] = '\0'; \
+ } \
+ } \
+ }
+#endif
/* enums */
enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */
enum { SchemeNorm, SchemeSel }; /* color schemes */
@@ -170,6 +200,9 @@ static void grabkeys(void);
static void incnmaster(const Arg *arg);
static void keypress(XEvent *e);
static void killclient(const Arg *arg);
+#if XRDB
+static void loadxrdb(void);
+#endif
static void manage(Window w, XWindowAttributes *wa);
static void mappingnotify(XEvent *e);
static void maprequest(XEvent *e);
@@ -227,6 +260,9 @@ static Monitor *wintomon(Window w);
static int xerror(Display *dpy, XErrorEvent *ee);
static int xerrordummy(Display *dpy, XErrorEvent *ee);
static int xerrorstart(Display *dpy, XErrorEvent *ee);
+#if XRDB
+static void xrdb(const Arg *arg);
+#endif
static void zoom(const Arg *arg);
/* variables */
@@ -236,6 +272,12 @@ static int screen;
static int sw, sh; /* X display screen geometry width, height */
static int bh; /* bar height */
static int lrpad; /* sum of left and right padding for text */
+
+#if BAR_PADDING
+static int vp; /* vertical padding for bar */
+static int sp; /* side padding for bar */
+#endif
+
static int (*xerrorxlib)(Display *, XErrorEvent *);
static unsigned int numlockmask = 0;
static void (*handler[LASTEvent]) (XEvent *) = {
@@ -565,7 +607,11 @@ configurenotify(XEvent *e)
for (c = m->clients; c; c = c->next)
if (c->isfullscreen)
resizeclient(c, m->mx, m->my, m->mw, m->mh);
+#if !BAR_PADDING
XMoveResizeWindow(dpy, m->barwin, m->wx, m->by, m->ww, bh);
+#else
+ XMoveResizeWindow(dpy, m->barwin, m->wx + sp, m->by + vp, m->ww - 2 * sp, bh);
+#endif
}
focus(NULL);
arrange(NULL);
@@ -709,7 +755,11 @@ drawbar(Monitor *m)
if (m == selmon) { /* status is only drawn on selected monitor */
drw_setscheme(drw, scheme[SchemeNorm]);
tw = TEXTW(stext) - lrpad + 2; /* 2px right padding */
+#if !BAR_PADDING
drw_text(drw, m->ww - tw, 0, tw, bh, 0, stext, 0);
+#else
+ drw_text(drw, m->ww - sw - 2 * sp, 0, sw, bh, 0, stext, 0);
+#endif
}
for (c = m->clients; c; c = c->next) {
@@ -734,13 +784,25 @@ drawbar(Monitor *m)
if ((w = m->ww - tw - x) > bh) {
if (m->sel) {
+#if !ALT_CENTER_OF_BAR_COLOR
drw_setscheme(drw, scheme[m == selmon ? SchemeSel : SchemeNorm]);
+#else
+ drw_setscheme(drw, scheme[m == selmon ? SchemeNorm : SchemeNorm]);
+#endif
+#if !BAR_PADDING
drw_text(drw, x, 0, w, bh, lrpad / 2, m->sel->name, 0);
+#else
+ drw_text(drw, x, 0, w - 2 * sp, bh, lrpad / 2, m->sel->name, 0);
+#endif
if (m->sel->isfloating)
drw_rect(drw, x + boxs, boxs, boxw, boxw, m->sel->isfixed, 0);
} else {
drw_setscheme(drw, scheme[SchemeNorm]);
+#if !BAR_PADDING
drw_rect(drw, x, 0, w, bh, 1, 1);
+#else
+ drw_rect(drw, x, 0, w - 2 * sp, bh, 1, 1);
+#endif
}
}
drw_map(drw, m->barwin, 0, 0, m->ww, bh);
@@ -1027,6 +1089,46 @@ killclient(const Arg *arg)
}
}
+#if XRDB
+void
+loadxrdb()
+{
+ Display *display;
+ char * resm;
+ XrmDatabase xrdb;
+ char *type;
+ XrmValue value;
+
+ display = XOpenDisplay(NULL);
+
+ if (display != NULL) {
+ resm = XResourceManagerString(display);
+
+ if (resm != NULL) {
+ xrdb = XrmGetStringDatabase(resm);
+
+ if (xrdb != NULL) {
+ // XRDB_LOAD_COLOR("dwm.normbordercolor", normbordercolor);
+ // XRDB_LOAD_COLOR("dwm.normbgcolor", normbgcolor);
+ // XRDB_LOAD_COLOR("dwm.normfgcolor", normfgcolor);
+ // XRDB_LOAD_COLOR("dwm.selbordercolor", selbordercolor);
+ // XRDB_LOAD_COLOR("dwm.selbgcolor", selbgcolor);
+ // XRDB_LOAD_COLOR("dwm.selfgcolor", selfgcolor);
+ XRDB_LOAD_COLOR("dwm.color0", normbordercolor);
+ XRDB_LOAD_COLOR("dwm.color8", selbordercolor);
+ XRDB_LOAD_COLOR("dwm.color0", normbgcolor);
+ XRDB_LOAD_COLOR("dwm.color6", normfgcolor);
+ XRDB_LOAD_COLOR("dwm.color0", selfgcolor);
+ XRDB_LOAD_COLOR("dwm.color14", selbgcolor);
+ }
+ }
+ }
+
+ XCloseDisplay(display);
+}
+
+#endif
+
void
manage(Window w, XWindowAttributes *wa)
{
@@ -1671,8 +1773,16 @@ setup(void)
if (!drw_fontset_create(drw, fonts, LENGTH(fonts)))
die("no fonts could be loaded.");
lrpad = drw->fonts->h;
+#if !BAR_HEIGHT
bh = drw->fonts->h + 2;
+#else
+ bh = user_bh ? user_bh : drw->fonts->h + 2;
+#endif
updategeom();
+#if BAR_PADDING
+ sp = sidepad;
+ vp = (topbar == 1) ? vertpad : - vertpad;
+#endif
/* init atoms */
utf8string = XInternAtom(dpy, "UTF8_STRING", False);
wmatom[WMProtocols] = XInternAtom(dpy, "WM_PROTOCOLS", False);
@@ -1699,6 +1809,9 @@ setup(void)
/* init bars */
updatebars();
updatestatus();
+#if BAR_PADDING
+ updatebarpos(selmon);
+#endif
/* supporting window for NetWMCheck */
wmcheckwin = XCreateSimpleWindow(dpy, root, 0, 0, 1, 1, 0, 0, 0);
XChangeProperty(dpy, wmcheckwin, netatom[NetWMCheck], XA_WINDOW, 32,
@@ -1843,7 +1956,11 @@ togglebar(const Arg *arg)
{
selmon->showbar = !selmon->showbar;
updatebarpos(selmon);
+#if !BAR_PADDING
XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh);
+#else
+ XMoveResizeWindow(dpy, selmon->barwin, selmon->wx + sp, selmon->by + vp, selmon->ww - 2 * sp, bh);
+#endif
arrange(selmon);
}
@@ -1954,7 +2071,11 @@ updatebars(void)
for (m = mons; m; m = m->next) {
if (m->barwin)
continue;
+#if !BAR_PADDING
m->barwin = XCreateWindow(dpy, root, m->wx, m->by, m->ww, bh, 0, DefaultDepth(dpy, screen),
+#else
+ m->barwin = XCreateWindow(dpy, root, m->wx + sp, m->by + vp, m->ww - 2 * sp, bh, 0, DefaultDepth(dpy, screen),
+#endif
CopyFromParent, DefaultVisual(dpy, screen),
CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa);
XDefineCursor(dpy, m->barwin, cursor[CurNormal]->cursor);
@@ -1969,11 +2090,21 @@ updatebarpos(Monitor *m)
m->wy = m->my;
m->wh = m->mh;
if (m->showbar) {
+#if !BAR_PADDING
m->wh -= bh;
m->by = m->topbar ? m->wy : m->wy + m->wh;
m->wy = m->topbar ? m->wy + bh : m->wy;
+#else
+ m->wh = m->wh - vertpad - bh;
+ m->by = m->topbar ? m->wy : m->wy + m->wh + vertpad;
+ m->wy = m->topbar ? m->wy + bh + vp : m->wy;
+#endif
} else
+#if !BAR_PADDING
m->by = -bh;
+#else
+ m->by = -bh - vp;
+#endif
}
void
@@ -2254,6 +2385,19 @@ xerrorstart(Display *dpy, XErrorEvent *ee)
return -1;
}
+#if XRDB
+void
+xrdb(const Arg *arg)
+{
+ loadxrdb();
+ int i;
+ for (i = 0; i < LENGTH(colors); i++)
+ scheme[i] = drw_scm_create(drw, colors[i], 3);
+ focus(NULL);
+ arrange(NULL);
+}
+#endif
+
void
zoom(const Arg *arg)
{
@@ -2278,6 +2422,10 @@ main(int argc, char *argv[])
if (!(dpy = XOpenDisplay(NULL)))
die("vxwm: cannot open display");
checkotherwm();
+#if XRDB
+ XrmInitialize();
+ loadxrdb();
+#endif
setup();
#ifdef __OpenBSD__
if (pledge("stdio rpath proc exec", NULL) == -1)