mirror of
https://github.com/mintycube/dwm.git
synced 2024-10-22 14:05:45 +02:00
systray: avoid dwm crashing when removing the monitor where the systray is running (hotplugging issues)
This commit is contained in:
parent
7bfcd388f6
commit
f662f6e749
12
dwm.c
12
dwm.c
@ -1133,6 +1133,8 @@ cleanupmon(Monitor *mon)
|
|||||||
XDestroyWindow(dpy, bar->win);
|
XDestroyWindow(dpy, bar->win);
|
||||||
}
|
}
|
||||||
mon->bar = bar->next;
|
mon->bar = bar->next;
|
||||||
|
if (systray && bar == systray->bar)
|
||||||
|
systray->bar = NULL;
|
||||||
free(bar);
|
free(bar);
|
||||||
}
|
}
|
||||||
free(mon);
|
free(mon);
|
||||||
@ -1265,7 +1267,7 @@ configurenotify(XEvent *e)
|
|||||||
sw = ev->width;
|
sw = ev->width;
|
||||||
sh = ev->height;
|
sh = ev->height;
|
||||||
if (updategeom() || dirty) {
|
if (updategeom() || dirty) {
|
||||||
drw_resize(drw, sw, bh);
|
drw_resize(drw, sw, sh);
|
||||||
updatebars();
|
updatebars();
|
||||||
for (m = mons; m; m = m->next) {
|
for (m = mons; m; m = m->next) {
|
||||||
#if !FAKEFULLSCREEN_PATCH
|
#if !FAKEFULLSCREEN_PATCH
|
||||||
@ -1638,11 +1640,12 @@ drawbars(void)
|
|||||||
void
|
void
|
||||||
drawbarwin(Bar *bar)
|
drawbarwin(Bar *bar)
|
||||||
{
|
{
|
||||||
if (!bar->win || bar->external)
|
if (!bar || !bar->win || bar->external)
|
||||||
return;
|
return;
|
||||||
int r, w, total_drawn = 0;
|
int r, w, total_drawn = 0;
|
||||||
int rx, lx, rw, lw; // bar size, split between left and right if a center module is added
|
int rx, lx, rw, lw; // bar size, split between left and right if a center module is added
|
||||||
const BarRule *br;
|
const BarRule *br;
|
||||||
|
Monitor *lastmon;
|
||||||
|
|
||||||
if (bar->borderpx) {
|
if (bar->borderpx) {
|
||||||
XSetForeground(drw->dpy, drw->gc, scheme[bar->borderscheme][ColBorder].pixel);
|
XSetForeground(drw->dpy, drw->gc, scheme[bar->borderscheme][ColBorder].pixel);
|
||||||
@ -1656,13 +1659,16 @@ drawbarwin(Bar *bar)
|
|||||||
rw = lw = bar->bw - 2 * bar->borderpx;
|
rw = lw = bar->bw - 2 * bar->borderpx;
|
||||||
rx = lx = bar->borderpx;
|
rx = lx = bar->borderpx;
|
||||||
|
|
||||||
|
for (lastmon = mons; lastmon && lastmon->next; lastmon = lastmon->next);
|
||||||
|
|
||||||
drw_setscheme(drw, scheme[SchemeNorm]);
|
drw_setscheme(drw, scheme[SchemeNorm]);
|
||||||
drw_rect(drw, lx, bar->borderpx, lw, bar->bh - 2 * bar->borderpx, 1, 1);
|
drw_rect(drw, lx, bar->borderpx, lw, bar->bh - 2 * bar->borderpx, 1, 1);
|
||||||
for (r = 0; r < LENGTH(barrules); r++) {
|
for (r = 0; r < LENGTH(barrules); r++) {
|
||||||
br = &barrules[r];
|
br = &barrules[r];
|
||||||
if (br->bar != bar->idx || !br->widthfunc || (br->monitor == 'A' && bar->mon != selmon))
|
if (br->bar != bar->idx || !br->widthfunc || (br->monitor == 'A' && bar->mon != selmon))
|
||||||
continue;
|
continue;
|
||||||
if (br->monitor != 'A' && br->monitor != -1 && br->monitor != bar->mon->index)
|
if (br->monitor != 'A' && br->monitor != -1 && br->monitor != bar->mon->index &&
|
||||||
|
(br->drawfunc != draw_systray || (lastmon->index >= br->monitor && bar->mon->index == 0))) // hack: draw systray on first monitor if the designated one is not available
|
||||||
continue;
|
continue;
|
||||||
drw_setscheme(drw, scheme[SchemeNorm]);
|
drw_setscheme(drw, scheme[SchemeNorm]);
|
||||||
warg.w = (br->alignment < BAR_ALIGN_RIGHT_LEFT ? lw : rw);
|
warg.w = (br->alignment < BAR_ALIGN_RIGHT_LEFT ? lw : rw);
|
||||||
|
Loading…
Reference in New Issue
Block a user