add systray border

This commit is contained in:
Ray Andrew 2024-10-13 16:33:00 -05:00
parent a7ab3e50e6
commit e9b07a4d70

40
dwm.c
View file

@ -207,7 +207,7 @@ static void detachstack(Client *c);
static Monitor *dirtomon(int dir);
static void drawbar(Monitor *m);
static void drawbars(void);
static int drawstatusbar(Monitor *m, int bh, char* text);
static int drawstatusbar(Monitor *m, int bh, char* text, int stw);
static void enternotify(XEvent *e);
static void expose(XEvent *e);
static void focus(Client *c);
@ -945,12 +945,12 @@ dirtomon(int dir)
}
int
drawstatusbar(Monitor *m, int bh, char* stext) {
drawstatusbar(Monitor *m, int bh, char* stext, int stw) {
int ret, i, j, w, x, len;
short isCode = 0;
char *text;
char *p;
int mw = m->ww - borderpx * 2;
int mw = m->ww;
int th = bh - borderpx * 2;
len = strlen(stext) + 1 ;
@ -995,7 +995,7 @@ drawstatusbar(Monitor *m, int bh, char* stext) {
drw_setscheme(drw, scheme[LENGTH(colors)]);
drw->scheme[ColFg] = scheme[SchemeNorm][ColFg];
drw->scheme[ColBg] = scheme[SchemeNorm][ColBg];
drw_rect(drw, x - 2 * sp, borderpx, w + borderpx - sp * 2, th, 1, 1);
drw_rect(drw, x - 2 * sp - stw, borderpx, w + borderpx + stw, th, 1, 1);
x++;
/* process status text */
@ -1050,7 +1050,7 @@ drawstatusbar(Monitor *m, int bh, char* stext) {
if (!isCode) {
w = TEXTW(text, statusfontindex) - lrpad;
drw_text(drw, x - 2 * sp, borderpx, w + borderpx, th, 0, text, 0, statusfontindex);
drw_text(drw, x - 2 * sp - stw, borderpx, w + borderpx + stw, th, 0, text, 0, statusfontindex);
}
drw_setscheme(drw, scheme[SchemeNorm]);
@ -1070,18 +1070,18 @@ drawbar(Monitor *m)
unsigned int i, occ = 0, urg = 0;
Client *c;
XSetForeground(drw->dpy, drw->gc, clrborder.pixel);
XFillRectangle(drw->dpy, drw->drawable, drw->gc, 0, 0, m->ww, bh);
if (!m->showbar)
return;
if(showsystray && m == systraytomon(m))
stw = getsystraywidth();
XSetForeground(drw->dpy, drw->gc, clrborder.pixel);
XFillRectangle(drw->dpy, drw->drawable, drw->gc, 0, 0, m->ww, bh);
/* draw status first so it can be overdrawn by tags later */
if (m == selmon || 1) { /* status is only drawn on selected monitor */
tw = statusw = m->ww - drawstatusbar(m, bh, stext);
tw = statusw = m->ww - drawstatusbar(m, bh, stext, stw);
}
resizebarwin(m);
@ -1097,7 +1097,7 @@ drawbar(Monitor *m)
continue;
w = TEXTW(tags[i], statusfontindex);
drw_setscheme(drw, scheme[m->tagset[m->seltags] & 1 << i ? SchemeSel : SchemeNorm]);
drw_text(drw, x, y, w , th, lrpad / 2, tags[i], urg & 1 << i, statusfontindex);
drw_text(drw, x, y, w, th, lrpad / 2, tags[i], urg & 1 << i, statusfontindex);
if (ulineall || m->tagset[m->seltags] & 1 << i)
drw_rect(drw, x + ulinepad, bh - ulinestroke - ulinevoffset, w - (ulinepad * 2), ulinestroke, 1, 0);
@ -1111,14 +1111,14 @@ drawbar(Monitor *m)
if ((w = mw - tw - x) > th) {
if (m->sel) {
drw_setscheme(drw, scheme[m == selmon ? SchemeSel : SchemeNorm]);
drw_text(drw, x, y, w - sidepad, th, lrpad / 2, m->sel->name, 0, statusfontindex);
drw_text(drw, x, y, w - sidepad - stw, th, lrpad / 2, m->sel->name, 0, statusfontindex);
if (m->sel->isfloating)
drw_rect(drw, x + boxs, y + boxs, boxw, boxw, m->sel->isfixed, 0);
drw_rect(drw, x + boxs, y + boxs, boxw - stw, boxw, m->sel->isfixed, 0);
} else {
drw_setscheme(drw, scheme[SchemeNorm]);
// drw_rect(drw, x, 0, w - 2 * sp, bh, 1, 1);
// drw_rect(drw, x, y, w - 2 * sp, th, 1, 1);
drw_rect(drw, x, y, w - 1, th, 1, 1);
drw_rect(drw, x, y, w - sp - stw, th, 1, 1);
}
}
drw_map(drw, m->barwin, 0, 0, m->ww - stw, bh);
@ -3059,6 +3059,8 @@ updatesystrayicongeom(Client *i, int w, int h)
if (i->w > 2*bh)
i->w = bh;
}
i->w = i->w - sp * 2 - borderpx * 2;
i->h = i->h - sp * 2 - borderpx * 2;
}
void
@ -3096,7 +3098,7 @@ updatesystray(void)
XWindowChanges wc;
Client *i;
Monitor *m = systraytomon(NULL);
unsigned int x = m->mx + m->mw;
unsigned int x = m->mx + m->mw - sp;
unsigned int w = 1;
if (!showsystray)
@ -3135,22 +3137,24 @@ updatesystray(void)
XMapRaised(dpy, i->win);
w += systrayspacing;
i->x = w;
XMoveResizeWindow(dpy, i->win, i->x, 0, i->w, i->h);
XMoveResizeWindow(dpy, i->win, i->x, 3 * borderpx + 1, i->w, i->h);
w += i->w;
if (i->mon != m)
i->mon = m;
}
w = w ? w + systrayspacing : 1;
w = w ? w + systrayspacing + borderpx : 1;
x -= w;
XMoveResizeWindow(dpy, systray->win, x, m->by, w, bh);
wc.x = x; wc.y = m->by; wc.width = w; wc.height = bh;
wc.x = x; wc.y = m->by - borderpx; wc.width = w; wc.height = bh;
wc.stack_mode = Above; wc.sibling = m->barwin;
XConfigureWindow(dpy, systray->win, CWX|CWY|CWWidth|CWHeight|CWSibling|CWStackMode, &wc);
XMapWindow(dpy, systray->win);
XMapSubwindows(dpy, systray->win);
/* redraw background */
XSetForeground(dpy, drw->gc, scheme[SchemeNorm][ColBg].pixel);
XSetForeground(dpy, drw->gc, clrborder.pixel);
XFillRectangle(dpy, systray->win, drw->gc, 0, 0, w, bh);
XSetForeground(dpy, drw->gc, scheme[SchemeNorm][ColBg].pixel);
XFillRectangle(dpy, systray->win, drw->gc, 0, borderpx, w - borderpx, bh - 2 * borderpx);
XSync(dpy, False);
}