[hackers] [wmii] Some grabbox fixes, and, it seems, several changes I forgot to commit.

From: Kris Maglione <jg_AT_suckless.org>
Date: Fri, 01 Jun 2007 01:10:29 -0000

changeset: 2132:de4907a49023
user: Kris Maglione <jg_AT_suckless.org>
date: Thu May 10 13:14:39 2007 -0400
summary: Some grabbox fixes, and, it seems, several changes I forgot to commit.

diff -r 49c6da41bba5 -r de4907a49023 TODO
--- a/TODO Wed Apr 25 17:48:44 2007 -0400
+++ b/TODO Thu May 10 13:14:39 2007 -0400
@@ -4,11 +4,9 @@ 3.6
 * Switch to mk for building
 
 4.0
-* Get rid of col modes
+* Get rid of colmodes
 * (Multi line) Tag bars
-* Replace bar with master tag bar
-* New event system
 * Resizable managed area
-* Sticky clients
+* Regex-based tag strings
 * New dmenu(with real cursor and using Bio)
-* Depend on plan9-corelibs
+* Use libbio, libfmt, libregex9
diff -r 49c6da41bba5 -r de4907a49023 cmd/wmii/area.c
--- a/cmd/wmii/area.c Wed Apr 25 17:48:44 2007 -0400
+++ b/cmd/wmii/area.c Thu May 10 13:14:39 2007 -0400
@@ -296,7 +296,7 @@ place_frame(Frame *f) {
 
         if(c->trans)
                 return;
- if(c->fullscreen || c->w.hints->position)
+ if(c->fullscreen || c->w.hints->position || starting)
                 return;
         if(!field) {
                 mx = Dx(screen->r) / dx;
diff -r 49c6da41bba5 -r de4907a49023 cmd/wmii/client.c
--- a/cmd/wmii/client.c Wed Apr 25 17:48:44 2007 -0400
+++ b/cmd/wmii/client.c Thu May 10 13:14:39 2007 -0400
@@ -104,14 +104,14 @@ manage_client(Client *c) {
         r = c->w.r;
         p.x = def.border;
         p.y = labelh(def.font);
- reparent_client(c, c->framewin, ZP);
+ reparentwindow(&c->w, c->framewin, p);
 
         if(!strlen(c->tags))
                 apply_rules(c);
         else
                 apply_tags(c, c->tags);
 
- if(c->w.hints->position) {
+ if(c->w.hints->position || starting) {
                 r = gravclient(c, r);
                 if(c->sel->area->floating)
                         resize_client(c, &r);
@@ -138,7 +138,7 @@ destroy_client(Client *c) {
         Rectangle r;
         char *dummy;
         Client **tc;
- XEvent ev;
+ Bool hide;
 
         Debug fprintf(stderr, "client.c:destroy_client(%p) %s\n", c, c->name);
 
@@ -148,37 +148,39 @@ destroy_client(Client *c) {
                         break;
                 }
 
+ r = c->w.r;
+ if(c->sel) {
+ r = gravclient(c, ZR);
+ r = frame2client(c->sel, r);
+ }
+
+ hide = False;
+ if(!c->sel || c->sel->view != screen->sel)
+ hide = True;
+
         XGrabServer(display);
 
         /* In case the client is already unmapped */
         handler = XSetErrorHandler(ignoreerrors);
 
- if(c->sel) {
- r = gravclient(c, ZR);
- r = frame2client(nil, r);
- }
-
         dummy = nil;
         update_client_views(c, &dummy);
-
- unmap_client(c, WithdrawnState);
- reparent_client(c, &scr.root, r.min);
-
- write_event("DestroyClient 0x%x\n", (uint)c->w.w);
-
+ unmap_client(c, IconicState);
+ sethandler(&c->w, nil);
+
+ if(hide)
+ reparentwindow(&c->w, &scr.root, screen->r.max);
+ else
+ reparentwindow(&c->w, &scr.root, r.min);
         destroywindow(c->framewin);
- sethandler(&c->w, nil);
 
         XSync(display, False);
         XSetErrorHandler(handler);
-
         XUngrabServer(display);
+
+ write_event("DestroyClient 0x%x\n", clientwin(c));
+
         flushevents(EnterWindowMask, False);
-
- while(XCheckMaskEvent(display, StructureNotifyMask, &ev))
- if(ev.type != UnmapNotify || ev.xunmap.window != c->w.w)
- dispatch_event(&ev);
-
         free(c);
 }
 
@@ -325,14 +327,15 @@ focus_client(Client *c) {
 
         if(screen->focus != c) {
                 Debug fprintf(stderr, "\t%s => %s\n", clientname(screen->focus), clientname(c));
+
                 if(c)
                         setfocus(&c->w, RevertToParent);
                 else
                         setfocus(screen->barwin, RevertToParent);
+
                 XSync(display, False);
- }
-
- flushevents(FocusChangeMask, True);
+ flushevents(FocusChangeMask, True);
+ }
 }
 
 void
@@ -364,13 +367,8 @@ resize_client(Client *c, Rectangle *r) {
                 map_frame(c);
                 configure_client(c);
         }
-
+
         flushevents(FocusChangeMask|ExposureMask, True);
-}
-
-void
-reparent_client(Client *c, Window *w, Point pt) {
- reparentwindow(&c->w, w, pt);
 }
 
 void
@@ -500,6 +498,8 @@ update_client_name(Client *c) {
         free(str);
 
         update_class(c);
+ if(c->sel)
+ draw_frame(c->sel);
 }
 
 static void
@@ -546,13 +546,15 @@ prop_client(Client *c, Atom a) {
         char **class;
         int n;
 
- if(a == xatom("WM_PROTOCOLS"))
+ if(a == xatom("WM_PROTOCOLS")) {
                 c->proto = winprotocols(&c->w);
- else if(a == xatom("_NET_WM_NAME"))
+ }
+ else if(a == xatom("_NET_WM_NAME")) {
                 goto wmname;
- else if(a == xatom("_MOTIF_WM_HINTS"))
+ }
+ else if(a == xatom("_MOTIF_WM_HINTS")) {
                 updatemwm(c);
- else switch (a) {
+ }else switch (a) {
         case XA_WM_TRANSIENT_FOR:
                 XGetTransientForHint(display, c->w.w, &c->trans);
                 break;
@@ -579,8 +581,6 @@ prop_client(Client *c, Atom a) {
         case XA_WM_NAME:
 wmname:
                 update_client_name(c);
- if(c->frame)
- draw_frame(c->sel);
                 break;
         }
 }
@@ -611,7 +611,8 @@ configreq_event(Window *w, XConfigureReq
         r = rectaddpt(r, p);
         r = gravclient(c, r);
 
- if((Dx(r) == Dx(screen->r)) && (Dy(r) == Dy(screen->r))) {
+ if((Dx(r) == Dx(screen->r))
+ && (Dy(r) == Dy(screen->r))) {
                 c->fullscreen = True;
                 if(f) {
                         if(!f->area->floating)
@@ -666,27 +667,22 @@ focusin_event(Window *w, XFocusChangeEve
         if(c != old) {
                 if(c->sel)
                         draw_frame(c->sel);
- if(old && old->sel)
- draw_frame(old->sel);
         }
 }
 
 static void
 focusout_event(Window *w, XFocusChangeEvent *e) {
         Client *c;
-
+
         c = w->aux;
-
         if((e->mode == NotifyWhileGrabbed) && (screen->hasgrab != &c_root)) {
                 if((screen->focus) && (screen->hasgrab != screen->focus))
                         screen->hasgrab = screen->focus;
                 if(screen->hasgrab == c)
                         return;
- }else if(e->mode != NotifyGrab) {
- if(screen->focus == c) {
- print_focus(&c_magic, "<magic>");
- screen->focus = &c_magic;
- }
+ }else if(screen->focus == c) {
+ print_focus(&c_magic, "<magic>");
+ screen->focus = &c_magic;
                 if(c->sel)
                         draw_frame(c->sel);
         }
diff -r 49c6da41bba5 -r de4907a49023 cmd/wmii/column.c
--- a/cmd/wmii/column.c Wed Apr 25 17:48:44 2007 -0400
+++ b/cmd/wmii/column.c Thu May 10 13:14:39 2007 -0400
@@ -204,13 +204,6 @@ scale_column(Area *a) {
         if(!a->frame)
                 return;
 
- /* This works by comparing heights based on a surplus of their
- * minimum size. We start by subtracting the minimum size, then
- * scale the surplus, and add back the minimum size later. This
- * is based on the size of the client, rather than the frame, so
- * increment gaps can be equalized later */
- /* Frames that can't be accomodated are pushed to the floating layer */
-
         minh = labelh(def.font);
         colh = labelh(def.font);
         uncolh = minh + colh +1;
@@ -253,11 +246,6 @@ scale_column(Area *a) {
                 f = *fp;
                 if(f == a->sel)
                         i++, j++;
- if(!f->collapsed) {
- if(j < 0 && (f != a->sel))
- f->collapsed = True;
- j--;
- }
                 if(f->collapsed) {
                         if(i < 0 && (f != a->sel)) {
                                 f->collapsed = False;
@@ -265,6 +253,10 @@ scale_column(Area *a) {
                                 continue;
                         }
                         i--;
+ }else {
+ if(j < 0 && (f != a->sel))
+ f->collapsed = True;
+ j--;
                 }
                 /* Doesn't change if we 'continue' */
                 fp=&f->anext;
@@ -281,8 +273,8 @@ scale_column(Area *a) {
                 }else {
                         f->r.max.y = uncolh;
                         dy += Dy(f->crect);
- surplus += Dy(f->r);
- }
+ }
+ surplus += Dy(f->r);
         }
         for(f = a->frame; f; f = f->anext)
                 f->ratio = (float)Dy(f->crect)/dy;
@@ -293,11 +285,9 @@ scale_column(Area *a) {
                 j = surplus;
                 dy = 0;
                 for(f=a->frame; f; f=f->anext) {
- if(!f->collapsed) {
+ if(!f->collapsed)
                                 f->r.max.y += f->ratio * surplus;
- resize_frame(f, f->r);
- f->r.max.y = Dy(f->crect) + labelh(def.font) + 1;
- }
+ resize_frame(f, f->r);
                         dy += Dy(f->r);
                 }
                 surplus = Dy(a->r) - dy;
@@ -336,11 +326,9 @@ arrange_column(Area *a, Bool dirty) {
 
         switch(a->mode) {
         case Coldefault:
- for(f=a->frame; f; f=f->anext) {
- f->collapsed = False;
- if(dirty)
+ if(dirty)
+ for(f=a->frame; f; f=f->anext)
                                 f->r = Rect(0, 0, 100, 100);
- }
                 break;
         case Colstack:
                 for(f=a->frame; f; f=f->anext)
diff -r 49c6da41bba5 -r de4907a49023 cmd/wmii/event.c
--- a/cmd/wmii/event.c Wed Apr 25 17:48:44 2007 -0400
+++ b/cmd/wmii/event.c Thu May 10 13:14:39 2007 -0400
@@ -15,6 +15,8 @@ dispatch_event(XEvent *e) {
                 handler[e->type](e);
 }
 
+#define handle(w, fn, ev) ((w)->handler->fn ? (w)->handler->fn((w), ev) : (void)0)
+
 uint
 flushevents(long event_mask, Bool dispatch) {
         XEvent ev;
@@ -35,8 +37,7 @@ buttonrelease(XEvent *e) {
 
         ev = &e->xbutton;
         if((w = findwin(ev->window)))
- if(w->handler->bup)
- w->handler->bup(w, ev);
+ handle(w, bup, ev);
 }
 
 static void
@@ -45,10 +46,8 @@ buttonpress(XEvent *e) {
         Window *w;
 
         ev = &e->xbutton;
- if((w = findwin(ev->window))) {
- if(w->handler->bdown)
- w->handler->bdown(w, ev);
- }
+ if((w = findwin(ev->window)))
+ handle(w, bdown, ev);
         else
                 XAllowEvents(display, ReplayPointer, ev->time);
 }
@@ -60,10 +59,9 @@ configurerequest(XEvent *e) {
         Window *w;
 
         ev = &e->xconfigurerequest;
- if((w = findwin(ev->window))) {
- if(w->handler->configreq)
- w->handler->configreq(w, ev);
- }else{
+ if((w = findwin(ev->window)))
+ handle(w, configreq, ev);
+ else{
                 wc.x = ev->x;
                 wc.y = ev->y;
                 wc.width = ev->width;
@@ -71,7 +69,6 @@ configurerequest(XEvent *e) {
                 wc.border_width = ev->border_width;
                 wc.sibling = ev->above;
                 wc.stack_mode = ev->detail;
- //ev->value_mask &= ~(CWStackMode|CWSibling);
                 XConfigureWindow(display, ev->window, ev->value_mask, &wc);
         }
 }
@@ -83,10 +80,9 @@ destroynotify(XEvent *e) {
         Client *c;
 
         ev = &e->xdestroywindow;
- if((w = findwin(ev->window))) {
- if(w->handler->destroy)
- w->handler->destroy(w, ev);
- }else {
+ if((w = findwin(ev->window)))
+ handle(w, destroy, ev);
+ else {
                 Debug fprintf(stderr, "DestroyWindow(%x) (no handler)\n", (uint)ev->window);
                 if((c = win2client(ev->window)))
                         fprintf(stderr, "Badness: Unhandled DestroyNotify: "
@@ -103,10 +99,8 @@ enternotify(XEvent *e) {
         if(ev->mode != NotifyNormal)
                 return;
 
- if((w = findwin(ev->window))) {
- if(w->handler->enter)
- w->handler->enter(w, ev);
- }
+ if((w = findwin(ev->window)))
+ handle(w, enter, ev);
         else if(ev->window == scr.root.w) {
                 sel_screen = True;
                 draw_frames();
@@ -164,21 +158,15 @@ focusin(XEvent *e) {
                 print_focus(nil, "<nil>");
                 screen->focus = nil;
         }
- else if((w = findwin(ev->window))) {
- if(w->handler->focusin)
- w->handler->focusin(w, ev);
- }
+ else if((w = findwin(ev->window)))
+ handle(w, focusin, ev);
         else if(ev->mode == NotifyGrab) {
                 if(ev->window == scr.root.w)
                         if(XCheckMaskEvent(display, KeyPressMask, &me)) {
                                 /* wmii has grabbed focus */
- c = screen->focus;
                                 screen->hasgrab = &c_root;
- screen->focus = &c_magic;
- if(c)
- draw_frame(c->sel);
+ flushevents(FocusChangeMask, True);
                                 dispatch_event(&me);
- return;
                         }
                 /* Some unmanaged window has grabbed focus */
                 if((c = screen->focus)) {
@@ -197,15 +185,16 @@ focusout(XEvent *e) {
 
         ev = &e->xfocus;
         if(!((ev->detail == NotifyNonlinear)
- ||(ev->detail == NotifyNonlinearVirtual)))
+ ||(ev->detail == NotifyNonlinearVirtual)
+ ||(ev->detail == NotifyVirtual)
+ ||(ev->detail == NotifyInferior)
+ ||(ev->detail == NotifyAncestor)))
                 return;
         if(ev->mode == NotifyUngrab)
                 screen->hasgrab = nil;
 
- if((w = findwin(ev->window))) {
- if(w->handler->focusout)
- w->handler->focusout(w, ev);
- }
+ if((w = findwin(ev->window)))
+ handle(w, focusout, ev);
 }
 
 static void
@@ -215,10 +204,8 @@ expose(XEvent *e) {
 
         ev = &e->xexpose;
         if(ev->count == 0) {
- if((w = findwin(ev->window))) {
- if(w->handler->expose)
- w->handler->expose(w, ev);
- }
+ if((w = findwin(ev->window)))
+ handle(w, expose, ev);
         }
 }
 
@@ -271,10 +258,8 @@ motionnotify(XEvent *e) {
         Window *w;
 
         ev = &e->xmotion;
- if((w = findwin(ev->window))) {
- if(w->handler->motion)
- w->handler->motion(w, ev);
- }
+ if((w = findwin(ev->window)))
+ handle(w, motion, ev);
 }
 
 static void
@@ -283,10 +268,8 @@ propertynotify(XEvent *e) {
         Window *w;
 
         ev = &e->xproperty;
- if((w = findwin(ev->window))) {
- if(w->handler->property)
- w->handler->property(w, ev);
- }
+ if((w = findwin(ev->window)))
+ handle(w, property, ev);
 }
 
 static void
@@ -295,10 +278,8 @@ mapnotify(XEvent *e) {
         Window *w;
 
         ev = &e->xmap;
- if((w = findwin(ev->window))) {
- if(w->handler->map)
- w->handler->map(w, ev);
- }
+ if((w = findwin(ev->window)))
+ handle(w, map, ev);
 }
 
 static void
@@ -309,28 +290,27 @@ unmapnotify(XEvent *e) {
         ev = &e->xunmap;
         if((w = findwin(ev->window)) && (ev->event == w->parent->w)) {
                 if(ev->send_event || w->unmapped-- == 0)
- if(w->handler->unmap)
- w->handler->unmap(w, ev);
+ handle(w, unmap, ev);
         }
 }
 
 void (*handler[LASTEvent]) (XEvent *) = {
- [ButtonPress] = buttonpress,
- [ButtonRelease] = buttonrelease,
- [ConfigureRequest]=configurerequest,
- [DestroyNotify] = destroynotify,
- [EnterNotify] = enternotify,
- [Expose] = expose,
- [FocusIn] = focusin,
- [FocusOut] = focusout,
- [KeyPress] = keypress,
- [LeaveNotify] = leavenotify,
- [MapNotify] = mapnotify,
- [MapRequest] = maprequest,
- [MappingNotify] = mappingnotify,
- [MotionNotify] = motionnotify,
- [PropertyNotify]= propertynotify,
- [UnmapNotify] = unmapnotify,
+ [ButtonPress] = buttonpress,
+ [ButtonRelease] = buttonrelease,
+ [ConfigureRequest] = configurerequest,
+ [DestroyNotify] = destroynotify,
+ [EnterNotify] = enternotify,
+ [Expose] = expose,
+ [FocusIn] = focusin,
+ [FocusOut] = focusout,
+ [KeyPress] = keypress,
+ [LeaveNotify] = leavenotify,
+ [MapNotify] = mapnotify,
+ [MapRequest] = maprequest,
+ [MappingNotify] = mappingnotify,
+ [MotionNotify] = motionnotify,
+ [PropertyNotify] = propertynotify,
+ [UnmapNotify] = unmapnotify,
 };
 
 void
diff -r 49c6da41bba5 -r de4907a49023 cmd/wmii/frame.c
--- a/cmd/wmii/frame.c Wed Apr 25 17:48:44 2007 -0400
+++ b/cmd/wmii/frame.c Thu May 10 13:14:39 2007 -0400
@@ -133,7 +133,7 @@ bdown_event(Window *w, XButtonEvent *e)
                         XAllowEvents(display, ReplayPointer, e->time);
                         break;
                 }
- XAllowEvents(display, AsyncPointer, e->time);
+ XUngrabPointer(display, e->time);
         }else{
                 if(e->button == Button1) {
                         if(frame_to_top(f))
@@ -267,6 +267,13 @@ resize_frame(Frame *f, Rectangle r) {
         f->crect = frame2client(f, f->crect);
         f->crect = rectsubpt(f->crect, f->crect.min);
 
+ if(!f->area->floating && f->area->mode == Coldefault) {
+ if(Dy(f->r) < 2 * labelh(def.font))
+ f->collapsed = True;
+ else
+ f->collapsed = False;
+ }
+
         if(Dx(f->crect) < labelh(def.font)) {
                 f->r.max.x = f->r.min.x + frame_delta_h();
                 f->collapsed = True;
@@ -313,34 +320,29 @@ set_frame_cursor(Frame *f, Point pt) {
 
 void
 swap_frames(Frame *fa, Frame *fb) {
- Rectangle trect;
- Area *a;
- Frame *an, *ap, *bn, *bp;
+ Frame **fp;
+ Client *c;
 
         if(fa == fb) return;
-
- an = fa->anext;
- ap = fa->aprev;
- bn = fb->anext;
- bp = fb->aprev;
         
- fb->anext = an;
- fb->aprev = ap;
- fa->anext = bn;
- fa->aprev = bp;
-
- if(fb->area->sel == fb)
- fb->area->sel = fa;
- if(fa->area->sel == fa)
- fa->area->sel = fb;
-
- a = fb->area;
- fb->area = fa->area;
- fa->area = a;
-
- trect = fa->r;
- fa->r = fb->r;
- fb->r = trect;
+ for(fp = &fa->client->frame; *fp; fp = &(*fp)->cnext)
+ if(*fp == fa) break;
+ *fp = (*fp)->cnext;
+
+ for(fp = &fb->client->frame; *fp; fp = &(*fp)->cnext)
+ if(*fp == fb) break;
+ *fp = (*fp)->cnext;
+
+ c = fa->client;
+ fa->client = fb->client;
+ fb->client = c;
+
+ fb->cnext = c->frame;
+ c->frame = fb;
+
+ c = fa->client;
+ fa->cnext = c->frame;
+ c->frame = fa;
 }
 
 void
diff -r 49c6da41bba5 -r de4907a49023 cmd/wmii/fs.c
--- a/cmd/wmii/fs.c Wed Apr 25 17:48:44 2007 -0400
+++ b/cmd/wmii/fs.c Thu May 10 13:14:39 2007 -0400
@@ -664,7 +664,7 @@ fs_read(Ixp9Req *r) {
                         respond(r, nil);
                         return;
                 case FsFTindex:
- buf = (char *)view_index(f->p.view);
+ buf = (char*)view_index(f->p.view);
                         n = strlen(buf);
                         write_buf(r, buf, n);
                         respond(r, nil);
diff -r 49c6da41bba5 -r de4907a49023 cmd/wmii/main.c
--- a/cmd/wmii/main.c Wed Apr 25 17:48:44 2007 -0400
+++ b/cmd/wmii/main.c Thu May 10 13:14:39 2007 -0400
@@ -219,19 +219,8 @@ init_screen(WMScreen *screen) {
 
 static void
 cleanup() {
- Point p;
- Client *c;
-
- for(c=client; c; c=c->next) {
- p = ZP;
- if(c->sel)
- p = c->sel->r.min;
- reparent_client(c, &scr.root, p);
- if(c->sel && c->sel->view != screen->sel)
- unmap_client(c, IconicState);
- }
- XSync(display, False);
- XCloseDisplay(display);
+ while(client)
+ destroy_client(client);
         ixp_server_close(&srv);
         close(sleeperfd);
 }
@@ -250,7 +239,7 @@ struct {
 
 /*
  * There's no way to check accesses to destroyed windows, thus
- * those cases are ignored (especially on UnmapNotify's).
+ * those cases are ignored (especially on UnmapNotifys).
  * Other types of errors call Xlib's default error handler, which
  * calls exit().
  */
@@ -269,6 +258,8 @@ errorhandler(Display *dpy, XErrorEvent *
 
         fprintf(stderr, "%s: fatal error: Xrequest code=%d, Xerror code=%d\n",
                         argv0, error->request_code, error->error_code);
+
+ /* Try to cleanup, but only try once, in case we're called again */
         if(!dead++)
                 cleanup();
         return xlib_errorhandler(display, error); /* calls exit() */
@@ -377,10 +368,15 @@ spawn_command(const char *cmd) {
         }
 }
 
-void
+static void
 check_9pcon(IxpConn *c) {
         serve_9pcon(c);
         check_x_event(nil);
+}
+
+static void
+closedisplay(IxpConn *c) {
+ XCloseDisplay(display);
 }
 
 int
@@ -447,7 +443,7 @@ main(int argc, char *argv[]) {
         init_lock_keys();
 
         ixp_listen(&srv, sock, &p9srv, check_9pcon, nil);
- ixp_listen(&srv, ConnectionNumber(display), nil, check_x_event, nil);
+ ixp_listen(&srv, ConnectionNumber(display), nil, check_x_event, closedisplay);
 
         def.font = loadfont(FONT);
         def.border = 1;
@@ -508,7 +504,6 @@ main(int argc, char *argv[]) {
 
         if(exitsignal)
                 raise(exitsignal);
- fprintf(stderr, "execstr: %s\n", execstr);
         if(execstr)
                 execl("/bin/sh", "sh", "-c", execstr, nil);
         if(errstr)
diff -r 49c6da41bba5 -r de4907a49023 cmd/wmii/map.c
--- a/cmd/wmii/map.c Wed Apr 25 17:48:44 2007 -0400
+++ b/cmd/wmii/map.c Thu May 10 13:14:39 2007 -0400
@@ -107,6 +107,7 @@ hashrm(Map *map, char *str) {
         MapEnt **e, *te;
         void *ret;
         
+ ret = nil;
         e = hashgetp(map, str, 0);
         if(*e) {
                 te = *e;
diff -r 49c6da41bba5 -r de4907a49023 cmd/wmii/message.c
--- a/cmd/wmii/message.c Wed Apr 25 17:48:44 2007 -0400
+++ b/cmd/wmii/message.c Thu May 10 13:14:39 2007 -0400
@@ -9,10 +9,11 @@
 #include "dat.h"
 #include "fns.h"
 
-static char Ebadcmd[] = "bad command",
+static char
+ Ebadcmd[] = "bad command",
         Ebadvalue[] = "bad value";
 
-/* Edit s/"([^"]+)"/L\1/g Edit |tr 'a-z' 'A-Z' */
+/* Edit |sort Edit s/"([^"]+)"/L\1/g Edit |tr 'a-z' 'A-Z' */
 enum {
         LNOTURGENT,
         LURGENT,
@@ -388,7 +389,7 @@ send_frame(Frame *f, int sym, Bool swap)
                 insert_frame(fp, f);
         }
 
- arrange_column(a, False);
+ arrange_view(f->view);
 
         flushevents(EnterWindowMask, False);
         focus_frame(f, True);
@@ -471,6 +472,7 @@ send_client(View *v, Message *m, Bool sw
 
         flushevents(EnterWindowMask, False);
         focus_frame(f, True);
+ arrange_view(v);
         update_views();
         return nil;
 }
@@ -494,6 +496,8 @@ select_frame(Frame *f, int sym) {
                 if(fp == nil)
                         fp = a->frame;
                 break;
+ default:
+ assert(!"can't get here");
         }
 
         focus_frame(fp, False);
diff -r 49c6da41bba5 -r de4907a49023 cmd/wmii/mouse.c
--- a/cmd/wmii/mouse.c Wed Apr 25 17:48:44 2007 -0400
+++ b/cmd/wmii/mouse.c Thu May 10 13:14:39 2007 -0400
@@ -30,7 +30,6 @@ struct Framewin {
         Point pt;
         int or;
         int n;
- int before;
 };
 
 static Rectangle
@@ -63,7 +62,6 @@ frameadjust(Framewin *f, Point pt, int o
         f->or = or;
         f->n = n;
         f->pt = pt;
- reshapewin(f->w, framerect(f));
 }
 
 static Framewin*
@@ -81,6 +79,7 @@ framewin(Frame *f, Point pt, int or, int
         fw->f = f;
         fw->gb = f->grabbox;
         frameadjust(fw, pt, or, n);
+ reshapewin(fw->w, framerect(fw));
 
         mapwin(fw->w);
         raisewin(fw->w);
@@ -136,33 +135,34 @@ vplace(Framewin *fw, Point pt) {
         int hr;
 
         v = screen->sel;
+
+ for(a = v->area->next; a->next; a = a->next)
+ if(pt.x < a->r.max.x)
+ break;
+ fw->ra = a;
+
+ pt.x = a->r.min.x;
+ frameadjust(fw, pt, OHoriz, Dx(a->r));
+
         r = fw->w->r;
         hr = Dy(r)/2;
-
         fw->n = pt.y;
- fw->before = 1;
-
- for(a = v->area->next; a->next; a = a->next)
- if(pt.x < a->r.max.x)
- break;
- fw->ra = a;
-
- for(f = a->frame; f->anext; f = f->anext) {
- if(f == fw->f)
- fw->before = 0;
+
+ for(f = a->frame; f->anext; f = f->anext)
                 if(pt.y < f->r.max.y)
                         break;
- }
 
         if(!f->collapsed) {
                 fw->fp = f;
                 fw->fr = fw->fp->r;
+
                 if(f == fw->f) {
                         fw->fp = f->aprev;
                         fw->fr.max = f->r.max;
                         if(_vsnap(fw, f->r.min.y+hr))
                                 goto done;
                 }
+
                 if(_vsnap(fw, f->r.max.y - hr)) {
                         fw->fr.min.y = f->r.max.y - labelh(def.font);
                         goto done;
@@ -175,26 +175,27 @@ vplace(Framewin *fw, Point pt) {
                         _vsnap(fw, f->r.min.y);
                 else if(_vsnap(fw, f->r.min.y-hr))
                         fw->fp = f->aprev;
- fw->fr.min.y = fw->n - hr;
+ fw->fr.min.y = pt.y - hr;
                 if(fw->fp && fw->fp->anext == fw->f)
                         fw->fr.max = fw->f->r.max;
                 goto done;
         }
 
         if(pt.y < f->r.min.y + hr) {
- fw->n = f->r.min.y;
+ pt.y = f->r.min.y;
                  if(f->aprev && !f->aprev->collapsed)
- fw->n -= hr;
+ pt.y -= hr;
         }else {
- fw->n = f->r.max.y;
+ pt.y = f->r.max.y;
                 if(f->anext == fw->f)
- fw->n += hr;
+ pt.y += hr;
         }
 
 done:
         pt.x = a->r.min.x;
         pt.y = fw->n;
- frameadjust(fw, pt, OHoriz, Dx(a->r));
+ frameadjust(fw, pt, OHoriz, Dx(a->r));
+ reshapewin(fw->w, framerect(fw));
 }
 
 static void
@@ -221,7 +222,8 @@ hplace(Framewin *fw, Point pt) {
         }
 
         pt.y = a->r.min.y;
- frameadjust(fw, pt, OVert, Dy(a->r));
+ frameadjust(fw, pt, OVert, Dy(a->r));
+ reshapewin(fw->w, framerect(fw));
 }
 
 static void
@@ -232,7 +234,7 @@ do_managed_move(Client *c) {
         Framewin *fw;
         Window *cwin;
         Frame *f;
- Point pt;
+ Point pt, pt2;
         int y;
 
         focus(c, False);
@@ -240,8 +242,9 @@ do_managed_move(Client *c) {
 
         pt = querypointer(&scr.root);
 
- pt.x = f->area->r.min.x;
- fw = framewin(f, pt, OHoriz, Dx(f->area->r));
+ pt2.x = f->area->r.min.x;
+ pt2.y = pt.y;
+ fw = framewin(f, pt2, OHoriz, Dx(f->area->r));
         
         r = screen->r;
         r.min.y += fw->gb.min.y + Dy(fw->gb)/2;
@@ -272,7 +275,7 @@ horiz:
                 case ButtonRelease:
                         switch(ev.xbutton.button) {
                         case 1:
- if(f->anext && (!f->aprev || (fw->fp != f->aprev && fw->fp != f->aprev->aprev))) {
+ if((f->anext) && (!f->aprev || (fw->fp != f->aprev && fw->fp != f->aprev->aprev))) {
                                         f->anext->r.min.y = f->r.min.y;
                                         resize_frame(f->anext, f->anext->r);
                                 }
@@ -352,6 +355,11 @@ done:
         XUngrabPointer(display, CurrentTime);
         framedestroy(fw);
         destroywindow(cwin);
+
+ pt = addpt(f->r.min, f->grabbox.min);
+ pt.x += Dx(f->grabbox)/2;
+ pt.y += Dy(f->grabbox)/2;
+ warppointer(pt);
 }
 
 static Window *
diff -r 49c6da41bba5 -r de4907a49023 cmd/wmii/x11.c
--- a/cmd/wmii/x11.c Wed Apr 25 17:48:44 2007 -0400
+++ b/cmd/wmii/x11.c Thu May 10 13:14:39 2007 -0400
@@ -171,6 +171,8 @@ reparentwindow(Window *w, Window *par, P
 reparentwindow(Window *w, Window *par, Point p) {
         XReparentWindow(display, w->w, par->w, p.x, p.y);
         w->parent = par;
+ w->r = rectsubpt(w->r, w->r.min);
+ w->r = rectaddpt(w->r, p);
 }
 
 void
diff -r 49c6da41bba5 -r de4907a49023 config.mk
--- a/config.mk Wed Apr 25 17:48:44 2007 -0400
+++ b/config.mk Thu May 10 13:14:39 2007 -0400
@@ -13,7 +13,8 @@ LIBS = -L/usr/lib -lc
 LIBS = -L/usr/lib -lc
 
 # Flags
-CFLAGS += -g -O0 -Wall
+include ${ROOT}/mk/gcc.mk
+CFLAGS += -g -O0
 LDFLAGS += -g ${LIBS}
 STATIC = -static
 MKDEP = cpp -M
Received on Fri Jun 01 2007 - 03:10:28 UTC

This archive was generated by hypermail 2.2.0 : Sun Jul 13 2008 - 15:57:07 UTC