all repos — openbox @ f0e82075a14f4bcfc6ee219b636f99f0568a15bf

openbox fork - make it a bit more like ryudo

let you resize aspect ratio windows in north and south directions, and make them resist properly when resizing
Dana Jansens danakj@orodu.net
commit

f0e82075a14f4bcfc6ee219b636f99f0568a15bf

parent

019e80355920a29fb1b6c800b268004e8573c98a

2 files changed, 68 insertions(+), 13 deletions(-)

jump to
M openbox/moveresize.copenbox/moveresize.c

@@ -374,12 +374,47 @@ static void calc_resize(gboolean keyboard, gint keydist, gint *dw, gint *dh,

ObDirection dir) { gint resist, x = 0, y = 0, lw, lh, ow, oh, nw, nh; + gint trydw, trydh; ow = cur_w; oh = cur_h; nw = ow + *dw; nh = oh + *dh; + if (moveresize_client->max_ratio || moveresize_client->min_ratio) { + switch (dir) { + case OB_DIRECTION_NORTH: + case OB_DIRECTION_SOUTH: + /* resize the width based on the height */ + if (moveresize_client->min_ratio) { + if (nh * moveresize_client->min_ratio > nw) + nw = (gint)(nh * moveresize_client->min_ratio); + } + if (moveresize_client->max_ratio) { + if (nh * moveresize_client->max_ratio < nw) + nw = (gint)(nh * moveresize_client->max_ratio); + } + break; + default: + /* resize the height based on the width */ + if (moveresize_client->min_ratio) { + if (nh * moveresize_client->min_ratio > nw) + nh = (gint)(nw / moveresize_client->min_ratio); + } + if (moveresize_client->max_ratio) { + if (nh * moveresize_client->max_ratio < nw) + nh = (gint)(nw / moveresize_client->max_ratio); + } + break; + } + } + + /* see its actual size (apply aspect ratios) */ + client_try_configure(moveresize_client, &x, &y, &nw, &nh, &lw, &lh, TRUE); + trydw = nw - ow; + trydh = nh - oh; + g_print("trydw %d trydh %d\n", trydw, trydh); + /* resist_size_* needs the frame size */ nw += moveresize_client->frame->size.left + moveresize_client->frame->size.right;

@@ -400,7 +435,31 @@

*dw = nw - ow; *dh = nh - oh; - /* make sure it's a valid size */ + /* take aspect ratios into account for resistance */ + if (*dh != trydh) { /* got resisted */ + /* resize the width based on the height */ + if (moveresize_client->min_ratio) { + if (nh * moveresize_client->min_ratio > nw) + nw = (gint)(nh * moveresize_client->min_ratio); + } + if (moveresize_client->max_ratio) { + if (nh * moveresize_client->max_ratio < nw) + nw = (gint)(nh * moveresize_client->max_ratio); + } + } + if (*dw != trydw) { /* got resisted */ + /* resize the height based on the width */ + if (moveresize_client->min_ratio) { + if (nh * moveresize_client->min_ratio > nw) + nh = (gint)(nw / moveresize_client->min_ratio); + } + if (moveresize_client->max_ratio) { + if (nh * moveresize_client->max_ratio < nw) + nh = (gint)(nw / moveresize_client->max_ratio); + } + } + + /* make sure it's all valid */ client_try_configure(moveresize_client, &x, &y, &nw, &nh, &lw, &lh, TRUE); *dw = nw - ow;
M openbox/resist.copenbox/resist.c

@@ -234,6 +234,8 @@ switch (dir) {

case OB_DIRECTION_EAST: case OB_DIRECTION_NORTHEAST: case OB_DIRECTION_SOUTHEAST: + case OB_DIRECTION_NORTH: + case OB_DIRECTION_SOUTH: dlt = l; drb = r + *w - c->frame->area.width; if (r < tl && drb >= tl &&

@@ -248,9 +250,6 @@ drb = r;

if (l > tr && dlt <= tr && dlt > tr - resist) *w = r - tr, snapx = target; - break; - case OB_DIRECTION_NORTH: - case OB_DIRECTION_SOUTH: break; } }

@@ -263,6 +262,8 @@ switch (dir) {

case OB_DIRECTION_SOUTH: case OB_DIRECTION_SOUTHWEST: case OB_DIRECTION_SOUTHEAST: + case OB_DIRECTION_EAST: + case OB_DIRECTION_WEST: dlt = t; drb = b + *h - c->frame->area.height; if (b < tt && drb >= tt &&

@@ -277,9 +278,6 @@ drb = b;

if (t > tb && dlt <= tb && dlt > tb - resist) *h = b - tb, snapy = target; - break; - case OB_DIRECTION_EAST: - case OB_DIRECTION_WEST: break; } }

@@ -340,6 +338,8 @@ switch (dir) {

case OB_DIRECTION_EAST: case OB_DIRECTION_NORTHEAST: case OB_DIRECTION_SOUTHEAST: + case OB_DIRECTION_NORTH: + case OB_DIRECTION_SOUTH: dlt = l; drb = r + *w - c->frame->area.width; if (r <= ar && drb > ar && drb <= ar + resist)

@@ -356,9 +356,6 @@ if (l >= al && dlt < al && dlt >= al - resist)

*w = r - al + 1; else if (l >= pl && dlt < pl && dlt >= pl - resist) *w = r - pl + 1; - break; - case OB_DIRECTION_NORTH: - case OB_DIRECTION_SOUTH: break; }

@@ -367,6 +364,8 @@ switch (dir) {

case OB_DIRECTION_SOUTH: case OB_DIRECTION_SOUTHWEST: case OB_DIRECTION_SOUTHEAST: + case OB_DIRECTION_WEST: + case OB_DIRECTION_EAST: dlt = t; drb = b + *h - c->frame->area.height; if (b <= ab && drb > ab && drb <= ab + resist)

@@ -383,9 +382,6 @@ if (t >= at && dlt < at && dlt >= at - resist)

*h = b - at + 1; else if (t >= pt && dlt < pt && dlt >= pt - resist) *h = b - pt + 1; - break; - case OB_DIRECTION_WEST: - case OB_DIRECTION_EAST: break; }