it* dwm + patches Err codevoid.de 70 i Err codevoid.de 70 hgit clone git://git.codevoid.de/dwm-sdk URL:git://git.codevoid.de/dwm-sdk codevoid.de 70 1Log /git/dwm-sdk/log.gph codevoid.de 70 1Files /git/dwm-sdk/files.gph codevoid.de 70 1Refs /git/dwm-sdk/refs.gph codevoid.de 70 1README /git/dwm-sdk/file/README.gph codevoid.de 70 1LICENSE /git/dwm-sdk/file/LICENSE.gph codevoid.de 70 i--- Err codevoid.de 70 1commit f60e596d4c5b9b5a780fe086de9017e959ff5d2e /git/dwm-sdk/commit/f60e596d4c5b9b5a780fe086de9017e959ff5d2e.gph codevoid.de 70 1parent b201ae7e7e4413f56c83b519fc6284788009cb50 /git/dwm-sdk/commit/b201ae7e7e4413f56c83b519fc6284788009cb50.gph codevoid.de 70 hAuthor: Stefan Hagen URL:mailto:sh+git[at]codevoid[dot]de codevoid.de 70 iDate: Wed, 23 May 2018 17:44:31 +0200 Err codevoid.de 70 i Err codevoid.de 70 ibstack layout, systray patch, config changes Err codevoid.de 70 i Err codevoid.de 70 iDiffstat: Err codevoid.de 70 i M config.def.h | 8 ++++++++ Err codevoid.de 70 i M config.h | 8 ++++++-- Err codevoid.de 70 i M dwm.c | 457 +++++++++++++++++++++++++++---- Err codevoid.de 70 i A patches/dwm-bottomstack-6.1.diff | 101 +++++++++++++++++++++++++++++++ Err codevoid.de 70 i A patches/dwm-systray-20180314-3bd84… | 716 +++++++++++++++++++++++++++++++ Err codevoid.de 70 i Err codevoid.de 70 i5 files changed, 1236 insertions(+), 54 deletions(-) Err codevoid.de 70 i--- Err codevoid.de 70 1diff --git a/config.def.h b/config.def.h /git/dwm-sdk/file/config.def.h.gph codevoid.de 70 it@@ -3,6 +3,10 @@ Err codevoid.de 70 i /* appearance */ Err codevoid.de 70 i static const unsigned int borderpx = 1; /* border pixel of windows */ Err codevoid.de 70 i static const unsigned int snap = 32; /* snap pixel */ Err codevoid.de 70 i+static const unsigned int systraypinning = 0; /* 0: sloppy systray follows selected monitor, >0: pin systray to monitor X */ Err codevoid.de 70 i+static const unsigned int systrayspacing = 2; /* systray spacing */ Err codevoid.de 70 i+static const int systraypinningfailfirst = 1; /* 1: if pinning fails, display systray on the first monitor, False: display systray on the last monitor*/ Err codevoid.de 70 i+static const int showsystray = 1; /* 0 means no systray */ Err codevoid.de 70 i static const int showbar = 1; /* 0 means no bar */ Err codevoid.de 70 i static const int topbar = 1; /* 0 means bottom bar */ Err codevoid.de 70 i static const char *fonts[] = { "monospace:size=10" }; Err codevoid.de 70 it@@ -41,6 +45,8 @@ static const Layout layouts[] = { Err codevoid.de 70 i { "[]=", tile }, /* first entry is default */ Err codevoid.de 70 i { "><>", NULL }, /* no layout function means floating behavior */ Err codevoid.de 70 i { "[M]", monocle }, Err codevoid.de 70 i+ { "TTT", bstack }, Err codevoid.de 70 i+ { "===", bstackhoriz }, Err codevoid.de 70 i }; Err codevoid.de 70 i Err codevoid.de 70 i /* key definitions */ Err codevoid.de 70 it@@ -76,6 +82,8 @@ static Key keys[] = { Err codevoid.de 70 i { MODKEY, XK_t, setlayout, {.v = &layouts[0]} }, Err codevoid.de 70 i { MODKEY, XK_f, setlayout, {.v = &layouts[1]} }, Err codevoid.de 70 i { MODKEY, XK_m, setlayout, {.v = &layouts[2]} }, Err codevoid.de 70 i+ { MODKEY, XK_u, setlayout, {.v = &layouts[3]} }, Err codevoid.de 70 i+ { MODKEY, XK_o, setlayout, {.v = &layouts[4]} }, Err codevoid.de 70 i { MODKEY, XK_space, setlayout, {0} }, Err codevoid.de 70 i { MODKEY|ShiftMask, XK_space, togglefloating, {0} }, Err codevoid.de 70 i { MODKEY, XK_0, view, {.ui = ~0 } }, Err codevoid.de 70 1diff --git a/config.h b/config.h /git/dwm-sdk/file/config.h.gph codevoid.de 70 it@@ -3,6 +3,10 @@ Err codevoid.de 70 i /* appearance */ Err codevoid.de 70 i static const unsigned int borderpx = 1; /* border pixel of windows */ Err codevoid.de 70 i static const unsigned int snap = 32; /* snap pixel */ Err codevoid.de 70 i+static const unsigned int systraypinning = 0; /* 0: sloppy systray follows selected monitor, >0: pin systray to monitor X */ Err codevoid.de 70 i+static const unsigned int systrayspacing = 2; /* systray spacing */ Err codevoid.de 70 i+static const int systraypinningfailfirst = 1; /* 1: if pinning fails, display systray on the first monitor, False: display systray on the last monitor*/ Err codevoid.de 70 i+static const int showsystray = 1; /* 0 means no systray */ Err codevoid.de 70 i static const int showbar = 1; /* 0 means no bar */ Err codevoid.de 70 i static const int topbar = 1; /* 0 means bottom bar */ Err codevoid.de 70 i static const char *fonts[] = { "Droid Sans Mono for Powerline:size=11" }; Err codevoid.de 70 it@@ -38,7 +42,7 @@ static const int resizehints = 0; /* 1 means respect size hints in tiled resi Err codevoid.de 70 i Err codevoid.de 70 i static const Layout layouts[] = { Err codevoid.de 70 i /* symbol arrange function */ Err codevoid.de 70 i- { "[T]", tile }, /* first entry is default */ Err codevoid.de 70 i+ { "[T]", bstack }, Err codevoid.de 70 i { "[M]", monocle }, Err codevoid.de 70 i }; Err codevoid.de 70 i Err codevoid.de 70 it@@ -58,7 +62,7 @@ static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn() Err codevoid.de 70 i static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL }; Err codevoid.de 70 i static const char *termcmd[] = { "st", NULL }; Err codevoid.de 70 i static const char *bigtermcmd[] = { "st", "-f FuraCode Nerd Font:size=20:antialias=false:autohint=false", NULL }; Err codevoid.de 70 i-static const char *browsercmd[] = { "/home/sdk/.dwm/browser", NULL }; Err codevoid.de 70 i+static const char *browsercmd[] = { ".dwm/browser", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL }; Err codevoid.de 70 i Err codevoid.de 70 i static Key keys[] = { Err codevoid.de 70 i /* modifier key function argument */ Err codevoid.de 70 1diff --git a/dwm.c b/dwm.c /git/dwm-sdk/file/dwm.c.gph codevoid.de 70 it@@ -57,12 +57,30 @@ Err codevoid.de 70 i #define TAGMASK ((1 << LENGTH(tags)) - 1) Err codevoid.de 70 i #define TEXTW(X) (drw_fontset_getwidth(drw, (X)) + lrpad) Err codevoid.de 70 i Err codevoid.de 70 i+#define SYSTEM_TRAY_REQUEST_DOCK 0 Err codevoid.de 70 i+ Err codevoid.de 70 i+/* XEMBED messages */ Err codevoid.de 70 i+#define XEMBED_EMBEDDED_NOTIFY 0 Err codevoid.de 70 i+#define XEMBED_WINDOW_ACTIVATE 1 Err codevoid.de 70 i+#define XEMBED_FOCUS_IN 4 Err codevoid.de 70 i+#define XEMBED_MODALITY_ON 10 Err codevoid.de 70 i+ Err codevoid.de 70 i+#define XEMBED_MAPPED (1 << 0) Err codevoid.de 70 i+#define XEMBED_WINDOW_ACTIVATE 1 Err codevoid.de 70 i+#define XEMBED_WINDOW_DEACTIVATE 2 Err codevoid.de 70 i+ Err codevoid.de 70 i+#define VERSION_MAJOR 0 Err codevoid.de 70 i+#define VERSION_MINOR 0 Err codevoid.de 70 i+#define XEMBED_EMBEDDED_VERSION (VERSION_MAJOR << 16) | VERSION_MINOR Err codevoid.de 70 i+ Err codevoid.de 70 i /* enums */ Err codevoid.de 70 i enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */ Err codevoid.de 70 i enum { SchemeNorm, SchemeSel }; /* color schemes */ Err codevoid.de 70 i enum { NetSupported, NetWMName, NetWMState, NetWMCheck, Err codevoid.de 70 i+ NetSystemTray, NetSystemTrayOP, NetSystemTrayOrientation, NetSystemTrayOrientationHorz, Err codevoid.de 70 i NetWMFullscreen, NetActiveWindow, NetWMWindowType, Err codevoid.de 70 i NetWMWindowTypeDialog, NetClientList, NetLast }; /* EWMH atoms */ Err codevoid.de 70 i+enum { Manager, Xembed, XembedInfo, XLast }; /* Xembed atoms */ Err codevoid.de 70 i enum { WMProtocols, WMDelete, WMState, WMTakeFocus, WMLast }; /* default atoms */ Err codevoid.de 70 i enum { ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, Err codevoid.de 70 i ClkClientWin, ClkRootWin, ClkLast }; /* clicks */ Err codevoid.de 70 it@@ -141,6 +159,12 @@ typedef struct { Err codevoid.de 70 i int monitor; Err codevoid.de 70 i } Rule; Err codevoid.de 70 i Err codevoid.de 70 i+typedef struct Systray Systray; Err codevoid.de 70 i+struct Systray { Err codevoid.de 70 i+ Window win; Err codevoid.de 70 i+ Client *icons; Err codevoid.de 70 i+}; Err codevoid.de 70 i+ Err codevoid.de 70 i /* function declarations */ Err codevoid.de 70 i static void applyrules(Client *c); Err codevoid.de 70 i static int applysizehints(Client *c, int *x, int *y, int *w, int *h, int interact); Err codevoid.de 70 it@@ -169,8 +193,10 @@ static void focus(Client *c); Err codevoid.de 70 i static void focusin(XEvent *e); Err codevoid.de 70 i static void focusmon(const Arg *arg); Err codevoid.de 70 i static void focusstack(const Arg *arg); Err codevoid.de 70 i+static Atom getatomprop(Client *c, Atom prop); Err codevoid.de 70 i static int getrootptr(int *x, int *y); Err codevoid.de 70 i static long getstate(Window w); Err codevoid.de 70 i+static unsigned int getsystraywidth(); Err codevoid.de 70 i static int gettextprop(Window w, Atom atom, char *text, unsigned int size); Err codevoid.de 70 i static void grabbuttons(Client *c, int focused); Err codevoid.de 70 i static void grabkeys(void); Err codevoid.de 70 it@@ -188,13 +214,16 @@ static void pop(Client *); Err codevoid.de 70 i static void propertynotify(XEvent *e); Err codevoid.de 70 i static void quit(const Arg *arg); Err codevoid.de 70 i static Monitor *recttomon(int x, int y, int w, int h); Err codevoid.de 70 i+static void removesystrayicon(Client *i); Err codevoid.de 70 i static void resize(Client *c, int x, int y, int w, int h, int interact); Err codevoid.de 70 i+static void resizebarwin(Monitor *m); Err codevoid.de 70 i static void resizeclient(Client *c, int x, int y, int w, int h); Err codevoid.de 70 i static void resizemouse(const Arg *arg); Err codevoid.de 70 i+static void resizerequest(XEvent *e); Err codevoid.de 70 i static void restack(Monitor *m); Err codevoid.de 70 i static void run(void); Err codevoid.de 70 i static void scan(void); Err codevoid.de 70 i-static int sendevent(Client *c, Atom proto); Err codevoid.de 70 i+static int sendevent(Window w, Atom proto, int m, long d0, long d1, long d2, long d3, long d4); Err codevoid.de 70 i static void sendmon(Client *c, Monitor *m); Err codevoid.de 70 i static void setclientstate(Client *c, long state); Err codevoid.de 70 i static void setfocus(Client *c); Err codevoid.de 70 it@@ -206,9 +235,9 @@ static void seturgent(Client *c, int urg); Err codevoid.de 70 i static void showhide(Client *c); Err codevoid.de 70 i static void sigchld(int unused); Err codevoid.de 70 i static void spawn(const Arg *arg); Err codevoid.de 70 i+static Monitor *systraytomon(Monitor *m); Err codevoid.de 70 i static void tag(const Arg *arg); Err codevoid.de 70 i static void tagmon(const Arg *arg); Err codevoid.de 70 i-static void tile(Monitor *); Err codevoid.de 70 i static void togglebar(const Arg *arg); Err codevoid.de 70 i static void togglefloating(const Arg *arg); Err codevoid.de 70 i static void toggletag(const Arg *arg); Err codevoid.de 70 it@@ -223,18 +252,24 @@ static int updategeom(void); Err codevoid.de 70 i static void updatenumlockmask(void); Err codevoid.de 70 i static void updatesizehints(Client *c); Err codevoid.de 70 i static void updatestatus(void); Err codevoid.de 70 i+static void updatesystray(void); Err codevoid.de 70 i+static void updatesystrayicongeom(Client *i, int w, int h); Err codevoid.de 70 i+static void updatesystrayiconstate(Client *i, XPropertyEvent *ev); Err codevoid.de 70 i static void updatetitle(Client *c); Err codevoid.de 70 i static void updatewindowtype(Client *c); Err codevoid.de 70 i static void updatewmhints(Client *c); Err codevoid.de 70 i static void view(const Arg *arg); Err codevoid.de 70 i static Client *wintoclient(Window w); Err codevoid.de 70 i static Monitor *wintomon(Window w); Err codevoid.de 70 i+static Client *wintosystrayicon(Window w); Err codevoid.de 70 i static int xerror(Display *dpy, XErrorEvent *ee); Err codevoid.de 70 i static int xerrordummy(Display *dpy, XErrorEvent *ee); Err codevoid.de 70 i static int xerrorstart(Display *dpy, XErrorEvent *ee); Err codevoid.de 70 i static void zoom(const Arg *arg); Err codevoid.de 70 i+static void bstack(Monitor *m); Err codevoid.de 70 i Err codevoid.de 70 i /* variables */ Err codevoid.de 70 i+static Systray *systray = NULL; Err codevoid.de 70 i static const char broken[] = "broken"; Err codevoid.de 70 i static char stext[256]; Err codevoid.de 70 i static int screen; Err codevoid.de 70 it@@ -257,9 +292,10 @@ static void (*handler[LASTEvent]) (XEvent *) = { Err codevoid.de 70 i [MapRequest] = maprequest, Err codevoid.de 70 i [MotionNotify] = motionnotify, Err codevoid.de 70 i [PropertyNotify] = propertynotify, Err codevoid.de 70 i+ [ResizeRequest] = resizerequest, Err codevoid.de 70 i [UnmapNotify] = unmapnotify Err codevoid.de 70 i }; Err codevoid.de 70 i-static Atom wmatom[WMLast], netatom[NetLast]; Err codevoid.de 70 i+static Atom wmatom[WMLast], netatom[NetLast], xatom[XLast]; Err codevoid.de 70 i static int running = 1; Err codevoid.de 70 i static Cur *cursor[CurLast]; Err codevoid.de 70 i static Clr **scheme; Err codevoid.de 70 it@@ -482,6 +518,11 @@ cleanup(void) Err codevoid.de 70 i XUngrabKey(dpy, AnyKey, AnyModifier, root); Err codevoid.de 70 i while (mons) Err codevoid.de 70 i cleanupmon(mons); Err codevoid.de 70 i+ if (showsystray) { Err codevoid.de 70 i+ XUnmapWindow(dpy, systray->win); Err codevoid.de 70 i+ XDestroyWindow(dpy, systray->win); Err codevoid.de 70 i+ free(systray); Err codevoid.de 70 i+ } Err codevoid.de 70 i for (i = 0; i < CurLast; i++) Err codevoid.de 70 i drw_cur_free(drw, cursor[i]); Err codevoid.de 70 i for (i = 0; i < LENGTH(colors); i++) Err codevoid.de 70 it@@ -512,9 +553,52 @@ cleanupmon(Monitor *mon) Err codevoid.de 70 i void Err codevoid.de 70 i clientmessage(XEvent *e) Err codevoid.de 70 i { Err codevoid.de 70 i+ XWindowAttributes wa; Err codevoid.de 70 i+ XSetWindowAttributes swa; Err codevoid.de 70 i XClientMessageEvent *cme = &e->xclient; Err codevoid.de 70 i Client *c = wintoclient(cme->window); Err codevoid.de 70 i Err codevoid.de 70 i+ if (showsystray && cme->window == systray->win && cme->message_type == netatom[NetSystemTrayOP]) { Err codevoid.de 70 i+ /* add systray icons */ Err codevoid.de 70 i+ if (cme->data.l[1] == SYSTEM_TRAY_REQUEST_DOCK) { Err codevoid.de 70 i+ if (!(c = (Client *)calloc(1, sizeof(Client)))) Err codevoid.de 70 i+ die("fatal: could not malloc() %u bytes\n", sizeof(Client)); Err codevoid.de 70 i+ if (!(c->win = cme->data.l[2])) { Err codevoid.de 70 i+ free(c); Err codevoid.de 70 i+ return; Err codevoid.de 70 i+ } Err codevoid.de 70 i+ c->mon = selmon; Err codevoid.de 70 i+ c->next = systray->icons; Err codevoid.de 70 i+ systray->icons = c; Err codevoid.de 70 i+ XGetWindowAttributes(dpy, c->win, &wa); Err codevoid.de 70 i+ c->x = c->oldx = c->y = c->oldy = 0; Err codevoid.de 70 i+ c->w = c->oldw = wa.width; Err codevoid.de 70 i+ c->h = c->oldh = wa.height; Err codevoid.de 70 i+ c->oldbw = wa.border_width; Err codevoid.de 70 i+ c->bw = 0; Err codevoid.de 70 i+ c->isfloating = True; Err codevoid.de 70 i+ /* reuse tags field as mapped status */ Err codevoid.de 70 i+ c->tags = 1; Err codevoid.de 70 i+ updatesizehints(c); Err codevoid.de 70 i+ updatesystrayicongeom(c, wa.width, wa.height); Err codevoid.de 70 i+ XAddToSaveSet(dpy, c->win); Err codevoid.de 70 i+ XSelectInput(dpy, c->win, StructureNotifyMask | PropertyChangeMask | ResizeRedirectMask); Err codevoid.de 70 i+ XReparentWindow(dpy, c->win, systray->win, 0, 0); Err codevoid.de 70 i+ /* use parents background color */ Err codevoid.de 70 i+ swa.background_pixel = scheme[SchemeNorm][ColBg].pixel; Err codevoid.de 70 i+ XChangeWindowAttributes(dpy, c->win, CWBackPixel, &swa); Err codevoid.de 70 i+ sendevent(c->win, netatom[Xembed], StructureNotifyMask, CurrentTime, XEMBED_EMBEDDED_NOTIFY, 0 , systray->win, XEMBED_EMBEDDED_VERSION); Err codevoid.de 70 i+ /* FIXME not sure if I have to send these events, too */ Err codevoid.de 70 i+ sendevent(c->win, netatom[Xembed], StructureNotifyMask, CurrentTime, XEMBED_FOCUS_IN, 0 , systray->win, XEMBED_EMBEDDED_VERSION); Err codevoid.de 70 i+ sendevent(c->win, netatom[Xembed], StructureNotifyMask, CurrentTime, XEMBED_WINDOW_ACTIVATE, 0 , systray->win, XEMBED_EMBEDDED_VERSION); Err codevoid.de 70 i+ sendevent(c->win, netatom[Xembed], StructureNotifyMask, CurrentTime, XEMBED_MODALITY_ON, 0 , systray->win, XEMBED_EMBEDDED_VERSION); Err codevoid.de 70 i+ XSync(dpy, False); Err codevoid.de 70 i+ resizebarwin(selmon); Err codevoid.de 70 i+ updatesystray(); Err codevoid.de 70 i+ setclientstate(c, NormalState); Err codevoid.de 70 i+ } Err codevoid.de 70 i+ return; Err codevoid.de 70 i+ } Err codevoid.de 70 i if (!c) Err codevoid.de 70 i return; Err codevoid.de 70 i if (cme->message_type == netatom[NetWMState]) { Err codevoid.de 70 it@@ -567,7 +651,7 @@ configurenotify(XEvent *e) Err codevoid.de 70 i for (c = m->clients; c; c = c->next) Err codevoid.de 70 i if (c->isfullscreen) Err codevoid.de 70 i resizeclient(c, m->mx, m->my, m->mw, m->mh); Err codevoid.de 70 i- XMoveResizeWindow(dpy, m->barwin, m->wx, m->by, m->ww, bh); Err codevoid.de 70 i+ resizebarwin(m); Err codevoid.de 70 i } Err codevoid.de 70 i focus(NULL); Err codevoid.de 70 i arrange(NULL); Err codevoid.de 70 it@@ -652,6 +736,11 @@ destroynotify(XEvent *e) Err codevoid.de 70 i Err codevoid.de 70 i if ((c = wintoclient(ev->window))) Err codevoid.de 70 i unmanage(c, 1); Err codevoid.de 70 i+ else if ((c = wintosystrayicon(ev->window))) { Err codevoid.de 70 i+ removesystrayicon(c); Err codevoid.de 70 i+ resizebarwin(selmon); Err codevoid.de 70 i+ updatesystray(); Err codevoid.de 70 i+ } Err codevoid.de 70 i } Err codevoid.de 70 i Err codevoid.de 70 i void Err codevoid.de 70 it@@ -695,19 +784,23 @@ dirtomon(int dir) Err codevoid.de 70 i void Err codevoid.de 70 i drawbar(Monitor *m) Err codevoid.de 70 i { Err codevoid.de 70 i- int x, w, sw = 0; Err codevoid.de 70 i+ int x, w, sw = 0, stw = 0; Err codevoid.de 70 i int boxs = drw->fonts->h / 9; Err codevoid.de 70 i int boxw = drw->fonts->h / 6 + 2; Err codevoid.de 70 i unsigned int i, occ = 0, urg = 0; Err codevoid.de 70 i Client *c; Err codevoid.de 70 i Err codevoid.de 70 i+ if(showsystray && m == systraytomon(m)) Err codevoid.de 70 i+ stw = getsystraywidth(); Err codevoid.de 70 i+ Err codevoid.de 70 i /* draw status first so it can be overdrawn by tags later */ Err codevoid.de 70 i if (m == selmon) { /* status is only drawn on selected monitor */ Err codevoid.de 70 i drw_setscheme(drw, scheme[SchemeNorm]); Err codevoid.de 70 i- sw = TEXTW(stext) - lrpad + 2; /* 2px right padding */ Err codevoid.de 70 i- drw_text(drw, m->ww - sw, 0, sw, bh, 0, stext, 0); Err codevoid.de 70 i+ sw = TEXTW(stext) - lrpad / 2 + 2; /* 2px right padding */ Err codevoid.de 70 i+ drw_text(drw, m->ww - sw - stw, 0, sw, bh, lrpad / 2 - 2, stext, 0); Err codevoid.de 70 i } Err codevoid.de 70 i Err codevoid.de 70 i+ resizebarwin(m); Err codevoid.de 70 i for (c = m->clients; c; c = c->next) { Err codevoid.de 70 i occ |= c->tags; Err codevoid.de 70 i if (c->isurgent) Err codevoid.de 70 it@@ -728,7 +821,7 @@ drawbar(Monitor *m) Err codevoid.de 70 i drw_setscheme(drw, scheme[SchemeNorm]); Err codevoid.de 70 i x = drw_text(drw, x, 0, w, bh, lrpad / 2, m->ltsymbol, 0); Err codevoid.de 70 i Err codevoid.de 70 i- if ((w = m->ww - sw - x) > bh) { Err codevoid.de 70 i+ if ((w = m->ww - sw - stw - x) > bh) { Err codevoid.de 70 i if (m->sel) { Err codevoid.de 70 i drw_setscheme(drw, scheme[m == selmon ? SchemeSel : SchemeNorm]); Err codevoid.de 70 i drw_text(drw, x, 0, w, bh, lrpad / 2, m->sel->name, 0); Err codevoid.de 70 it@@ -739,7 +832,7 @@ drawbar(Monitor *m) Err codevoid.de 70 i drw_rect(drw, x, 0, w, bh, 1, 1); Err codevoid.de 70 i } Err codevoid.de 70 i } Err codevoid.de 70 i- drw_map(drw, m->barwin, 0, 0, m->ww, bh); Err codevoid.de 70 i+ drw_map(drw, m->barwin, 0, 0, m->ww - stw, bh); Err codevoid.de 70 i } Err codevoid.de 70 i Err codevoid.de 70 i void Err codevoid.de 70 it@@ -776,8 +869,11 @@ expose(XEvent *e) Err codevoid.de 70 i Monitor *m; Err codevoid.de 70 i XExposeEvent *ev = &e->xexpose; Err codevoid.de 70 i Err codevoid.de 70 i- if (ev->count == 0 && (m = wintomon(ev->window))) Err codevoid.de 70 i+ if (ev->count == 0 && (m = wintomon(ev->window))) { Err codevoid.de 70 i drawbar(m); Err codevoid.de 70 i+ if (m == selmon) Err codevoid.de 70 i+ updatesystray(); Err codevoid.de 70 i+ } Err codevoid.de 70 i } Err codevoid.de 70 i Err codevoid.de 70 i void Err codevoid.de 70 it@@ -862,10 +958,17 @@ getatomprop(Client *c, Atom prop) Err codevoid.de 70 i unsigned long dl; Err codevoid.de 70 i unsigned char *p = NULL; Err codevoid.de 70 i Atom da, atom = None; Err codevoid.de 70 i+ /* FIXME getatomprop should return the number of items and a pointer to Err codevoid.de 70 i+ * the stored data instead of this workaround */ Err codevoid.de 70 i+ Atom req = XA_ATOM; Err codevoid.de 70 i+ if (prop == xatom[XembedInfo]) Err codevoid.de 70 i+ req = xatom[XembedInfo]; Err codevoid.de 70 i Err codevoid.de 70 i- if (XGetWindowProperty(dpy, c->win, prop, 0L, sizeof atom, False, XA_ATOM, Err codevoid.de 70 i+ if (XGetWindowProperty(dpy, c->win, prop, 0L, sizeof atom, False, req, Err codevoid.de 70 i &da, &di, &dl, &dl, &p) == Success && p) { Err codevoid.de 70 i atom = *(Atom *)p; Err codevoid.de 70 i+ if (da == xatom[XembedInfo] && dl == 2) Err codevoid.de 70 i+ atom = ((Atom *)p)[1]; Err codevoid.de 70 i XFree(p); Err codevoid.de 70 i } Err codevoid.de 70 i return atom; Err codevoid.de 70 it@@ -899,6 +1002,16 @@ getstate(Window w) Err codevoid.de 70 i return result; Err codevoid.de 70 i } Err codevoid.de 70 i Err codevoid.de 70 i+unsigned int Err codevoid.de 70 i+getsystraywidth() Err codevoid.de 70 i+{ Err codevoid.de 70 i+ unsigned int w = 0; Err codevoid.de 70 i+ Client *i; Err codevoid.de 70 i+ if(showsystray) Err codevoid.de 70 i+ for(i = systray->icons; i; w += i->w + systrayspacing, i = i->next) ; Err codevoid.de 70 i+ return w ? w + systrayspacing : 1; Err codevoid.de 70 i+} Err codevoid.de 70 i+ Err codevoid.de 70 i int Err codevoid.de 70 i gettextprop(Window w, Atom atom, char *text, unsigned int size) Err codevoid.de 70 i { Err codevoid.de 70 it@@ -1003,7 +1116,7 @@ killclient(const Arg *arg) Err codevoid.de 70 i { Err codevoid.de 70 i if (!selmon->sel) Err codevoid.de 70 i return; Err codevoid.de 70 i- if (!sendevent(selmon->sel, wmatom[WMDelete])) { Err codevoid.de 70 i+ if (!sendevent(selmon->sel->win, wmatom[WMDelete], NoEventMask, wmatom[WMDelete], CurrentTime, 0 , 0, 0)) { Err codevoid.de 70 i XGrabServer(dpy); Err codevoid.de 70 i XSetErrorHandler(xerrordummy); Err codevoid.de 70 i XSetCloseDownMode(dpy, DestroyAll); Err codevoid.de 70 it@@ -1091,6 +1204,12 @@ maprequest(XEvent *e) Err codevoid.de 70 i { Err codevoid.de 70 i static XWindowAttributes wa; Err codevoid.de 70 i XMapRequestEvent *ev = &e->xmaprequest; Err codevoid.de 70 i+ Client *i; Err codevoid.de 70 i+ if ((i = wintosystrayicon(ev->window))) { Err codevoid.de 70 i+ sendevent(i->win, netatom[Xembed], StructureNotifyMask, CurrentTime, XEMBED_WINDOW_ACTIVATE, 0, systray->win, XEMBED_EMBEDDED_VERSION); Err codevoid.de 70 i+ resizebarwin(selmon); Err codevoid.de 70 i+ updatesystray(); Err codevoid.de 70 i+ } Err codevoid.de 70 i Err codevoid.de 70 i if (!XGetWindowAttributes(dpy, ev->window, &wa)) Err codevoid.de 70 i return; Err codevoid.de 70 it@@ -1215,6 +1334,16 @@ propertynotify(XEvent *e) Err codevoid.de 70 i Window trans; Err codevoid.de 70 i XPropertyEvent *ev = &e->xproperty; Err codevoid.de 70 i Err codevoid.de 70 i+ if ((c = wintosystrayicon(ev->window))) { Err codevoid.de 70 i+ if (ev->atom == XA_WM_NORMAL_HINTS) { Err codevoid.de 70 i+ updatesizehints(c); Err codevoid.de 70 i+ updatesystrayicongeom(c, c->w, c->h); Err codevoid.de 70 i+ } Err codevoid.de 70 i+ else Err codevoid.de 70 i+ updatesystrayiconstate(c, ev); Err codevoid.de 70 i+ resizebarwin(selmon); Err codevoid.de 70 i+ updatesystray(); Err codevoid.de 70 i+ } Err codevoid.de 70 i if ((ev->window == root) && (ev->atom == XA_WM_NAME)) Err codevoid.de 70 i updatestatus(); Err codevoid.de 70 i else if (ev->state == PropertyDelete) Err codevoid.de 70 it@@ -1266,6 +1395,20 @@ recttomon(int x, int y, int w, int h) Err codevoid.de 70 i } Err codevoid.de 70 i Err codevoid.de 70 i void Err codevoid.de 70 i+removesystrayicon(Client *i) Err codevoid.de 70 i+{ Err codevoid.de 70 i+ Client **ii; Err codevoid.de 70 i+ Err codevoid.de 70 i+ if (!showsystray || !i) Err codevoid.de 70 i+ return; Err codevoid.de 70 i+ for (ii = &systray->icons; *ii && *ii != i; ii = &(*ii)->next); Err codevoid.de 70 i+ if (ii) Err codevoid.de 70 i+ *ii = i->next; Err codevoid.de 70 i+ free(i); Err codevoid.de 70 i+} Err codevoid.de 70 i+ Err codevoid.de 70 i+ Err codevoid.de 70 i+void Err codevoid.de 70 i resize(Client *c, int x, int y, int w, int h, int interact) Err codevoid.de 70 i { Err codevoid.de 70 i if (applysizehints(c, &x, &y, &w, &h, interact)) Err codevoid.de 70 it@@ -1273,6 +1416,14 @@ resize(Client *c, int x, int y, int w, int h, int interact) Err codevoid.de 70 i } Err codevoid.de 70 i Err codevoid.de 70 i void Err codevoid.de 70 i+resizebarwin(Monitor *m) { Err codevoid.de 70 i+ unsigned int w = m->ww; Err codevoid.de 70 i+ if (showsystray && m == systraytomon(m)) Err codevoid.de 70 i+ w -= getsystraywidth(); Err codevoid.de 70 i+ XMoveResizeWindow(dpy, m->barwin, m->wx, m->by, w, bh); Err codevoid.de 70 i+} Err codevoid.de 70 i+ Err codevoid.de 70 i+void Err codevoid.de 70 i resizeclient(Client *c, int x, int y, int w, int h) Err codevoid.de 70 i { Err codevoid.de 70 i XWindowChanges wc; Err codevoid.de 70 it@@ -1345,6 +1496,19 @@ resizemouse(const Arg *arg) Err codevoid.de 70 i } Err codevoid.de 70 i Err codevoid.de 70 i void Err codevoid.de 70 i+resizerequest(XEvent *e) Err codevoid.de 70 i+{ Err codevoid.de 70 i+ XResizeRequestEvent *ev = &e->xresizerequest; Err codevoid.de 70 i+ Client *i; Err codevoid.de 70 i+ Err codevoid.de 70 i+ if ((i = wintosystrayicon(ev->window))) { Err codevoid.de 70 i+ updatesystrayicongeom(i, ev->width, ev->height); Err codevoid.de 70 i+ resizebarwin(selmon); Err codevoid.de 70 i+ updatesystray(); Err codevoid.de 70 i+ } Err codevoid.de 70 i+} Err codevoid.de 70 i+ Err codevoid.de 70 i+void Err codevoid.de 70 i restack(Monitor *m) Err codevoid.de 70 i { Err codevoid.de 70 i Client *c; Err codevoid.de 70 it@@ -1433,26 +1597,36 @@ setclientstate(Client *c, long state) Err codevoid.de 70 i } Err codevoid.de 70 i Err codevoid.de 70 i int Err codevoid.de 70 i-sendevent(Client *c, Atom proto) Err codevoid.de 70 i+sendevent(Window w, Atom proto, int mask, long d0, long d1, long d2, long d3, long d4) Err codevoid.de 70 i { Err codevoid.de 70 i int n; Err codevoid.de 70 i- Atom *protocols; Err codevoid.de 70 i+ Atom *protocols, mt; Err codevoid.de 70 i int exists = 0; Err codevoid.de 70 i XEvent ev; Err codevoid.de 70 i Err codevoid.de 70 i- if (XGetWMProtocols(dpy, c->win, &protocols, &n)) { Err codevoid.de 70 i- while (!exists && n--) Err codevoid.de 70 i- exists = protocols[n] == proto; Err codevoid.de 70 i- XFree(protocols); Err codevoid.de 70 i+ if (proto == wmatom[WMTakeFocus] || proto == wmatom[WMDelete]) { Err codevoid.de 70 i+ mt = wmatom[WMProtocols]; Err codevoid.de 70 i+ if (XGetWMProtocols(dpy, w, &protocols, &n)) { Err codevoid.de 70 i+ while (!exists && n--) Err codevoid.de 70 i+ exists = protocols[n] == proto; Err codevoid.de 70 i+ XFree(protocols); Err codevoid.de 70 i+ } Err codevoid.de 70 i+ } Err codevoid.de 70 i+ else { Err codevoid.de 70 i+ exists = True; Err codevoid.de 70 i+ mt = proto; Err codevoid.de 70 i } Err codevoid.de 70 i if (exists) { Err codevoid.de 70 i ev.type = ClientMessage; Err codevoid.de 70 i- ev.xclient.window = c->win; Err codevoid.de 70 i- ev.xclient.message_type = wmatom[WMProtocols]; Err codevoid.de 70 i+ ev.xclient.window = w; Err codevoid.de 70 i+ ev.xclient.message_type = mt; Err codevoid.de 70 i ev.xclient.format = 32; Err codevoid.de 70 i- ev.xclient.data.l[0] = proto; Err codevoid.de 70 i- ev.xclient.data.l[1] = CurrentTime; Err codevoid.de 70 i- XSendEvent(dpy, c->win, False, NoEventMask, &ev); Err codevoid.de 70 i+ ev.xclient.data.l[0] = d0; Err codevoid.de 70 i+ ev.xclient.data.l[1] = d1; Err codevoid.de 70 i+ ev.xclient.data.l[2] = d2; Err codevoid.de 70 i+ ev.xclient.data.l[3] = d3; Err codevoid.de 70 i+ ev.xclient.data.l[4] = d4; Err codevoid.de 70 i+ XSendEvent(dpy, w, False, mask, &ev); Err codevoid.de 70 i } Err codevoid.de 70 i return exists; Err codevoid.de 70 i } Err codevoid.de 70 it@@ -1466,7 +1640,7 @@ setfocus(Client *c) Err codevoid.de 70 i XA_WINDOW, 32, PropModeReplace, Err codevoid.de 70 i (unsigned char *) &(c->win), 1); Err codevoid.de 70 i } Err codevoid.de 70 i- sendevent(c, wmatom[WMTakeFocus]); Err codevoid.de 70 i+ sendevent(c->win, wmatom[WMTakeFocus], NoEventMask, wmatom[WMTakeFocus], CurrentTime, 0, 0, 0); Err codevoid.de 70 i } Err codevoid.de 70 i Err codevoid.de 70 i void Err codevoid.de 70 it@@ -1555,6 +1729,10 @@ setup(void) Err codevoid.de 70 i wmatom[WMTakeFocus] = XInternAtom(dpy, "WM_TAKE_FOCUS", False); Err codevoid.de 70 i netatom[NetActiveWindow] = XInternAtom(dpy, "_NET_ACTIVE_WINDOW", False); Err codevoid.de 70 i netatom[NetSupported] = XInternAtom(dpy, "_NET_SUPPORTED", False); Err codevoid.de 70 i+ netatom[NetSystemTray] = XInternAtom(dpy, "_NET_SYSTEM_TRAY_S0", False); Err codevoid.de 70 i+ netatom[NetSystemTrayOP] = XInternAtom(dpy, "_NET_SYSTEM_TRAY_OPCODE", False); Err codevoid.de 70 i+ netatom[NetSystemTrayOrientation] = XInternAtom(dpy, "_NET_SYSTEM_TRAY_ORIENTATION", False); Err codevoid.de 70 i+ netatom[NetSystemTrayOrientationHorz] = XInternAtom(dpy, "_NET_SYSTEM_TRAY_ORIENTATION_HORZ", False); Err codevoid.de 70 i netatom[NetWMName] = XInternAtom(dpy, "_NET_WM_NAME", False); Err codevoid.de 70 i netatom[NetWMState] = XInternAtom(dpy, "_NET_WM_STATE", False); Err codevoid.de 70 i netatom[NetWMCheck] = XInternAtom(dpy, "_NET_SUPPORTING_WM_CHECK", False); Err codevoid.de 70 it@@ -1562,6 +1740,9 @@ setup(void) Err codevoid.de 70 i netatom[NetWMWindowType] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE", False); Err codevoid.de 70 i netatom[NetWMWindowTypeDialog] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE_DIALOG", False); Err codevoid.de 70 i netatom[NetClientList] = XInternAtom(dpy, "_NET_CLIENT_LIST", False); Err codevoid.de 70 i+ xatom[Manager] = XInternAtom(dpy, "MANAGER", False); Err codevoid.de 70 i+ xatom[Xembed] = XInternAtom(dpy, "_XEMBED", False); Err codevoid.de 70 i+ xatom[XembedInfo] = XInternAtom(dpy, "_XEMBED_INFO", False); Err codevoid.de 70 i /* init cursors */ Err codevoid.de 70 i cursor[CurNormal] = drw_cur_create(drw, XC_left_ptr); Err codevoid.de 70 i cursor[CurResize] = drw_cur_create(drw, XC_sizing); Err codevoid.de 70 it@@ -1570,6 +1751,8 @@ setup(void) Err codevoid.de 70 i scheme = ecalloc(LENGTH(colors), sizeof(Clr *)); Err codevoid.de 70 i for (i = 0; i < LENGTH(colors); i++) Err codevoid.de 70 i scheme[i] = drw_scm_create(drw, colors[i], 3); Err codevoid.de 70 i+ /* init system tray */ Err codevoid.de 70 i+ updatesystray(); Err codevoid.de 70 i /* init bars */ Err codevoid.de 70 i updatebars(); Err codevoid.de 70 i updatestatus(); Err codevoid.de 70 it@@ -1671,37 +1854,22 @@ tagmon(const Arg *arg) Err codevoid.de 70 i } Err codevoid.de 70 i Err codevoid.de 70 i void Err codevoid.de 70 i-tile(Monitor *m) Err codevoid.de 70 i-{ Err codevoid.de 70 i- unsigned int i, n, h, mw, my, ty; Err codevoid.de 70 i- Client *c; Err codevoid.de 70 i- Err codevoid.de 70 i- for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++); Err codevoid.de 70 i- if (n == 0) Err codevoid.de 70 i- return; Err codevoid.de 70 i- Err codevoid.de 70 i- if (n > m->nmaster) Err codevoid.de 70 i- mw = m->nmaster ? m->ww * m->mfact : 0; Err codevoid.de 70 i- else Err codevoid.de 70 i- mw = m->ww; Err codevoid.de 70 i- for (i = my = ty = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) Err codevoid.de 70 i- if (i < m->nmaster) { Err codevoid.de 70 i- h = (m->wh - my) / (MIN(n, m->nmaster) - i); Err codevoid.de 70 i- resize(c, m->wx, m->wy + my, mw - (2*c->bw), h - (2*c->bw), 0); Err codevoid.de 70 i- my += HEIGHT(c); Err codevoid.de 70 i- } else { Err codevoid.de 70 i- h = (m->wh - ty) / (n - i); Err codevoid.de 70 i- resize(c, m->wx + mw, m->wy + ty, m->ww - mw - (2*c->bw), h - (2*c->bw), 0); Err codevoid.de 70 i- ty += HEIGHT(c); Err codevoid.de 70 i- } Err codevoid.de 70 i-} Err codevoid.de 70 i- Err codevoid.de 70 i-void Err codevoid.de 70 i togglebar(const Arg *arg) Err codevoid.de 70 i { Err codevoid.de 70 i selmon->showbar = !selmon->showbar; Err codevoid.de 70 i updatebarpos(selmon); Err codevoid.de 70 i- XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh); Err codevoid.de 70 i+ resizebarwin(selmon); Err codevoid.de 70 i+ if (showsystray) { Err codevoid.de 70 i+ XWindowChanges wc; Err codevoid.de 70 i+ if (!selmon->showbar) Err codevoid.de 70 i+ wc.y = -bh; Err codevoid.de 70 i+ else if (selmon->showbar) { Err codevoid.de 70 i+ wc.y = 0; Err codevoid.de 70 i+ if (!selmon->topbar) Err codevoid.de 70 i+ wc.y = selmon->mh - bh; Err codevoid.de 70 i+ } Err codevoid.de 70 i+ XConfigureWindow(dpy, systray->win, CWY, &wc); Err codevoid.de 70 i+ } Err codevoid.de 70 i arrange(selmon); Err codevoid.de 70 i } Err codevoid.de 70 i Err codevoid.de 70 it@@ -1796,11 +1964,18 @@ unmapnotify(XEvent *e) Err codevoid.de 70 i else Err codevoid.de 70 i unmanage(c, 0); Err codevoid.de 70 i } Err codevoid.de 70 i+ else if ((c = wintosystrayicon(ev->window))) { Err codevoid.de 70 i+ /* KLUDGE! sometimes icons occasionally unmap their windows, but do Err codevoid.de 70 i+ * _not_ destroy them. We map those windows back */ Err codevoid.de 70 i+ XMapRaised(dpy, c->win); Err codevoid.de 70 i+ updatesystray(); Err codevoid.de 70 i+ } Err codevoid.de 70 i } Err codevoid.de 70 i Err codevoid.de 70 i void Err codevoid.de 70 i updatebars(void) Err codevoid.de 70 i { Err codevoid.de 70 i+ unsigned int w; Err codevoid.de 70 i Monitor *m; Err codevoid.de 70 i XSetWindowAttributes wa = { Err codevoid.de 70 i .override_redirect = True, Err codevoid.de 70 it@@ -1811,10 +1986,15 @@ updatebars(void) Err codevoid.de 70 i for (m = mons; m; m = m->next) { Err codevoid.de 70 i if (m->barwin) Err codevoid.de 70 i continue; Err codevoid.de 70 i- m->barwin = XCreateWindow(dpy, root, m->wx, m->by, m->ww, bh, 0, DefaultDepth(dpy, screen), Err codevoid.de 70 i+ w = m->ww; Err codevoid.de 70 i+ if (showsystray && m == systraytomon(m)) Err codevoid.de 70 i+ w -= getsystraywidth(); Err codevoid.de 70 i+ m->barwin = XCreateWindow(dpy, root, m->wx, m->by, w, bh, 0, DefaultDepth(dpy, screen), Err codevoid.de 70 i CopyFromParent, DefaultVisual(dpy, screen), Err codevoid.de 70 i CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa); Err codevoid.de 70 i XDefineCursor(dpy, m->barwin, cursor[CurNormal]->cursor); Err codevoid.de 70 i+ if (showsystray && m == systraytomon(m)) Err codevoid.de 70 i+ XMapRaised(dpy, systray->win); Err codevoid.de 70 i XMapRaised(dpy, m->barwin); Err codevoid.de 70 i XSetClassHint(dpy, m->barwin, &ch); Err codevoid.de 70 i } Err codevoid.de 70 it@@ -1990,6 +2170,121 @@ updatestatus(void) Err codevoid.de 70 i if (!gettextprop(root, XA_WM_NAME, stext, sizeof(stext))) Err codevoid.de 70 i strcpy(stext, "dwm-"VERSION); Err codevoid.de 70 i drawbar(selmon); Err codevoid.de 70 i+ updatesystray(); Err codevoid.de 70 i+} Err codevoid.de 70 i+ Err codevoid.de 70 i+void Err codevoid.de 70 i+updatesystrayicongeom(Client *i, int w, int h) Err codevoid.de 70 i+{ Err codevoid.de 70 i+ if (i) { Err codevoid.de 70 i+ i->h = bh; Err codevoid.de 70 i+ if (w == h) Err codevoid.de 70 i+ i->w = bh; Err codevoid.de 70 i+ else if (h == bh) Err codevoid.de 70 i+ i->w = w; Err codevoid.de 70 i+ else Err codevoid.de 70 i+ i->w = (int) ((float)bh * ((float)w / (float)h)); Err codevoid.de 70 i+ applysizehints(i, &(i->x), &(i->y), &(i->w), &(i->h), False); Err codevoid.de 70 i+ /* force icons into the systray dimenons if they don't want to */ Err codevoid.de 70 i+ if (i->h > bh) { Err codevoid.de 70 i+ if (i->w == i->h) Err codevoid.de 70 i+ i->w = bh; Err codevoid.de 70 i+ else Err codevoid.de 70 i+ i->w = (int) ((float)bh * ((float)i->w / (float)i->h)); Err codevoid.de 70 i+ i->h = bh; Err codevoid.de 70 i+ } Err codevoid.de 70 i+ } Err codevoid.de 70 i+} Err codevoid.de 70 i+ Err codevoid.de 70 i+void Err codevoid.de 70 i+updatesystrayiconstate(Client *i, XPropertyEvent *ev) Err codevoid.de 70 i+{ Err codevoid.de 70 i+ long flags; Err codevoid.de 70 i+ int code = 0; Err codevoid.de 70 i+ Err codevoid.de 70 i+ if (!showsystray || !i || ev->atom != xatom[XembedInfo] || Err codevoid.de 70 i+ !(flags = getatomprop(i, xatom[XembedInfo]))) Err codevoid.de 70 i+ return; Err codevoid.de 70 i+ Err codevoid.de 70 i+ if (flags & XEMBED_MAPPED && !i->tags) { Err codevoid.de 70 i+ i->tags = 1; Err codevoid.de 70 i+ code = XEMBED_WINDOW_ACTIVATE; Err codevoid.de 70 i+ XMapRaised(dpy, i->win); Err codevoid.de 70 i+ setclientstate(i, NormalState); Err codevoid.de 70 i+ } Err codevoid.de 70 i+ else if (!(flags & XEMBED_MAPPED) && i->tags) { Err codevoid.de 70 i+ i->tags = 0; Err codevoid.de 70 i+ code = XEMBED_WINDOW_DEACTIVATE; Err codevoid.de 70 i+ XUnmapWindow(dpy, i->win); Err codevoid.de 70 i+ setclientstate(i, WithdrawnState); Err codevoid.de 70 i+ } Err codevoid.de 70 i+ else Err codevoid.de 70 i+ return; Err codevoid.de 70 i+ sendevent(i->win, xatom[Xembed], StructureNotifyMask, CurrentTime, code, 0, Err codevoid.de 70 i+ systray->win, XEMBED_EMBEDDED_VERSION); Err codevoid.de 70 i+} Err codevoid.de 70 i+ Err codevoid.de 70 i+void Err codevoid.de 70 i+updatesystray(void) Err codevoid.de 70 i+{ Err codevoid.de 70 i+ XSetWindowAttributes wa; Err codevoid.de 70 i+ XWindowChanges wc; Err codevoid.de 70 i+ Client *i; Err codevoid.de 70 i+ Monitor *m = systraytomon(NULL); Err codevoid.de 70 i+ unsigned int x = m->mx + m->mw; Err codevoid.de 70 i+ unsigned int w = 1; Err codevoid.de 70 i+ Err codevoid.de 70 i+ if (!showsystray) Err codevoid.de 70 i+ return; Err codevoid.de 70 i+ if (!systray) { Err codevoid.de 70 i+ /* init systray */ Err codevoid.de 70 i+ if (!(systray = (Systray *)calloc(1, sizeof(Systray)))) Err codevoid.de 70 i+ die("fatal: could not malloc() %u bytes\n", sizeof(Systray)); Err codevoid.de 70 i+ systray->win = XCreateSimpleWindow(dpy, root, x, m->by, w, bh, 0, 0, scheme[SchemeSel][ColBg].pixel); Err codevoid.de 70 i+ wa.event_mask = ButtonPressMask | ExposureMask; Err codevoid.de 70 i+ wa.override_redirect = True; Err codevoid.de 70 i+ wa.background_pixel = scheme[SchemeNorm][ColBg].pixel; Err codevoid.de 70 i+ XSelectInput(dpy, systray->win, SubstructureNotifyMask); Err codevoid.de 70 i+ XChangeProperty(dpy, systray->win, netatom[NetSystemTrayOrientation], XA_CARDINAL, 32, Err codevoid.de 70 i+ PropModeReplace, (unsigned char *)&netatom[NetSystemTrayOrientationHorz], 1); Err codevoid.de 70 i+ XChangeWindowAttributes(dpy, systray->win, CWEventMask|CWOverrideRedirect|CWBackPixel, &wa); Err codevoid.de 70 i+ XMapRaised(dpy, systray->win); Err codevoid.de 70 i+ XSetSelectionOwner(dpy, netatom[NetSystemTray], systray->win, CurrentTime); Err codevoid.de 70 i+ if (XGetSelectionOwner(dpy, netatom[NetSystemTray]) == systray->win) { Err codevoid.de 70 i+ sendevent(root, xatom[Manager], StructureNotifyMask, CurrentTime, netatom[NetSystemTray], systray->win, 0, 0); Err codevoid.de 70 i+ XSync(dpy, False); Err codevoid.de 70 i+ } Err codevoid.de 70 i+ else { Err codevoid.de 70 i+ fprintf(stderr, "dwm: unable to obtain system tray.\n"); Err codevoid.de 70 i+ free(systray); Err codevoid.de 70 i+ systray = NULL; Err codevoid.de 70 i+ return; Err codevoid.de 70 i+ } Err codevoid.de 70 i+ } Err codevoid.de 70 i+ for (w = 0, i = systray->icons; i; i = i->next) { Err codevoid.de 70 i+ /* make sure the background color stays the same */ Err codevoid.de 70 i+ wa.background_pixel = scheme[SchemeNorm][ColBg].pixel; Err codevoid.de 70 i+ XChangeWindowAttributes(dpy, i->win, CWBackPixel, &wa); Err codevoid.de 70 i+ XMapRaised(dpy, i->win); Err codevoid.de 70 i+ w += systrayspacing; Err codevoid.de 70 i+ i->x = w; Err codevoid.de 70 i+ XMoveResizeWindow(dpy, i->win, i->x, 0, i->w, i->h); Err codevoid.de 70 i+ w += i->w; Err codevoid.de 70 i+ if (i->mon != m) Err codevoid.de 70 i+ i->mon = m; Err codevoid.de 70 i+ } Err codevoid.de 70 i+ w = w ? w + systrayspacing : 1; Err codevoid.de 70 i+ x -= w; Err codevoid.de 70 i+ XMoveResizeWindow(dpy, systray->win, x, m->by, w, bh); Err codevoid.de 70 i+ wc.x = x; wc.y = m->by; wc.width = w; wc.height = bh; Err codevoid.de 70 i+ wc.stack_mode = Above; wc.sibling = m->barwin; Err codevoid.de 70 i+ XConfigureWindow(dpy, systray->win, CWX|CWY|CWWidth|CWHeight|CWSibling|CWStackMode, &wc); Err codevoid.de 70 i+ XMapWindow(dpy, systray->win); Err codevoid.de 70 i+ XMapSubwindows(dpy, systray->win); Err codevoid.de 70 i+ /* redraw background */ Err codevoid.de 70 i+ XSetForeground(dpy, drw->gc, scheme[SchemeNorm][ColBg].pixel); Err codevoid.de 70 i+ XFillRectangle(dpy, systray->win, drw->gc, 0, Err codevoid.de 70 .