[hackers] [wmii] Fix a fullscreen bug. Add setsid command to wmiir.

From: Kris Maglione <jg_AT_suckless.org>
Date: Tue Jan 22 05:22:24 2008

changeset: 2251:b5da839c0588
tag: tip
user: Kris Maglione <jg_AT_suckless.org>
date: Mon Jan 21 23:21:37 2008 -0500
summary: Fix a fullscreen bug. Add setsid command to wmiir.

diff -r 80565821dd0c -r b5da839c0588 cmd/util.c
--- a/cmd/util.c Mon Jan 21 18:22:42 2008 -0500
+++ b/cmd/util.c Mon Jan 21 23:21:37 2008 -0500
@@ -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;
-
- id = nbuf++ % nelem(bufs);
- if(bufs[id])
- free(bufs[id]);
- bufs[id] = vsmprint(fmt, ap);
- return bufs[id];
+ char *s;
+
+ 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
                 *d = '\0';
         return size - n - 1;
 }
+
diff -r 80565821dd0c -r b5da839c0588 cmd/wmii.sh.sh
--- a/cmd/wmii.sh.sh Mon Jan 21 18:22:42 2008 -0500
+++ b/cmd/wmii.sh.sh Mon Jan 21 23:21:37 2008 -0500
@@ -1,5 +1,4 @@
 
-wmiiscript=$1
 if [ -z "$scriptname" ]; then
         scriptname="$wmiiscript"; fi
 echo Start $wmiiscript | wmiir write /event 2>/dev/null ||
diff -r 80565821dd0c -r b5da839c0588 cmd/wmii/bar.c
--- a/cmd/wmii/bar.c Mon Jan 21 18:22:42 2008 -0500
+++ b/cmd/wmii/bar.c Mon Jan 21 23:21:37 2008 -0500
@@ -1,12 +1,10 @@
-/* Copyright ©2004-2006 Anselm R. Garbe <garbeam at gmail dot com>
- * Copyright ©2006-2008 Kris Maglione <fbsdaemon_AT_gmail.com>
+/* Copyright ©2006-2008 Kris Maglione <fbsdaemon_AT_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 -r 80565821dd0c -r b5da839c0588 cmd/wmii/client.c
--- a/cmd/wmii/client.c Mon Jan 21 18:22:42 2008 -0500
+++ b/cmd/wmii/client.c Mon Jan 21 23:21:37 2008 -0500
@@ -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 -r 80565821dd0c -r b5da839c0588 cmd/wmii/dat.h
--- a/cmd/wmii/dat.h Mon Jan 21 18:22:42 2008 -0500
+++ b/cmd/wmii/dat.h Mon Jan 21 23:21:37 2008 -0500
@@ -275,7 +275,7 @@ EXTERN struct {
 } def;
 
 enum {
- BarLeft, BarRight
+ BLeft, BRight
 };
 
 #define BLOCK(x) do { x; }while(0)
diff -r 80565821dd0c -r b5da839c0588 cmd/wmii/div.c
--- a/cmd/wmii/div.c Mon Jan 21 18:22:42 2008 -0500
+++ b/cmd/wmii/div.c Mon Jan 21 23:21:37 2008 -0500
@@ -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 -r 80565821dd0c -r b5da839c0588 cmd/wmii/ewmh.c
--- a/cmd/wmii/ewmh.c Mon Jan 21 18:22:42 2008 -0500
+++ b/cmd/wmii/ewmh.c Mon Jan 21 23:21:37 2008 -0500
@@ -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 -r 80565821dd0c -r b5da839c0588 cmd/wmii/fs.c
--- a/cmd/wmii/fs.c Mon Jan 21 18:22:42 2008 -0500
+++ b/cmd/wmii/fs.c Mon Jan 21 23:21:37 2008 -0500
@@ -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 -r 80565821dd0c -r b5da839c0588 cmd/wmii/main.c
--- a/cmd/wmii/main.c Mon Jan 21 18:22:42 2008 -0500
+++ b/cmd/wmii/main.c Mon Jan 21 23:21:37 2008 -0500
@@ -241,6 +241,7 @@ errorhandler(Display *dpy, XErrorEvent *
         /* 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 -r 80565821dd0c -r b5da839c0588 cmd/wmii/x11.c
--- a/cmd/wmii/x11.c Mon Jan 21 18:22:42 2008 -0500
+++ b/cmd/wmii/x11.c Mon Jan 21 23:21:37 2008 -0500
@@ -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 Window _pointerwin = {
- .w = PointerRoot
-};
-Window *const pointerwin = (Window*)&_pointerwin;
-
-static Map wmap, amap;
-static MapEnt* wbucket[137];
-static MapEnt* abucket[137];
+const Point ZP = {0, 0};
+const Rectangle ZR = {{0, 0}, {0, 0}};
+
+const Window _pointerwin = { .w = PointerRoot };
+Window* const pointerwin = (Window*)&_pointerwin;
+
+static Map windowmap;
+static Map atommap;
+static MapEnt* wbucket[137];
+static MapEnt* abucket[137];
 
 
 /* Rectangles/Points */
@@ -43,7 +43,7 @@ int
 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 @@ freeimage(Image *img) {
 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
 
         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
 }
 
 Window*
-window(XWindow w) {
- static Window win;
-
- win.type = WWindow;
- win.w = w;
- return &win;
+window(XWindow xw) {
+ Window *w;
+
+ 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 @@ findwin(XWindow w) {
 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 @@ setshapemask(Window *dst, Image *src, Po
 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, u
 
         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,
         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,
 
         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 @@ drawline(Image *dst, Point p1, Point p2,
 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 @@ void
 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 0;
+ return true;
+ }
+ 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 @@ xatom(char *name) {
 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&PMaxSize) {
- p.x = xs.max_width;
- p.y = xs.max_height;
- h->max = p;
+ if(xs.flags & PMinSize) {
+ h->min.x = xs.min_width;
+ h->min.y = xs.min_height;
+ }
+ 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;
- }
-
- h->position = ((xs.flags&(USPosition|PPosition)) != 0);
+ 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);
 
         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, Po
 
         return rectsubpt(rc, d);
 }
+
diff -r 80565821dd0c -r b5da839c0588 cmd/wmiir.c
--- a/cmd/wmiir.c Mon Jan 21 18:22:42 2008 -0500
+++ b/cmd/wmiir.c Mon Jan 21 23:21:37 2008 -0500
@@ -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[] = {
+ {"cat", xread},
+ {"create", xcreate},
+ {"ls", xls},
+ {"read", xread},
+ {"remove", xremove},
+ {"rm", xremove},
+ {"setsid", xsetsid},
         {"write", xwrite},
         {"xwrite", xawrite},
- {"read", xread},
- {"cat", xread},
- {"create", xcreate},
- {"remove", xremove},
- {"rm", xremove},
- {"ls", xls},
         {0, 0}
 };
 
diff -r 80565821dd0c -r b5da839c0588 include/util.h
--- a/include/util.h Mon Jan 21 18:22:42 2008 -0500
+++ b/include/util.h Mon Jan 21 23:21:37 2008 -0500
@@ -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* erealloc(void*, 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 -r 80565821dd0c -r b5da839c0588 include/x11.h
--- a/include/x11.h Mon Jan 21 18:22:42 2008 -0500
+++ b/include/x11.h Mon Jan 21 23:21:37 2008 -0500
@@ -112,8 +112,7 @@ struct WinHints {
 
 struct Window {
         int type;
- XWindow w;
- Drawable image;
+ XID w;
         GC gc;
         Rectangle r;
         Window* parent;
diff -r 80565821dd0c -r b5da839c0588 rc/wmiirc.sh
--- a/rc/wmiirc.sh Mon Jan 21 18:22:42 2008 -0500
+++ b/rc/wmiirc.sh Mon Jan 21 23:21:37 2008 -0500
@@ -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
Received on Tue Jan 22 2008 - 05:22:24 UTC

This archive was generated by hypermail 2.2.0 : Sun Jul 13 2008 - 15:59:06 UTC