commit 00701a72b872d173d09dd5efd50a0df57c77907c
parent 9f87971cc19441b401d5c999b02a9b9e230efea3
Author: Kris Maglione <jg@suckless.org>
Date: Wed, 21 May 2008 19:32:25 -0400
Better respect minw on column_resizeframe; fix a possible crash with grow command.
Diffstat:
4 files changed, 64 insertions(+), 11 deletions(-)
diff --git a/cmd/wmii/client.c b/cmd/wmii/client.c
@@ -386,6 +386,7 @@ client_groupframe(Client *c, View *v) {
Rectangle
frame_hints(Frame *f, Rectangle r, Align sticky) {
Rectangle or;
+ WinHints h;
Point p;
Client *c;
@@ -394,9 +395,8 @@ frame_hints(Frame *f, Rectangle r, Align sticky) {
return r;
or = r;
- r = frame_rect2client(c, r, f->area->floating);
- r = sizehint(c->w.hints, r);
- r = frame_client2rect(c, r, f->area->floating);
+ h = frame_gethints(f);
+ r = sizehint(&h, r);
if(!f->area->floating) {
/* Not allowed to grow */
diff --git a/cmd/wmii/column.c b/cmd/wmii/column.c
@@ -136,6 +136,8 @@ column_detach(Frame *f) {
area_destroy(a);
}
+/* This is impossibly long and tortuous. We can do better.
+ */
static void
column_scale(Area *a) {
Frame *f, **fp;
@@ -254,12 +256,10 @@ column_scale(Area *a) {
}
/* Distribute the surplus.
- * When a frame doesn't accept its allocation, don't try to
- * allocate to it again. Keep going until we have no more
- * surplus, or no more frames will accept it.
*/
osurplus = 0;
- while(surplus != osurplus) {
+ /* More on this later. */
+ //while(surplus != osurplus) {
osurplus = surplus;
dy = 0;
for(f=a->frame; f; f=f->anext)
@@ -278,13 +278,15 @@ column_scale(Area *a) {
if(f->dy == i)
f->dy = 0;
}
- }
+ //}
/* Now, try to give each frame, in turn, the entirety of the
* surplus that we have left. A single frame might be able
* to fill its increment gap with all of what's left, but
* not with its fair share.
*/
+#if 0
+ No, don''t. Causes too much trouble, the way things are now.
for(f=a->frame; f && surplus > 0; f=f->anext)
if(!f->collapsed) {
dy = Dy(f->r);
@@ -293,6 +295,7 @@ column_scale(Area *a) {
f->r.max.y = Dy(f->crect) + colh + 1;
surplus -= Dy(f->r) - dy;
}
+#endif
if(surplus < 0) {
print("Badness: surplus = %d\n", surplus);
@@ -437,13 +440,17 @@ column_resizeframe(Frame *f, Rectangle r) {
if(al)
r.min.x = max(r.min.x, al->r.min.x + minw);
- else
+ else { /* Hm... */
r.min.x = max(r.min.x, v->r.min.x);
+ r.max.x = max(r.max.x, r.min.x + minw);
+ }
if(ar)
r.max.x = min(r.max.x, ar->r.max.x - minw);
- else
+ else {
r.max.x = min(r.max.x, v->r.max.x);
+ r.min.x = min(r.min.x, r.max.x - minw);
+ }
a->r.min.x = r.min.x;
a->r.max.x = r.max.x;
diff --git a/cmd/wmii/fns.h b/cmd/wmii/fns.h
@@ -134,8 +134,9 @@ int ingrabbox_p(Frame*, int x, int y);
void move_focus(Frame*, Frame*);
Rectangle constrain(Rectangle);
Rectangle frame_client2rect(Client*, Rectangle, bool);
-Rectangle frame_rect2client(Client*, Rectangle, bool);
+WinHints frame_gethints(Frame*);
Rectangle frame_hints(Frame*, Rectangle, Align);
+Rectangle frame_rect2client(Client*, Rectangle, bool);
/* fs.c */
void fs_attach(Ixp9Req*);
diff --git a/cmd/wmii/frame.c b/cmd/wmii/frame.c
@@ -246,6 +246,51 @@ Handlers framehandler = {
.motion = motion_event,
};
+WinHints
+frame_gethints(Frame *f) {
+ WinHints h;
+ Client *c;
+ Point d;
+ int minh;
+
+ minh = labelh(def.font);
+
+ c = f->client;
+ h = *c->w.hints;
+
+ d.y = labelh(def.font);
+ if(f->area->floating) {
+ d.x = 2*def.border;
+ d.y += def.border;
+ }else {
+ d.x = 2;
+ d.y += 2;
+ }
+
+ if(h.min.x < 2*minh)
+ h.min.x = minh + (2*minh) % h.inc.x;
+ if(h.min.y < minh)
+ h.min.y = minh + minh % h.inc.y;
+
+ h.min.x += d.x;
+ h.min.y += d.y;
+ if(h.max.x + d.x > h.max.x)
+ h.max.x += d.x;
+ if(h.max.y + d.y > h.max.y)
+ h.max.y += d.y;
+
+ h.base.x += d.x;
+ h.base.y += d.y;
+ h.baspect.x += d.x;
+ h.baspect.y += d.y;
+
+ h.group = 0;
+ h.grav = ZP;
+ h.gravstatic = 0;
+ h.position = 0;
+ return h;
+}
+
Rectangle
frame_rect2client(Client *c, Rectangle r, bool floating) {