wmii

git clone git://oldgit.suckless.org/wmii/
Log | Files | Refs | README | LICENSE

commit 1f72d945d8cd9864385441223e54055ab5414108
parent c2e18957f9c58724ae8b0f5aefe0fba0d9fe21a2
Author: Kris Maglione <jg@suckless.org>
Date:   Mon, 21 Jan 2008 23:21:37 -0500

Fix a fullscreen bug. Add setsid command to wmiir.

Diffstat:
cmd/util.c | 41+++++++++++++++++++++++++----------------
cmd/wmii.sh.sh | 1-
cmd/wmii/bar.c | 64+++++++++++++++++++++++++---------------------------------------
cmd/wmii/client.c | 9+++++++--
cmd/wmii/dat.h | 2+-
cmd/wmii/div.c | 13+++++++------
cmd/wmii/ewmh.c | 4++--
cmd/wmii/fs.c | 4++--
cmd/wmii/main.c | 1+
cmd/wmii/x11.c | 178++++++++++++++++++++++++++++++++++++++-----------------------------------------
cmd/wmiir.c | 30++++++++++++++++++++++++++----
include/util.h | 3++-
include/x11.h | 3+--
rc/wmiirc.sh | 35++++++++++++++++++-----------------
14 files changed, 202 insertions(+), 186 deletions(-)

diff --git a/cmd/util.c b/cmd/util.c @@ -46,17 +46,25 @@ fatal(const char *fmt, ...) { exit(1); } +void* +freelater(void *p) { + static char* obj[16]; + static long nobj; + int id; + + id = nobj++ % nelem(obj); + free(obj[id]); + obj[id] = p; + return p; +} + char* vsxprint(const char *fmt, va_list ap) { - static char* bufs[16]; - static long nbuf; - int id; + char *s; - id = nbuf++ % nelem(bufs); - if(bufs[id]) - free(bufs[id]); - bufs[id] = vsmprint(fmt, ap); - return bufs[id]; + s = vsmprint(fmt, ap); + freelater(s); + return s; } char* @@ -93,19 +101,19 @@ mfatal(char *name, uint size) { char buf[1024]; char sizestr[8]; int i; - - i = sizeof(sizestr); + + i = sizeof sizestr; do { sizestr[--i] = '0' + (size%10); size /= 10; } while(size > 0); - strlcat(buf, argv0, sizeof(buf)); - strlcat(buf, couldnot, sizeof(buf)); - strlcat(buf, name, sizeof(buf)); - strlcat(buf, paren, sizeof(buf)); - strlcat(buf, sizestr+i, sizeof(buf)); - strlcat(buf, bytes, sizeof(buf)); + strlcat(buf, argv0, sizeof buf); + strlcat(buf, couldnot, sizeof buf); + strlcat(buf, name, sizeof buf); + strlcat(buf, paren, sizeof buf); + strlcat(buf, sizestr+i, sizeof buf); + strlcat(buf, bytes, sizeof buf); write(2, buf, strlen(buf)); exit(1); @@ -204,3 +212,4 @@ strlcat(char *dst, const char *src, uint size) { *d = '\0'; return size - n - 1; } + diff --git a/cmd/wmii.sh.sh b/cmd/wmii.sh.sh @@ -1,5 +1,4 @@ -wmiiscript=$1 if [ -z "$scriptname" ]; then scriptname="$wmiiscript"; fi echo Start $wmiiscript | wmiir write /event 2>/dev/null || diff --git a/cmd/wmii/bar.c b/cmd/wmii/bar.c @@ -1,12 +1,10 @@ -/* Copyright ©2004-2006 Anselm R. Garbe <garbeam at gmail dot com> - * Copyright ©2006-2008 Kris Maglione <fbsdaemon@gmail.com> +/* Copyright ©2006-2008 Kris Maglione <fbsdaemon@gmail.com> * See LICENSE file for license details. */ #include "dat.h" #include "fns.h" static Handlers handlers; -static Bar *free_bars; #define foreach_bar(s, b) \ for(int __bar_n=0; __bar_n < nelem((s)->bar); __bar_n++) \ @@ -25,10 +23,7 @@ bar_init(WMScreen *s) { ExposureMask | ButtonPressMask | ButtonReleaseMask - | FocusChangeMask - | SubstructureRedirectMask - | SubstructureNotifyMask; - + | FocusChangeMask; s->barwin = createwindow(&scr.root, s->brect, scr.depth, InputOutput, &wa, CWOverrideRedirect | CWBackPixmap @@ -39,6 +34,20 @@ bar_init(WMScreen *s) { mapwin(s->barwin); } +void +bar_resize(WMScreen *s) { + View *v; + + s->brect = s->r; + s->brect.min.y = s->brect.max.y - labelh(def.font); + + reshapewin(s->barwin, s->brect); + + bar_draw(s); + for(v=view; v; v=v->next) + view_arrange(v); +} + Bar* bar_create(Bar **bp, const char *name) { static uint id = 1; @@ -50,16 +59,9 @@ bar_create(Bar **bp, const char *name) { if(b) return b; - if(free_bars) { - b = free_bars; - free_bars = b->next; - memset(b, 0, sizeof(*b)); - } - else - b = emallocz(sizeof(Bar)); - + b = emallocz(sizeof *b); b->id = id++; - utflcpy(b->name, name, sizeof(b->name)); + utflcpy(b->name, name, sizeof b->name); b->col = def.normcolor; for(; *bp; bp = &bp[0]->next) @@ -85,24 +87,7 @@ bar_destroy(Bar **bp, Bar *b) { for(p = bp; *p; p = &p[0]->next) if(*p == b) break; *p = b->next; - - b->next = free_bars; - free_bars = b; -} - -void -bar_resize(WMScreen *s) { - View *v; - - s->brect = s->r; - s->brect.min.y = s->brect.max.y - labelh(def.font); - - reshapewin(s->barwin, s->brect); - - sync(); - bar_draw(s); - for(v = view; v; v = v->next) - view_arrange(v); + free(b); } void @@ -151,7 +136,7 @@ bar_draw(WMScreen *s) { foreach_bar(s, b) { if(tb) b->r = rectaddpt(b->r, Pt(tb->r.max.x, 0)); - if(b == s->bar[BarRight]) + if(b == s->bar[BRight]) b->r.max.x += Dx(s->brect) - width; tb = b; } @@ -160,7 +145,7 @@ bar_draw(WMScreen *s) { fill(screen->ibuf, r, def.normcolor.bg); foreach_bar(s, b) { align = Center; - if(b == s->bar[BarRight]) + if(b == s->bar[BRight]) align = East; fill(screen->ibuf, b->r, b->col.bg); drawstring(screen->ibuf, def.font, b->r, align, b->text, b->col.fg); @@ -175,14 +160,14 @@ bar_find(Bar *bp, const char *name) { Bar *b; for(b = bp; b; b = b->next) - if(!strncmp(b->name, name, sizeof(b->name))) + if(!strcmp(b->name, name)) break; return b; } static char *barside[] = { - [BarLeft] = "Left", - [BarRight] = "Right", + [BLeft] = "Left", + [BRight] = "Right", }; static Bar* @@ -247,3 +232,4 @@ static Handlers handlers = { .dndmotion = dndmotion_event, .expose = expose_event, }; + diff --git a/cmd/wmii/client.c b/cmd/wmii/client.c @@ -494,7 +494,8 @@ client_resize(Client *c, Rectangle r) { client_configure(c); ewmh_framesize(c); } - + sync(); /* Not ideal. */ + flushenterevents(); flushevents(FocusChangeMask|ExposureMask, True); } @@ -557,8 +558,12 @@ fullscreen(Client *c, int fullscreen) { if(!fullscreen) for(f=c->frame; f; f=f->cnext) { - if(f->oldarea == 0) + if(f->oldarea == 0) { frame_resize(f, f->oldr); /* XXX: oldr Replace with floatr */ + if(f->view == screen->sel) /* FIXME */ + client_resize(f->client, f->r); + + } else if(f->oldarea > 0) { wassel = (f == f->area->sel); area_moveto(view_findarea(f->view, f->oldarea, true), f); diff --git a/cmd/wmii/dat.h b/cmd/wmii/dat.h @@ -275,7 +275,7 @@ EXTERN struct { } def; enum { - BarLeft, BarRight + BLeft, BRight }; #define BLOCK(x) do { x; }while(0) diff --git a/cmd/wmii/div.c b/cmd/wmii/div.c @@ -4,9 +4,10 @@ #include "dat.h" #include "fns.h" -static Image *divimg, *divmask; -static CTuple divc; -static Handlers handlers; +static Image* divimg; +static Image* divmask; +static CTuple divcolor; +static Handlers handlers; static Divide* getdiv(Divide **dp) { @@ -92,7 +93,7 @@ update_imgs(void) { if(divimg) { if(w == Dx(divimg->r) && h == Dy(divimg->r) - && !memcmp(&divc, &def.normcolor, sizeof(divc))) + && !memcmp(&divcolor, &def.normcolor, sizeof divcolor)) return; freeimage(divimg); freeimage(divmask); @@ -100,11 +101,11 @@ update_imgs(void) { divimg = allocimage(w, h, scr.depth); divmask = allocimage(w, h, 1); - divc = def.normcolor; + divcolor = def.normcolor; fill(divmask, divmask->r, 0); drawimg(divmask, 1, 1); - drawimg(divimg, divc.bg, divc.border); + drawimg(divimg, divcolor.bg, divcolor.border); for(d = divs; d && d->w->mapped; d = d->next) drawdiv(d); diff --git a/cmd/wmii/ewmh.c b/cmd/wmii/ewmh.c @@ -384,8 +384,8 @@ ewmh_framesize(Client *c) { f = c->sel; r.min.x = f->crect.min.x; r.min.y = f->crect.min.y; - r.max.x = f->r.max.x - f->crect.max.x; - r.max.y = f->r.max.y - f->crect.max.y; + r.max.x = Dx(f->r) - f->crect.max.x; + r.max.y = Dy(f->r) - f->crect.max.y; long extents[] = { r.min.x, r.max.x, diff --git a/cmd/wmii/fs.c b/cmd/wmii/fs.c @@ -433,9 +433,9 @@ lookup_file(FileId *parent, char *name) switch(file->tab.type) { case FsDBars: if(!strcmp(file->tab.name, "lbar")) - file->p.bar_p = &screen[0].bar[BarLeft]; + file->p.bar_p = &screen[0].bar[BLeft]; else - file->p.bar_p = &screen[0].bar[BarRight]; + file->p.bar_p = &screen[0].bar[BRight]; break; case FsFColRules: file->p.rule = &def.colrules; diff --git a/cmd/wmii/main.c b/cmd/wmii/main.c @@ -241,6 +241,7 @@ errorhandler(Display *dpy, XErrorEvent *error) { /* Try to cleanup, but only try once, in case we're called recursively. */ if(!dead++) cleanup(); + abort(); return xlib_errorhandler(display, error); /* calls exit() */ } diff --git a/cmd/wmii/x11.c b/cmd/wmii/x11.c @@ -6,6 +6,7 @@ #define ZR _ZR #define pointerwin __pointerwin #include "dat.h" +#include <limits.h> #include <math.h> #include <unistd.h> #include <bio.h> @@ -15,17 +16,16 @@ * elsewhere. */ #undef pointerwin -const Point ZP = {0, 0}; -const Rectangle ZR = {{0, 0}, {0, 0}}; +const Point ZP = {0, 0}; +const Rectangle ZR = {{0, 0}, {0, 0}}; -const Window _pointerwin = { - .w = PointerRoot -}; -Window *const pointerwin = (Window*)&_pointerwin; +const Window _pointerwin = { .w = PointerRoot }; +Window* const pointerwin = (Window*)&_pointerwin; -static Map wmap, amap; -static MapEnt* wbucket[137]; -static MapEnt* abucket[137]; +static Map windowmap; +static Map atommap; +static MapEnt* wbucket[137]; +static MapEnt* abucket[137]; /* Rectangles/Points */ @@ -43,7 +43,7 @@ XRect(Rectangle r) { int eqrect(Rectangle a, Rectangle b) { return a.min.x==b.min.x && a.max.x==b.max.x - && a.min.y==b.min.y && a.max.y==b.max.y; + && a.min.y==b.min.y && a.max.y==b.max.y; } int @@ -165,10 +165,10 @@ initdisplay(void) { scr.root.parent = &scr.root; - wmap.bucket = wbucket; - wmap.nhash = nelem(wbucket); - amap.bucket = abucket; - amap.nhash = nelem(abucket); + windowmap.bucket = wbucket; + windowmap.nhash = nelem(wbucket); + atommap.bucket = abucket; + atommap.nhash = nelem(abucket); fmtinstall('A', Afmt); fmtinstall('R', Rfmt); @@ -183,8 +183,8 @@ allocimage(int w, int h, int depth) { img = emallocz(sizeof *img); img->type = WImage; - img->image = XCreatePixmap(display, scr.root.w, w, h, depth); - img->gc = XCreateGC(display, img->image, 0, nil); + img->w = XCreatePixmap(display, scr.root.w, w, h, depth); + img->gc = XCreateGC(display, img->w, 0, nil); img->depth = depth; img->r = Rect(0, 0, w, h); return img; @@ -194,16 +194,14 @@ void freeimage(Image *img) { assert(img->type == WImage); - XFreePixmap(display, img->image); + XFreePixmap(display, img->w); XFreeGC(display, img->gc); free(img); } /* Windows */ Window* -createwindow(Window *parent, Rectangle r, int depth, uint class, - WinAttr *wa, int valmask) - { +createwindow(Window *parent, Rectangle r, int depth, uint class, WinAttr *wa, int valmask) { Window *w; assert(parent->type == WWindow); @@ -214,11 +212,8 @@ createwindow(Window *parent, Rectangle r, int depth, uint class, w->w = XCreateWindow(display, parent->w, r.min.x, r.min.y, Dx(r), Dy(r), 0 /* border */, depth, class, scr.visual, valmask, wa); - - if(class != InputOnly) { + if(class != InputOnly) w->gc = XCreateGC(display, w->w, 0, nil); - w->image = w->w; - } w->r = r; w->depth = depth; @@ -226,12 +221,13 @@ createwindow(Window *parent, Rectangle r, int depth, uint class, } Window* -window(XWindow w) { - static Window win; +window(XWindow xw) { + Window *w; - win.type = WWindow; - win.w = w; - return &win; + w = malloc(sizeof *w); + w->type = WWindow; + w->w = xw; + return freelater(w); } void @@ -316,9 +312,9 @@ sethandler(Window *w, Handlers *new) { assert((w->prev != nil && w->next != nil) || w->next == w->prev); if(new == nil) - map_rm(&wmap, (ulong)w->w); + map_rm(&windowmap, (ulong)w->w); else { - e = map_get(&wmap, (ulong)w->w, 1); + e = map_get(&windowmap, (ulong)w->w, 1); e->val = w; } old = w->handler; @@ -330,7 +326,7 @@ Window* findwin(XWindow w) { MapEnt *e; - e = map_get(&wmap, (ulong)w, 0); + e = map_get(&windowmap, (ulong)w, 0); if(e) return e->val; return nil; @@ -346,7 +342,7 @@ void setshapemask(Window *dst, Image *src, Point pt) { /* Assumes that we have the shape extension... */ XShapeCombineMask (display, dst->w, - ShapeBounding, pt.x, pt.y, src->image, ShapeSet); + ShapeBounding, pt.x, pt.y, src->w, ShapeSet); } static void @@ -366,14 +362,14 @@ border(Image *dst, Rectangle r, int w, ulong col) { XSetLineAttributes(display, dst->gc, w, LineSolid, CapButt, JoinMiter); setgccol(dst, col); - XDrawRectangle(display, dst->image, dst->gc, + XDrawRectangle(display, dst->w, dst->gc, r.min.x, r.min.y, Dx(r), Dy(r)); } void fill(Image *dst, Rectangle r, ulong col) { setgccol(dst, col); - XFillRectangle(display, dst->image, dst->gc, + XFillRectangle(display, dst->w, dst->gc, r.min.x, r.min.y, Dx(r), Dy(r)); } @@ -397,7 +393,7 @@ drawpoly(Image *dst, Point *pt, int np, int cap, int w, ulong col) { xp = convpts(pt, np); XSetLineAttributes(display, dst->gc, w, LineSolid, cap, JoinMiter); setgccol(dst, col); - XDrawLines(display, dst->image, dst->gc, xp, np, CoordModeOrigin); + XDrawLines(display, dst->w, dst->gc, xp, np, CoordModeOrigin); free(xp); } @@ -407,7 +403,7 @@ fillpoly(Image *dst, Point *pt, int np, ulong col) { xp = convpts(pt, np); setgccol(dst, col); - XFillPolygon(display, dst->image, dst->gc, xp, np, Complex, CoordModeOrigin); + XFillPolygon(display, dst->w, dst->gc, xp, np, Complex, CoordModeOrigin); free(xp); } @@ -415,13 +411,13 @@ void drawline(Image *dst, Point p1, Point p2, int cap, int w, ulong col) { XSetLineAttributes(display, dst->gc, w, LineSolid, cap, JoinMiter); setgccol(dst, col); - XDrawLine(display, dst->image, dst->gc, p1.x, p1.y, p2.x, p2.y); + XDrawLine(display, dst->w, dst->gc, p1.x, p1.y, p2.x, p2.y); } uint drawstring(Image *dst, Font *font, - Rectangle r, Align align, - char *text, ulong col) { + Rectangle r, Align align, + char *text, ulong col) { char *buf; uint x, y, w, h, len; int shortened; @@ -465,13 +461,13 @@ drawstring(Image *dst, Font *font, setgccol(dst, col); if(font->set) - Xutf8DrawString(display, dst->image, + Xutf8DrawString(display, dst->w, font->set, dst->gc, x, y, buf, len); else { XSetFont(display, dst->gc, font->xfont->fid); - XDrawString(display, dst->image, dst->gc, + XDrawString(display, dst->w, dst->gc, x, y, buf, len); } @@ -484,10 +480,10 @@ done: void copyimage(Image *dst, Rectangle r, Image *src, Point p) { XCopyArea(display, - src->image, dst->image, - dst->gc, - r.min.x, r.min.y, Dx(r), Dy(r), - p.x, p.y); + src->w, dst->w, + dst->gc, + r.min.x, r.min.y, Dx(r), Dy(r), + p.x, p.y); } /* Colors */ @@ -497,22 +493,22 @@ namedcolor(char *name, ulong *ret) { if(XAllocNamedColor(display, scr.colormap, name, &c, &c2)) { *ret = c.pixel; - return 1; + return true; } - return 0; + return false; } bool loadcolor(CTuple *c, char *str) { char buf[24]; - utflcpy(buf, str, sizeof(buf)); + utflcpy(buf, str, sizeof buf); memcpy(c->colstr, str, sizeof c->colstr); buf[7] = buf[15] = buf[23] = '\0'; return namedcolor(buf, &c->fg) - && namedcolor(buf+8, &c->bg) - && namedcolor(buf+16, &c->border); + && namedcolor(buf+8, &c->bg) + && namedcolor(buf+16, &c->border); } /* Fonts */ @@ -533,7 +529,7 @@ loadfont(char *name) { Bprint(b, "%s: note: missing fontset%s for '%s':", argv0, (n > 1 ? "s" : ""), name); for(i = 0; i < n; i++) - Bprint(b, "%s %s", (i ? "," : ""), missing[i]); + Bprint(b, "%s %s", i?",":"", missing[i]); Bprint(b, "\n"); Bterm(b); freestringlist(missing); @@ -543,8 +539,7 @@ loadfont(char *name) { XFontsOfFontSet(f->set, &xfonts, &font_names); f->ascent = xfonts[0]->ascent; f->descent = xfonts[0]->descent; - } - else { + }else { f->xfont = XLoadQueryFont(display, name); if(!f->xfont) { fprint(2, "%s: cannot load font: %s\n", argv0, name); @@ -595,7 +590,7 @@ Atom xatom(char *name) { MapEnt *e; - e = hash_get(&amap, name, 1); + e = hash_get(&atommap, name, 1); if(e->val == nil) e->val = (void*)XInternAtom(display, name, False); return (Atom)e->val; @@ -851,7 +846,6 @@ ungrabpointer(void) { /* Insanity */ void sethints(Window *w) { - enum { MaxInt = ((uint)(1<<(8*sizeof(int)-1))-1) }; XSizeHints xs; XWMHints *wmh; WinHints *h; @@ -864,12 +858,12 @@ sethints(Window *w) { h = w->hints; memset(h, 0, sizeof *h); - h->max = Pt(MaxInt, MaxInt); + h->max = Pt(INT_MAX, INT_MAX); h->inc = Pt(1,1); wmh = XGetWMHints(display, w->w); if(wmh) { - if(wmh->flags&WindowGroupHint) + if(wmh->flags & WindowGroupHint) h->group = wmh->window_group; free(wmh); } @@ -877,45 +871,40 @@ sethints(Window *w) { if(!XGetWMNormalHints(display, w->w, &xs, &size)) return; - if(xs.flags&PMinSize) { - p.x = xs.min_width; - p.y = xs.min_height; - h->min = p; + if(xs.flags & PMinSize) { + h->min.x = xs.min_width; + h->min.y = xs.min_height; } - if(xs.flags&PMaxSize) { - p.x = xs.max_width; - p.y = xs.max_height; - h->max = p; + if(xs.flags & PMaxSize) { + h->max.x = xs.max_width; + h->max.y = xs.max_height; } h->base = h->min; - if(xs.flags&PBaseSize) { + if(xs.flags & PBaseSize) { p.x = xs.base_width; p.y = xs.base_height; h->base = p; h->baspect = p; } - if(xs.flags&PResizeInc) { + if(xs.flags & PResizeInc) { h->inc.x = max(xs.width_inc, 1); h->inc.y = max(xs.height_inc, 1); } - if(xs.flags&PAspect) { - p.x = xs.min_aspect.x; - p.y = xs.min_aspect.y; - h->aspect.min = p; - p.x = xs.max_aspect.x; - p.y = xs.max_aspect.y; - h->aspect.max = p; + if(xs.flags & PAspect) { + h->aspect.min.x = xs.min_aspect.x; + h->aspect.min.y = xs.min_aspect.y; + h->aspect.max.x = xs.max_aspect.x; + h->aspect.max.y = xs.max_aspect.y; } - - h->position = ((xs.flags&(USPosition|PPosition)) != 0); + + h->position = ((xs.flags & (USPosition|PPosition)) != 0); p = ZP; - if((xs.flags&PWinGravity) == 0) + if(!(xs.flags & PWinGravity)) xs.win_gravity = NorthWestGravity; - switch (xs.win_gravity) { case EastGravity: case CenterGravity: @@ -946,13 +935,13 @@ sethints(Window *w) { Rectangle sizehint(WinHints *h, Rectangle r) { - Point p, p2, o; + Point p, aspect, origin; if(h == nil) return r; - o = r.min; - r = rectsubpt(r, o); + origin = r.min; + r = rectsubpt(r, origin); /* Min/max */ r.max.x = max(r.max.x, h->min.x); @@ -968,25 +957,27 @@ sizehint(WinHints *h, Rectangle r) { /* Aspect */ p = subpt(r.max, h->baspect); p.y = max(p.y, 1); - p2 = h->aspect.min; - if(p.x * p2.y / p.y < p2.x) - r.max.y = h->baspect.y + p.x * p2.y / p2.x; - p2 = h->aspect.max; - if(p.x * p2.y / p.y > p2.x) - r.max.x = h->baspect.x + p.y * p2.x / p2.y; - return rectaddpt(r, o); + aspect = h->aspect.min; + if(p.x * aspect.y / p.y < aspect.x) + r.max.y = h->baspect.y + + p.x * aspect.y / aspect.x; + + aspect = h->aspect.max; + if(p.x * aspect.y / p.y > aspect.x) + r.max.x = h->baspect.x + + p.y * aspect.x / aspect.y; + + return rectaddpt(r, origin); } Rectangle gravitate(Rectangle rc, Rectangle rf, Point grav) { Point d; - rf = rectsubpt(rf, rf.min); - /* Get delta between frame and client rectangles */ - d = subpt(rc.max, rc.min); - d = subpt(rf.max, d); + d = subpt(subpt(rf.max, rf.min), + subpt(rc.max, rc.min)); /* Divide by 2 and apply gravity */ d = divpt(d, Pt(2, 2)); @@ -994,3 +985,4 @@ gravitate(Rectangle rc, Rectangle rf, Point grav) { return rectsubpt(rc, d); } + diff --git a/cmd/wmiir.c b/cmd/wmiir.c @@ -300,19 +300,41 @@ xls(int argc, char *argv[]) { return 0; } +static int +xsetsid(int argc, char *argv[]) { + char *av0; + + av0 = nil; + ARGBEGIN{ + case '0': + av0 = EARGF(usage()); + break; + default: + usage(); + }ARGEND; + if(av0 == nil) + av0 = argv[0]; + + setsid(); + execvp(av0, argv); + fatal("setsid: can't exec: %r"); + return 1; /* NOTREACHED */ +} + typedef struct exectab exectab; struct exectab { char *cmd; int (*fn)(int, char**); } etab[] = { - {"write", xwrite}, - {"xwrite", xawrite}, - {"read", xread}, {"cat", xread}, {"create", xcreate}, + {"ls", xls}, + {"read", xread}, {"remove", xremove}, {"rm", xremove}, - {"ls", xls}, + {"setsid", xsetsid}, + {"write", xwrite}, + {"xwrite", xawrite}, {0, 0} }; diff --git a/include/util.h b/include/util.h @@ -15,7 +15,7 @@ #define ushort _x_ushort #define uint _x_uint #define ulong _x_ulong -#define uvlong _x_uvlong +#define uvlong _x_uvlong #define vlong _x_vlong typedef unsigned char uchar; @@ -34,6 +34,7 @@ void* emallocz(uint); void* erealloc(void*, uint); char* estrdup(const char*); void fatal(const char*, ...); +void* freelater(void*); int max(int, int); int min(int, int); uint strlcat(char*, const char*, uint); diff --git a/include/x11.h b/include/x11.h @@ -112,8 +112,7 @@ struct WinHints { struct Window { int type; - XWindow w; - Drawable image; + XID w; GC gc; Rectangle r; Window* parent; diff --git a/rc/wmiirc.sh b/rc/wmiirc.sh @@ -1,6 +1,7 @@ #!/bin/sh -f # Configure wmii -. wmii.sh wmiirc +wmiiscript=wmiirc # For wmii.sh +. wmii.sh # Configuration Variables MODKEY=Mod1 @@ -63,6 +64,19 @@ wi_events -s ' ' <<'!' Event LeftBarClick LeftBarDND shift wmiir xwrite /ctl view "$@" + Event ClientMouseDown + client=$1; button=$2 + case "$button" in + 3) + do=$(wi_9menu -initial "$menulast" Nop Delete Fullscreen) + case "$do" in + Delete) + wmiir xwrite /client/$client/ctl kill;; + Fullscreen) + wmiir xwrite /client/$client/ctl Fullscreen on;; + esac + menulast=${do:-"$menulast"} + esac Event Unresponsive { client=$1; shift @@ -96,19 +110,6 @@ wi_events -s ' ' <<'!' while status | wmiir write /rbar/status; do sleep 1 done - Event ClientMouseDown - client=$1; button=$2 - case "$button" in - 3) - do=$(wi_9menu -initial "${menulast:-SomeRandomName}" Nop Delete Fullscreen) - case "$do" in - Delete) - wmiir xwrite /client/$client/ctl kill;; - Fullscreen) - wmiir xwrite /client/$client/ctl Fullscreen on;; - esac - menulast=${do:-"$menulast"} - esac # Key Bindings Key $MODKEY-Control-t case $(wmiir read /keys | wc -l | tr -d ' \t\n') in @@ -130,9 +131,9 @@ wi_events -s ' ' <<'!' Key $MODKEY-a Action $(wi_actions | wi_menu) & Key $MODKEY-p - sh -c "$(wi_menu <$progsfile)" & + wmiir setsid "$(wi_menu <$progsfile)" & Key $MODKEY-t - wmiir xwrite /ctl "view $(wi_tags | wi_menu)" & + wmiir xwrite /ctl view $(wi_tags | wi_menu) & Key $MODKEY-Return eval $WMII_TERM & Key $MODKEY-Shift-space @@ -142,7 +143,7 @@ wi_events -s ' ' <<'!' Key $MODKEY-Shift-c wmiir xwrite /client/sel/ctl kill Key $MODKEY-Shift-t - wmiir xwrite "/client/$(wmiir read /client/sel/ctl)/tags" "$(wi_tags | wi_menu)" & + wmiir xwrite "/client/$(wmiir read /client/sel/ctl)/tags" $(wi_tags | wi_menu) & Key $MODKEY-$LEFT wmiir xwrite /tag/sel/ctl select left Key $MODKEY-$RIGHT