unpatch anybar patch 🥲
This commit is contained in:
parent
e391f7c2cc
commit
e5bbcaa6e7
5 changed files with 578 additions and 308 deletions
562
patches/92f77de7deb4b5b9fc2dcf958264093458123497.diff
Normal file
562
patches/92f77de7deb4b5b9fc2dcf958264093458123497.diff
Normal file
|
@ -0,0 +1,562 @@
|
|||
diff --git a/src/config.def.h.rej b/src/config.def.h.rej
|
||||
new file mode 100644
|
||||
index 0000000..82ea963
|
||||
--- /dev/null
|
||||
+++ b/src/config.def.h.rej
|
||||
@@ -0,0 +1,13 @@
|
||||
+--- config.def.h
|
||||
++++ config.def.h
|
||||
+@@ -5,6 +5,10 @@ static const unsigned int borderpx = 1; /* border pixel of windows */
|
||||
+ static const unsigned int snap = 32; /* snap pixel */
|
||||
+ static const int showbar = 1; /* 0 means no bar */
|
||||
+ static const int topbar = 1; /* 0 means bottom bar */
|
||||
++static const int usealtbar = 1; /* 1 means use non-dwm status bar */
|
||||
++static const char *altbarclass = "Polybar"; /* Alternate bar class name */
|
||||
++static const char *alttrayname = "tray"; /* Polybar tray instance name */
|
||||
++static const char *altbarcmd = "$HOME/bar.sh"; /* Alternate bar launch command */
|
||||
+ static const char *fonts[] = { "monospace:size=10" };
|
||||
+ static const char dmenufont[] = "monospace:size=10";
|
||||
+ static const char col_gray1[] = "#222222";
|
||||
diff --git a/src/config.h b/src/config.h
|
||||
index 1e3fec2..43aa1e2 100644
|
||||
--- a/src/config.h
|
||||
+++ b/src/config.h
|
||||
@@ -17,6 +17,12 @@ static const int systraypinningfailfirst = 1; /* 1: if pinning fails, display
|
||||
static const int showsystray = 1; /* 0 means no systray */
|
||||
static const int showbar = 1; /* 0 means no bar */
|
||||
static const int topbar = 1; /* 0 means bottom bar */
|
||||
+
|
||||
+static const int usealtbar = 1; /* 1 means use non-dwm status bar */
|
||||
+static const char *altbarclass = "Polybar"; /* Alternate bar class name */
|
||||
+static const char *alttrayname = "tray"; /* Polybar tray instance name */
|
||||
+static const char *altbarcmd = "$HOME/bar.sh"; /* Alternate bar launch command */
|
||||
+
|
||||
static const char *fonts[] = { "monospace:size=11", "Noto Color Emoji:size=11", "Nerd Font Mono:weight=bold:size=15:antialias=true:hinting=true" };
|
||||
static const char dmenufont[] = "monospace:size=11";
|
||||
|
||||
@@ -24,8 +30,6 @@ static const char dmenufont[] = "monospace:size=11";
|
||||
|
||||
// Autostart programs
|
||||
static const char *const autostart[] = {
|
||||
- // Start my build of slstatus
|
||||
- "slstatus", NULL,
|
||||
// Keyboard layouts switch (requires setxkbmap)
|
||||
"setxkbmap", "-model", "pc101", "-layout", "us,ar", "-variant", ",,", "-option", "grp:win_space_toggle", NULL,
|
||||
// "xkbset", "exp", "=sticky", "-twokey", "-latchlock", NULL, // sticky keys
|
||||
diff --git a/src/dwm.c b/src/dwm.c
|
||||
index eb423c5..0499e58 100644
|
||||
--- a/src/dwm.c
|
||||
+++ b/src/dwm.c
|
||||
@@ -47,8 +47,8 @@
|
||||
/* macros */
|
||||
#define BUTTONMASK (ButtonPressMask|ButtonReleaseMask)
|
||||
#define CLEANMASK(mask) (mask & ~(numlockmask|LockMask) & (ShiftMask|ControlMask|Mod1Mask|Mod2Mask|Mod3Mask|Mod4Mask|Mod5Mask))
|
||||
-#define INTERSECT(x,y,w,h,m) (MAX(0, MIN((x)+(w),(m)->wx+(m)->ww) - MAX((x),(m)->wx)) \
|
||||
- * MAX(0, MIN((y)+(h),(m)->wy+(m)->wh) - MAX((y),(m)->wy)))
|
||||
+#define INTERSECT(x,y,w,h,m) (MAX(0, MIN((x)+(w),(m)->mx+(m)->mw) - MAX((x),(m)->mx)) \
|
||||
+ * MAX(0, MIN((y)+(h),(m)->my+(m)->mh) - MAX((y),(m)->my)))
|
||||
#define ISVISIBLE(C) ((C->tags & C->mon->tagset[C->mon->seltags]) || C->issticky)
|
||||
#define LENGTH(X) (sizeof X / sizeof X[0])
|
||||
#define MOUSEMASK (BUTTONMASK|PointerMotionMask)
|
||||
@@ -137,7 +137,8 @@ struct Monitor {
|
||||
float mfact;
|
||||
int nmaster;
|
||||
int num;
|
||||
- int by; /* bar geometry */
|
||||
+ int by, bh; /* bar geometry */
|
||||
+ int tx, tw; /* bar tray geometry */
|
||||
int mx, my, mw, mh; /* screen size */
|
||||
int wx, wy, ww, wh; /* window area */
|
||||
unsigned int seltags;
|
||||
@@ -150,6 +151,7 @@ struct Monitor {
|
||||
Client *stack;
|
||||
Monitor *next;
|
||||
Window barwin;
|
||||
+ Window traywin;
|
||||
const Layout *lt[2];
|
||||
Pertag *pertag;
|
||||
};
|
||||
@@ -208,6 +210,8 @@ static void incnmaster(const Arg *arg);
|
||||
static void keypress(XEvent *e);
|
||||
static void killclient(const Arg *arg);
|
||||
static void manage(Window w, XWindowAttributes *wa);
|
||||
+static void managealtbar(Window win, XWindowAttributes *wa);
|
||||
+static void managetray(Window win, XWindowAttributes *wa);
|
||||
static void mappingnotify(XEvent *e);
|
||||
static void maprequest(XEvent *e);
|
||||
static void monocle(Monitor *m);
|
||||
@@ -227,6 +231,7 @@ static void resizerequest(XEvent *e);
|
||||
static void restack(Monitor *m);
|
||||
static void run(void);
|
||||
static void scan(void);
|
||||
+static void scantray(void);
|
||||
static int sendevent(Window w, Atom proto, int m, long d0, long d1, long d2, long d3, long d4);
|
||||
static void sendmon(Client *c, Monitor *m);
|
||||
static void setclientstate(Client *c, long state);
|
||||
@@ -240,6 +245,7 @@ static void seturgent(Client *c, int urg);
|
||||
static void showhide(Client *c);
|
||||
static void sigchld(int unused);
|
||||
static void spawn(const Arg *arg);
|
||||
+static void spawnbar();
|
||||
static Monitor *systraytomon(Monitor *m);
|
||||
static void tag(const Arg *arg);
|
||||
static void tagmon(const Arg *arg);
|
||||
@@ -251,6 +257,8 @@ static void toggletag(const Arg *arg);
|
||||
static void toggleview(const Arg *arg);
|
||||
static void unfocus(Client *c, int setfocus);
|
||||
static void unmanage(Client *c, int destroyed);
|
||||
+static void unmanagealtbar(Window w);
|
||||
+static void unmanagetray(Window w);
|
||||
static void unmapnotify(XEvent *e);
|
||||
static void updatebarpos(Monitor *m);
|
||||
static void updatebars(void);
|
||||
@@ -269,6 +277,7 @@ static void view(const Arg *arg);
|
||||
static Client *wintoclient(Window w);
|
||||
static Monitor *wintomon(Window w);
|
||||
static Client *wintosystrayicon(Window w);
|
||||
+static int wmclasscontains(Window win, const char *class, const char *name);
|
||||
static int xerror(Display *dpy, XErrorEvent *ee);
|
||||
static int xerrordummy(Display *dpy, XErrorEvent *ee);
|
||||
static int xerrorstart(Display *dpy, XErrorEvent *ee);
|
||||
@@ -595,8 +604,10 @@ 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);
|
||||
+ if (!usealtbar) {
|
||||
+ XUnmapWindow(dpy, mon->barwin);
|
||||
+ XDestroyWindow(dpy, mon->barwin);
|
||||
+ }
|
||||
free(mon);
|
||||
}
|
||||
|
||||
@@ -779,6 +790,7 @@ createmon(void)
|
||||
m->nmaster = nmaster;
|
||||
m->showbar = showbar;
|
||||
m->topbar = topbar;
|
||||
+ m->bh = bh;
|
||||
m->lt[0] = &layouts[0];
|
||||
m->lt[1] = &layouts[1 % LENGTH(layouts)];
|
||||
strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol);
|
||||
@@ -803,10 +815,15 @@ void
|
||||
destroynotify(XEvent *e)
|
||||
{
|
||||
Client *c;
|
||||
+ Monitor *m;
|
||||
XDestroyWindowEvent *ev = &e->xdestroywindow;
|
||||
|
||||
if ((c = wintoclient(ev->window)))
|
||||
unmanage(c, 1);
|
||||
+ else if ((m = wintomon(ev->window)) && m->barwin == ev->window)
|
||||
+ unmanagealtbar(ev->window);
|
||||
+ else if (m->traywin == ev->window)
|
||||
+ unmanagetray(ev->window);
|
||||
else if ((c = wintosystrayicon(ev->window))) {
|
||||
removesystrayicon(c);
|
||||
resizebarwin(selmon);
|
||||
@@ -855,6 +872,8 @@ dirtomon(int dir)
|
||||
void
|
||||
drawbar(Monitor *m)
|
||||
{
|
||||
+ if (usealtbar) return;
|
||||
+
|
||||
int x, w, tw = 0, stw = 0;
|
||||
int boxs = drw->fonts->h / 9;
|
||||
int boxw = drw->fonts->h / 6 + 2;
|
||||
@@ -1325,6 +1344,8 @@ maprequest(XEvent *e)
|
||||
return;
|
||||
if (wa.override_redirect)
|
||||
return;
|
||||
+ if (wmclasscontains(ev->window, altbarclass, ""))
|
||||
+ managealtbar(ev->window, &wa);
|
||||
if (!wintoclient(ev->window))
|
||||
manage(ev->window, &wa);
|
||||
}
|
||||
@@ -1525,7 +1546,7 @@ resizebarwin(Monitor *m) {
|
||||
unsigned int w = m->ww;
|
||||
if (showsystray && m == systraytomon(m) && !systrayonleft)
|
||||
w -= getsystraywidth();
|
||||
- XMoveResizeWindow(dpy, m->barwin, m->wx, m->by, w, bh);
|
||||
+ XMoveResizeWindow(dpy, m->barwin, m->wx, m->by, m->ww, m->bh);
|
||||
}
|
||||
|
||||
void
|
||||
@@ -1668,8 +1689,10 @@ scan(void)
|
||||
for (i = 0; i < num; i++) {
|
||||
if (!XGetWindowAttributes(dpy, wins[i], &wa)
|
||||
|| wa.override_redirect || XGetTransientForHint(dpy, wins[i], &d1))
|
||||
- continue;
|
||||
- if (wa.map_state == IsViewable || getstate(wins[i]) == IconicState)
|
||||
+ continue;
|
||||
+ if (wmclasscontains(wins[i], altbarclass, ""))
|
||||
+ managealtbar(wins[i], &wa);
|
||||
+ else if (wa.map_state == IsViewable || getstate(wins[i]) == IconicState)
|
||||
manage(wins[i], &wa);
|
||||
}
|
||||
for (i = 0; i < num; i++) { /* now the transients */
|
||||
@@ -1684,6 +1707,28 @@ scan(void)
|
||||
}
|
||||
}
|
||||
|
||||
+
|
||||
+void
|
||||
+scantray(void)
|
||||
+{
|
||||
+ unsigned int num;
|
||||
+ Window d1, d2, *wins = NULL;
|
||||
+ XWindowAttributes wa;
|
||||
+
|
||||
+ if (XQueryTree(dpy, root, &d1, &d2, &wins, &num)) {
|
||||
+ for (unsigned int i = 0; i < num; i++) {
|
||||
+ if (wmclasscontains(wins[i], altbarclass, alttrayname)) {
|
||||
+ if (!XGetWindowAttributes(dpy, wins[i], &wa))
|
||||
+ break;
|
||||
+ managetray(wins[i], &wa);
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ if (wins)
|
||||
+ XFree(wins);
|
||||
+}
|
||||
+
|
||||
void
|
||||
sendmon(Client *c, Monitor *m)
|
||||
{
|
||||
@@ -1848,7 +1893,7 @@ setup(void)
|
||||
if (!drw_fontset_create(drw, fonts, LENGTH(fonts)))
|
||||
die("no fonts could be loaded.");
|
||||
lrpad = drw->fonts->h;
|
||||
- bh = drw->fonts->h + 2;
|
||||
+ bh = usealtbar ? 0 : drw->fonts->h + 2;
|
||||
updategeom();
|
||||
/* init atoms */
|
||||
utf8string = XInternAtom(dpy, "UTF8_STRING", False);
|
||||
@@ -1906,6 +1951,7 @@ setup(void)
|
||||
XSelectInput(dpy, root, wa.event_mask);
|
||||
grabkeys();
|
||||
focus(NULL);
|
||||
+ spawnbar();
|
||||
}
|
||||
|
||||
|
||||
@@ -1980,6 +2026,13 @@ spawn(const Arg *arg)
|
||||
}
|
||||
}
|
||||
|
||||
+void
|
||||
+spawnbar()
|
||||
+{
|
||||
+ if (*altbarcmd)
|
||||
+ system(altbarcmd);
|
||||
+}
|
||||
+
|
||||
void
|
||||
tag(const Arg *arg)
|
||||
{
|
||||
@@ -2001,9 +2054,19 @@ tagmon(const Arg *arg)
|
||||
void
|
||||
togglebar(const Arg *arg)
|
||||
{
|
||||
+ /**
|
||||
+ * Polybar tray does not raise maprequest event. It must be manually scanned
|
||||
+ * for. Scanning it too early while the tray is being populated would give
|
||||
+ * wrong dimensions.
|
||||
+ */
|
||||
+ if (!selmon->traywin)
|
||||
+ scantray();
|
||||
+
|
||||
selmon->showbar = selmon->pertag->showbars[selmon->pertag->curtag] = !selmon->showbar;
|
||||
updatebarpos(selmon);
|
||||
resizebarwin(selmon);
|
||||
+ //TODO: 2022-07-17 Test
|
||||
+ XMoveResizeWindow(dpy, selmon->traywin, selmon->tx, selmon->by, selmon->tw, selmon->bh);
|
||||
if (showsystray) {
|
||||
XWindowChanges wc;
|
||||
if (!selmon->showbar)
|
||||
@@ -2018,6 +2081,38 @@ togglebar(const Arg *arg)
|
||||
arrange(selmon);
|
||||
}
|
||||
|
||||
+
|
||||
+void
|
||||
+unmanagealtbar(Window w)
|
||||
+{
|
||||
+ Monitor *m = wintomon(w);
|
||||
+
|
||||
+ if (!m)
|
||||
+ return;
|
||||
+
|
||||
+ m->barwin = 0;
|
||||
+ m->by = 0;
|
||||
+ m->bh = 0;
|
||||
+ updatebarpos(m);
|
||||
+ arrange(m);
|
||||
+}
|
||||
+
|
||||
+void
|
||||
+unmanagetray(Window w)
|
||||
+{
|
||||
+ Monitor *m = wintomon(w);
|
||||
+
|
||||
+ if (!m)
|
||||
+ return;
|
||||
+
|
||||
+ m->traywin = 0;
|
||||
+ m->tx = 0;
|
||||
+ m->tw = 0;
|
||||
+ updatebarpos(m);
|
||||
+ arrange(m);
|
||||
+}
|
||||
+
|
||||
+
|
||||
void
|
||||
togglefloating(const Arg *arg)
|
||||
{
|
||||
@@ -2134,6 +2229,7 @@ void
|
||||
unmapnotify(XEvent *e)
|
||||
{
|
||||
Client *c;
|
||||
+ Monitor *m;
|
||||
XUnmapEvent *ev = &e->xunmap;
|
||||
|
||||
if ((c = wintoclient(ev->window))) {
|
||||
@@ -2141,7 +2237,10 @@ unmapnotify(XEvent *e)
|
||||
setclientstate(c, WithdrawnState);
|
||||
else
|
||||
unmanage(c, 0);
|
||||
- }
|
||||
+ } else if ((m = wintomon(ev->window)) && m->barwin == ev->window)
|
||||
+ unmanagealtbar(ev->window);
|
||||
+ else if (m->traywin == ev->window)
|
||||
+ unmanagetray(ev->window);
|
||||
else if ((c = wintosystrayicon(ev->window))) {
|
||||
/* KLUDGE! sometimes icons occasionally unmap their windows, but do
|
||||
* _not_ destroy them. We map those windows back */
|
||||
@@ -2153,6 +2252,8 @@ unmapnotify(XEvent *e)
|
||||
void
|
||||
updatebars(void)
|
||||
{
|
||||
+ if (usealtbar) return;
|
||||
+
|
||||
unsigned int w;
|
||||
Monitor *m;
|
||||
XSetWindowAttributes wa = {
|
||||
@@ -2184,11 +2285,11 @@ updatebarpos(Monitor *m)
|
||||
m->wy = m->my;
|
||||
m->wh = m->mh;
|
||||
if (m->showbar) {
|
||||
- m->wh -= bh;
|
||||
+ m->wh -= m->bh;
|
||||
m->by = m->topbar ? m->wy : m->wy + m->wh;
|
||||
- m->wy = m->topbar ? m->wy + bh : m->wy;
|
||||
+ m->wy = m->topbar ? m->wy + m->bh : m->wy;
|
||||
} else
|
||||
- m->by = -bh;
|
||||
+ m->by = -m->bh;
|
||||
}
|
||||
|
||||
void
|
||||
@@ -2491,6 +2592,45 @@ updatewindowtype(Client *c)
|
||||
c->isfloating = 1;
|
||||
}
|
||||
|
||||
+
|
||||
+void
|
||||
+managealtbar(Window win, XWindowAttributes *wa)
|
||||
+{
|
||||
+ Monitor *m;
|
||||
+ if (!(m = recttomon(wa->x, wa->y, wa->width, wa->height)))
|
||||
+ return;
|
||||
+
|
||||
+ m->barwin = win;
|
||||
+ m->by = wa->y;
|
||||
+ bh = m->bh = wa->height;
|
||||
+ updatebarpos(m);
|
||||
+ arrange(m);
|
||||
+ XSelectInput(dpy, win, EnterWindowMask|FocusChangeMask|PropertyChangeMask|StructureNotifyMask);
|
||||
+ XMoveResizeWindow(dpy, win, wa->x, wa->y, wa->width, wa->height);
|
||||
+ XMapWindow(dpy, win);
|
||||
+ XChangeProperty(dpy, root, netatom[NetClientList], XA_WINDOW, 32, PropModeAppend,
|
||||
+ (unsigned char *) &win, 1);
|
||||
+}
|
||||
+
|
||||
+void
|
||||
+managetray(Window win, XWindowAttributes *wa)
|
||||
+{
|
||||
+ Monitor *m;
|
||||
+ if (!(m = recttomon(wa->x, wa->y, wa->width, wa->height)))
|
||||
+ return;
|
||||
+
|
||||
+ m->traywin = win;
|
||||
+ m->tx = wa->x;
|
||||
+ m->tw = wa->width;
|
||||
+ updatebarpos(m);
|
||||
+ arrange(m);
|
||||
+ XSelectInput(dpy, win, EnterWindowMask|FocusChangeMask|PropertyChangeMask|StructureNotifyMask);
|
||||
+ XMoveResizeWindow(dpy, win, wa->x, wa->y, wa->width, wa->height);
|
||||
+ XMapWindow(dpy, win);
|
||||
+ XChangeProperty(dpy, root, netatom[NetClientList], XA_WINDOW, 32, PropModeAppend,
|
||||
+ (unsigned char *) &win, 1);
|
||||
+}
|
||||
+
|
||||
void
|
||||
updatewmhints(Client *c)
|
||||
{
|
||||
@@ -2581,13 +2721,36 @@ 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->barwin || w == m->traywin)
|
||||
return m;
|
||||
if ((c = wintoclient(w)))
|
||||
return c->mon;
|
||||
return selmon;
|
||||
}
|
||||
|
||||
+
|
||||
+int
|
||||
+wmclasscontains(Window win, const char *class, const char *name)
|
||||
+{
|
||||
+ XClassHint ch = { NULL, NULL };
|
||||
+ int res = 1;
|
||||
+
|
||||
+ if (XGetClassHint(dpy, win, &ch)) {
|
||||
+ if (ch.res_name && strstr(ch.res_name, name) == NULL)
|
||||
+ res = 0;
|
||||
+ if (ch.res_class && strstr(ch.res_class, class) == NULL)
|
||||
+ res = 0;
|
||||
+ } else
|
||||
+ res = 0;
|
||||
+
|
||||
+ if (ch.res_class)
|
||||
+ XFree(ch.res_class);
|
||||
+ if (ch.res_name)
|
||||
+ XFree(ch.res_name);
|
||||
+
|
||||
+ return res;
|
||||
+}
|
||||
+
|
||||
/* There's no way to check accesses to destroyed windows, thus those cases are
|
||||
* ignored (especially on UnmapNotify's). Other types of errors call Xlibs
|
||||
* default error handler, which may call exit. */
|
||||
diff --git a/src/dwm.c.rej b/src/dwm.c.rej
|
||||
new file mode 100644
|
||||
index 0000000..7e375c6
|
||||
--- /dev/null
|
||||
+++ b/src/dwm.c.rej
|
||||
@@ -0,0 +1,112 @@
|
||||
+--- dwm.c
|
||||
++++ dwm.c
|
||||
+@@ -47,8 +47,8 @@
|
||||
+ /* macros */
|
||||
+ #define BUTTONMASK (ButtonPressMask|ButtonReleaseMask)
|
||||
+ #define CLEANMASK(mask) (mask & ~(numlockmask|LockMask) & (ShiftMask|ControlMask|Mod1Mask|Mod2Mask|Mod3Mask|Mod4Mask|Mod5Mask))
|
||||
+-#define INTERSECT(x,y,w,h,m) (MAX(0, MIN((x)+(w),(m)->wx+(m)->ww) - MAX((x),(m)->wx)) \
|
||||
+- * MAX(0, MIN((y)+(h),(m)->wy+(m)->wh) - MAX((y),(m)->wy)))
|
||||
++#define INTERSECT(x,y,w,h,m) (MAX(0, MIN((x)+(w),(m)->mx+(m)->mw) - MAX((x),(m)->mx)) \
|
||||
++ * MAX(0, MIN((y)+(h),(m)->my+(m)->mh) - MAX((y),(m)->my)))
|
||||
+ #define ISVISIBLE(C) ((C->tags & C->mon->tagset[C->mon->seltags]))
|
||||
+ #define LENGTH(X) (sizeof X / sizeof X[0])
|
||||
+ #define MOUSEMASK (BUTTONMASK|PointerMotionMask)
|
||||
+@@ -199,6 +203,7 @@ static void resizemouse(const Arg *arg);
|
||||
+ static void restack(Monitor *m);
|
||||
+ static void run(void);
|
||||
+ static void scan(void);
|
||||
++static void scantray(void);
|
||||
+ static int sendevent(Client *c, Atom proto);
|
||||
+ static void sendmon(Client *c, Monitor *m);
|
||||
+ static void setclientstate(Client *c, long state);
|
||||
+@@ -211,6 +216,7 @@ static void seturgent(Client *c, int urg);
|
||||
+ static void showhide(Client *c);
|
||||
+ static void sigchld(int unused);
|
||||
+ static void spawn(const Arg *arg);
|
||||
++static void spawnbar();
|
||||
+ static void tag(const Arg *arg);
|
||||
+ static void tagmon(const Arg *arg);
|
||||
+ static void tile(Monitor *);
|
||||
+@@ -236,6 +244,7 @@ static void updatewmhints(Client *c);
|
||||
+ static void view(const Arg *arg);
|
||||
+ static Client *wintoclient(Window w);
|
||||
+ static Monitor *wintomon(Window w);
|
||||
++static int wmclasscontains(Window win, const char *class, const char *name);
|
||||
+ static int xerror(Display *dpy, XErrorEvent *ee);
|
||||
+ static int xerrordummy(Display *dpy, XErrorEvent *ee);
|
||||
+ static int xerrorstart(Display *dpy, XErrorEvent *ee);
|
||||
+@@ -576,7 +587,7 @@ configurenotify(XEvent *e)
|
||||
+ for (c = m->clients; c; c = c->next)
|
||||
+ if (c->isfullscreen)
|
||||
+ resizeclient(c, m->mx, m->my, m->mw, m->mh);
|
||||
+- XMoveResizeWindow(dpy, m->barwin, m->wx, m->by, m->ww, bh);
|
||||
++ XMoveResizeWindow(dpy, m->barwin, m->wx, m->by, m->ww, m->bh);
|
||||
+ }
|
||||
+ focus(NULL);
|
||||
+ arrange(NULL);
|
||||
+@@ -658,10 +670,15 @@ void
|
||||
+ destroynotify(XEvent *e)
|
||||
+ {
|
||||
+ Client *c;
|
||||
++ Monitor *m;
|
||||
+ XDestroyWindowEvent *ev = &e->xdestroywindow;
|
||||
+
|
||||
+ if ((c = wintoclient(ev->window)))
|
||||
+ unmanage(c, 1);
|
||||
++ else if ((m = wintomon(ev->window)) && m->barwin == ev->window)
|
||||
++ unmanagealtbar(ev->window);
|
||||
++ else if (m->traywin == ev->window)
|
||||
++ unmanagetray(ev->window);
|
||||
+ }
|
||||
+
|
||||
+ void
|
||||
+@@ -705,6 +722,9 @@ dirtomon(int dir)
|
||||
+ void
|
||||
+ drawbar(Monitor *m)
|
||||
+ {
|
||||
++ if (usealtbar)
|
||||
++ return;
|
||||
++
|
||||
+ int x, w, tw = 0;
|
||||
+ int boxs = drw->fonts->h / 9;
|
||||
+ int boxw = drw->fonts->h / 6 + 2;
|
||||
+@@ -1785,9 +1879,18 @@ tile(Monitor *m)
|
||||
+ void
|
||||
+ togglebar(const Arg *arg)
|
||||
+ {
|
||||
++ /**
|
||||
++ * Polybar tray does not raise maprequest event. It must be manually scanned
|
||||
++ * for. Scanning it too early while the tray is being populated would give
|
||||
++ * wrong dimensions.
|
||||
++ */
|
||||
++ if (!selmon->traywin)
|
||||
++ scantray();
|
||||
++
|
||||
+ selmon->showbar = !selmon->showbar;
|
||||
+ updatebarpos(selmon);
|
||||
+- XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh);
|
||||
++ XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, selmon->bh);
|
||||
++ XMoveResizeWindow(dpy, selmon->traywin, selmon->tx, selmon->by, selmon->tw, selmon->bh);
|
||||
+ arrange(selmon);
|
||||
+ }
|
||||
+
|
||||
+@@ -1912,12 +2046,18 @@ unmapnotify(XEvent *e)
|
||||
+ setclientstate(c, WithdrawnState);
|
||||
+ else
|
||||
+ unmanage(c, 0);
|
||||
+- }
|
||||
++ } else if ((m = wintomon(ev->window)) && m->barwin == ev->window)
|
||||
++ unmanagealtbar(ev->window);
|
||||
++ else if (m->traywin == ev->window)
|
||||
++ unmanagetray(ev->window);
|
||||
+ }
|
||||
+
|
||||
+ void
|
||||
+ updatebars(void)
|
||||
+ {
|
||||
++ if (usealtbar)
|
||||
++ return;
|
||||
++
|
||||
+ Monitor *m;
|
||||
+ XSetWindowAttributes wa = {
|
||||
+ .override_redirect = True,
|
|
@ -1,13 +0,0 @@
|
|||
--- config.def.h
|
||||
+++ config.def.h
|
||||
@@ -5,6 +5,10 @@ static const unsigned int borderpx = 1; /* border pixel of windows */
|
||||
static const unsigned int snap = 32; /* snap pixel */
|
||||
static const int showbar = 1; /* 0 means no bar */
|
||||
static const int topbar = 1; /* 0 means bottom bar */
|
||||
+static const int usealtbar = 1; /* 1 means use non-dwm status bar */
|
||||
+static const char *altbarclass = "Polybar"; /* Alternate bar class name */
|
||||
+static const char *alttrayname = "tray"; /* Polybar tray instance name */
|
||||
+static const char *altbarcmd = "$HOME/bar.sh"; /* Alternate bar launch command */
|
||||
static const char *fonts[] = { "monospace:size=10" };
|
||||
static const char dmenufont[] = "monospace:size=10";
|
||||
static const char col_gray1[] = "#222222";
|
|
@ -17,12 +17,6 @@ static const int systraypinningfailfirst = 1; /* 1: if pinning fails, display
|
|||
static const int showsystray = 1; /* 0 means no systray */
|
||||
static const int showbar = 1; /* 0 means no bar */
|
||||
static const int topbar = 1; /* 0 means bottom bar */
|
||||
|
||||
static const int usealtbar = 1; /* 1 means use non-dwm status bar */
|
||||
static const char *altbarclass = "Polybar"; /* Alternate bar class name */
|
||||
static const char *alttrayname = "tray"; /* Polybar tray instance name */
|
||||
static const char *altbarcmd = "$HOME/bar.sh"; /* Alternate bar launch command */
|
||||
|
||||
static const char *fonts[] = { "monospace:size=11", "Noto Color Emoji:size=11", "Nerd Font Mono:weight=bold:size=15:antialias=true:hinting=true" };
|
||||
static const char dmenufont[] = "monospace:size=11";
|
||||
|
||||
|
@ -30,6 +24,8 @@ static const char dmenufont[] = "monospace:size=11";
|
|||
|
||||
// Autostart programs
|
||||
static const char *const autostart[] = {
|
||||
// Start my build of slstatus
|
||||
"slstatus", NULL,
|
||||
// Keyboard layouts switch (requires setxkbmap)
|
||||
"setxkbmap", "-model", "pc101", "-layout", "us,ar", "-variant", ",,", "-option", "grp:win_space_toggle", NULL,
|
||||
// "xkbset", "exp", "=sticky", "-twokey", "-latchlock", NULL, // sticky keys
|
||||
|
|
191
src/dwm.c
191
src/dwm.c
|
@ -47,8 +47,8 @@
|
|||
/* macros */
|
||||
#define BUTTONMASK (ButtonPressMask|ButtonReleaseMask)
|
||||
#define CLEANMASK(mask) (mask & ~(numlockmask|LockMask) & (ShiftMask|ControlMask|Mod1Mask|Mod2Mask|Mod3Mask|Mod4Mask|Mod5Mask))
|
||||
#define INTERSECT(x,y,w,h,m) (MAX(0, MIN((x)+(w),(m)->mx+(m)->mw) - MAX((x),(m)->mx)) \
|
||||
* MAX(0, MIN((y)+(h),(m)->my+(m)->mh) - MAX((y),(m)->my)))
|
||||
#define INTERSECT(x,y,w,h,m) (MAX(0, MIN((x)+(w),(m)->wx+(m)->ww) - MAX((x),(m)->wx)) \
|
||||
* MAX(0, MIN((y)+(h),(m)->wy+(m)->wh) - MAX((y),(m)->wy)))
|
||||
#define ISVISIBLE(C) ((C->tags & C->mon->tagset[C->mon->seltags]) || C->issticky)
|
||||
#define LENGTH(X) (sizeof X / sizeof X[0])
|
||||
#define MOUSEMASK (BUTTONMASK|PointerMotionMask)
|
||||
|
@ -137,8 +137,7 @@ struct Monitor {
|
|||
float mfact;
|
||||
int nmaster;
|
||||
int num;
|
||||
int by, bh; /* bar geometry */
|
||||
int tx, tw; /* bar tray geometry */
|
||||
int by; /* bar geometry */
|
||||
int mx, my, mw, mh; /* screen size */
|
||||
int wx, wy, ww, wh; /* window area */
|
||||
unsigned int seltags;
|
||||
|
@ -151,7 +150,6 @@ struct Monitor {
|
|||
Client *stack;
|
||||
Monitor *next;
|
||||
Window barwin;
|
||||
Window traywin;
|
||||
const Layout *lt[2];
|
||||
Pertag *pertag;
|
||||
};
|
||||
|
@ -210,8 +208,6 @@ static void incnmaster(const Arg *arg);
|
|||
static void keypress(XEvent *e);
|
||||
static void killclient(const Arg *arg);
|
||||
static void manage(Window w, XWindowAttributes *wa);
|
||||
static void managealtbar(Window win, XWindowAttributes *wa);
|
||||
static void managetray(Window win, XWindowAttributes *wa);
|
||||
static void mappingnotify(XEvent *e);
|
||||
static void maprequest(XEvent *e);
|
||||
static void monocle(Monitor *m);
|
||||
|
@ -231,7 +227,6 @@ static void resizerequest(XEvent *e);
|
|||
static void restack(Monitor *m);
|
||||
static void run(void);
|
||||
static void scan(void);
|
||||
static void scantray(void);
|
||||
static int sendevent(Window w, Atom proto, int m, long d0, long d1, long d2, long d3, long d4);
|
||||
static void sendmon(Client *c, Monitor *m);
|
||||
static void setclientstate(Client *c, long state);
|
||||
|
@ -245,7 +240,6 @@ static void seturgent(Client *c, int urg);
|
|||
static void showhide(Client *c);
|
||||
static void sigchld(int unused);
|
||||
static void spawn(const Arg *arg);
|
||||
static void spawnbar();
|
||||
static Monitor *systraytomon(Monitor *m);
|
||||
static void tag(const Arg *arg);
|
||||
static void tagmon(const Arg *arg);
|
||||
|
@ -257,8 +251,6 @@ static void toggletag(const Arg *arg);
|
|||
static void toggleview(const Arg *arg);
|
||||
static void unfocus(Client *c, int setfocus);
|
||||
static void unmanage(Client *c, int destroyed);
|
||||
static void unmanagealtbar(Window w);
|
||||
static void unmanagetray(Window w);
|
||||
static void unmapnotify(XEvent *e);
|
||||
static void updatebarpos(Monitor *m);
|
||||
static void updatebars(void);
|
||||
|
@ -277,7 +269,6 @@ static void view(const Arg *arg);
|
|||
static Client *wintoclient(Window w);
|
||||
static Monitor *wintomon(Window w);
|
||||
static Client *wintosystrayicon(Window w);
|
||||
static int wmclasscontains(Window win, const char *class, const char *name);
|
||||
static int xerror(Display *dpy, XErrorEvent *ee);
|
||||
static int xerrordummy(Display *dpy, XErrorEvent *ee);
|
||||
static int xerrorstart(Display *dpy, XErrorEvent *ee);
|
||||
|
@ -604,10 +595,8 @@ cleanupmon(Monitor *mon)
|
|||
for (m = mons; m && m->next != mon; m = m->next);
|
||||
m->next = mon->next;
|
||||
}
|
||||
if (!usealtbar) {
|
||||
XUnmapWindow(dpy, mon->barwin);
|
||||
XDestroyWindow(dpy, mon->barwin);
|
||||
}
|
||||
XUnmapWindow(dpy, mon->barwin);
|
||||
XDestroyWindow(dpy, mon->barwin);
|
||||
free(mon);
|
||||
}
|
||||
|
||||
|
@ -790,7 +779,6 @@ createmon(void)
|
|||
m->nmaster = nmaster;
|
||||
m->showbar = showbar;
|
||||
m->topbar = topbar;
|
||||
m->bh = bh;
|
||||
m->lt[0] = &layouts[0];
|
||||
m->lt[1] = &layouts[1 % LENGTH(layouts)];
|
||||
strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol);
|
||||
|
@ -815,15 +803,10 @@ void
|
|||
destroynotify(XEvent *e)
|
||||
{
|
||||
Client *c;
|
||||
Monitor *m;
|
||||
XDestroyWindowEvent *ev = &e->xdestroywindow;
|
||||
|
||||
if ((c = wintoclient(ev->window)))
|
||||
unmanage(c, 1);
|
||||
else if ((m = wintomon(ev->window)) && m->barwin == ev->window)
|
||||
unmanagealtbar(ev->window);
|
||||
else if (m->traywin == ev->window)
|
||||
unmanagetray(ev->window);
|
||||
else if ((c = wintosystrayicon(ev->window))) {
|
||||
removesystrayicon(c);
|
||||
resizebarwin(selmon);
|
||||
|
@ -872,8 +855,6 @@ dirtomon(int dir)
|
|||
void
|
||||
drawbar(Monitor *m)
|
||||
{
|
||||
if (usealtbar) return;
|
||||
|
||||
int x, w, tw = 0, stw = 0;
|
||||
int boxs = drw->fonts->h / 9;
|
||||
int boxw = drw->fonts->h / 6 + 2;
|
||||
|
@ -1344,8 +1325,6 @@ maprequest(XEvent *e)
|
|||
return;
|
||||
if (wa.override_redirect)
|
||||
return;
|
||||
if (wmclasscontains(ev->window, altbarclass, ""))
|
||||
managealtbar(ev->window, &wa);
|
||||
if (!wintoclient(ev->window))
|
||||
manage(ev->window, &wa);
|
||||
}
|
||||
|
@ -1546,7 +1525,7 @@ resizebarwin(Monitor *m) {
|
|||
unsigned int w = m->ww;
|
||||
if (showsystray && m == systraytomon(m) && !systrayonleft)
|
||||
w -= getsystraywidth();
|
||||
XMoveResizeWindow(dpy, m->barwin, m->wx, m->by, m->ww, m->bh);
|
||||
XMoveResizeWindow(dpy, m->barwin, m->wx, m->by, w, bh);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -1689,10 +1668,8 @@ scan(void)
|
|||
for (i = 0; i < num; i++) {
|
||||
if (!XGetWindowAttributes(dpy, wins[i], &wa)
|
||||
|| wa.override_redirect || XGetTransientForHint(dpy, wins[i], &d1))
|
||||
continue;
|
||||
if (wmclasscontains(wins[i], altbarclass, ""))
|
||||
managealtbar(wins[i], &wa);
|
||||
else if (wa.map_state == IsViewable || getstate(wins[i]) == IconicState)
|
||||
continue;
|
||||
if (wa.map_state == IsViewable || getstate(wins[i]) == IconicState)
|
||||
manage(wins[i], &wa);
|
||||
}
|
||||
for (i = 0; i < num; i++) { /* now the transients */
|
||||
|
@ -1707,28 +1684,6 @@ scan(void)
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
scantray(void)
|
||||
{
|
||||
unsigned int num;
|
||||
Window d1, d2, *wins = NULL;
|
||||
XWindowAttributes wa;
|
||||
|
||||
if (XQueryTree(dpy, root, &d1, &d2, &wins, &num)) {
|
||||
for (unsigned int i = 0; i < num; i++) {
|
||||
if (wmclasscontains(wins[i], altbarclass, alttrayname)) {
|
||||
if (!XGetWindowAttributes(dpy, wins[i], &wa))
|
||||
break;
|
||||
managetray(wins[i], &wa);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (wins)
|
||||
XFree(wins);
|
||||
}
|
||||
|
||||
void
|
||||
sendmon(Client *c, Monitor *m)
|
||||
{
|
||||
|
@ -1893,7 +1848,7 @@ setup(void)
|
|||
if (!drw_fontset_create(drw, fonts, LENGTH(fonts)))
|
||||
die("no fonts could be loaded.");
|
||||
lrpad = drw->fonts->h;
|
||||
bh = usealtbar ? 0 : drw->fonts->h + 2;
|
||||
bh = drw->fonts->h + 2;
|
||||
updategeom();
|
||||
/* init atoms */
|
||||
utf8string = XInternAtom(dpy, "UTF8_STRING", False);
|
||||
|
@ -1951,7 +1906,6 @@ setup(void)
|
|||
XSelectInput(dpy, root, wa.event_mask);
|
||||
grabkeys();
|
||||
focus(NULL);
|
||||
spawnbar();
|
||||
}
|
||||
|
||||
|
||||
|
@ -2026,13 +1980,6 @@ spawn(const Arg *arg)
|
|||
}
|
||||
}
|
||||
|
||||
void
|
||||
spawnbar()
|
||||
{
|
||||
if (*altbarcmd)
|
||||
system(altbarcmd);
|
||||
}
|
||||
|
||||
void
|
||||
tag(const Arg *arg)
|
||||
{
|
||||
|
@ -2054,19 +2001,9 @@ tagmon(const Arg *arg)
|
|||
void
|
||||
togglebar(const Arg *arg)
|
||||
{
|
||||
/**
|
||||
* Polybar tray does not raise maprequest event. It must be manually scanned
|
||||
* for. Scanning it too early while the tray is being populated would give
|
||||
* wrong dimensions.
|
||||
*/
|
||||
if (!selmon->traywin)
|
||||
scantray();
|
||||
|
||||
selmon->showbar = selmon->pertag->showbars[selmon->pertag->curtag] = !selmon->showbar;
|
||||
updatebarpos(selmon);
|
||||
resizebarwin(selmon);
|
||||
//TODO: 2022-07-17 Test
|
||||
XMoveResizeWindow(dpy, selmon->traywin, selmon->tx, selmon->by, selmon->tw, selmon->bh);
|
||||
if (showsystray) {
|
||||
XWindowChanges wc;
|
||||
if (!selmon->showbar)
|
||||
|
@ -2081,38 +2018,6 @@ togglebar(const Arg *arg)
|
|||
arrange(selmon);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
unmanagealtbar(Window w)
|
||||
{
|
||||
Monitor *m = wintomon(w);
|
||||
|
||||
if (!m)
|
||||
return;
|
||||
|
||||
m->barwin = 0;
|
||||
m->by = 0;
|
||||
m->bh = 0;
|
||||
updatebarpos(m);
|
||||
arrange(m);
|
||||
}
|
||||
|
||||
void
|
||||
unmanagetray(Window w)
|
||||
{
|
||||
Monitor *m = wintomon(w);
|
||||
|
||||
if (!m)
|
||||
return;
|
||||
|
||||
m->traywin = 0;
|
||||
m->tx = 0;
|
||||
m->tw = 0;
|
||||
updatebarpos(m);
|
||||
arrange(m);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
togglefloating(const Arg *arg)
|
||||
{
|
||||
|
@ -2229,7 +2134,6 @@ void
|
|||
unmapnotify(XEvent *e)
|
||||
{
|
||||
Client *c;
|
||||
Monitor *m;
|
||||
XUnmapEvent *ev = &e->xunmap;
|
||||
|
||||
if ((c = wintoclient(ev->window))) {
|
||||
|
@ -2237,10 +2141,7 @@ unmapnotify(XEvent *e)
|
|||
setclientstate(c, WithdrawnState);
|
||||
else
|
||||
unmanage(c, 0);
|
||||
} else if ((m = wintomon(ev->window)) && m->barwin == ev->window)
|
||||
unmanagealtbar(ev->window);
|
||||
else if (m->traywin == ev->window)
|
||||
unmanagetray(ev->window);
|
||||
}
|
||||
else if ((c = wintosystrayicon(ev->window))) {
|
||||
/* KLUDGE! sometimes icons occasionally unmap their windows, but do
|
||||
* _not_ destroy them. We map those windows back */
|
||||
|
@ -2252,8 +2153,6 @@ unmapnotify(XEvent *e)
|
|||
void
|
||||
updatebars(void)
|
||||
{
|
||||
if (usealtbar) return;
|
||||
|
||||
unsigned int w;
|
||||
Monitor *m;
|
||||
XSetWindowAttributes wa = {
|
||||
|
@ -2285,11 +2184,11 @@ updatebarpos(Monitor *m)
|
|||
m->wy = m->my;
|
||||
m->wh = m->mh;
|
||||
if (m->showbar) {
|
||||
m->wh -= m->bh;
|
||||
m->wh -= bh;
|
||||
m->by = m->topbar ? m->wy : m->wy + m->wh;
|
||||
m->wy = m->topbar ? m->wy + m->bh : m->wy;
|
||||
m->wy = m->topbar ? m->wy + bh : m->wy;
|
||||
} else
|
||||
m->by = -m->bh;
|
||||
m->by = -bh;
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -2592,45 +2491,6 @@ updatewindowtype(Client *c)
|
|||
c->isfloating = 1;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
managealtbar(Window win, XWindowAttributes *wa)
|
||||
{
|
||||
Monitor *m;
|
||||
if (!(m = recttomon(wa->x, wa->y, wa->width, wa->height)))
|
||||
return;
|
||||
|
||||
m->barwin = win;
|
||||
m->by = wa->y;
|
||||
bh = m->bh = wa->height;
|
||||
updatebarpos(m);
|
||||
arrange(m);
|
||||
XSelectInput(dpy, win, EnterWindowMask|FocusChangeMask|PropertyChangeMask|StructureNotifyMask);
|
||||
XMoveResizeWindow(dpy, win, wa->x, wa->y, wa->width, wa->height);
|
||||
XMapWindow(dpy, win);
|
||||
XChangeProperty(dpy, root, netatom[NetClientList], XA_WINDOW, 32, PropModeAppend,
|
||||
(unsigned char *) &win, 1);
|
||||
}
|
||||
|
||||
void
|
||||
managetray(Window win, XWindowAttributes *wa)
|
||||
{
|
||||
Monitor *m;
|
||||
if (!(m = recttomon(wa->x, wa->y, wa->width, wa->height)))
|
||||
return;
|
||||
|
||||
m->traywin = win;
|
||||
m->tx = wa->x;
|
||||
m->tw = wa->width;
|
||||
updatebarpos(m);
|
||||
arrange(m);
|
||||
XSelectInput(dpy, win, EnterWindowMask|FocusChangeMask|PropertyChangeMask|StructureNotifyMask);
|
||||
XMoveResizeWindow(dpy, win, wa->x, wa->y, wa->width, wa->height);
|
||||
XMapWindow(dpy, win);
|
||||
XChangeProperty(dpy, root, netatom[NetClientList], XA_WINDOW, 32, PropModeAppend,
|
||||
(unsigned char *) &win, 1);
|
||||
}
|
||||
|
||||
void
|
||||
updatewmhints(Client *c)
|
||||
{
|
||||
|
@ -2721,36 +2581,13 @@ 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 || w == m->traywin)
|
||||
if (w == m->barwin)
|
||||
return m;
|
||||
if ((c = wintoclient(w)))
|
||||
return c->mon;
|
||||
return selmon;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
wmclasscontains(Window win, const char *class, const char *name)
|
||||
{
|
||||
XClassHint ch = { NULL, NULL };
|
||||
int res = 1;
|
||||
|
||||
if (XGetClassHint(dpy, win, &ch)) {
|
||||
if (ch.res_name && strstr(ch.res_name, name) == NULL)
|
||||
res = 0;
|
||||
if (ch.res_class && strstr(ch.res_class, class) == NULL)
|
||||
res = 0;
|
||||
} else
|
||||
res = 0;
|
||||
|
||||
if (ch.res_class)
|
||||
XFree(ch.res_class);
|
||||
if (ch.res_name)
|
||||
XFree(ch.res_name);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
/* There's no way to check accesses to destroyed windows, thus those cases are
|
||||
* ignored (especially on UnmapNotify's). Other types of errors call Xlibs
|
||||
* default error handler, which may call exit. */
|
||||
|
|
112
src/dwm.c.rej
112
src/dwm.c.rej
|
@ -1,112 +0,0 @@
|
|||
--- dwm.c
|
||||
+++ dwm.c
|
||||
@@ -47,8 +47,8 @@
|
||||
/* macros */
|
||||
#define BUTTONMASK (ButtonPressMask|ButtonReleaseMask)
|
||||
#define CLEANMASK(mask) (mask & ~(numlockmask|LockMask) & (ShiftMask|ControlMask|Mod1Mask|Mod2Mask|Mod3Mask|Mod4Mask|Mod5Mask))
|
||||
-#define INTERSECT(x,y,w,h,m) (MAX(0, MIN((x)+(w),(m)->wx+(m)->ww) - MAX((x),(m)->wx)) \
|
||||
- * MAX(0, MIN((y)+(h),(m)->wy+(m)->wh) - MAX((y),(m)->wy)))
|
||||
+#define INTERSECT(x,y,w,h,m) (MAX(0, MIN((x)+(w),(m)->mx+(m)->mw) - MAX((x),(m)->mx)) \
|
||||
+ * MAX(0, MIN((y)+(h),(m)->my+(m)->mh) - MAX((y),(m)->my)))
|
||||
#define ISVISIBLE(C) ((C->tags & C->mon->tagset[C->mon->seltags]))
|
||||
#define LENGTH(X) (sizeof X / sizeof X[0])
|
||||
#define MOUSEMASK (BUTTONMASK|PointerMotionMask)
|
||||
@@ -199,6 +203,7 @@ static void resizemouse(const Arg *arg);
|
||||
static void restack(Monitor *m);
|
||||
static void run(void);
|
||||
static void scan(void);
|
||||
+static void scantray(void);
|
||||
static int sendevent(Client *c, Atom proto);
|
||||
static void sendmon(Client *c, Monitor *m);
|
||||
static void setclientstate(Client *c, long state);
|
||||
@@ -211,6 +216,7 @@ static void seturgent(Client *c, int urg);
|
||||
static void showhide(Client *c);
|
||||
static void sigchld(int unused);
|
||||
static void spawn(const Arg *arg);
|
||||
+static void spawnbar();
|
||||
static void tag(const Arg *arg);
|
||||
static void tagmon(const Arg *arg);
|
||||
static void tile(Monitor *);
|
||||
@@ -236,6 +244,7 @@ static void updatewmhints(Client *c);
|
||||
static void view(const Arg *arg);
|
||||
static Client *wintoclient(Window w);
|
||||
static Monitor *wintomon(Window w);
|
||||
+static int wmclasscontains(Window win, const char *class, const char *name);
|
||||
static int xerror(Display *dpy, XErrorEvent *ee);
|
||||
static int xerrordummy(Display *dpy, XErrorEvent *ee);
|
||||
static int xerrorstart(Display *dpy, XErrorEvent *ee);
|
||||
@@ -576,7 +587,7 @@ configurenotify(XEvent *e)
|
||||
for (c = m->clients; c; c = c->next)
|
||||
if (c->isfullscreen)
|
||||
resizeclient(c, m->mx, m->my, m->mw, m->mh);
|
||||
- XMoveResizeWindow(dpy, m->barwin, m->wx, m->by, m->ww, bh);
|
||||
+ XMoveResizeWindow(dpy, m->barwin, m->wx, m->by, m->ww, m->bh);
|
||||
}
|
||||
focus(NULL);
|
||||
arrange(NULL);
|
||||
@@ -658,10 +670,15 @@ void
|
||||
destroynotify(XEvent *e)
|
||||
{
|
||||
Client *c;
|
||||
+ Monitor *m;
|
||||
XDestroyWindowEvent *ev = &e->xdestroywindow;
|
||||
|
||||
if ((c = wintoclient(ev->window)))
|
||||
unmanage(c, 1);
|
||||
+ else if ((m = wintomon(ev->window)) && m->barwin == ev->window)
|
||||
+ unmanagealtbar(ev->window);
|
||||
+ else if (m->traywin == ev->window)
|
||||
+ unmanagetray(ev->window);
|
||||
}
|
||||
|
||||
void
|
||||
@@ -705,6 +722,9 @@ dirtomon(int dir)
|
||||
void
|
||||
drawbar(Monitor *m)
|
||||
{
|
||||
+ if (usealtbar)
|
||||
+ return;
|
||||
+
|
||||
int x, w, tw = 0;
|
||||
int boxs = drw->fonts->h / 9;
|
||||
int boxw = drw->fonts->h / 6 + 2;
|
||||
@@ -1785,9 +1879,18 @@ tile(Monitor *m)
|
||||
void
|
||||
togglebar(const Arg *arg)
|
||||
{
|
||||
+ /**
|
||||
+ * Polybar tray does not raise maprequest event. It must be manually scanned
|
||||
+ * for. Scanning it too early while the tray is being populated would give
|
||||
+ * wrong dimensions.
|
||||
+ */
|
||||
+ if (!selmon->traywin)
|
||||
+ scantray();
|
||||
+
|
||||
selmon->showbar = !selmon->showbar;
|
||||
updatebarpos(selmon);
|
||||
- XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh);
|
||||
+ XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, selmon->bh);
|
||||
+ XMoveResizeWindow(dpy, selmon->traywin, selmon->tx, selmon->by, selmon->tw, selmon->bh);
|
||||
arrange(selmon);
|
||||
}
|
||||
|
||||
@@ -1912,12 +2046,18 @@ unmapnotify(XEvent *e)
|
||||
setclientstate(c, WithdrawnState);
|
||||
else
|
||||
unmanage(c, 0);
|
||||
- }
|
||||
+ } else if ((m = wintomon(ev->window)) && m->barwin == ev->window)
|
||||
+ unmanagealtbar(ev->window);
|
||||
+ else if (m->traywin == ev->window)
|
||||
+ unmanagetray(ev->window);
|
||||
}
|
||||
|
||||
void
|
||||
updatebars(void)
|
||||
{
|
||||
+ if (usealtbar)
|
||||
+ return;
|
||||
+
|
||||
Monitor *m;
|
||||
XSetWindowAttributes wa = {
|
||||
.override_redirect = True,
|
Loading…
Reference in a new issue