dwm

dynamic window manager
git clone git://git.suckless.org/dwm
Log | Files | Refs | README | LICENSE

commit 36672d0401299a5230b516ca4575365d9f45dd35
parent b18e6840152b300f2db8ff8dca16aee0839f864b
Author: Anselm R. Garbe <garbeam@gmail.com>
Date:   Wed, 22 Aug 2007 19:01:05 +0200

removed the _DWM_PROPERTIES handling, reverted ban/unban to XMoveWindow(), and changed argument of setlayout to layout[N].symbol check
Diffstat:
Mclient.c | 50+++++++-------------------------------------------
Mconfig.mk | 4++--
Mdwm.h | 8++------
Mevent.c | 8+++-----
Mmain.c | 6++----
Mscreen.c | 48+++++++-----------------------------------------
6 files changed, 23 insertions(+), 101 deletions(-)

diff --git a/client.c b/client.c @@ -1,14 +1,11 @@ /* See LICENSE file for copyright and license details. */ #include "dwm.h" #include <stdlib.h> -#include <string.h> #include <X11/Xatom.h> #include <X11/Xutil.h> /* static */ -static char buf[128]; - static void attachstack(Client *c) { c->snext = stack; @@ -102,10 +99,8 @@ void ban(Client *c) { if(c->isbanned) return; - XUnmapWindow(dpy, c->win); - setclientstate(c, IconicState); + XMoveWindow(dpy, c->win, c->x + 2 * sw, c->y); c->isbanned = True; - c->unmapped++; } void @@ -181,21 +176,6 @@ killclient(const char *arg) { XKillClient(dpy, sel->win); } -Bool -getprops(Client *c) { - unsigned int i; - Bool result = False; - - if(gettextprop(c->win, dwmprops, buf, sizeof buf)) { - for(i = 0; i < ntags && i < sizeof buf - 1 && buf[i] != '\0'; i++) - if((c->tags[i] = buf[i] == '1')) - result = True; - if(i < sizeof buf - 1 && buf[i] != '\0') - c->isfloating = buf[i] == '1'; - } - return result; -} - void manage(Window w, XWindowAttributes *wa) { unsigned int i; @@ -242,15 +222,14 @@ manage(Window w, XWindowAttributes *wa) { if(t) for(i = 0; i < ntags; i++) c->tags[i] = t->tags[i]; - if(!getprops(c)) - applyrules(c); + applyrules(c); if(!c->isfloating) c->isfloating = (rettrans == Success) || c->isfixed; - setprops(c); attach(c); attachstack(c); XMoveResizeWindow(dpy, c->win, c->x, c->y, c->w, c->h); /* some windows require this */ ban(c); + XMapWindow(dpy, c->win); arrange(); } @@ -318,29 +297,15 @@ resize(Client *c, int x, int y, int w, int h, Bool sizehints) { } void -setprops(Client *c) { - unsigned int i; - - for(i = 0; i < ntags && i < sizeof buf - 1; i++) - buf[i] = c->tags[i] ? '1' : '0'; - if(i < sizeof buf - 1) - buf[i++] = c->isfloating ? '1' : '0'; - buf[i] = '\0'; - XChangeProperty(dpy, c->win, dwmprops, XA_STRING, 8, - PropModeReplace, (unsigned char *)buf, i); -} - -void unban(Client *c) { if(!c->isbanned) return; - XMapWindow(dpy, c->win); - setclientstate(c, NormalState); + XMoveWindow(dpy, c->win, c->x, c->y); c->isbanned = False; } void -unmanage(Client *c, long state) { +unmanage(Client *c) { XWindowChanges wc; wc.border_width = c->oldborder; @@ -353,14 +318,13 @@ unmanage(Client *c, long state) { if(sel == c) focus(NULL); XUngrabButton(dpy, AnyButton, AnyModifier, c->win); - setclientstate(c, state); + setclientstate(c, WithdrawnState); free(c->tags); free(c); XSync(dpy, False); XSetErrorHandler(xerror); XUngrabServer(dpy); - if(state != NormalState) - arrange(); + arrange(); } void diff --git a/config.mk b/config.mk @@ -20,8 +20,8 @@ LIBS = -L/usr/lib -lc -L${X11LIB} -lX11 # flags CFLAGS = -Os ${INCS} -DVERSION=\"${VERSION}\" LDFLAGS = -s ${LIBS} -#CFLAGS = -g -Wall -O2 ${INCS} -DVERSION=\"${VERSION}\" -#LDFLAGS = -g ${LIBS} +CFLAGS = -g -Wall -O2 ${INCS} -DVERSION=\"${VERSION}\" +LDFLAGS = -g ${LIBS} # Solaris #CFLAGS = -fast ${INCS} -DVERSION=\"${VERSION}\" diff --git a/dwm.h b/dwm.h @@ -48,7 +48,6 @@ struct Client { int rx, ry, rw, rh; /* revert geometry */ int basew, baseh, incw, inch, maxw, maxh, minw, minh; int minax, maxax, minay, maxay; - int unmapped; long flags; unsigned int border, oldborder; Bool isbanned, isfixed, ismax, isfloating; @@ -81,7 +80,7 @@ extern int wax, way, wah, waw; /* windowarea geometry */ extern unsigned int bh, blw, bpos; /* bar height, bar layout label width, bar position */ extern unsigned int ntags, numlockmask; /* number of tags, numlock mask */ extern void (*handler[LASTEvent])(XEvent *); /* event handler */ -extern Atom dwmprops, wmatom[WMLast], netatom[NetLast]; +extern Atom wmatom[WMLast], netatom[NetLast]; extern Bool selscreen, *seltags; /* seltags is array of Bool */ extern Client *clients, *sel, *stack; /* global client list and stack */ extern Cursor cursor[CurLast]; @@ -96,13 +95,11 @@ void configure(Client *c); /* send synthetic configure event */ void detach(Client *c); /* detaches c from global client list */ void focus(Client *c); /* focus c if visible && !NULL, or focus top visible */ void killclient(const char *arg); /* kill sel nicely */ -Bool getprops(Client *c); /* gets client properties */ void manage(Window w, XWindowAttributes *wa); /* manage new client */ void resize(Client *c, int x, int y, int w, int h, Bool sizehints); /* resize with given coordinates c*/ -void setprops(Client *c); /* sets client properties */ void unban(Client *c); /* unbans c */ -void unmanage(Client *c, long state); /* unmanage c */ +void unmanage(Client *c); /* unmanage c */ void updatesizehints(Client *c); /* update the size hint variables of c */ void updatetitle(Client *c); /* update the name of c */ @@ -131,7 +128,6 @@ void initlayouts(void); /* initialize layout array */ Bool isarrange(void (*func)()); /* returns True if func is the layout function in use */ Bool isfloating(void); /* returns True if floating layout is enabled */ Bool isvisible(Client *c); /* returns True if client is visible */ -void getdwmprops(void); /* gets dwm properties */ Client *nexttiled(Client *c); /* returns tiled successor of c */ void restack(void); /* restores z layers of all clients */ void setlayout(const char *arg); /* sets layout, NULL means next layout */ diff --git a/event.c b/event.c @@ -221,7 +221,7 @@ destroynotify(XEvent *e) { XDestroyWindowEvent *ev = &e->xdestroywindow; if((c = getclient(ev->window))) - unmanage(c, WithdrawnState); + unmanage(c); } static void @@ -332,10 +332,8 @@ unmapnotify(XEvent *e) { Client *c; XUnmapEvent *ev = &e->xunmap; - if((c = getclient(ev->window)) && (ev->event == root)) { - if(ev->send_event || c->unmapped-- == 0) - unmanage(c, WithdrawnState); - } + if((c = getclient(ev->window))) + unmanage(c); } /* extern */ diff --git a/main.c b/main.c @@ -20,7 +20,7 @@ int screen, sx, sy, sw, sh, wax, way, waw, wah; unsigned int bh, ntags; unsigned int bpos = BARPOS; unsigned int numlockmask = 0; -Atom dwmprops, wmatom[WMLast], netatom[NetLast]; +Atom wmatom[WMLast], netatom[NetLast]; Bool *seltags; Bool selscreen = True; Client *clients = NULL; @@ -42,7 +42,7 @@ cleanup(void) { close(STDIN_FILENO); while(stack) { unban(stack); - unmanage(stack, NormalState); + unmanage(stack); } if(dc.font.set) XFreeFontSet(dpy, dc.font.set); @@ -165,7 +165,6 @@ setup(void) { XSetWindowAttributes wa; /* init atoms */ - dwmprops = XInternAtom(dpy, "_DWM_PROPERTIES", False); wmatom[WMProtocols] = XInternAtom(dpy, "WM_PROTOCOLS", False); wmatom[WMDelete] = XInternAtom(dpy, "WM_DELETE_WINDOW", False); wmatom[WMName] = XInternAtom(dpy, "WM_NAME", False); @@ -231,7 +230,6 @@ setup(void) { XSetFont(dpy, dc.gc, dc.font.xfont->fid); /* multihead support */ selscreen = XQueryPointer(dpy, root, &w, &w, &i, &i, &i, &i, &mask); - getdwmprops(); } /* diff --git a/screen.c b/screen.c @@ -3,8 +3,6 @@ #include <regex.h> #include <stdio.h> #include <stdlib.h> -#include <string.h> -#include <X11/Xatom.h> #include <X11/Xutil.h> /* static */ @@ -28,7 +26,6 @@ typedef struct { TAGS RULES -static char buf[512]; static unsigned int nrules = 0; static unsigned int nlayouts = 0; static unsigned int ltidx = 0; /* default */ @@ -53,19 +50,6 @@ floating(void) { /* default floating layout */ resize(c, c->x, c->y, c->w, c->h, True); } -static void -setdwmprops(void) { - unsigned int i; - - for(i = 0; i < ntags && i < sizeof buf - 1; i++) - buf[i] = seltags[i] ? '1' : '0'; - if(i < sizeof buf - 1) - buf[i++] = (char)ltidx + '0'; - buf[i] = '\0'; - XChangeProperty(dpy, root, dwmprops, XA_STRING, 8, - PropModeReplace, (unsigned char *)buf, i); -} - LAYOUTS /* extern */ @@ -74,6 +58,7 @@ unsigned int blw = 0; void applyrules(Client *c) { + static char buf[512]; unsigned int i, j; regmatch_t tmp; Bool matched = False; @@ -215,20 +200,6 @@ isvisible(Client *c) { return False; } -void -getdwmprops(void) { - unsigned int i; - - if(gettextprop(root, dwmprops, buf, sizeof buf)) { - for(i = 0; i < ntags && i < sizeof buf - 1 && buf[i] != '\0'; i++) - seltags[i] = buf[i] == '1'; - if(i < sizeof buf - 1 && buf[i] != '\0') { - if((unsigned int)(buf[i] - '0') < nlayouts) - ltidx = buf[i] - '0'; - } - } -} - Client * nexttiled(Client *c) { for(; c && (c->isfloating || !isvisible(c)); c = c->next); @@ -266,15 +237,17 @@ restack(void) { void setlayout(const char *arg) { - int i; + unsigned int i; if(!arg) { if(++ltidx == nlayouts) ltidx = 0;; } else { - i = atoi(arg); - if(i < 0 || i >= nlayouts) + for(i = 0; i < nlayouts; i++) + if(arg == layouts[i].symbol) + break; + if(i == nlayouts) return; ltidx = i; } @@ -282,7 +255,6 @@ setlayout(const char *arg) { arrange(); else drawstatus(); - setdwmprops(); } void @@ -296,7 +268,6 @@ tag(const char *arg) { i = idxoftag(arg); if(i >= 0 && i < ntags) sel->tags[i] = True; - setprops(sel); arrange(); } @@ -315,10 +286,8 @@ togglefloating(const char *arg) { if(!sel || isfloating()) return; sel->isfloating = !sel->isfloating; - if(sel->isfloating) { + if(sel->isfloating) resize(sel, sel->x, sel->y, sel->w, sel->h, True); - setprops(sel); - } arrange(); } @@ -352,7 +321,6 @@ toggletag(const char *arg) { for(j = 0; j < ntags && !sel->tags[j]; j++); if(j == ntags) sel->tags[i] = True; - setprops(sel); arrange(); } @@ -365,7 +333,6 @@ toggleview(const char *arg) { for(j = 0; j < ntags && !seltags[j]; j++); if(j == ntags) seltags[i] = True; /* cannot toggle last view */ - setdwmprops(); arrange(); } @@ -404,6 +371,5 @@ view(const char *arg) { i = idxoftag(arg); if(i >= 0 && i < ntags) seltags[i] = True; - setdwmprops(); arrange(); }