# HG changeset patch # User Christoph Lohmann <20h@r-36.net> # Date 1302074113 -7200 # Node ID 43fd667d9cb634cc09200e4f90dde95d239e0d14 # Parent d92f9b65f85f19122ccc0e19ee7dca089644bd81 A common touching and panel patch. diff -r d92f9b65f85f -r 43fd667d9cb6 dwm.c --- a/dwm.c Fri Mar 25 09:24:05 2011 +0100 +++ b/dwm.c Wed Apr 06 09:15:13 2011 +0200 @@ -58,7 +58,9 @@ enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */ enum { ColBorder, ColFG, ColBG, ColLast }; /* color */ enum { NetSupported, NetWMName, NetWMState, - NetWMFullscreen, NetWMWindowType, NetLast }; /* EWMH atoms */ + NetWMFullscreen, NetWMWindowType, + NetWMWindowTypeDock, NetWMWindowTypeToolbar, + NetLast }; /* EWMH atoms */ enum { WMProtocols, WMDelete, WMState, WMLast }; /* default atoms */ enum { ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, ClkRootWin, ClkLast }; /* clicks */ @@ -88,7 +90,7 @@ int basew, baseh, incw, inch, maxw, maxh, minw, minh; int bw, oldbw; unsigned int tags; - Bool isfixed, isfloating, isurgent, oldstate, isfocusable, istoolbar; + Bool isfixed, isfloating, isurgent, oldstate, isfocusable, isdock, istoolbar; Client *next; Client *snext; Monitor *mon; @@ -229,6 +231,7 @@ static void unmapnotify(XEvent *e); static Bool updategeom(void); static void updatebarpos(Monitor *m); +void updatedocks(Monitor *m); static void updatebars(void); static void updatenumlockmask(void); static void updatesizehints(Client *c); @@ -683,6 +686,8 @@ unsigned long *col; Client *c; for(c = m->clients; c; c = c->next) { + if(c->isdock || c->istoolbar) + continue; occ |= c->tags; if(c->isurgent) urg |= c->tags; @@ -702,15 +707,15 @@ x = dc.x; if(m == selmon) { /* status is only drawn on selected monitor */ dc.w = TEXTW(stext); - dc.x = m->ww - dc.w; + dc.x = m->mw - dc.w; if(dc.x < x) { dc.x = x; - dc.w = m->ww - x; + dc.w = m->mw - x; } drawtext(stext, dc.norm, False); } else - dc.x = m->ww; + dc.x = m->mw; if((dc.w = dc.x - x) > bh) { dc.x = x; if(m->sel) { @@ -858,17 +863,17 @@ if(!selmon->sel) return; if(arg->i > 0) { - for(c = selmon->sel->next; c && (!ISVISIBLE(c) || c->istoolbar); c = c->next); + for(c = selmon->sel->next; c && (!ISVISIBLE(c) || c->isdock || c->istoolbar); c = c->next); if(!c) - for(c = selmon->clients; c && (!ISVISIBLE(c) || c->istoolbar); c = c->next); + for(c = selmon->clients; c && (!ISVISIBLE(c) || c->isdock || c->istoolbar); c = c->next); } else { for(i = selmon->clients; i != selmon->sel; i = i->next) - if(ISVISIBLE(i) && !c->istoolbar) + if(ISVISIBLE(i) && !c->isdock && !c->istoolbar) c = i; if(!c) for(; i; i = i->next) - if(ISVISIBLE(i) && !c->istoolbar) + if(ISVISIBLE(i) && !c->isdock && !c->istoolbar) c = i; } if(c) { @@ -1105,6 +1110,7 @@ c->oldbw = wa->border_width; c->isfocusable = True; + c->isdock = False; c->istoolbar = False; if(c->w == c->mon->mw && c->h == c->mon->mh) { c->isfloating = True; @@ -1128,6 +1134,7 @@ XSetWindowBorder(dpy, w, dc.norm[ColBorder]); configure(c); /* propagates border_width, if size doesn't change */ updatesizehints(c); + updatewmhints(c); XSelectInput(dpy, w, EnterWindowMask|FocusChangeMask|PropertyChangeMask|StructureNotifyMask); grabbuttons(c, False); if(!c->isfloating) @@ -1139,6 +1146,7 @@ XMoveResizeWindow(dpy, c->win, c->x + 2 * sw, c->y, c->w, c->h); /* some windows require this */ XMapWindow(dpy, c->win); setclientstate(c, NormalState); + updatewindowtype(c); arrange(c->mon); } @@ -1235,7 +1243,7 @@ Client * nexttiled(Client *c) { - for(; c && (c->isfloating || !ISVISIBLE(c)); c = c->next); + for(; c && (c->isfloating || !ISVISIBLE(c) || c->isdock); c = c->next); return c; } @@ -1254,6 +1262,10 @@ Client *c; Window trans; XPropertyEvent *ev = &e->xproperty; + char *aname; + + aname = XGetAtomName(dpy, ev->atom); + XFree(aname); if((ev->window == root) && (ev->atom == XA_WM_NAME)) updatestatus(); @@ -1422,10 +1434,9 @@ XEvent ev; /* main event loop */ XSync(dpy, False); - while(running && !XNextEvent(dpy, &ev)) { + while(running && !XNextEvent(dpy, &ev)) if(handler[ev.type]) handler[ev.type](&ev); /* call handler */ - } } void @@ -1528,6 +1539,8 @@ netatom[NetWMState] = XInternAtom(dpy, "_NET_WM_STATE", False); netatom[NetWMFullscreen] = XInternAtom(dpy, "_NET_WM_STATE_FULLSCREEN", False); netatom[NetWMWindowType] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE", False); + netatom[NetWMWindowTypeDock] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE_DOCK", False); + netatom[NetWMWindowTypeToolbar] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE_TOOLBAR", False); /* init cursors */ cursor[CurNormal] = XCreateFontCursor(dpy, XC_left_ptr); cursor[CurResize] = XCreateFontCursor(dpy, XC_sizing); @@ -1725,6 +1738,7 @@ } free(c); focus(NULL); + updatebarpos(m); arrange(m); } @@ -1758,6 +1772,9 @@ updatebarpos(Monitor *m) { m->wy = m->my; m->wh = m->mh; + m->ww = m->mw; + m->wx = m->mx; + if(m->showbar) { m->wh -= bh; m->by = m->topbar ? m->wy : m->wy + m->wh; @@ -1765,6 +1782,46 @@ } else m->by = -bh; + + updatedocks(m); +} + +void +updatedocks(Monitor *m) { + Client *c; + + for(c = m->clients; c; c = c->next) { + if(!c->isdock) + continue; + + /* horizontal */ + if(c->w / c->h >= 1) { + /* top */ + if(c->y < m->mh / 2) { + resize(c, m->wx, m->wy, m->ww, c->h, True); + m->wy += c->h; + m->wh -= c->h; + } + else { + /* bottom */ + resize(c, m->wx, m->wy + m->wh - c->h, m->ww, c->h, True); + m->wh -= c->h; + } + } + else { + /* left */ + if(c->x < m->mw / 2) { + resize(c, m->wx, m->wy, c->w, m->wh, True); + m->wx += c->w; + m->ww -= c->w; + } + else { + /* right */ + resize(c, m->wx + m->ww - c->w, m->wy, c->w, m->wh, True); + m->ww -= c->w; + } + } + } } Bool @@ -1922,13 +1979,24 @@ void updatewindowtype(Client *c) { - char windowtype[32]; + Atom wtype, real; + int format; + unsigned long n, extra; + unsigned char *p = NULL; - if(!gettextprop(c->win, netatom[NetWMWindowType], windowtype, - sizeof windowtype)) { - gettextprop(c->win, netatom[NetWMWindowType], windowtype, - sizeof windowtype); - if(strstr(windowtype, "_NET_WM_WINDOW_TYPE_TOOLBAR")) + if(XGetWindowProperty(dpy, c->win, netatom[NetWMWindowType], 0L, + sizeof(Atom), False, XA_ATOM, &real, &format, &n, + &extra, (unsigned char **)&p) == Success + && p) { + wtype = *(Atom *)p; + XFree(p); + + if(wtype == netatom[NetWMWindowTypeDock]) { + c->isdock = True; + c->tags = 0xFFFFFFFF; + updatebarpos(c->mon); + } + if(wtype == netatom[NetWMWindowTypeToolbar]) c->istoolbar = True; } }