wmii

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

commit 054a356d003ea967cdb185e3b5c3a070d0feb550
parent 9e0ac2f4fbf64d9ca3844ad7cdd3fd7b28d13a21
Author: Kris Maglione <jg@suckless.org>
Date:   Fri, 23 May 2008 17:28:45 -0400

Some resizing stuff. See diff.

Diffstat:
cmd/wmii/column.c | 26++++----------------------
cmd/wmii/dat.h | 3++-
cmd/wmii/fns.h | 5++++-
cmd/wmii/frame.c | 27++++-----------------------
cmd/wmii/layout.c | 4++--
cmd/wmii/main.c | 2++
cmd/wmii/mouse.c | 149++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------
7 files changed, 154 insertions(+), 62 deletions(-)

diff --git a/cmd/wmii/column.c b/cmd/wmii/column.c @@ -66,9 +66,6 @@ column_attach(Area *a, Frame *f) { nframe++; nframe = max(nframe, 1); - f->r = a->r; - f->r.max.y = Dy(a->r) / nframe; - /* COLR */ f->colr = a->r; f->colr.max.y = Dy(a->r) / nframe; @@ -240,7 +237,7 @@ column_fit(Area *a, uint *ncolp, uint *nuncolp) { if(nuncolp) *nuncolp = nuncol; } -static void +void column_settle(Area *a) { Frame *f; uint yoff, yoffcr; @@ -269,6 +266,7 @@ column_settle(Area *a) { f->colr = rectsetorigin(f->colr, Pt(a->r.min.x, yoffcr)); f->r.min.x = a->r.min.x; f->r.max.x = a->r.max.x; + if(def.incmode == ISqueeze) if(!f->collapsed) { f->r.max.y += surplus; if(n-- > 0) @@ -384,18 +382,12 @@ column_scale(Area *a) { dy += Dy(f->colr); } for(f=a->frame; f; f=f->anext) { - WinHints h; - f->dy = Dy(f->r); f->colr.min.x = a->r.min.x; f->colr.max.x = a->r.max.x; if(!f->collapsed) f->colr.max.y += ((float)f->dy / dy) * surplus; frame_resize(f, f->colr); - if(!f->collapsed) { - h = frame_gethints(f); - f->r = sizehint(&h, f->r); - } } if(def.incmode == ISqueeze) @@ -417,10 +409,6 @@ column_arrange(Area *a, bool dirty) { case Coldefault: if(dirty) for(f=a->frame; f; f=f->anext) - f->r = Rect(0, 0, 100, 100); - /* COLR */ - if(dirty) - for(f=a->frame; f; f=f->anext) f->colr = Rect(0, 0, 100, 100); break; case Colstack: @@ -434,21 +422,15 @@ column_arrange(Area *a, bool dirty) { } goto resize; default: - die("can't get here"); + die("not reached"); break; } column_scale(a); resize: if(v == screen->sel) { view_restack(v); - client_resize(a->sel->client, a->sel->r); - - for(f=a->frame; f; f=f->anext) - if(!f->collapsed && f != a->sel) - client_resize(f->client, f->r); for(f=a->frame; f; f=f->anext) - if(f->collapsed && f != a->sel) - client_resize(f->client, f->r); + client_resize(f->client, f->r); } } diff --git a/cmd/wmii/dat.h b/cmd/wmii/dat.h @@ -80,7 +80,8 @@ enum Barpos { enum { CurNormal, CurNECorner, CurNWCorner, CurSECorner, CurSWCorner, - CurDHArrow, CurMove, CurInput, CurSizing, CurIcon, + CurDHArrow, CurDVArrow, CurMove, CurInput, CurSizing, + CurIcon, CurNone, CurLast, }; diff --git a/cmd/wmii/fns.h b/cmd/wmii/fns.h @@ -83,6 +83,7 @@ Area* column_new(View*, Area *, uint); void column_remove(Frame*); void column_resize(Area*, int); void column_resizeframe(Frame*, Rectangle); +void column_settle(Area*); void div_draw(Divide*); void div_set(Divide*, int x); void div_update_all(void); @@ -131,7 +132,6 @@ void frame_insert(Frame*, Frame *pos); void frame_remove(Frame*); void frame_resize(Frame*, Rectangle); bool frame_restack(Frame*, Frame*); -void frame_setcursor(Frame*, Point); void frame_swap(Frame*, Frame*); int ingrabbox_p(Frame*, int x, int y); void move_focus(Frame*, Frame*); @@ -202,7 +202,10 @@ bool setdebug(int); void vdebug(int, const char*, va_list); /* mouse.c */ +Window* constraintwin(Rectangle); +void destroyconstraintwin(Window*); void grab_button(XWindow, uint button, ulong mod); +void mouse_checkresize(Frame*, Point, bool); void mouse_movegrabbox(Client*); void mouse_resize(Client*, Align); void mouse_resizecol(Divide*); diff --git a/cmd/wmii/frame.c b/cmd/wmii/frame.c @@ -179,11 +179,7 @@ bdown_event(Window *w, XButtonEvent *e) { if(!e->subwindow) { frame_restack(f, nil); view_restack(f->view); - if(rect_haspoint_p(Pt(e->x, e->y), f->grabbox)) - mouse_movegrabbox(c); - else if(f->area->floating) - if(!e->subwindow && !rect_haspoint_p(Pt(e->x, e->y), f->titlebar)) - mouse_resize(c, quadrant(f->r, Pt(e->x_root, e->y_root))); + mouse_checkresize(f, Pt(e->x, e->y), true); } if(f->client != selclient()) @@ -213,7 +209,7 @@ enter_event(Window *w, XCrossingEvent *e) { if(f->area->floating || !f->collapsed) focus(f->client, false); } - frame_setcursor(f, Pt(e->x, e->y)); + mouse_checkresize(f, Pt(e->x, e->y), false); } static void @@ -235,7 +231,7 @@ motion_event(Window *w, XMotionEvent *e) { Client *c; c = w->aux; - frame_setcursor(c->sel, Pt(e->x, e->y)); + mouse_checkresize(c->sel, Pt(e->x, e->y), false); } Handlers framehandler = { @@ -370,7 +366,7 @@ frame_resize(Frame *f, Rectangle r) { collapsed = f->collapsed; if(!f->area->floating && f->area->mode == Coldefault) { f->collapsed = false; - if(Dy(f->r) < 2 * labelh(def.font)) + if(Dy(r) < 2 * labelh(def.font)) f->collapsed = true; } if(collapsed != f->collapsed) @@ -513,21 +509,6 @@ frame_draw_all(void) { } void -frame_setcursor(Frame *f, Point pt) { - Rectangle r; - Cursor cur; - - if(f->area->floating - && !rect_haspoint_p(pt, f->titlebar) - && !rect_haspoint_p(pt, f->crect)) { - r = rectsubpt(f->r, f->r.min); - cur = quad_cursor(quadrant(r, pt)); - client_setcursor(f->client, cur); - } else - client_setcursor(f->client, cursor[CurNormal]); -} - -void frame_swap(Frame *fa, Frame *fb) { Frame **fp; Client *c; diff --git a/cmd/wmii/layout.c b/cmd/wmii/layout.c @@ -402,8 +402,8 @@ thcol(Frame *f) { column_drop(fw->ra, f, fw->pt.y); - if(!a->frame && !a->floating && f->view->area->next->next) - area_destroy(a); + if(!a->frame && !a->floating && f->view->area->next->next) + area_destroy(a); goto done; case ButtonPress: if(button == 2) diff --git a/cmd/wmii/main.c b/cmd/wmii/main.c @@ -116,6 +116,7 @@ init_cursors(void) { create_cursor(CurSWCorner, XC_bottom_left_corner); create_cursor(CurMove, XC_fleur); create_cursor(CurDHArrow, XC_sb_h_double_arrow); + create_cursor(CurDVArrow, XC_sb_v_double_arrow); create_cursor(CurInput, XC_xterm); create_cursor(CurSizing, XC_sizing); create_cursor(CurIcon, XC_icon); @@ -297,6 +298,7 @@ main(int argc, char *argv[]) { WinAttr wa; int i; + quotefmtinstall(); fmtinstall('r', errfmt); fmtinstall('a', afmt); fmtinstall('C', Cfmt); diff --git a/cmd/wmii/mouse.c b/cmd/wmii/mouse.c @@ -13,6 +13,51 @@ enum { ButtonMask | PointerMotionMask }; +static void +cwin_expose(Window *w, XExposeEvent *e) { + + fill(w, rectsubpt(w->r, w->r.min), def.focuscolor.bg); + fill(w, w->r, def.focuscolor.bg); +} + +static Handlers chandler = { + .expose = cwin_expose, +}; + +Window* +constraintwin(Rectangle r) { + Window *w; + WinAttr wa; + + w = createwindow(&scr.root, r, 0, InputOnly, &wa, 0); + if(0) { + Window *w2; + + w2 = createwindow(&scr.root, r, 0, InputOutput, &wa, 0); + selectinput(w2, ExposureMask); + w->aux = w2; + + setborder(w2, 1, def.focuscolor.border); + sethandler(w2, &chandler); + mapwin(w2); + raisewin(w2); + } + mapwin(w); + return w; +} + +void +destroyconstraintwin(Window *w) { + Window *w2; + + if(w->aux) { + w2 = w->aux; + sethandler(w2, nil); + destroywindow(w2); + } + destroywindow(w); +} + static Window* gethsep(Rectangle r) { Window *w; @@ -167,7 +212,6 @@ readmotion(Point *p) { static void mouse_resizecolframe(Frame *f, Align align) { - WinAttr wa; Window *cwin, *hwin; Divide *d; View *v; @@ -196,7 +240,7 @@ mouse_resizecolframe(Frame *f, Align align) { /* At any rate, set the limits of where this box may be * dragged. */ -#define frob(pred, rmin, rmax, plus, minus, xy) BLOCK( \ +#define frob(pred, f, aprev, rmin, rmax, plus, minus, xy) BLOCK( \ if(pred) { \ r.rmin.xy = f->aprev->r.rmin.xy plus min.xy; \ r.rmax.xy = f->r.rmax.xy minus min.xy; \ @@ -205,17 +249,16 @@ mouse_resizecolframe(Frame *f, Align align) { r.rmax.xy = r.rmin.xy plus 1; \ }) if(align&North) - frob(f->aprev, min, max, +, -, y); + frob(f->aprev, f, aprev, min, max, +, -, y); else - frob(f->anext, max, min, -, +, y); + frob(f->anext, f, anext, max, min, -, +, y); if(align&West) - frob(a->prev != v->area, min, max, +, -, x); + frob(a->prev != v->area, a, prev, min, max, +, -, x); else - frob(a->next, max, min, -, +, x); + frob(a->next, a, next, max, min, -, +, x); #undef frob - cwin = createwindow(&scr.root, r, 0, InputOnly, &wa, 0); - mapwin(cwin); + cwin = constraintwin(r); r = f->r; if(align&North) @@ -269,13 +312,12 @@ mouse_resizecolframe(Frame *f, Align align) { done: ungrabpointer(); - destroywindow(cwin); + destroyconstraintwin(cwin); destroywindow(hwin); } void mouse_resizecol(Divide *d) { - WinAttr wa; Window *cwin; Divide *dp; View *v; @@ -301,8 +343,7 @@ mouse_resizecol(Divide *d) { r.min.y = pt.y; r.max.y = pt.y+1; - cwin = createwindow(&scr.root, r, 0, InputOnly, &wa, 0); - mapwin(cwin); + cwin = constraintwin(r); if(!grabpointer(&scr.root, cwin, cursor[CurNone], MouseMask)) goto done; @@ -314,7 +355,7 @@ mouse_resizecol(Divide *d) { done: ungrabpointer(); - destroywindow(cwin); + destroyconstraintwin(cwin); } void @@ -421,6 +462,88 @@ mouse_resize(Client *c, Align align) { } static void +mouse_tempvertresize(Area *a, Point p) { + Frame *fa, *fb; + Window *cwin; + Rectangle r; + int dy, incmode; + + for(fa=a->frame; fa; fa=fa->anext) + if(p.y < fa->r.max.y + labelh(def.font)/2) + break; + if(!(fa && fa->anext)) + return; + for(fb=fa->anext; fb->anext; fb=fb->anext) + if(!fb->collapsed) break; + + incmode = def.incmode; + def.incmode = IShow; + column_arrange(a, false); + + dy = fb->colr.min.y - fa->colr.max.y; + + r.min.x = p.x; + r.max.x = p.x + 1; + r.min.y = fa->r.min.y + labelh(def.font); + r.max.y = a->r.max.y - dy; + cwin = constraintwin(r); + + if(!grabpointer(&scr.root, cwin, cursor[CurDVArrow], MouseMask)) + goto done; + + int amin = fa->colr.min.y; + while(readmotion(&p)) { + fa->colr.min.y = amin; + fa->colr.max.y = p.y; + fb->colr.min.y = p.y + dy; + column_arrange(a, false); + } + +done: + ungrabpointer(); + destroyconstraintwin(cwin); + def.incmode = incmode; + column_arrange(a, false); +} + +void +mouse_checkresize(Frame *f, Point p, bool exec) { + Rectangle r; + Cursor cur; + int q; + + cur = cursor[CurNormal]; + if(rect_haspoint_p(p, f->crect)) { + client_setcursor(f->client, cur); + return; + } + + r = rectsubpt(f->r, f->r.min); + q = quadrant(r, p); + if(rect_haspoint_p(p, f->grabbox)) { + cur = cursor[CurMove]; + if(exec) mouse_movegrabbox(f->client); + } + else if(f->area->floating) { + if(p.x <= 2 || p.y <= 2 + || r.max.x - p.x <= 2 + || r.max.y - p.y <= 2) { + cur = quad_cursor(q); + if(exec) mouse_resize(f->client, q); + } + }else { + if(f->aprev && p.y <= 2 + || f->anext && r.max.y - p.y <= 2) { + cur = cursor[CurDVArrow]; + if(exec) mouse_tempvertresize(f->area, addpt(p, f->r.min)); + } + } + + if(!exec) + client_setcursor(f->client, cur); +} + +static void _grab(XWindow w, uint button, ulong mod) { XGrabButton(display, button, mod, w, false, ButtonMask, GrabModeSync, GrabModeAsync, None, None);