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:
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);