From a3ef784a8d784da77f53f104275bec9a88a1908e Mon Sep 17 00:00:00 2001 From: JuliusHerrmann Date: Mon, 19 Oct 2020 18:46:47 +0200 Subject: [PATCH] added systray --- config.def.h | 4 + config.h | 4 + dwm | Bin 80144 -> 84832 bytes dwm.c | 404 ++++++++++++++++++++++++++-- dwm.o | Bin 68536 -> 78456 bytes systray.diff | 747 +++++++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 1133 insertions(+), 26 deletions(-) create mode 100644 systray.diff diff --git a/config.def.h b/config.def.h index fd05ee1..44adc16 100644 --- a/config.def.h +++ b/config.def.h @@ -8,6 +8,10 @@ static const unsigned int gappiv = 10; /* vert inner gap between window static const unsigned int gappoh = 10; /* horiz outer gap between windows and screen edge */ static const unsigned int gappov = 30; /* vert outer gap between windows and screen edge */ static int smartgaps = 0; /* 1 means no outer gap when there is only one window */ +static const unsigned int systraypinning = 0; /* 0: sloppy systray follows selected monitor, >0: pin systray to monitor X */ +static const unsigned int systrayspacing = 2; /* systray spacing */ +static const int systraypinningfailfirst = 1; /* 1: if pinning fails, display systray on the first monitor, False: display systray on the last monitor*/ +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 attachmode = 0; /* 0 master (default), 1 = above, 2 = aside, 3 = below, 4 = bottom */ diff --git a/config.h b/config.h index 13da7e9..a03fc85 100644 --- a/config.h +++ b/config.h @@ -8,6 +8,10 @@ static const unsigned int gappiv = 7; /* vert inner gap between windows static const unsigned int gappoh = 7; /* horiz outer gap between windows and screen edge */ static const unsigned int gappov = 7; /* vert outer gap between windows and screen edge */ static int smartgaps = 0; /* 1 means no outer gap when there is only one window */ +static const unsigned int systraypinning = 0; /* 0: sloppy systray follows selected monitor, >0: pin systray to monitor X */ +static const unsigned int systrayspacing = 2; /* systray spacing */ +static const int systraypinningfailfirst = 1; /* 1: if pinning fails, display systray on the first monitor, False: display systray on the last monitor*/ +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 attachmode = 4; /* 0 master (default), 1 = above, 2 = aside, 3 = below, 4 = bottom */ diff --git a/dwm b/dwm index ab9e958bbf47c37509439dd4639554f73100b81f..3d6e9104ff0717225ef09a4f6185df69fba4104b 100755 GIT binary patch literal 84832 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

X8;yOn1wZDoOZP*lAG~IEEYmUQ&6pC% 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 diff --git a/dwm.c b/dwm.c index 6b8e6f2..08de02e 100644 --- a/dwm.c +++ b/dwm.c @@ -56,13 +56,30 @@ #define HEIGHT(X) ((X)->h + 2 * (X)->bw) #define TAGMASK ((1 << LENGTH(tags)) - 1) #define TEXTW(X) (drw_fontset_getwidth(drw, (X)) + lrpad) +#define SYSTEM_TRAY_REQUEST_DOCK 0 + +/* XEMBED messages */ +#define XEMBED_EMBEDDED_NOTIFY 0 +#define XEMBED_WINDOW_ACTIVATE 1 +#define XEMBED_FOCUS_IN 4 +#define XEMBED_MODALITY_ON 10 + +#define XEMBED_MAPPED (1 << 0) +#define XEMBED_WINDOW_ACTIVATE 1 +#define XEMBED_WINDOW_DEACTIVATE 2 + +#define VERSION_MAJOR 0 +#define VERSION_MINOR 0 +#define XEMBED_EMBEDDED_VERSION (VERSION_MAJOR << 16) | VERSION_MINOR /* enums */ enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */ enum { SchemeNorm, SchemeSel, SchemeStatus, SchemeTagsSel, SchemeTagsNorm, SchemeInfoSel, SchemeInfoNorm }; /* color schemes */ enum { NetSupported, NetWMName, NetWMState, NetWMCheck, + NetSystemTray, NetSystemTrayOP, NetSystemTrayOrientation, NetSystemTrayOrientationHorz, NetWMFullscreen, NetActiveWindow, NetWMWindowType, NetWMWindowTypeDialog, NetClientList, NetLast }; /* EWMH atoms */ +enum { Manager, Xembed, XembedInfo, XLast }; /* Xembed atoms */ enum { WMProtocols, WMDelete, WMState, WMTakeFocus, WMLast }; /* default atoms */ enum { ClkTagBar, ClkLtSymbol, ClkStatusText, ClkClientWin, ClkRootWin, ClkLast }; /* clicks */ @@ -145,6 +162,12 @@ typedef struct { int monitor; } Rule; +typedef struct Systray Systray; +struct Systray { + Window win; + Client *icons; +}; + /* function declarations */ static void applyrules(Client *c); static int applysizehints(Client *c, int *x, int *y, int *w, int *h, int interact); @@ -162,9 +185,12 @@ static void configure(Client *c); static void configurenotify(XEvent *e); static void configurerequest(XEvent *e); static Monitor *createmon(void); +static void removesystrayicon(Client *i); static void cyclelayout(const Arg *arg); +static void resizebarwin(Monitor *m); static void destroynotify(XEvent *e); static void detach(Client *c); +static void resizerequest(XEvent *e); static void detachstack(Client *c); static Monitor *dirtomon(int dir); static void drawbar(Monitor *m); @@ -175,8 +201,10 @@ static void focus(Client *c); static void focusin(XEvent *e); static void focusmon(const Arg *arg); static void focusstack(const Arg *arg); +static Atom getatomprop(Client *c, Atom prop); static int getrootptr(int *x, int *y); static long getstate(Window w); +static unsigned int getsystraywidth(); static int gettextprop(Window w, Atom atom, char *text, unsigned int size); static void grabbuttons(Client *c, int focused); static void grabkeys(void); @@ -202,7 +230,7 @@ static void restack(Monitor *m); static void run(void); static void runAutostart(void); static void scan(void); -static int sendevent(Client *c, Atom proto); +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); static void setfocus(Client *c); @@ -214,6 +242,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 Monitor *systraytomon(Monitor *m); static void tag(const Arg *arg); static void tagmon(const Arg *arg); static void togglebar(const Arg *arg); @@ -231,18 +260,23 @@ static int updategeom(void); static void updatenumlockmask(void); static void updatesizehints(Client *c); static void updatestatus(void); +static void updatesystray(void); +static void updatesystrayicongeom(Client *i, int w, int h); +static void updatesystrayiconstate(Client *i, XPropertyEvent *ev); static void updatetitle(Client *c); static void updatewindowtype(Client *c); static void updatewmhints(Client *c); static void view(const Arg *arg); static Client *wintoclient(Window w); static Monitor *wintomon(Window w); +static Client *wintosystrayicon(Window w); static int xerror(Display *dpy, XErrorEvent *ee); static int xerrordummy(Display *dpy, XErrorEvent *ee); static int xerrorstart(Display *dpy, XErrorEvent *ee); static void zoom(const Arg *arg); /* variables */ +static Systray *systray = NULL; static const char broken[] = "broken"; static char stext[256]; static int screen; @@ -265,9 +299,10 @@ static void (*handler[LASTEvent]) (XEvent *) = { [MapRequest] = maprequest, [MotionNotify] = motionnotify, [PropertyNotify] = propertynotify, + [ResizeRequest] = resizerequest, [UnmapNotify] = unmapnotify }; -static Atom wmatom[WMLast], netatom[NetLast]; +static Atom wmatom[WMLast], netatom[NetLast], xatom[XLast]; static int running = 1; static Cur *cursor[CurLast]; static Clr **scheme; @@ -496,7 +531,7 @@ buttonpress(XEvent *e) if (i < LENGTH(tags)) { click = ClkTagBar; arg.ui = 1 << i; - } else if (ev->x < x + blw) + }else if (ev->x > selmon->ww - TEXTW(stext) - getsystraywidth()) click = ClkLtSymbol; else click = ClkStatusText; @@ -539,6 +574,11 @@ cleanup(void) XUngrabKey(dpy, AnyKey, AnyModifier, root); while (mons) cleanupmon(mons); + if (showsystray) { + XUnmapWindow(dpy, systray->win); + XDestroyWindow(dpy, systray->win); + free(systray); + } for (i = 0; i < CurLast; i++) drw_cur_free(drw, cursor[i]); for (i = 0; i < LENGTH(colors); i++) @@ -569,9 +609,57 @@ cleanupmon(Monitor *mon) void clientmessage(XEvent *e) { + XWindowAttributes wa; + XSetWindowAttributes swa; XClientMessageEvent *cme = &e->xclient; Client *c = wintoclient(cme->window); + if (showsystray && cme->window == systray->win && cme->message_type == netatom[NetSystemTrayOP]) { + /* add systray icons */ + if (cme->data.l[1] == SYSTEM_TRAY_REQUEST_DOCK) { + if (!(c = (Client *)calloc(1, sizeof(Client)))) + die("fatal: could not malloc() %u bytes\n", sizeof(Client)); + if (!(c->win = cme->data.l[2])) { + free(c); + return; + } + c->mon = selmon; + c->next = systray->icons; + systray->icons = c; + if (!XGetWindowAttributes(dpy, c->win, &wa)) { + /* use sane defaults */ + wa.width = bh; + wa.height = bh; + wa.border_width = 0; + } + c->x = c->oldx = c->y = c->oldy = 0; + c->w = c->oldw = wa.width; + c->h = c->oldh = wa.height; + c->oldbw = wa.border_width; + c->bw = 0; + c->isfloating = True; + /* reuse tags field as mapped status */ + c->tags = 1; + updatesizehints(c); + updatesystrayicongeom(c, wa.width, wa.height); + XAddToSaveSet(dpy, c->win); + XSelectInput(dpy, c->win, StructureNotifyMask | PropertyChangeMask | ResizeRedirectMask); + XReparentWindow(dpy, c->win, systray->win, 0, 0); + /* use parents background color */ + swa.background_pixel = scheme[SchemeNorm][ColBg].pixel; + XChangeWindowAttributes(dpy, c->win, CWBackPixel, &swa); + sendevent(c->win, netatom[Xembed], StructureNotifyMask, CurrentTime, XEMBED_EMBEDDED_NOTIFY, 0 , systray->win, XEMBED_EMBEDDED_VERSION); + /* FIXME not sure if I have to send these events, too */ + sendevent(c->win, netatom[Xembed], StructureNotifyMask, CurrentTime, XEMBED_FOCUS_IN, 0 , systray->win, XEMBED_EMBEDDED_VERSION); + sendevent(c->win, netatom[Xembed], StructureNotifyMask, CurrentTime, XEMBED_WINDOW_ACTIVATE, 0 , systray->win, XEMBED_EMBEDDED_VERSION); + sendevent(c->win, netatom[Xembed], StructureNotifyMask, CurrentTime, XEMBED_MODALITY_ON, 0 , systray->win, XEMBED_EMBEDDED_VERSION); + XSync(dpy, False); + resizebarwin(selmon); + updatesystray(); + setclientstate(c, NormalState); + } + return; + } if (!c) return; if (cme->message_type == netatom[NetWMState]) { @@ -624,7 +712,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); + resizebarwin(m); } focus(NULL); arrange(NULL); @@ -730,6 +818,11 @@ destroynotify(XEvent *e) if ((c = wintoclient(ev->window))) unmanage(c, 1); + else if ((c = wintosystrayicon(ev->window))) { + removesystrayicon(c); + resizebarwin(selmon); + updatesystray(); + } } void @@ -773,19 +866,23 @@ dirtomon(int dir) void drawbar(Monitor *m) { - int x, w, sw = 0; + int x, w, sw = 0, stw = 0; int boxs = drw->fonts->h / 9; int boxw = drw->fonts->h / 6 + 2; unsigned int i, occ = 0, urg = 0; Client *c; + if(showsystray && m == systraytomon(m)) + stw = getsystraywidth(); + /* draw status first so it can be overdrawn by tags later */ if (m == selmon) { /* status is only drawn on selected monitor */ drw_setscheme(drw, scheme[SchemeStatus]); - sw = TEXTW(stext) - lrpad + 2; /* 2px right padding */ - drw_text(drw, m->ww - sw, 0, sw, bh, 0, stext, 0); + sw = TEXTW(stext) - lrpad / 2 + 2; /* 2px right padding */ + drw_text(drw, m->ww - sw - stw, 0, sw, bh, lrpad / 2 - 2, stext, 0); } + resizebarwin(m); for (c = m->clients; c; c = c->next) { occ |= c->tags; if (c->isurgent) @@ -807,11 +904,11 @@ drawbar(Monitor *m) drw_setscheme(drw, scheme[SchemeTagsNorm]); x = drw_text(drw, x, 0, w, bh, lrpad / 2, m->ltsymbol, 0); - if ((w = m->ww - sw - x) > bh) { + if ((w = m->ww - sw - stw - x) > bh) { drw_setscheme(drw, scheme[m == selmon ? SchemeInfoSel : SchemeInfoNorm]); drw_rect(drw, x, 0, w, bh, 1, 1); } - drw_map(drw, m->barwin, 0, 0, m->ww, bh); + drw_map(drw, m->barwin, 0, 0, m->ww - stw, bh); } void @@ -848,8 +945,11 @@ expose(XEvent *e) Monitor *m; XExposeEvent *ev = &e->xexpose; - if (ev->count == 0 && (m = wintomon(ev->window))) + if (ev->count == 0 && (m = wintomon(ev->window))) { drawbar(m); + if (m == selmon) + updatesystray(); + } } void @@ -934,10 +1034,17 @@ getatomprop(Client *c, Atom prop) unsigned long dl; unsigned char *p = NULL; Atom da, atom = None; + /* FIXME getatomprop should return the number of items and a pointer to + * the stored data instead of this workaround */ + Atom req = XA_ATOM; + if (prop == xatom[XembedInfo]) + req = xatom[XembedInfo]; - if (XGetWindowProperty(dpy, c->win, prop, 0L, sizeof atom, False, XA_ATOM, + if (XGetWindowProperty(dpy, c->win, prop, 0L, sizeof atom, False, req, &da, &di, &dl, &dl, &p) == Success && p) { atom = *(Atom *)p; + if (da == xatom[XembedInfo] && dl == 2) + atom = ((Atom *)p)[1]; XFree(p); } return atom; @@ -971,6 +1078,16 @@ getstate(Window w) return result; } +unsigned int +getsystraywidth() +{ + unsigned int w = 0; + Client *i; + if(showsystray) + for(i = systray->icons; i; w += i->w + systrayspacing, i = i->next) ; + return w ? w + systrayspacing : 1; +} + int gettextprop(Window w, Atom atom, char *text, unsigned int size) { @@ -1075,7 +1192,7 @@ killclient(const Arg *arg) { if (!selmon->sel) return; - if (!sendevent(selmon->sel, wmatom[WMDelete])) { + if (!sendevent(selmon->sel->win, wmatom[WMDelete], NoEventMask, wmatom[WMDelete], CurrentTime, 0 , 0, 0)) { XGrabServer(dpy); XSetErrorHandler(xerrordummy); XSetCloseDownMode(dpy, DestroyAll); @@ -1163,6 +1280,12 @@ maprequest(XEvent *e) { static XWindowAttributes wa; XMapRequestEvent *ev = &e->xmaprequest; + Client *i; + if ((i = wintosystrayicon(ev->window))) { + sendevent(i->win, netatom[Xembed], StructureNotifyMask, CurrentTime, XEMBED_WINDOW_ACTIVATE, 0, systray->win, XEMBED_EMBEDDED_VERSION); + resizebarwin(selmon); + updatesystray(); + } if (!XGetWindowAttributes(dpy, ev->window, &wa)) return; @@ -1305,6 +1428,16 @@ propertynotify(XEvent *e) Window trans; XPropertyEvent *ev = &e->xproperty; + if ((c = wintosystrayicon(ev->window))) { + if (ev->atom == XA_WM_NORMAL_HINTS) { + updatesizehints(c); + updatesystrayicongeom(c, c->w, c->h); + } + else + updatesystrayiconstate(c, ev); + resizebarwin(selmon); + updatesystray(); + } if ((ev->window == root) && (ev->atom == XA_WM_NAME)) updatestatus(); else if (ev->state == PropertyDelete) @@ -1352,6 +1485,20 @@ recttomon(int x, int y, int w, int h) return r; } +void +removesystrayicon(Client *i) +{ + Client **ii; + + if (!showsystray || !i) + return; + for (ii = &systray->icons; *ii && *ii != i; ii = &(*ii)->next); + if (ii) + *ii = i->next; + free(i); +} + + void resize(Client *c, int x, int y, int w, int h, int interact) { @@ -1359,6 +1506,14 @@ resize(Client *c, int x, int y, int w, int h, int interact) resizeclient(c, x, y, w, h); } +void +resizebarwin(Monitor *m) { + unsigned int w = m->ww; + if (showsystray && m == systraytomon(m)) + w -= getsystraywidth(); + XMoveResizeWindow(dpy, m->barwin, m->wx, m->by, w, bh); +} + void resizeclient(Client *c, int x, int y, int w, int h) { @@ -1431,6 +1586,19 @@ resizemouse(const Arg *arg) } } +void +resizerequest(XEvent *e) +{ + XResizeRequestEvent *ev = &e->xresizerequest; + Client *i; + + if ((i = wintosystrayicon(ev->window))) { + updatesystrayicongeom(i, ev->width, ev->height); + resizebarwin(selmon); + updatesystray(); + } +} + void restack(Monitor *m) { @@ -1526,26 +1694,36 @@ setclientstate(Client *c, long state) } int -sendevent(Client *c, Atom proto) +sendevent(Window w, Atom proto, int mask, long d0, long d1, long d2, long d3, long d4) { int n; - Atom *protocols; + Atom *protocols, mt; int exists = 0; XEvent ev; - if (XGetWMProtocols(dpy, c->win, &protocols, &n)) { - while (!exists && n--) - exists = protocols[n] == proto; - XFree(protocols); + if (proto == wmatom[WMTakeFocus] || proto == wmatom[WMDelete]) { + mt = wmatom[WMProtocols]; + if (XGetWMProtocols(dpy, w, &protocols, &n)) { + while (!exists && n--) + exists = protocols[n] == proto; + XFree(protocols); + } + } + else { + exists = True; + mt = proto; } if (exists) { ev.type = ClientMessage; - ev.xclient.window = c->win; - ev.xclient.message_type = wmatom[WMProtocols]; + ev.xclient.window = w; + ev.xclient.message_type = mt; ev.xclient.format = 32; - ev.xclient.data.l[0] = proto; - ev.xclient.data.l[1] = CurrentTime; - XSendEvent(dpy, c->win, False, NoEventMask, &ev); + ev.xclient.data.l[0] = d0; + ev.xclient.data.l[1] = d1; + ev.xclient.data.l[2] = d2; + ev.xclient.data.l[3] = d3; + ev.xclient.data.l[4] = d4; + XSendEvent(dpy, w, False, mask, &ev); } return exists; } @@ -1559,7 +1737,7 @@ setfocus(Client *c) XA_WINDOW, 32, PropModeReplace, (unsigned char *) &(c->win), 1); } - sendevent(c, wmatom[WMTakeFocus]); + sendevent(c->win, wmatom[WMTakeFocus], NoEventMask, wmatom[WMTakeFocus], CurrentTime, 0, 0, 0); } void @@ -1648,6 +1826,10 @@ setup(void) wmatom[WMTakeFocus] = XInternAtom(dpy, "WM_TAKE_FOCUS", False); netatom[NetActiveWindow] = XInternAtom(dpy, "_NET_ACTIVE_WINDOW", False); netatom[NetSupported] = XInternAtom(dpy, "_NET_SUPPORTED", False); + netatom[NetSystemTray] = XInternAtom(dpy, "_NET_SYSTEM_TRAY_S0", False); + netatom[NetSystemTrayOP] = XInternAtom(dpy, "_NET_SYSTEM_TRAY_OPCODE", False); + netatom[NetSystemTrayOrientation] = XInternAtom(dpy, "_NET_SYSTEM_TRAY_ORIENTATION", False); + netatom[NetSystemTrayOrientationHorz] = XInternAtom(dpy, "_NET_SYSTEM_TRAY_ORIENTATION_HORZ", False); netatom[NetWMName] = XInternAtom(dpy, "_NET_WM_NAME", False); netatom[NetWMState] = XInternAtom(dpy, "_NET_WM_STATE", False); netatom[NetWMCheck] = XInternAtom(dpy, "_NET_SUPPORTING_WM_CHECK", False); @@ -1655,6 +1837,9 @@ setup(void) netatom[NetWMWindowType] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE", False); netatom[NetWMWindowTypeDialog] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE_DIALOG", False); netatom[NetClientList] = XInternAtom(dpy, "_NET_CLIENT_LIST", False); + xatom[Manager] = XInternAtom(dpy, "MANAGER", False); + xatom[Xembed] = XInternAtom(dpy, "_XEMBED", False); + xatom[XembedInfo] = XInternAtom(dpy, "_XEMBED_INFO", False); /* init cursors */ cursor[CurNormal] = drw_cur_create(drw, XC_left_ptr); cursor[CurResize] = drw_cur_create(drw, XC_sizing); @@ -1663,6 +1848,8 @@ setup(void) scheme = ecalloc(LENGTH(colors), sizeof(Clr *)); for (i = 0; i < LENGTH(colors); i++) scheme[i] = drw_scm_create(drw, colors[i], 3); + /* init system tray */ + updatesystray(); /* init bars */ updatebars(); updatestatus(); @@ -1768,7 +1955,18 @@ togglebar(const Arg *arg) { selmon->showbar = !selmon->showbar; updatebarpos(selmon); -- XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh); + resizebarwin(selmon); + if (showsystray) { + XWindowChanges wc; + if (!selmon->showbar) + wc.y = -bh; + else if (selmon->showbar) { + wc.y = 0; + if (!selmon->topbar) + wc.y = selmon->mh - bh; + } + XConfigureWindow(dpy, systray->win, CWY, &wc); + } arrange(selmon); } @@ -1871,11 +2069,19 @@ unmapnotify(XEvent *e) else unmanage(c, 0); } + + else if ((c = wintosystrayicon(ev->window))) { + /* KLUDGE! sometimes icons occasionally unmap their windows, but do + * _not_ destroy them. We map those windows back */ + XMapRaised(dpy, c->win); + updatesystray(); + } } void updatebars(void) { + unsigned int w; Monitor *m; XSetWindowAttributes wa = { .override_redirect = True, @@ -1886,10 +2092,15 @@ updatebars(void) for (m = mons; m; m = m->next) { if (m->barwin) continue; - m->barwin = XCreateWindow(dpy, root, m->wx, m->by, m->ww, bh, 0, DefaultDepth(dpy, screen), + w = m->ww; + if (showsystray && m == systraytomon(m)) + w -= getsystraywidth(); + m->barwin = XCreateWindow(dpy, root, m->wx, m->by, w, bh, 0, DefaultDepth(dpy, screen), CopyFromParent, DefaultVisual(dpy, screen), CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa); XDefineCursor(dpy, m->barwin, cursor[CurNormal]->cursor); + if (showsystray && m == systraytomon(m)) + XMapRaised(dpy, systray->win); XMapRaised(dpy, m->barwin); XSetClassHint(dpy, m->barwin, &ch); } @@ -2065,6 +2276,121 @@ updatestatus(void) if (!gettextprop(root, XA_WM_NAME, stext, sizeof(stext))) strcpy(stext, "dwm-"VERSION); drawbar(selmon); + updatesystray(); +} + +void +updatesystrayicongeom(Client *i, int w, int h) +{ + if (i) { + i->h = bh; + if (w == h) + i->w = bh; + else if (h == bh) + i->w = w; + else + i->w = (int) ((float)bh * ((float)w / (float)h)); + applysizehints(i, &(i->x), &(i->y), &(i->w), &(i->h), False); + /* force icons into the systray dimensions if they don't want to */ + if (i->h > bh) { + if (i->w == i->h) + i->w = bh; + else + i->w = (int) ((float)bh * ((float)i->w / (float)i->h)); + i->h = bh; + } + } +} + +void +updatesystrayiconstate(Client *i, XPropertyEvent *ev) +{ + long flags; + int code = 0; + + if (!showsystray || !i || ev->atom != xatom[XembedInfo] || + !(flags = getatomprop(i, xatom[XembedInfo]))) + return; + + if (flags & XEMBED_MAPPED && !i->tags) { + i->tags = 1; + code = XEMBED_WINDOW_ACTIVATE; + XMapRaised(dpy, i->win); + setclientstate(i, NormalState); + } + else if (!(flags & XEMBED_MAPPED) && i->tags) { + i->tags = 0; + code = XEMBED_WINDOW_DEACTIVATE; + XUnmapWindow(dpy, i->win); + setclientstate(i, WithdrawnState); + } + else + return; + sendevent(i->win, xatom[Xembed], StructureNotifyMask, CurrentTime, code, 0, + systray->win, XEMBED_EMBEDDED_VERSION); +} + +void +updatesystray(void) +{ + XSetWindowAttributes wa; + XWindowChanges wc; + Client *i; + Monitor *m = systraytomon(NULL); + unsigned int x = m->mx + m->mw; + unsigned int w = 1; + + if (!showsystray) + return; + if (!systray) { + /* init systray */ + if (!(systray = (Systray *)calloc(1, sizeof(Systray)))) + die("fatal: could not malloc() %u bytes\n", sizeof(Systray)); + systray->win = XCreateSimpleWindow(dpy, root, x, m->by, w, bh, 0, 0, scheme[SchemeSel][ColBg].pixel); + wa.event_mask = ButtonPressMask | ExposureMask; + wa.override_redirect = True; + wa.background_pixel = scheme[SchemeNorm][ColBg].pixel; + XSelectInput(dpy, systray->win, SubstructureNotifyMask); + XChangeProperty(dpy, systray->win, netatom[NetSystemTrayOrientation], XA_CARDINAL, 32, + PropModeReplace, (unsigned char *)&netatom[NetSystemTrayOrientationHorz], 1); + XChangeWindowAttributes(dpy, systray->win, CWEventMask|CWOverrideRedirect|CWBackPixel, &wa); + XMapRaised(dpy, systray->win); + XSetSelectionOwner(dpy, netatom[NetSystemTray], systray->win, CurrentTime); + if (XGetSelectionOwner(dpy, netatom[NetSystemTray]) == systray->win) { + sendevent(root, xatom[Manager], StructureNotifyMask, CurrentTime, netatom[NetSystemTray], systray->win, 0, 0); + XSync(dpy, False); + } + else { + fprintf(stderr, "dwm: unable to obtain system tray.\n"); + free(systray); + systray = NULL; + return; + } + } + for (w = 0, i = systray->icons; i; i = i->next) { + /* make sure the background color stays the same */ + wa.background_pixel = scheme[SchemeNorm][ColBg].pixel; + XChangeWindowAttributes(dpy, i->win, CWBackPixel, &wa); + XMapRaised(dpy, i->win); + w += systrayspacing; + i->x = w; + XMoveResizeWindow(dpy, i->win, i->x, 0, i->w, i->h); + w += i->w; + if (i->mon != m) + i->mon = m; + } + w = w ? w + systrayspacing : 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.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); + XFillRectangle(dpy, systray->win, drw->gc, 0, 0, w, bh); + XSync(dpy, False); } void @@ -2132,6 +2458,16 @@ wintoclient(Window w) return NULL; } +Client * +wintosystrayicon(Window w) { + Client *i = NULL; + + if (!showsystray || !w) + return i; + for (i = systray->icons; i && i->win != w; i = i->next) ; + return i; +} + Monitor * wintomon(Window w) { @@ -2185,6 +2521,22 @@ xerrorstart(Display *dpy, XErrorEvent *ee) return -1; } +Monitor * +systraytomon(Monitor *m) { + Monitor *t; + int i, n; + if(!systraypinning) { + if(!m) + return selmon; + return m == selmon ? m : NULL; + } + for(n = 1, t = mons; t && t->next; n++, t = t->next) ; + for(i = 1, t = mons; t && t->next && i < systraypinning; i++, t = t->next) ; + if(systraypinningfailfirst && n < systraypinning) + return mons; + return t; +} + void zoom(const Arg *arg) { diff --git a/dwm.o b/dwm.o index a9d751d210d8adbde452f36d98cf0b2b66e1aab0..9579b0773006b47ed6f21f6f64441285e6ebe34b 100644 GIT binary patch literal 78456 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 sGS2{KY3Bu&O-?k%UELZ!9v`^S{Cg8D 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 d=YBqtmR{d~LDE*Pe9z{tF0Ga+Lr8 diff --git a/systray.diff b/systray.diff new file mode 100644 index 0000000..5d10160 --- /dev/null +++ b/systray.diff @@ -0,0 +1,747 @@ +From 4001ccae7b1a41bdcb247b0cf095a51af7b68c28 Mon Sep 17 00:00:00 2001 +From: Igor Gevka +Date: Sun, 16 Feb 2020 15:03:10 -0800 +Subject: [PATCH] [PATCH] Implements a system tray for dwm. + +Original author: Jan Christoph Ebersbach , inspired by http://code.google.com/p/dwm-plus +URL: http://dwm.suckless.org/patches/systray +dwm 6.2 port by Igor Gevka +--- + config.def.h | 4 + + dwm.c | 404 +++++++++++++++++++++++++++++++++++++++++++++++---- + 2 files changed, 382 insertions(+), 26 deletions(-) + +diff --git a/config.def.h b/config.def.h +index 1c0b587..2d824d1 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -3,6 +3,10 @@ + /* appearance */ + static const unsigned int borderpx = 1; /* border pixel of windows */ + static const unsigned int snap = 32; /* snap pixel */ ++static const unsigned int systraypinning = 0; /* 0: sloppy systray follows selected monitor, >0: pin systray to monitor X */ ++static const unsigned int systrayspacing = 2; /* systray spacing */ ++static const int systraypinningfailfirst = 1; /* 1: if pinning fails, display systray on the first monitor, False: display systray on the last monitor*/ ++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 char *fonts[] = { "monospace:size=10" }; +diff --git a/dwm.c b/dwm.c +index 4465af1..3e361fa 100644 +--- a/dwm.c ++++ b/dwm.c +@@ -57,12 +57,30 @@ + #define TAGMASK ((1 << LENGTH(tags)) - 1) + #define TEXTW(X) (drw_fontset_getwidth(drw, (X)) + lrpad) + ++#define SYSTEM_TRAY_REQUEST_DOCK 0 ++ ++/* XEMBED messages */ ++#define XEMBED_EMBEDDED_NOTIFY 0 ++#define XEMBED_WINDOW_ACTIVATE 1 ++#define XEMBED_FOCUS_IN 4 ++#define XEMBED_MODALITY_ON 10 ++ ++#define XEMBED_MAPPED (1 << 0) ++#define XEMBED_WINDOW_ACTIVATE 1 ++#define XEMBED_WINDOW_DEACTIVATE 2 ++ ++#define VERSION_MAJOR 0 ++#define VERSION_MINOR 0 ++#define XEMBED_EMBEDDED_VERSION (VERSION_MAJOR << 16) | VERSION_MINOR ++ + /* enums */ + enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */ + enum { SchemeNorm, SchemeSel }; /* color schemes */ + enum { NetSupported, NetWMName, NetWMState, NetWMCheck, ++ NetSystemTray, NetSystemTrayOP, NetSystemTrayOrientation, NetSystemTrayOrientationHorz, + NetWMFullscreen, NetActiveWindow, NetWMWindowType, + NetWMWindowTypeDialog, NetClientList, NetLast }; /* EWMH atoms */ ++enum { Manager, Xembed, XembedInfo, XLast }; /* Xembed atoms */ + enum { WMProtocols, WMDelete, WMState, WMTakeFocus, WMLast }; /* default atoms */ + enum { ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, + ClkClientWin, ClkRootWin, ClkLast }; /* clicks */ +@@ -141,6 +159,12 @@ typedef struct { + int monitor; + } Rule; + ++typedef struct Systray Systray; ++struct Systray { ++ Window win; ++ Client *icons; ++}; ++ + /* function declarations */ + static void applyrules(Client *c); + static int applysizehints(Client *c, int *x, int *y, int *w, int *h, int interact); +@@ -169,8 +193,10 @@ static void focus(Client *c); + static void focusin(XEvent *e); + static void focusmon(const Arg *arg); + static void focusstack(const Arg *arg); ++static Atom getatomprop(Client *c, Atom prop); + static int getrootptr(int *x, int *y); + static long getstate(Window w); ++static unsigned int getsystraywidth(); + static int gettextprop(Window w, Atom atom, char *text, unsigned int size); + static void grabbuttons(Client *c, int focused); + static void grabkeys(void); +@@ -188,13 +214,16 @@ static void pop(Client *); + static void propertynotify(XEvent *e); + static void quit(const Arg *arg); + static Monitor *recttomon(int x, int y, int w, int h); ++static void removesystrayicon(Client *i); + static void resize(Client *c, int x, int y, int w, int h, int interact); ++static void resizebarwin(Monitor *m); + static void resizeclient(Client *c, int x, int y, int w, int h); + staic void resizemouse(const Arg *arg); ++static void resizerequest(XEvent *e); + static void restack(Monitor *m); + static void run(void); + static void scan(void); +-static int sendevent(Client *c, Atom proto); ++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); + static void setfocus(Client *c); +@@ -206,6 +235,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 Monitor *systraytomon(Monitor *m); + static void tag(const Arg *arg); + static void tagmon(const Arg *arg); + static void tile(Monitor *); +@@ -223,18 +253,23 @@ static int updategeom(void); + static void updatenumlockmask(void); + static void updatesizehints(Client *c); + static void updatestatus(void); ++static void updatesystray(void); ++static void updatesystrayicongeom(Client *i, int w, int h); ++static void updatesystrayiconstate(Client *i, XPropertyEvent *ev); + static void updatetitle(Client *c); + static void updatewindowtype(Client *c); + static void updatewmhints(Client *c); + static void view(const Arg *arg); + static Client *wintoclient(Window w); + static Monitor *wintomon(Window w); ++static Client *wintosystrayicon(Window w); + static int xerror(Display *dpy, XErrorEvent *ee); + static int xerrordummy(Display *dpy, XErrorEvent *ee); + static int xerrorstart(Display *dpy, XErrorEvent *ee); + static void zoom(const Arg *arg); + + /* variables */ ++static Systray *systray = NULL; + static const char broken[] = "broken"; + static char stext[256]; + static int screen; +@@ -257,9 +292,10 @@ static void (*handler[LASTEvent]) (XEvent *) = { + [MapRequest] = maprequest, + [MotionNotify] = motionnotify, + [PropertyNotify] = propertynotify, ++ [ResizeRequest] = resizerequest, + [UnmapNotify] = unmapnotify + }; +-static Atom wmatom[WMLast], netatom[NetLast]; ++static Atom wmatom[WMLast], netatom[NetLast], xatom[XLast]; + static int running = 1; + static Cur *cursor[CurLast]; + static Clr **scheme; +@@ -439,7 +475,7 @@ buttonpress(XEvent *e) + arg.ui = 1 << i; + } else if (ev->x < x + blw) + click = ClkLtSymbol; +- else if (ev->x > selmon->ww - TEXTW(stext)) ++ else if (ev->x > selmon->ww - TEXTW(stext) - getsystraywidth()) + click = ClkStatusText; + else + click = ClkWinTitle; +@@ -482,6 +518,11 @@ cleanup(void) + XUngrabKey(dpy, AnyKey, AnyModifier, root); + while (mons) + cleanupmon(mons); ++ if (showsystray) { ++ XUnmapWindow(dpy, systray->win); ++ XDestroyWindow(dpy, systray->win); ++ free(systray); ++ } + for (i = 0; i < CurLast; i++) + drw_cur_free(drw, cursor[i]); + for (i = 0; i < LENGTH(colors); i++) +@@ -512,9 +553,57 @@ cleanupmon(Monitor *mon) + void + clientmessage(XEvent *e) + { ++ XWindowAttributes wa; ++ XSetWindowAttributes swa; + XClientMessageEvent *cme = &e->xclient; + Client *c = wintoclient(cme->window); + ++ if (showsystray && cme->window == systray->win && cme->message_type == netatom[NetSystemTrayOP]) { ++ /* add systray icons */ ++ if (cme->data.l[1] == SYSTEM_TRAY_REQUEST_DOCK) { ++ if (!(c = (Client *)calloc(1, sizeof(Client)))) ++ die("fatal: could not malloc() %u bytes\n", sizeof(Client)); ++ if (!(c->win = cme->data.l[2])) { ++ free(c); ++ return; ++ } ++ c->mon = selmon; ++ c->next = systray->icons; ++ systray->icons = c; ++ if (!XGetWindowAttributes(dpy, c->win, &wa)) { ++ /* use sane defaults */ ++ wa.width = bh; ++ wa.height = bh; ++ wa.border_width = 0; ++ } ++ c->x = c->oldx = c->y = c->oldy = 0; ++ c->w = c->oldw = wa.width; ++ c->h = c->oldh = wa.height; ++ c->oldbw = wa.border_width; ++ c->bw = 0; ++ c->isfloating = True; ++ /* reuse tags field as mapped status */ ++ c->tags = 1; ++ updatesizehints(c); ++ updatesystrayicongeom(c, wa.width, wa.height); ++ XAddToSaveSet(dpy, c->win); ++ XSelectInput(dpy, c->win, StructureNotifyMask | PropertyChangeMask | ResizeRedirectMask); ++ XReparentWindow(dpy, c->win, systray->win, 0, 0); ++ /* use parents background color */ ++ swa.background_pixel = scheme[SchemeNorm][ColBg].pixel; ++ XChangeWindowAttributes(dpy, c->win, CWBackPixel, &swa); ++ sendevent(c->win, netatom[Xembed], StructureNotifyMask, CurrentTime, XEMBED_EMBEDDED_NOTIFY, 0 , systray->win, XEMBED_EMBEDDED_VERSION); ++ /* FIXME not sure if I have to send these events, too */ ++ sendevent(c->win, netatom[Xembed], StructureNotifyMask, CurrentTime, XEMBED_FOCUS_IN, 0 , systray->win, XEMBED_EMBEDDED_VERSION); ++ sendevent(c->win, netatom[Xembed], StructureNotifyMask, CurrentTime, XEMBED_WINDOW_ACTIVATE, 0 , systray->win, XEMBED_EMBEDDED_VERSION); ++ sendevent(c->win, netatom[Xembed], StructureNotifyMask, CurrentTime, XEMBED_MODALITY_ON, 0 , systray->win, XEMBED_EMBEDDED_VERSION); ++ XSync(dpy, False); ++ resizebarwin(selmon); ++ updatesystray(); ++ setclientstate(c, NormalState); ++ } ++ return; ++ } + if (!c) + return; + if (cme->message_type == netatom[NetWMState]) { +@@ -567,7 +656,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); ++ resizebarwin(m); + } + focus(NULL); + arrange(NULL); +@@ -652,6 +741,11 @@ destroynotify(XEvent *e) + + if ((c = wintoclient(ev->window))) + unmanage(c, 1); ++ else if ((c = wintosystrayicon(ev->window))) { ++ removesystrayicon(c); ++ resizebarwin(selmon); ++ updatesystray(); ++ } + } + + void +@@ -695,19 +789,23 @@ dirtomon(int dir) + void + drawbar(Monitor *m) + { +- int x, w, sw = 0; ++ int x, w, sw = 0, stw = 0; + int boxs = drw->fonts->h / 9; + int boxw = drw->fonts->h / 6 + 2; + unsigned int i, occ = 0, urg = 0; + Client *c; + ++ if(showsystray && m == systraytomon(m)) ++ stw = getsystraywidth(); ++ + /* draw status first so it can be overdrawn by tags later */ + if (m == selmon) { /* status is only drawn on selected monitor */ + drw_setscheme(drw, scheme[SchemeNorm]); +- sw = TEXTW(stext) - lrpad + 2; /* 2px right padding */ +- drw_text(drw, m->ww - sw, 0, sw, bh, 0, stext, 0); ++ sw = TEXTW(stext) - lrpad / 2 + 2; /* 2px right padding */ ++ drw_text(drw, m->ww - sw - stw, 0, sw, bh, lrpad / 2 - 2, stext, 0); + } + ++ resizebarwin(m); + for (c = m->clients; c; c = c->next) { + occ |= c->tags; + if (c->isurgent) +@@ -728,7 +826,7 @@ drawbar(Monitor *m) + drw_setscheme(drw, scheme[SchemeNorm]); + x = drw_text(drw, x, 0, w, bh, lrpad / 2, m->ltsymbol, 0); + +- if ((w = m->ww - sw - x) > bh) { ++ if ((w = m->ww - sw - stw - x) > bh) { + if (m->sel) { + drw_setscheme(drw, scheme[m == selmon ? SchemeSel : SchemeNorm]); + drw_text(drw, x, 0, w, bh, lrpad / 2, m->sel->name, 0); +@@ -739,7 +837,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->barwin, 0, 0, m->ww - stw, bh); + } + + void +@@ -776,8 +874,11 @@ expose(XEvent *e) + Monitor *m; + XExposeEvent *ev = &e->xexpose; + +- if (ev->count == 0 && (m = wintomon(ev->window))) ++ if (ev->count == 0 && (m = wintomon(ev->window))) { + drawbar(m); ++ if (m == selmon) ++ updatesystray(); ++ } + } + + void +@@ -862,10 +963,17 @@ getatomprop(Client *c, Atom prop) + unsigned long dl; + unsigned char *p = NULL; + Atom da, atom = None; ++ /* FIXME getatomprop should return the number of items and a pointer to ++ * the stored data instead of this workaround */ ++ Atom req = XA_ATOM; ++ if (prop == xatom[XembedInfo]) ++ req = xatom[XembedInfo]; + +- if (XGetWindowProperty(dpy, c->win, prop, 0L, sizeof atom, False, XA_ATOM, ++ if (XGetWindowProperty(dpy, c->win, prop, 0L, sizeof atom, False, req, + &da, &di, &dl, &dl, &p) == Success && p) { + atom = *(Atom *)p; ++ if (da == xatom[XembedInfo] && dl == 2) ++ atom = ((Atom *)p)[1]; + XFree(p); + } + return atom; +@@ -899,6 +1007,16 @@ getstate(Window w) + return result; + } + ++unsigned int ++getsystraywidth() ++{ ++ unsigned int w = 0; ++ Client *i; ++ if(showsystray) ++ for(i = systray->icons; i; w += i->w + systrayspacing, i = i->next) ; ++ return w ? w + systrayspacing : 1; ++} ++ + int + gettextprop(Window w, Atom atom, char *text, unsigned int size) + { +@@ -1003,7 +1121,7 @@ killclient(const Arg *arg) + { + if (!selmon->sel) + return; +- if (!sendevent(selmon->sel, wmatom[WMDelete])) { ++ if (!sendevent(selmon->sel->win, wmatom[WMDelete], NoEventMask, wmatom[WMDelete], CurrentTime, 0 , 0, 0)) { + XGrabServer(dpy); + XSetErrorHandler(xerrordummy); + XSetCloseDownMode(dpy, DestroyAll); +@@ -1091,6 +1209,12 @@ maprequest(XEvent *e) + { + static XWindowAttributes wa; + XMapRequestEvent *ev = &e->xmaprequest; ++ Client *i; ++ if ((i = wintosystrayicon(ev->window))) { ++ sendevent(i->win, netatom[Xembed], StructureNotifyMask, CurrentTime, XEMBED_WINDOW_ACTIVATE, 0, systray->win, XEMBED_EMBEDDED_VERSION); ++ resizebarwin(selmon); ++ updatesystray(); ++ } + + if (!XGetWindowAttributes(dpy, ev->window, &wa)) + return; +@@ -1215,6 +1339,16 @@ propertynotify(XEvent *e) + Window trans; + XPropertyEvent *ev = &e->xproperty; + ++ if ((c = wintosystrayicon(ev->window))) { ++ if (ev->atom == XA_WM_NORMAL_HINTS) { ++ updatesizehints(c); ++ updatesystrayicongeom(c, c->w, c->h); ++ } ++ else ++ updatesystrayiconstate(c, ev); ++ resizebarwin(selmon); ++ updatesystray(); ++ } + if ((ev->window == root) && (ev->atom == XA_WM_NAME)) + updatestatus(); + else if (ev->state == PropertyDelete) +@@ -1265,6 +1399,20 @@ recttomon(int x, int y, int w, int h) + return r; + } + ++void ++removesystrayicon(Client *i) ++{ ++ Client **ii; ++ ++ if (!showsystray || !i) ++ return; ++ for (ii = &systray->icons; *ii && *ii != i; ii = &(*ii)->next); ++ if (ii) ++ *ii = i->next; ++ free(i); ++} ++ ++ + void + resize(Client *c, int x, int y, int w, int h, int interact) + { +@@ -1272,6 +1420,14 @@ resize(Client *c, int x, int y, int w, int h, int interact) + resizeclient(c, x, y, w, h); + } + ++void ++resizebarwin(Monitor *m) { ++ unsigned int w = m->ww; ++ if (showsystray && m == systraytomon(m)) ++ w -= getsystraywidth(); ++ XMoveResizeWindow(dpy, m->barwin, m->wx, m->by, w, bh); ++} ++ + void + resizeclient(Client *c, int x, int y, int w, int h) + { +@@ -1344,6 +1500,19 @@ resizemouse(const Arg *arg) + } + } + ++void ++resizerequest(XEvent *e) ++{ ++ XResizeRequestEvent *ev = &e->xresizerequest; ++ Client *i; ++ ++ if ((i = wintosystrayicon(ev->window))) { ++ updatesystrayicongeom(i, ev->width, ev->height); ++ resizebarwin(selmon); ++ updatesystray(); ++ } ++} ++ + void + restack(Monitor *m) + { +@@ -1433,26 +1602,36 @@ setclientstate(Client *c, long state) + } + + int +-sendevent(Client *c, Atom proto) ++sendevent(Window w, Atom proto, int mask, long d0, long d1, long d2, long d3, long d4) + { + int n; +- Atom *protocols; ++ Atom *protocols, mt; + int exists = 0; + XEvent ev; + +- if (XGetWMProtocols(dpy, c->win, &protocols, &n)) { +- while (!exists && n--) +- exists = protocols[n] == proto; +- XFree(protocols); ++ if (proto == wmatom[WMTakeFocus] || proto == wmatom[WMDelete]) { ++ mt = wmatom[WMProtocols]; ++ if (XGetWMProtocols(dpy, w, &protocols, &n)) { ++ while (!exists && n--) ++ exists = protocols[n] == proto; ++ XFree(protocols); ++ } ++ } ++ else { ++ exists = True; ++ mt = proto; + } + if (exists) { + ev.type = ClientMessage; +- ev.xclient.window = c->win; +- ev.xclient.message_type = wmatom[WMProtocols]; ++ ev.xclient.window = w; ++ ev.xclient.message_type = mt; + ev.xclient.format = 32; +- ev.xclient.data.l[0] = proto; +- ev.xclient.data.l[1] = CurrentTime; +- XSendEvent(dpy, c->win, False, NoEventMask, &ev); ++ ev.xclient.data.l[0] = d0; ++ ev.xclient.data.l[1] = d1; ++ ev.xclient.data.l[2] = d2; ++ ev.xclient.data.l[3] = d3; ++ ev.xclient.data.l[4] = d4; ++ XSendEvent(dpy, w, False, mask, &ev); + } + return exists; + } +@@ -1466,7 +1645,7 @@ setfocus(Client *c) + XA_WINDOW, 32, PropModeReplace, + (unsigned char *) &(c->win), 1); + } +- sendevent(c, wmatom[WMTakeFocus]); ++ sendevent(c->win, wmatom[WMTakeFocus], NoEventMask, wmatom[WMTakeFocus], CurrentTime, 0, 0, 0); + } + + void +@@ -1555,6 +1734,10 @@ setup(void) + wmatom[WMTakeFocus] = XInternAtom(dpy, "WM_TAKE_FOCUS", False); + netatom[NetActiveWindow] = XInternAtom(dpy, "_NET_ACTIVE_WINDOW", False); + netatom[NetSupported] = XInternAtom(dpy, "_NET_SUPPORTED", False); ++ netatom[NetSystemTray] = XInternAtom(dpy, "_NET_SYSTEM_TRAY_S0", False); ++ netatom[NetSystemTrayOP] = XInternAtom(dpy, "_NET_SYSTEM_TRAY_OPCODE", False); ++ netatom[NetSystemTrayOrientation] = XInternAtom(dpy, "_NET_SYSTEM_TRAY_ORIENTATION", False); ++ netatom[NetSystemTrayOrientationHorz] = XInternAtom(dpy, "_NET_SYSTEM_TRAY_ORIENTATION_HORZ", False); + netatom[NetWMName] = XInternAtom(dpy, "_NET_WM_NAME", False); + netatom[NetWMState] = XInternAtom(dpy, "_NET_WM_STATE", False); + netatom[NetWMCheck] = XInternAtom(dpy, "_NET_SUPPORTING_WM_CHECK", False); +@@ -1562,6 +1745,9 @@ setup(void) + netatom[NetWMWindowType] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE", False); + netatom[NetWMWindowTypeDialog] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE_DIALOG", False); + netatom[NetClientList] = XInternAtom(dpy, "_NET_CLIENT_LIST", False); ++ xatom[Manager] = XInternAtom(dpy, "MANAGER", False); ++ xatom[Xembed] = XInternAtom(dpy, "_XEMBED", False); ++ xatom[XembedInfo] = XInternAtom(dpy, "_XEMBED_INFO", False); + /* init cursors */ + cursor[CurNormal] = drw_cur_create(drw, XC_left_ptr); + cursor[CurResize] = drw_cur_create(drw, XC_sizing); +@@ -1570,6 +1756,8 @@ setup(void) + scheme = ecalloc(LENGTH(colors), sizeof(Clr *)); + for (i = 0; i < LENGTH(colors); i++) + scheme[i] = drw_scm_create(drw, colors[i], 3); ++ /* init system tray */ ++ updatesystray(); + /* init bars */ + updatebars(); + updatestatus(); +@@ -1701,7 +1889,18 @@ togglebar(const Arg *arg) + { + selmon->showbar = !selmon->showbar; + updatebarpos(selmon); +- XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh); ++ resizebarwin(selmon); ++ if (showsystray) { ++ XWindowChanges wc; ++ if (!selmon->showbar) ++ wc.y = -bh; ++ else if (selmon->showbar) { ++ wc.y = 0; ++ if (!selmon->topbar) ++ wc.y = selmon->mh - bh; ++ } ++ XConfigureWindow(dpy, systray->win, CWY, &wc); ++ } + arrange(selmon); + } + +@@ -1796,11 +1995,18 @@ unmapnotify(XEvent *e) + else + unmanage(c, 0); + } ++ else if ((c = wintosystrayicon(ev->window))) { ++ /* KLUDGE! sometimes icons occasionally unmap their windows, but do ++ * _not_ destroy them. We map those windows back */ ++ XMapRaised(dpy, c->win); ++ updatesystray(); ++ } + } + + void + updatebars(void) + { ++ unsigned int w; + Monitor *m; + XSetWindowAttributes wa = { + .override_redirect = True, +@@ -1811,10 +2017,15 @@ updatebars(void) + for (m = mons; m; m = m->next) { + if (m->barwin) + continue; +- m->barwin = XCreateWindow(dpy, root, m->wx, m->by, m->ww, bh, 0, DefaultDepth(dpy, screen), ++ w = m->ww; ++ if (showsystray && m == systraytomon(m)) ++ w -= getsystraywidth(); ++ m->barwin = XCreateWindow(dpy, root, m->wx, m->by, w, bh, 0, DefaultDepth(dpy, screen), + CopyFromParent, DefaultVisual(dpy, screen), + CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa); + XDefineCursor(dpy, m->barwin, cursor[CurNormal]->cursor); ++ if (showsystray && m == systraytomon(m)) ++ XMapRaised(dpy, systray->win); + XMapRaised(dpy, m->barwin); + XSetClassHint(dpy, m->barwin, &ch); + } +@@ -1990,6 +2201,121 @@ updatestatus(void) + if (!gettextprop(root, XA_WM_NAME, stext, sizeof(stext))) + strcpy(stext, "dwm-"VERSION); + drawbar(selmon); ++ updatesystray(); ++} ++ ++void ++updatesystrayicongeom(Client *i, int w, int h) ++{ ++ if (i) { ++ i->h = bh; ++ if (w == h) ++ i->w = bh; ++ else if (h == bh) ++ i->w = w; ++ else ++ i->w = (int) ((float)bh * ((float)w / (float)h)); ++ applysizehints(i, &(i->x), &(i->y), &(i->w), &(i->h), False); ++ /* force icons into the systray dimensions if they don't want to */ ++ if (i->h > bh) { ++ if (i->w == i->h) ++ i->w = bh; ++ else ++ i->w = (int) ((float)bh * ((float)i->w / (float)i->h)); ++ i->h = bh; ++ } ++ } ++} ++ ++void ++updatesystrayiconstate(Client *i, XPropertyEvent *ev) ++{ ++ long flags; ++ int code = 0; ++ ++ if (!showsystray || !i || ev->atom != xatom[XembedInfo] || ++ !(flags = getatomprop(i, xatom[XembedInfo]))) ++ return; ++ ++ if (flags & XEMBED_MAPPED && !i->tags) { ++ i->tags = 1; ++ code = XEMBED_WINDOW_ACTIVATE; ++ XMapRaised(dpy, i->win); ++ setclientstate(i, NormalState); ++ } ++ else if (!(flags & XEMBED_MAPPED) && i->tags) { ++ i->tags = 0; ++ code = XEMBED_WINDOW_DEACTIVATE; ++ XUnmapWindow(dpy, i->win); ++ setclientstate(i, WithdrawnState); ++ } ++ else ++ return; ++ sendevent(i->win, xatom[Xembed], StructureNotifyMask, CurrentTime, code, 0, ++ systray->win, XEMBED_EMBEDDED_VERSION); ++} ++ ++void ++updatesystray(void) ++{ ++ XSetWindowAttributes wa; ++ XWindowChanges wc; ++ Client *i; ++ Monitor *m = systraytomon(NULL); ++ unsigned int x = m->mx + m->mw; ++ unsigned int w = 1; ++ ++ if (!showsystray) ++ return; ++ if (!systray) { ++ /* init systray */ ++ if (!(systray = (Systray *)calloc(1, sizeof(Systray)))) ++ die("fatal: could not malloc() %u bytes\n", sizeof(Systray)); ++ systray->win = XCreateSimpleWindow(dpy, root, x, m->by, w, bh, 0, 0, scheme[SchemeSel][ColBg].pixel); ++ wa.event_mask = ButtonPressMask | ExposureMask; ++ wa.override_redirect = True; ++ wa.background_pixel = scheme[SchemeNorm][ColBg].pixel; ++ XSelectInput(dpy, systray->win, SubstructureNotifyMask); ++ XChangeProperty(dpy, systray->win, netatom[NetSystemTrayOrientation], XA_CARDINAL, 32, ++ PropModeReplace, (unsigned char *)&netatom[NetSystemTrayOrientationHorz], 1); ++ XChangeWindowAttributes(dpy, systray->win, CWEventMask|CWOverrideRedirect|CWBackPixel, &wa); ++ XMapRaised(dpy, systray->win); ++ XSetSelectionOwner(dpy, netatom[NetSystemTray], systray->win, CurrentTime); ++ if (XGetSelectionOwner(dpy, netatom[NetSystemTray]) == systray->win) { ++ sendevent(root, xatom[Manager], StructureNotifyMask, CurrentTime, netatom[NetSystemTray], systray->win, 0, 0); ++ XSync(dpy, False); ++ } ++ else { ++ fprintf(stderr, "dwm: unable to obtain system tray.\n"); ++ free(systray); ++ systray = NULL; ++ return; ++ } ++ } ++ for (w = 0, i = systray->icons; i; i = i->next) { ++ /* make sure the background color stays the same */ ++ wa.background_pixel = scheme[SchemeNorm][ColBg].pixel; ++ XChangeWindowAttributes(dpy, i->win, CWBackPixel, &wa); ++ XMapRaised(dpy, i->win); ++ w += systrayspacing; ++ i->x = w; ++ XMoveResizeWindow(dpy, i->win, i->x, 0, i->w, i->h); ++ w += i->w; ++ if (i->mon != m) ++ i->mon = m; ++ } ++ w = w ? w + systrayspacing : 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.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); ++ XFillRectangle(dpy, systray->win, drw->gc, 0, 0, w, bh); ++ XSync(dpy, False); + } + + void +@@ -2057,6 +2383,16 @@ wintoclient(Window w) + return NULL; + } + ++Client * ++wintosystrayicon(Window w) { ++ Client *i = NULL; ++ ++ if (!showsystray || !w) ++ return i; ++ for (i = systray->icons; i && i->win != w; i = i->next) ; ++ return i; ++} ++ + Monitor * + wintomon(Window w) + { +@@ -2110,6 +2446,22 @@ xerrorstart(Display *dpy, XErrorEvent *ee) + return -1; + } + ++Monitor * ++systraytomon(Monitor *m) { ++ Monitor *t; ++ int i, n; ++ if(!systraypinning) { ++ if(!m) ++ return selmon; ++ return m == selmon ? m : NULL; ++ } ++ for(n = 1, t = mons; t && t->next; n++, t = t->next) ; ++ for(i = 1, t = mons; t && t->next && i < systraypinning; i++, t = t->next) ; ++ if(systraypinningfailfirst && n < systraypinning) ++ return mons; ++ return t; ++} ++ + void + zoom(const Arg *arg) + { +-- +2.17.1 + +