[hackers] [wmii] Improved column resizing.

From: Kris Maglione <jg_AT_suckless.org>
Date: Sat Apr 14 08:39:21 2007

changeset: 2069:69c86c93e307
tag: tip
user: Kris Maglione <jg_AT_suckless.org>
date: Sat Apr 14 02:35:58 2007 -0400
summary: Improved column resizing.

diff -r 9ca89274a296 -r 69c86c93e307 cmd/wmii/Makefile
--- a/cmd/wmii/Makefile Sat Apr 14 01:25:11 2007 -0400
+++ b/cmd/wmii/Makefile Sat Apr 14 02:35:58 2007 -0400
@@ -7,7 +7,7 @@ TARG = wmii
 TARG = wmii
 
 LIB = ${LIBIXP}
-EXLDFLAGS = -lm ${LIBX11}
+EXLDFLAGS = -lm ${LIBX11} -lXext
 EXCFLAGS = ${INCX11}
 OBJ = area \
         bar \
diff -r 9ca89274a296 -r 69c86c93e307 cmd/wmii/area.c
--- a/cmd/wmii/area.c Sat Apr 14 01:25:11 2007 -0400
+++ b/cmd/wmii/area.c Sat Apr 14 02:35:58 2007 -0400
@@ -213,7 +213,7 @@ detach_from_area(Frame *f) {
         else if(!a->frame) {
                 if(c->trans) {
                         /* focus area of transient, if possible */
- Client *cl = client_of_win(c->trans);
+ Client *cl = win2client(c->trans);
                         if(cl && cl->frame) {
                                 a = cl->sel->area;
                                 if(a->view == v)
diff -r 9ca89274a296 -r 69c86c93e307 cmd/wmii/bar.c
--- a/cmd/wmii/bar.c Sat Apr 14 01:25:11 2007 -0400
+++ b/cmd/wmii/bar.c Sat Apr 14 02:35:58 2007 -0400
@@ -54,6 +54,7 @@ resize_bar(WMScreen *s) {
         s->brect = s->rect;
         s->brect.height = labelh(&def.font);
         s->brect.y = s->rect.height - s->brect.height;
+
         XMoveResizeWindow(blz.dpy, s->barwin, s->brect.x, s->brect.y, s->brect.width, s->brect.height);
         XSync(blz.dpy, False);
         draw_bar(s);
diff -r 9ca89274a296 -r 69c86c93e307 cmd/wmii/client.c
--- a/cmd/wmii/client.c Sat Apr 14 01:25:11 2007 -0400
+++ b/cmd/wmii/client.c Sat Apr 14 02:35:58 2007 -0400
@@ -139,7 +139,7 @@ manage_client(Client *c) {
 
         XGetTextProperty(blz.dpy, c->win, &tags, atom[TagsAtom]);
 
- if((trans = client_of_win(c->trans)))
+ if((trans = win2client(c->trans)))
                 strncpy(c->tags, trans->tags, sizeof(c->tags));
         else if(tags.nitems)
                 strncpy(c->tags, (char *)tags.value, sizeof(c->tags));
@@ -170,7 +170,7 @@ selclient() {
 }
 
 Client *
-client_of_win(Window w) {
+win2client(Window w) {
         Client *c;
         for(c=client; c; c=c->next)
                 if(c->win == w) break;
@@ -178,7 +178,7 @@ client_of_win(Window w) {
 }
 
 Frame *
-frame_of_win(Window w) {
+win2frame(Window w) {
         Client *c;
         for(c=client; c; c=c->next)
                 if(c->framewin == w) break;
diff -r 9ca89274a296 -r 69c86c93e307 cmd/wmii/column.c
--- a/cmd/wmii/column.c Sat Apr 14 01:25:11 2007 -0400
+++ b/cmd/wmii/column.c Sat Apr 14 02:35:58 2007 -0400
@@ -4,38 +4,204 @@
  */
 #include <math.h>
 #include <string.h>
+#include <X11/extensions/shape.h>
 #include <util.h>
 #include "dat.h"
 #include "fns.h"
 
-char *
-str_of_column_mode(int mode) {
- switch(mode) {
- case Coldefault: return "default"; break;
- case Colstack: return "stack"; break;
- case Colmax: return "max"; break;
- default: break;
- }
+int divw, divh;
+GC divgc;
+GC maskgc;
+
+char *modes[] = {
+ [Coldefault] = "default",
+ [Colstack] = "stack",
+ [Colmax] = "max",
+};
+
+Divide *
+win2div(Window w) {
+ Divide *d;
+
+ for(d = divs; d; d = d->next)
+ if(d->w == w) return d;
         return nil;
 }
 
 int
-column_mode_of_str(char *arg) {
- if(!strncmp("default", arg, 8))
- return Coldefault;
- if(!strncmp("stack", arg, 6))
- return Colstack;
- if(!strncmp("max", arg, 4))
- return Colmax;
+str2colmode(const char *str) {
+ int i;
+
+ for(i = 0; i < nelem(modes); i++)
+ if(strcasecmp(str, modes[i]))
+ return i;
         return -1;
+}
+
+static void
+draw_pmap(Pixmap pm, GC gc, Bool color) {
+ XPoint pt[4];
+
+ pt[0] = (XPoint){ 0, 0 };
+ pt[1] = (XPoint){ divw/2 - 1, divw/2 - 1 };
+ pt[2] = (XPoint){ divw/2, divw/2 - 1 };
+ pt[3] = (XPoint){ divw - 1, 0 };
+
+ if(color)
+ XSetForeground(blz.dpy, gc, def.normcolor.bg);
+ else {
+ XSetForeground(blz.dpy, gc, 0);
+ XFillRectangle(blz.dpy, pm, gc, 0, 0, divw, divh);
+ XSetForeground(blz.dpy, gc, 1);
+ }
+
+ XFillPolygon(blz.dpy, pm, gc, pt, nelem(pt), Convex, CoordModeOrigin);
+
+ if(color)
+ XSetForeground(blz.dpy, gc, def.normcolor.border);
+
+ XDrawLines(blz.dpy, pm, gc, pt, nelem(pt), CoordModeOrigin);
+ XDrawRectangle(blz.dpy, pm, gc, pt[1].x, pt[1].y, 1, screen->rect.height);
+}
+
+void
+update_dividers() {
+ if(divmap) {
+ XFreePixmap(blz.dpy, divmap);
+ XFreePixmap(blz.dpy, divmask);
+ XFreeGC(blz.dpy, divgc);
+ XFreeGC(blz.dpy, maskgc);
+ }
+
+ divw = 2 * (labelh(&def.font) / 3);
+ divw = max(divw, 10);
+ divh = screen->rect.height;
+
+ divmap = XCreatePixmap(blz.dpy, blz.root,
+ divw, divh,
+ DefaultDepth(blz.dpy, blz.screen));
+ divmask = XCreatePixmap(blz.dpy, blz.root,
+ divw, divh,
+ 1);
+ divgc = XCreateGC(blz.dpy, divmap, 0, 0);
+ maskgc = XCreateGC(blz.dpy, divmask, 0, 0);
+
+ draw_pmap(divmap, divgc, True);
+ draw_pmap(divmask, maskgc, False);
+}
+
+static Divide*
+get_div(Divide **dp) {
+ XSetWindowAttributes wa;
+ Divide *d;
+
+ if(*dp)
+ return *dp;
+
+ d = emallocz(sizeof *d);
+
+ wa.override_redirect = True;
+ wa.background_pixmap = ParentRelative;
+ wa.event_mask =
+ SubstructureRedirectMask
+ | ExposureMask
+ | EnterWindowMask
+ | PointerMotionMask
+ | ButtonPressMask
+ | ButtonReleaseMask;
+ d->w = XCreateWindow(
+ /* display */ blz.dpy,
+ /* parent */ blz.root,
+ /* x, y */ 0, 0,
+ /* w, h */ 1, 1,
+ /* border */ 0,
+ /* depth */ DefaultDepth(blz.dpy, blz.screen),
+ /* class */ CopyFromParent,
+ /* visual */ DefaultVisual(blz.dpy, blz.screen),
+ /* valuemask */ CWOverrideRedirect | CWEventMask | CWBackPixmap,
+ /* attributes */&wa
+ );
+
+ *dp = d;
+ return d;
+}
+
+static void
+map_div(Divide *d) {
+ if(!d->mapped)
+ XMapWindow(blz.dpy, d->w);
+ d->mapped = 1;
+}
+
+static void
+unmap_div(Divide *d) {
+ if(d->mapped)
+ XUnmapWindow(blz.dpy, d->w);
+ d->mapped = 0;
+}
+
+static void
+move_div(Divide *d, int x) {
+ d->x = x - divw/2;
+
+ XMoveResizeWindow(blz.dpy,
+ d->w,
+ d->x, 0,
+ divw, divh);
+ map_div(d);
+}
+
+void
+update_divs() {
+ Divide **dp, *d;
+ Area *a;
+ View *v;
+
+ update_dividers();
+
+ v = screen->sel;
+ dp = &divs;
+ for(a = v->area->next; a; a = a->next) {
+ d = get_div(dp);
+ dp = &d->next;
+ d->x = a->rect.x - divw/2;
+ move_div(d, a->rect.x);
+ if(!a->next) {
+ d = get_div(dp);
+ dp = &d->next;
+ move_div(d, r_east(&a->rect));
+ }
+ }
+ for(d = *dp; d; d = d->next)
+ unmap_div(d);
+}
+
+void
+draw_div(Divide *d) {
+ XCopyArea(
+ blz.dpy,
+ divmap, d->w,
+ divgc,
+ /* x, y */ 0, 0,
+ /* w, h */ divw, divh,
+ /* dest x, y */ 0, 0
+ );
+ XShapeCombineMask (
+ /* dpy */ blz.dpy,
+ /* dst */ d->w,
+ /* type */ ShapeBounding,
+ /* off x, y */ 0, 0,
+ /* src */ divmask,
+ /* op */ ShapeSet
+ );
 }
 
 static void
 scale_column(Area *a) {
         Frame *f, **fp;
- uint min_height, yoff, dy;
- uint num_col, num_uncol;
- uint col_h, uncol_h;
+ uint minh, yoff, dy;
+ uint ncol, nuncol;
+ uint colh, uncolh;
         int surplus, i, j;
 
         if(!a->frame)
@@ -48,40 +214,40 @@ scale_column(Area *a) {
          * increment gaps can be equalized later */
         /* Frames that can't be accomodated are pushed to the floating layer */
 
- min_height = labelh(&def.font);
- col_h = labelh(&def.font);
- uncol_h = min_height + frame_delta_h();
-
- num_col = 0;
- num_uncol = 0;
+ minh = labelh(&def.font);
+ colh = labelh(&def.font);
+ uncolh = minh + frame_delta_h();
+
+ ncol = 0;
+ nuncol = 0;
         dy = 0;
         for(f=a->frame; f; f=f->anext)
                 if(f->collapsed)
- num_col++;
+ ncol++;
                 else
- num_uncol++;
+ nuncol++;
 
         surplus = a->rect.height;
- surplus -= num_col * col_h;
- surplus -= num_uncol * uncol_h;
+ surplus -= ncol * colh;
+ surplus -= nuncol * uncolh;
         if(surplus < 0) {
- i = ceil((float)(-surplus)/(uncol_h - col_h));
- if(i >= num_uncol)
- i = num_uncol - 1;
- num_uncol -= i;
- num_col += i;
- surplus += i * (uncol_h - col_h);
+ i = ceil((float)(-surplus)/(uncolh - colh));
+ if(i >= nuncol)
+ i = nuncol - 1;
+ nuncol -= i;
+ ncol += i;
+ surplus += i * (uncolh - colh);
         }
         if(surplus < 0) {
- i = ceil((float)(-surplus)/col_h);
- if(i > num_col)
- i = num_col;
- num_col -= i;
- surplus += i * col_h;
- }
-
- i = num_col - 1;
- j = num_uncol - 1;
+ i = ceil((float)(-surplus)/colh);
+ if(i > ncol)
+ i = ncol;
+ ncol -= i;
+ surplus += i * colh;
+ }
+
+ i = ncol - 1;
+ j = nuncol - 1;
         for(f=a->frame; f; f=f->anext) {
                 if(f == a->sel)
                         j++;
@@ -89,10 +255,10 @@ scale_column(Area *a) {
                         if(j < 0 && f != a->sel)
                                 f->collapsed = True;
                         else {
- if(f->crect.height <= min_height)
+ if(f->crect.height <= minh)
                                         f->crect.height = 1;
                                 else
- f->crect.height -= min_height;
+ f->crect.height -= minh;
                                 dy += f->crect.height;
                         }
                         j--;
@@ -113,7 +279,7 @@ scale_column(Area *a) {
                 fp=&f->anext;
         }
 
- i = num_uncol;
+ i = nuncol;
         for(f=a->frame; f; f=f->anext) {
                 f->rect.x = a->rect.x;
                 f->rect.width = a->rect.width;
@@ -122,17 +288,17 @@ scale_column(Area *a) {
                         f->rect.height = (float)f->crect.height / dy * surplus;
                         if(!i)
                                 f->rect.height = surplus;
- f->rect.height += min_height + frame_delta_h();
+ f->rect.height += minh + frame_delta_h();
                         apply_sizehints(f->client, &f->rect, False, True, NWEST);
 
                         dy -= f->crect.height;
- surplus -= f->rect.height - frame_delta_h() - min_height;
+ surplus -= f->rect.height - frame_delta_h() - minh;
                 }else
                         f->rect.height = labelh(&def.font);
         }
 
         yoff = a->rect.y;
- i = num_uncol;
+ i = nuncol;
         for(f=a->frame; f; f=f->anext) {
                 f->rect.y = yoff;
                 f->rect.x = a->rect.x;
@@ -141,9 +307,9 @@ scale_column(Area *a) {
                         yoff += f->rect.height;
                 else{
                         i--;
- f->rect.height += surplus / num_uncol;
+ f->rect.height += surplus / nuncol;
                         if(!i)
- f->rect.height += surplus % num_uncol;
+ f->rect.height += surplus % nuncol;
                         yoff += f->rect.height;
                 }
         }
@@ -203,15 +369,14 @@ match_horiz(Area *a, XRectangle *r) {
 }
 
 void
-resize_column(Client *c, XRectangle *new) {
+resize_column(Frame *f, XRectangle *new) {
         Area *west, *east, *a;
- Frame *north, *south, *f;
+ Frame *north, *south;
         View *v;
         BlitzAlign sticky;
         uint min_height;
         uint min_width;
 
- f = c->sel;
         a = f->area;
         v = a->view;
         min_height = 2 * labelh(&def.font);
@@ -262,7 +427,6 @@ resize_column(Client *c, XRectangle *new
                 a->rect.width = r_east(new) - a->rect.x;
                 match_horiz(a, &a->rect);
                 match_horiz(east, &east->rect);
- //relax_column(east);
         }
 AfterHorizontal:
         /* skip vertical resize unless the column is in equal mode */
diff -r 9ca89274a296 -r 69c86c93e307 cmd/wmii/dat.h
--- a/cmd/wmii/dat.h Sat Apr 14 01:25:11 2007 -0400
+++ b/cmd/wmii/dat.h Sat Apr 14 02:35:58 2007 -0400
@@ -89,6 +89,7 @@ typedef struct Area Area;
 typedef struct Area Area;
 typedef struct Frame Frame;
 typedef struct Client Client;
+typedef struct Divide Divide;
 typedef struct Key Key;
 typedef struct Bar Bar;
 typedef struct Rule Rule;
@@ -158,6 +159,13 @@ struct Client {
         GC gc;
 };
 
+struct Divide {
+ Divide *next;
+ Window w;
+ Bool mapped;
+ int x;
+};
+
 struct Key {
         Key *next;
         Key *lnext;
@@ -223,11 +231,11 @@ Client *client;
 Client *client;
 View *view;
 Key *key;
+Divide *divs;
 Client c_magic;
 Client c_root;
 
-enum { BUFFER_SIZE = 8092 };
-char buffer[BUFFER_SIZE];
+char buffer[8092];
 
 /* IXP */
 IxpServer srv;
@@ -235,18 +243,21 @@ Ixp9Srv p9srv;
 
 /* X11 */
 uint num_screens;
-Blitz blz;
-GC xorgc;
-char *user;
-Atom atom[AtomLast];
-Cursor cursor[CurLast];
 uint valid_mask;
 uint num_lock_mask;
 Bool sel_screen;
+
+Blitz blz;
+GC xorgc;
 Pixmap pmap;
+Pixmap divmap, divmask;
+
+Atom atom[AtomLast];
+Cursor cursor[CurLast];
 void (*handler[LASTEvent]) (XEvent *);
 
 /* Misc */
 Bool starting;
 Bool verbose;
+char *user;
 char *execstr;
diff -r 9ca89274a296 -r 69c86c93e307 cmd/wmii/event.c
--- a/cmd/wmii/event.c Sat Apr 14 01:25:11 2007 -0400
+++ b/cmd/wmii/event.c Sat Apr 14 02:35:58 2007 -0400
@@ -47,17 +47,18 @@ buttonrelease(XEvent *e) {
                                 return;
                         }
         }
- else if((f = frame_of_win(ev->window)))
+ else if((f = win2frame(ev->window)))
                 write_event("ClientClick 0x%x %d\n", f->client->win, ev->button);
 }
 
 static void
 buttonpress(XEvent *e) {
         XButtonPressedEvent *ev;
+ Divide *d;
         Frame *f;
 
         ev = &e->xbutton;
- if((f = frame_of_win(ev->window))) {
+ if((f = win2frame(ev->window))) {
                 if((ev->state & def.mod) == def.mod) {
                         switch(ev->button) {
                         case Button1:
@@ -80,9 +81,6 @@ buttonpress(XEvent *e) {
                                 if(frame_to_top(f))
                                         restack_view(f->view);
 
- if(ingrabbox(f, ev->x, ev->y))
- do_mouse_resize(f->client, False,
- quadrant(&f->rect, ev->x_root, ev->y_root) & (EAST|WEST));
                                 else if(ptinrect(ev->x, ev->y, &f->grabbox))
                                         do_mouse_resize(f->client, True, CENTER);
                                 else if(f->area->floating)
@@ -103,7 +101,10 @@ buttonpress(XEvent *e) {
                                 write_event("ClientMouseDown 0x%x %d\n", f->client->win, ev->button);
                         }
                 }
- }else
+ }
+ else if((d = win2div(ev->window)))
+ mouse_resizecol(d);
+ else
                 XAllowEvents(blz.dpy, ReplayPointer, ev->time);
 }
 
@@ -116,7 +117,7 @@ configurerequest(XEvent *e) {
         Frame *f;
 
         ev = &e->xconfigurerequest;
- c = client_of_win(ev->window);
+ c = win2client(ev->window);
         if(c) {
                 f = c->sel;
                 gravitate_client(c, True);
@@ -178,7 +179,7 @@ destroynotify(XEvent *e) {
         Client *c;
 
         ev = &e->xdestroywindow;
- if((c = client_of_win(ev->window)))
+ if((c = win2client(ev->window)))
                 destroy_client(c);
 }
 
@@ -192,7 +193,7 @@ enternotify(XEvent *e) {
         if(ev->mode != NotifyNormal)
                 return;
 
- if((c = client_of_win(ev->window))) {
+ if((c = win2client(ev->window))) {
                 if(ev->detail != NotifyInferior) {
                         if(screen->focus != c) {
                                 if(verbose) fprintf(stderr, "enter_notify(c) => %s\n", c->name);
@@ -201,7 +202,7 @@ enternotify(XEvent *e) {
                         set_cursor(c, cursor[CurNormal]);
                 }else if(verbose) fprintf(stderr, "enter_notify(c[NotifyInferior]) => %s\n", c->name);
         }
- else if((f = frame_of_win(ev->window))) {
+ else if((f = win2frame(ev->window))) {
                 if(screen->focus != c) {
                         if(verbose) fprintf(stderr, "enter_notify(f) => %s\n", f->client->name);
                         if(f->area->floating || !f->collapsed)
@@ -261,7 +262,7 @@ focusin(XEvent *e) {
                 return;
 
         old = screen->focus;
- c = client_of_win(ev->window);
+ c = win2client(ev->window);
         if(c) {
                 print_focus(c, c->name);
                 if(ev->mode == NotifyGrab)
@@ -307,7 +308,7 @@ focusout(XEvent *e) {
         if(ev->mode == NotifyUngrab)
                 screen->hasgrab = nil;
 
- c = client_of_win(ev->window);
+ c = win2client(ev->window);
         if(c) {
                 if((ev->mode == NotifyWhileGrabbed)
                 && (screen->hasgrab != &c_root)) {
@@ -331,14 +332,17 @@ static void
 static void
 expose(XEvent *e) {
         XExposeEvent *ev;
- static Frame *f;
+ Divide *d;
+ Frame *f;
 
         ev = &e->xexpose;
         if(ev->count == 0) {
                 if(ev->window == screen->barwin)
                         draw_bar(screen);
- else if((f = frame_of_win(ev->window)))
+ else if((f = win2frame(ev->window)))
                         draw_frame(f);
+ else if((d = win2div(ev->window)))
+ draw_div(d);
         }
 }
 
@@ -375,7 +379,7 @@ maprequest(XEvent *e) {
                                 (StructureNotifyMask | PropertyChangeMask));
                 return;
         }
- if(!client_of_win(ev->window))
+ if(!win2client(ev->window))
                 manage_client(create_client(ev->window, &wa));
 }
 
@@ -385,7 +389,7 @@ motionnotify(XEvent *e) {
         Frame *f;
 
         ev = &e->xmotion;
- if((f = frame_of_win(ev->window)))
+ if((f = win2frame(ev->window)))
                 set_frame_cursor(f, ev->x, ev->y);
 }
 
@@ -397,7 +401,7 @@ propertynotify(XEvent *e) {
         ev = &e->xproperty;
         if(ev->state == PropertyDelete)
                 return; /* ignore */
- if((c = client_of_win(ev->window)))
+ if((c = win2client(ev->window)))
                 prop_client(c, ev->atom);
 }
 
@@ -407,7 +411,7 @@ mapnotify(XEvent *e) {
         Client *c;
 
         ev = &e->xmap;
- if((c = client_of_win(ev->window)))
+ if((c = win2client(ev->window)))
                 if(c == selclient())
                         focus_client(c);
 }
@@ -418,7 +422,7 @@ unmapnotify(XEvent *e) {
         Client *c;
 
         ev = &e->xunmap;
- if((c = client_of_win(ev->window)))
+ if((c = win2client(ev->window)))
                 if(ev->send_event || (c->unmapped-- == 0))
                         destroy_client(c);
 }
diff -r 9ca89274a296 -r 69c86c93e307 cmd/wmii/fns.h
--- a/cmd/wmii/fns.h Sat Apr 14 01:25:11 2007 -0400
+++ b/cmd/wmii/fns.h Sat Apr 14 02:35:58 2007 -0400
@@ -48,17 +48,20 @@ void move_client(Client *c, char *arg);
 void move_client(Client *c, char *arg);
 void size_client(Client *c, char *arg);
 Client *selclient();
-Frame *frame_of_win(Window w);
-Client *client_of_win(Window w);
+Frame *win2frame(Window w);
+Client *win2client(Window w);
 void update_client_grab(Client *c);
 void apply_rules(Client *c);
 void apply_tags(Client *c, const char *tags);
 
 /* column.c */
+Divide *win2div(Window w);
+void update_dividers();
+void update_divs();
+void draw_div(Divide *d);
 void arrange_column(Area *a, Bool dirty);
-void resize_column(Client *c, XRectangle *r);
-int column_mode_of_str(char *arg);
-char *str_of_column_mode(int mode);
+void resize_column(Frame *f, XRectangle *r);
+int str2colmode(const char *str);
 Area *new_column(View *v, Area *pos, uint w);
 
 /* draw.c */
diff -r 9ca89274a296 -r 69c86c93e307 cmd/wmii/frame.c
--- a/cmd/wmii/frame.c Sat Apr 14 01:25:11 2007 -0400
+++ b/cmd/wmii/frame.c Sat Apr 14 02:35:58 2007 -0400
@@ -341,6 +341,7 @@ draw_frame(Frame *f) {
         f->grabbox = br.rect;
         draw_tile(&br);
 
+#if 0
         if(!f->area->floating) {
                 XSetLineAttributes(blz.dpy, br.gc, 1, LineSolid, CapButt, JoinMiter);
                 h = labelh(&def.font) / 3;
@@ -364,6 +365,7 @@ draw_frame(Frame *f) {
                         XDrawLines(blz.dpy, br.drawable, br.gc, pt, 2, CoordModeOrigin);
                 }
         }
+#endif
 
         XCopyArea(
                 /* display */ blz.dpy,
diff -r 9ca89274a296 -r 69c86c93e307 cmd/wmii/fs.c
--- a/cmd/wmii/fs.c Sat Apr 14 01:25:11 2007 -0400
+++ b/cmd/wmii/fs.c Sat Apr 14 02:35:58 2007 -0400
@@ -224,14 +224,15 @@ message_root(char *message)
         uint n;
 
         if(!strchr(message, ' ')) {
- snprintf(buffer, BUFFER_SIZE, "%s ", message);
+ snprintf(buffer, sizeof(buffer), "%s ", message);
                 message = buffer;
         }
         if(!strcmp(message, "quit "))
                 srv.running = 0;
         else if(!strncmp(message, "exec ", 5)) {
                 srv.running = 0;
- execstr = estrdup(&message[5]);
+ execstr = emalloc(strlen(&message[5]) + sizeof("exec "));
+ sprintf(execstr, "exec %s", &message[5]);
                 message += strlen(message);
         }
         else if(!strncmp(message, "view ", 5))
@@ -283,12 +284,12 @@ read_root_ctl() {
 read_root_ctl() {
         uint i = 0;
         if(screen->sel)
- i += snprintf(&buffer[i], (BUFFER_SIZE - i), "view %s\n", screen->sel->name);
- i += snprintf(&buffer[i], (BUFFER_SIZE - i), "focuscolors %s\n", def.focuscolor.colstr);
- i += snprintf(&buffer[i], (BUFFER_SIZE - i), "normcolors %s\n", def.normcolor.colstr);
- i += snprintf(&buffer[i], (BUFFER_SIZE - i), "font %s\n", def.font.fontstr);
- i += snprintf(&buffer[i], (BUFFER_SIZE - i), "grabmod %s\n", def.grabmod);
- i += snprintf(&buffer[i], (BUFFER_SIZE - i), "border %d\n", def.border);
+ i += snprintf(&buffer[i], (sizeof(buffer) - i), "view %s\n", screen->sel->name);
+ i += snprintf(&buffer[i], (sizeof(buffer) - i), "focuscolors %s\n", def.focuscolor.colstr);
+ i += snprintf(&buffer[i], (sizeof(buffer) - i), "normcolors %s\n", def.normcolor.colstr);
+ i += snprintf(&buffer[i], (sizeof(buffer) - i), "font %s\n", def.font.fontstr);
+ i += snprintf(&buffer[i], (sizeof(buffer) - i), "grabmod %s\n", def.grabmod);
+ i += snprintf(&buffer[i], (sizeof(buffer) - i), "border %d\n", def.border);
         return buffer;
 }
 
@@ -316,7 +317,7 @@ write_event(char *format, ...) {
         Ixp9Req *req;
 
         va_start(ap, format);
- vsnprintf(buffer, BUFFER_SIZE, format, ap);
+ vsnprintf(buffer, sizeof(buffer), format, ap);
         va_end(ap);
         if(!(len = strlen(buffer)))
                 return;
diff -r 9ca89274a296 -r 69c86c93e307 cmd/wmii/mouse.c
--- a/cmd/wmii/mouse.c Sat Apr 14 01:25:11 2007 -0400
+++ b/cmd/wmii/mouse.c Sat Apr 14 02:35:58 2007 -0400
@@ -355,6 +355,81 @@ do_managed_move(Client *c) {
 }
 
 void
+mouse_resizecol(Divide *d) {
+ XSetWindowAttributes wa;
+ XEvent ev;
+ Window cwin;
+ XRectangle r;
+ Divide *dp;
+ View *v;
+ Area *a;
+ uint w, minw;
+ int x;
+
+ v = screen->sel;
+
+ for(a = v->area->next, dp = divs; a; a = a->next, dp = dp->next)
+ if(dp->next == d) break;
+
+ /* Fix later */
+ if(dp == nil || d->next == nil)
+ return;
+
+ minw = screen->rect.width/NCOL;
+
+ x = a->rect.x + minw;
+ w = r_east(&a->next->rect) - minw;
+ w -= x;
+
+ cwin = XCreateWindow(blz.dpy, blz.root,
+ x, 0, w, 1,
+ /* border */ 0,
+ /* depth */ CopyFromParent,
+ /* class */ InputOnly,
+ /* visual */ CopyFromParent,
+ /* valuemask */ 0,
+ /* attrib */ &wa
+ );
+ XMapWindow(blz.dpy, cwin);
+
+ if(XGrabPointer(
+ blz.dpy, blz.root,
+ /* owner_events*/ False,
+ /* event_mask */ MouseMask,
+ /* kbd, mouse */ GrabModeAsync, GrabModeAsync,
+ /* confine_to */ cwin,
+ /* cursor */ cursor[CurInvisible],
+ /* time */ CurrentTime
+ ) != GrabSuccess)
+ goto done;
+
+ for(;;) {
+ XMaskEvent(blz.dpy, MouseMask | ExposureMask, &ev);
+ switch (ev.type) {
+ case ButtonRelease:
+ r = a->rect;
+ r.width = x - r.x;
+ resize_column(a->frame, &r);
+
+ XUngrabPointer(blz.dpy, CurrentTime);
+ XSync(blz.dpy, False);
+ goto done;
+ case MotionNotify:
+ x = ev.xmotion.x_root;
+
+ XMoveWindow(blz.dpy, d->w, x, 0);
+ break;
+ case Expose:
+ dispatch_event(&ev);
+ break;
+ default: break;
+ }
+ }
+done:
+ XDestroyWindow(blz.dpy, cwin);
+}
+
+void
 do_mouse_resize(Client *c, Bool opaque, BlitzAlign align) {
         BlitzAlign grav;
         Window dummy;
@@ -428,8 +503,10 @@ do_mouse_resize(Client *c, Bool opaque,
                 return;
         }
         else if(!opaque) {
- hrx = (double)(screen->rect.width + frect.width - 2 * labelh(&def.font)) / screen->rect.width;
- hry = (double)(screen->rect.height + frect.height - 3 * labelh(&def.font)) / screen->rect.height;
+ hrx = (double)(screen->rect.width + frect.width - 2 * labelh(&def.font))
+ / screen->rect.width;
+ hry = (double)(screen->rect.height + frect.height - 3 * labelh(&def.font))
+ / screen->rect.height;
                 pt_x = r_east(&frect) - labelh(&def.font);
                 pt_y = r_south(&frect) - labelh(&def.font);
                 warppointer(pt_x / hrx, pt_y / hry);
@@ -451,7 +528,7 @@ do_mouse_resize(Client *c, Bool opaque,
                                 xorborder(&frect);
 
                         if(!floating)
- resize_column(c, &frect);
+ resize_column(c->sel, &frect);
                         else
                                 resize_client(c, &frect);
 
diff -r 9ca89274a296 -r 69c86c93e307 cmd/wmii/view.c
--- a/cmd/wmii/view.c Sat Apr 14 01:25:11 2007 -0400
+++ b/cmd/wmii/view.c Sat Apr 14 02:35:58 2007 -0400
@@ -120,6 +120,7 @@ focus_view(WMScreen *s, View *v) {
         XGrabServer(blz.dpy);
         assign_sel_view(v);
         update_frame_selectors(v);
+ update_divs();
         for(c=client; c; c=c->next)
                 if((f = c->sel)) {
                         if(f->view == v) {
@@ -130,6 +131,7 @@ focus_view(WMScreen *s, View *v) {
                                 unmap_client(c, IconicState);
                         }
                 }
+
         restack_view(v);
         focus_area(v->sel);
         draw_frames();
@@ -168,9 +170,10 @@ restack_view(View *v) {
 restack_view(View *v) {
         static Window *wins = nil;
         static uint winssz = 0;
- Area *a;
+ Divide *d;
         Frame *f;
         Client *c;
+ Area *a;
         uint n, i;
         
         if(v != screen->sel)
@@ -179,31 +182,39 @@ restack_view(View *v) {
         i = 0;
         n = 0;
 
- for(c=client; c; c=c->next)
+ for(c = client; c; c = c->next)
                 i++;
         if(i == 0)
                 return;
+
+ for(a = v->area; a; a = a->next)
+ i++;
+
         if(i >= winssz) {
                 winssz = 2 * i;
                 wins = erealloc(wins, sizeof(Window) * winssz);
         }
 
         wins[n++] = screen->barwin;
- for(f=v->area->stack; f; f=f->snext)
+ for(f = v->area->frame; f; f = f->anext)
                 if(f->client->fullscreen) {
                         n--;
                         break;
                 }
+
         for(f=v->area->stack; f; f=f->snext)
                 wins[n++] = f->client->framewin;
- for(a=v->area->next; a; a=a->next) {
+
+ for(d = divs; d && d->mapped; d = d->next)
+ wins[n++] = d->w;
+
+ for(a=v->area->next; a; a=a->next)
                 if(a->frame) {
                         wins[n++] = a->sel->client->framewin;
                         for(f=a->frame; f; f=f->anext)
                                 if(f != a->sel)
                                         wins[n++] = f->client->framewin;
                 }
- }
         if(n)
                 XRestackWindows(blz.dpy, wins, n);
 }
@@ -294,7 +305,7 @@ view_index(View *v) {
         Frame *f;
         Area *a;
 
- len = BUFFER_SIZE;
+ len = sizeof(buffer);
         buf_i = 0;
         for((a = v->area), (a_i = 0); a && len > 0; (a=a->next), (a_i++)) {
                 if(a->floating)
@@ -365,7 +376,7 @@ area_of_message(View *v, char *message,
 
 char *
 message_view(View *v, char *message) {
- uint n, i;
+ int n, i;
         Client *c;
         Frame *f;
         Area *a;
@@ -388,13 +399,16 @@ message_view(View *v, char *message) {
         }
         if(!strncmp(message, "colmode ", 8)) {
                 message += 8;
- if(!(a = area_of_message(v, message, &n)) || a == v->area)
+ if((a = area_of_message(v, message, &n)) == nil
+ || a->floating)
                         return Ebadvalue;
- if((i = column_mode_of_str(&message[n])) == -1)
+ if((i = str2colmode(&message[n])) == -1)
                         return Ebadvalue;
+
                 a->mode = i;
                 arrange_column(a, True);
                 restack_view(v);
+
                 if(v == screen->sel)
                         focus_view(screen, v);
                 draw_frames();
Received on Sat Apr 14 2007 - 08:39:21 UTC

This archive was generated by hypermail 2.2.0 : Sun Jul 13 2008 - 15:56:37 UTC