aboutsummaryrefslogtreecommitdiffstats
path: root/dwm.c
diff options
context:
space:
mode:
authorNikita Langer <nikitalanger@icloud.com>2026-07-14 14:18:24 +0200
committerNikita Langer <nikitalanger@icloud.com>2026-07-14 14:18:24 +0200
commitce36d2ea39fa4883e40f06d5d61fde2847bee987 (patch)
treec3fc197a014c1e0ae2b85c4f85b11decc0edb473 /dwm.c
parent240c2f060bd412c7a565a701674a1f4dca23b422 (diff)
downloaddwm-ce36d2ea39fa4883e40f06d5d61fde2847bee987.tar.gz
dwm-ce36d2ea39fa4883e40f06d5d61fde2847bee987.tar.bz2
dwm-ce36d2ea39fa4883e40f06d5d61fde2847bee987.tar.xz
dwm-ce36d2ea39fa4883e40f06d5d61fde2847bee987.zip
Diffstat (limited to 'dwm.c')
-rw-r--r--dwm.c69
1 files changed, 61 insertions, 8 deletions
diff --git a/dwm.c b/dwm.c
index 8c95945..5f2d154 100644
--- a/dwm.c
+++ b/dwm.c
@@ -91,6 +91,8 @@
#define VERSION_MINOR 0
#define XEMBED_EMBEDDED_VERSION (VERSION_MAJOR << 16) | VERSION_MINOR
+#define OPAQUE 0xffU
+
/* enums */
enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */
enum { SchemeNorm, SchemeSel }; /* color schemes */
@@ -298,6 +300,7 @@ static Client *wintosystrayicon(Window w);
static int xerror(Display *dpy, XErrorEvent *ee);
static int xerrordummy(Display *dpy, XErrorEvent *ee);
static int xerrorstart(Display *dpy, XErrorEvent *ee);
+static void xinitvisual(void);
static void xrdb(const Arg *arg);
static void zoom(const Arg *arg);
@@ -344,6 +347,10 @@ static Display *dpy;
static Drw *drw;
static Monitor *mons, *selmon;
static Window root, wmcheckwin;
+static int useargb = 0;
+static Visual *visual;
+static int depth;
+static Colormap cmap;
static xcb_connection_t *xcon;
@@ -1958,7 +1965,8 @@ setup(void)
sw = DisplayWidth(dpy, screen);
sh = DisplayHeight(dpy, screen);
root = RootWindow(dpy, screen);
- drw = drw_create(dpy, screen, root, sw, sh);
+ xinitvisual();
+ drw = drw_create(dpy, screen, root, sw, sh, visual, depth, cmap);
if (!drw_fontset_create(drw, fonts, LENGTH(fonts)))
die("no fonts could be loaded.");
lrpad = drw->fonts->h;
@@ -1995,8 +2003,9 @@ setup(void)
cursor[CurMove] = drw_cur_create(drw, XC_fleur);
/* init appearance */
scheme = ecalloc(LENGTH(colors), sizeof(Clr *));
+ unsigned int alphas[] = {borderalpha, baralpha, OPAQUE};
for (i = 0; i < LENGTH(colors); i++)
- scheme[i] = drw_scm_create(drw, colors[i], 3);
+ scheme[i] = drw_scm_create(drw, colors[i], alphas, 3);
/* init system tray */
updatesystray();
/* init bars */
@@ -2269,7 +2278,9 @@ updatebars(void)
Monitor *m;
XSetWindowAttributes wa = {
.override_redirect = True,
- .background_pixmap = ParentRelative,
+ .background_pixel = 0,
+ .border_pixel = 0,
+ .colormap = cmap,
.event_mask = ButtonPressMask|ExposureMask
};
XClassHint ch = {"dwm", "dwm"};
@@ -2279,9 +2290,12 @@ updatebars(void)
w = m->ww;
if (showsystray && m == systraytomon(m))
w -= getsystraywidth();
- m->barwin = XCreateWindow(dpy, root, m->wx, m->by, w, bh, 0, DefaultDepth(dpy, screen),
- CopyFromParent, DefaultVisual(dpy, screen),
- CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa);
+ // m->barwin = XCreateWindow(dpy, root, m->wx, m->by, w, bh, 0, DefaultDepth(dpy, screen),
+ // CopyFromParent, DefaultVisual(dpy, screen),
+ // CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa);
+ m->barwin = XCreateWindow(dpy, root, m->wx, m->by, w, bh, 0, depth,
+ InputOutput, visual,
+ CWOverrideRedirect|CWBackPixel|CWBorderPixel|CWColormap|CWEventMask, &wa);
XDefineCursor(dpy, m->barwin, cursor[CurNormal]->cursor);
if (showsystray && m == systraytomon(m))
XMapRaised(dpy, systray->win);
@@ -2578,7 +2592,8 @@ updatesystray(void)
XMapSubwindows(dpy, systray->win);
/* redraw background */
XSetForeground(dpy, drw->gc, scheme[SchemeNorm][ColBg].pixel);
- XFillRectangle(dpy, systray->win, drw->gc, 0, 0, w, bh);
+ // XFillRectangle(dpy, systray->win, drw->gc, 0, 0, w, bh);
+ XFillRectangle(dpy, systray->win, XCreateGC(dpy, root, 0 , NULL), 0, 0, w, bh);
XSync(dpy, False);
}
@@ -2883,13 +2898,51 @@ xrdb(const Arg *arg)
{
loadxrdb();
int i;
+ unsigned int alphas[] = {borderalpha, baralpha, OPAQUE};
for (i = 0; i < LENGTH(colors); i++)
- scheme[i] = drw_scm_create(drw, colors[i], 3);
+ scheme[i] = drw_scm_create(drw, colors[i], alphas, 3);
focus(NULL);
arrange(NULL);
}
void
+xinitvisual(void)
+{
+ XVisualInfo *infos;
+ XRenderPictFormat *fmt;
+ int nitems;
+ int i;
+
+ XVisualInfo tpl = {
+ .screen = screen,
+ .depth = 32,
+ .class = TrueColor
+ };
+ long masks = VisualScreenMask | VisualDepthMask | VisualClassMask;
+
+ infos = XGetVisualInfo(dpy, masks, &tpl, &nitems);
+ visual = NULL;
+ for(i = 0; i < nitems; i++) {
+ fmt = XRenderFindVisualFormat(dpy, infos[i].visual);
+ if (fmt->type == PictTypeDirect && fmt->direct.alphaMask) {
+ visual = infos[i].visual;
+ depth = infos[i].depth;
+ cmap = XCreateColormap(dpy, root, visual, AllocNone);
+ useargb = 1;
+ break;
+ }
+ }
+
+ XFree(infos);
+
+ if (!visual) {
+ visual = DefaultVisual(dpy, screen);
+ depth = DefaultDepth(dpy, screen);
+ cmap = DefaultColormap(dpy, screen);
+ }
+}
+
+void
zoom(const Arg *arg)
{
Client *c = selmon->sel;