diff --git a/src/dwm.c b/src/dwm.c index aa66c62..d9222eb 100644 --- a/src/dwm.c +++ b/src/dwm.c @@ -124,24 +124,29 @@ typedef struct { void (*arrange)(Monitor *); } Layout; +typedef struct Bar { + int by; + int topbar; + Window barwin; +} *Bar; + struct Monitor { Unit unit; + Bar bar; + Pertag *pertag; char ltsymbol[16]; int nmaster; int num; - int by; /* bar geometry */ int mx, my, mw, mh; /* screen size */ int wx, wy, ww, wh; /* window area */ unsigned int seltags; unsigned int sellt; unsigned int tagset[2]; - int topbar; Client *clients; Client *sel; Client *stack; Monitor *next; - Window barwin; const Layout *lt[2]; // actual state @@ -594,13 +599,16 @@ cleanupmon(Monitor *mon) for (m = mons; m && m->next != mon; m = m->next); m->next = mon->next; } - XUnmapWindow(dpy, mon->barwin); - XDestroyWindow(dpy, mon->barwin); for (int i = 0; i <= TAGS_COUNT; ++i) { UNIT_DELETE(mon->pertag->units[i]); } free(mon->pertag); + { + XUnmapWindow(dpy, mon->bar->barwin); + XDestroyWindow(dpy, mon->bar->barwin); + free(mon->bar); + } UNIT_DELETE(mon->unit); free(mon); } @@ -635,9 +643,15 @@ createmon(void) goto fail_without_unit; } + if (!(m->bar = malloc(sizeof(struct Bar)))) { + goto fail_without_bar; + } + + memset(m->bar, 0, sizeof(struct Bar)); + m->tagset[0] = m->tagset[1] = 1; m->nmaster = settings_get_default_clients_in_master(); - m->topbar = settings_get_bar_on_top_by_default(); + m->bar->topbar = settings_get_bar_on_top_by_default(); m->lt[0] = &layouts[0]; m->lt[1] = &layouts[1 % LENGTH(layouts)]; @@ -682,6 +696,8 @@ fail_other: } free(m->pertag); fail_without_pertag: + free(m->bar); +fail_without_bar: UNIT_DELETE(m->unit); fail_without_unit: free(m); @@ -1011,7 +1027,7 @@ manage(Window w, XWindowAttributes *wa) c->y = MAX( c->y, ( - (c->mon->by == c->mon->my) && + (c->mon->bar->by == c->mon->my) && (c->x + (c->w / 2) >= c->mon->wx) && (c->x + (c->w / 2) < c->mon->wx + c->mon->ww) ) @@ -1400,7 +1416,7 @@ restack(Monitor *m) XRaiseWindow(dpy, m->sel->win); if (m->lt[m->sellt]->arrange) { wc.stack_mode = Below; - wc.sibling = m->barwin; + wc.sibling = m->bar->barwin; for (c = m->stack; c; c = c->snext) if (!c->isfloating && ISVISIBLE(c)) { XConfigureWindow(dpy, c->win, CWSibling|CWStackMode, &wc); @@ -2178,7 +2194,7 @@ wintomon(Window w) if (w == root && getrootptr(&x, &y)) return recttomon(x, y, 1, 1); for (m = mons; m; m = m->next) - if (w == m->barwin) + if (w == m->bar->barwin) return m; if ((c = wintoclient(w))) return c->mon; diff --git a/src/dwm/bar.c b/src/dwm/bar.c index eefecd7..f154168 100644 --- a/src/dwm/bar.c +++ b/src/dwm/bar.c @@ -12,13 +12,13 @@ createbars(void) }; for (Monitor *m = mons; m; m = m->next) { - if (m->barwin) continue; + if (m->bar->barwin) continue; - m->barwin = XCreateWindow( + m->bar->barwin = XCreateWindow( dpy, root, m->wx, - m->by, + m->bar->by, m->ww, bh, 0, @@ -29,9 +29,9 @@ createbars(void) &wa ); - XDefineCursor(dpy, m->barwin, cursor[CurNormal]->cursor); - XMapRaised(dpy, m->barwin); - XSetClassHint(dpy, m->barwin, &ch); + XDefineCursor(dpy, m->bar->barwin, cursor[CurNormal]->cursor); + XMapRaised(dpy, m->bar->barwin); + XSetClassHint(dpy, m->bar->barwin, &ch); } } @@ -67,7 +67,7 @@ drawbar(Monitor *m) drw_rect(drw, x, 0, w, bh, 1, 1); } - drw_map(drw, m->barwin, 0, 0, m->ww, bh); + drw_map(drw, m->bar->barwin, 0, 0, m->ww, bh); } void @@ -92,7 +92,7 @@ updatebar(Monitor *m) m->show_bar = unit_get_show_bar(m->pertag->units[m->pertag->curtag]); updatebarpos(m); - XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh); + XMoveResizeWindow(dpy, selmon->bar->barwin, selmon->wx, selmon->bar->by, selmon->ww, bh); arrange(m); } @@ -111,10 +111,10 @@ updatebarpos(Monitor *m) m->wh = m->mh; if (m->show_bar) { m->wh -= bh; - m->by = m->topbar ? m->wy : m->wy + m->wh; - m->wy = m->topbar ? m->wy + bh : m->wy; + m->bar->by = m->bar->topbar ? m->wy : m->wy + m->wh; + m->wy = m->bar->topbar ? m->wy + bh : m->wy; } else - m->by = -bh; + m->bar->by = -bh; } #endif // _DWM_BAR_C diff --git a/src/dwm/handlers.c b/src/dwm/handlers.c index 9b305f9..350eace 100644 --- a/src/dwm/handlers.c +++ b/src/dwm/handlers.c @@ -134,7 +134,7 @@ on_configure_notify(XEvent *e) drw_resize(drw, sw, bh); createbars(); for (m = mons; m; m = m->next) { - XMoveResizeWindow(dpy, m->barwin, m->wx, m->by, m->ww, bh); + XMoveResizeWindow(dpy, m->bar->barwin, m->wx, m->bar->by, m->ww, bh); } focus(NULL); arrange(NULL);