]> Dogcows Code - chaz/openbox/commitdiff
let you resize aspect ratio windows in north and south directions, and make them...
authorDana Jansens <danakj@orodu.net>
Sat, 21 Jul 2007 00:23:35 +0000 (20:23 -0400)
committerDana Jansens <danakj@orodu.net>
Sat, 21 Jul 2007 00:23:35 +0000 (20:23 -0400)
openbox/moveresize.c
openbox/resist.c

index c0ddcca89ef4ef29c0a0f44a967eb29a3a77acd3..b93871ba401fa094814728ae79656abb8e601eab 100644 (file)
@@ -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 @@ static void calc_resize(gboolean keyboard, gint keydist, gint *dw, gint *dh,
     *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;
index a3eee7b9102b7504985fa40bbca76095f7015cb5..b8f24893e8ebd26d8b7d543e47770dd2817b6024 100644 (file)
@@ -234,6 +234,8 @@ void resist_size_windows(ObClient *c, gint resist, gint *w, gint *h,
                 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 &&
@@ -249,9 +251,6 @@ void resist_size_windows(ObClient *c, gint resist, gint *w, gint *h,
                         dlt > tr - resist)
                         *w = r - tr, snapx = target;
                     break;
-                case OB_DIRECTION_NORTH:
-                case OB_DIRECTION_SOUTH:
-                    break;
                 }
             }
         }
@@ -263,6 +262,8 @@ void resist_size_windows(ObClient *c, gint resist, gint *w, gint *h,
                 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 &&
@@ -278,9 +279,6 @@ void resist_size_windows(ObClient *c, gint resist, gint *w, gint *h,
                         dlt > tb - resist)
                         *h = b - tb, snapy = target;
                     break;
-                case OB_DIRECTION_EAST:
-                case OB_DIRECTION_WEST:
-                    break;
                 }
             }
         }
@@ -340,6 +338,8 @@ void resist_size_monitors(ObClient *c, gint resist, gint *w, gint *h,
         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)
@@ -357,9 +357,6 @@ void resist_size_monitors(ObClient *c, gint resist, gint *w, gint *h,
             else if (l >= pl && dlt < pl && dlt >= pl - resist)
                 *w = r - pl + 1;
             break;
-        case OB_DIRECTION_NORTH:
-        case OB_DIRECTION_SOUTH:
-            break;
         }
 
         /* vertical snapping */
@@ -367,6 +364,8 @@ void resist_size_monitors(ObClient *c, gint resist, gint *w, gint *h,
         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)
@@ -384,9 +383,6 @@ void resist_size_monitors(ObClient *c, gint resist, gint *w, gint *h,
             else if (t >= pt && dlt < pt && dlt >= pt - resist)
                 *h = b - pt + 1;
             break;
-        case OB_DIRECTION_WEST:
-        case OB_DIRECTION_EAST:
-            break;
         }
 
         g_free(area);
This page took 0.030946 seconds and 4 git commands to generate.