grow to edge works again, using the new edge detection code
authorDana Jansens <danakj@orodu.net>
Tue, 10 Jul 2007 20:47:10 +0000 (20:47 +0000)
committerDana Jansens <danakj@orodu.net>
Tue, 10 Jul 2007 20:47:10 +0000 (20:47 +0000)
openbox/actions/growtoedge.c
openbox/client.c
openbox/client.h

index a5b24e3..b6979c9 100644 (file)
@@ -63,73 +63,23 @@ static gboolean run_func(ObActionsData *data, gpointer options)
     Options *o = options;
 
     if (data->client) {
-        gint x, y, width, height, dest;
-        ObClient *c = data->client;
-        Rect *a;
-
-        a = screen_area(c->desktop, SCREEN_AREA_ALL_MONITORS, &c->frame->area);
-        x = c->frame->area.x;
-        y = c->frame->area.y;
-        /* get the unshaded frame's dimensions..if it is shaded */
-        width = c->area.width + c->frame->size.left + c->frame->size.right;
-        height = c->area.height + c->frame->size.top + c->frame->size.bottom;
-
-#if 0
-        dest = client_directional_edge_search(c, o->dir);
-
-        switch(o->dir) {
-        case OB_DIRECTION_NORTH:
-            if (c->shaded) break; /* don't allow vertical resize if shaded */
-
-            if (a->y == y)
-                height = height / 2;
-            else {
-                height = c->frame->area.y + height - dest;
-                y = dest;
-            }
-            break;
-        case OB_DIRECTION_WEST:
-            if (a->x == x)
-                width = width / 2;
-            else {
-                width = c->frame->area.x + width - dest;
-                x = dest;
+        gint x, y, w, h;
+
+        /* don't allow vertical resize if shaded */
+        if (o->dir != OB_DIRECTION_NORTH || o->dir != OB_DIRECTION_SOUTH ||
+            !data->client->shaded)
+        {
+            client_find_resize_directional(data->client, o->dir, TRUE,
+                                           &x, &y, &w, &h);
+            if (x != data->client->area.x || y != data->client->area.y ||
+                w != data->client->area.width ||
+                h != data->client->area.height)
+            {
+                actions_client_move(data, FALSE);
+                client_move_resize(data->client, x, y, w, h);
+                actions_client_move(data, TRUE);
             }
-            break;
-        case OB_DIRECTION_SOUTH:
-            if (c->shaded) break; /* don't allow vertical resize if shaded */
-
-            if (a->y + a->height == y + c->frame->area.height) {
-                height = c->frame->area.height / 2;
-                y = a->y + a->height - height;
-            } else
-                height = dest - c->frame->area.y;
-            y += (height - c->frame->area.height) % c->size_inc.height;
-            height -= (height - c->frame->area.height) % c->size_inc.height;
-            break;
-        case OB_DIRECTION_EAST:
-            if (a->x + a->width == x + c->frame->area.width) {
-                width = c->frame->area.width / 2;
-                x = a->x + a->width - width;
-            } else
-                width = dest - c->frame->area.x;
-            x += (width - c->frame->area.width) % c->size_inc.width;
-            width -= (width - c->frame->area.width) % c->size_inc.width;
-            break;
-        default:
-            g_assert_not_reached();
         }
-
-        width -= c->frame->size.left + c->frame->size.right;
-        height -= c->frame->size.top + c->frame->size.bottom;
-        frame_frame_gravity(c->frame, &x, &y);
-
-        actions_client_move(data, FALSE);
-        client_move_resize(c, x, y, width, height);
-        actions_client_move(data, TRUE);
-
-#endif
-        g_free(a);
     }
 
     return FALSE;
index 4383bc7..064d685 100644 (file)
@@ -4089,6 +4089,85 @@ void client_find_move_directional(ObClient *self, ObDirection dir,
     frame_frame_gravity(self->frame, x, y);
 }
 
+void client_find_resize_directional(ObClient *self, ObDirection side,
+                                    gboolean grow,
+                                    gint *x, gint *y, gint *w, gint *h)
+{
+    gint head, size;
+    gint e, e_start, e_size, delta;
+    gboolean near;
+    ObDirection dir;
+
+    switch (side) {
+    case OB_DIRECTION_EAST:
+        head = RECT_RIGHT(self->frame->area) + (self->size_inc.width - 1);
+        size = self->frame->area.width;
+        e_start = RECT_TOP(self->frame->area);
+        e_size = self->frame->area.height;
+        dir = grow ? OB_DIRECTION_EAST : OB_DIRECTION_WEST;
+        break;
+    case OB_DIRECTION_WEST:
+        head = RECT_LEFT(self->frame->area) - (self->size_inc.width - 1);
+        size = self->frame->area.width;
+        e_start = RECT_TOP(self->frame->area);
+        e_size = self->frame->area.height;
+        dir = grow ? OB_DIRECTION_WEST : OB_DIRECTION_EAST;
+        break;
+    case OB_DIRECTION_NORTH:
+        head = RECT_TOP(self->frame->area) - (self->size_inc.height - 1);
+        size = self->frame->area.height;
+        e_start = RECT_LEFT(self->frame->area);
+        e_size = self->frame->area.width;
+        dir = grow ? OB_DIRECTION_NORTH : OB_DIRECTION_SOUTH;
+        break;
+    case OB_DIRECTION_SOUTH:
+        head = RECT_BOTTOM(self->frame->area) + (self->size_inc.height - 1);
+        size = self->frame->area.height;
+        e_start = RECT_LEFT(self->frame->area);
+        e_size = self->frame->area.width;
+        dir = grow ? OB_DIRECTION_SOUTH : OB_DIRECTION_NORTH;
+        break;
+    default:
+        g_assert_not_reached();
+    }
+
+    client_find_edge_directional(self, dir, head, size,
+                                 e_start, e_size, &e, &near);
+    *x = self->frame->area.x;
+    *y = self->frame->area.y;
+    *w = self->frame->area.width;
+    *h = self->frame->area.height;
+    switch (side) {
+    case OB_DIRECTION_EAST:
+        if (near) --e;
+        delta = e - RECT_RIGHT(self->frame->area);
+        *w += delta;
+        break;
+    case OB_DIRECTION_WEST:
+        if (near) ++e;
+        delta = RECT_LEFT(self->frame->area) - e;
+        *x -= delta;
+        *w += delta;
+        break;
+    case OB_DIRECTION_NORTH:
+        if (near) ++e;
+        delta = RECT_TOP(self->frame->area) - e;
+        *y -= delta;
+        *h += delta;
+        break;
+    case OB_DIRECTION_SOUTH:
+        if (near) --e;
+        delta = e - RECT_BOTTOM(self->frame->area);
+        *h += delta;
+        break;
+    default:
+        g_assert_not_reached();
+    }
+    frame_frame_gravity(self->frame, x, y);
+    *w -= self->frame->size.left + self->frame->size.right;
+    *h -= self->frame->size.top + self->frame->size.bottom;
+}
+
 ObClient* client_under_pointer()
 {
     gint x, y;
index cae9d90..9f20859 100644 (file)
@@ -463,6 +463,9 @@ void client_find_edge_directional(ObClient *self, ObDirection dir,
                                   gint *dest, gboolean *near_edge);
 void client_find_move_directional(ObClient *self, ObDirection dir,
                                   gint *x, gint *y);
+void client_find_resize_directional(ObClient *self, ObDirection side,
+                                    gboolean grow,
+                                    gint *x, gint *y, gint *w, gint *h);
 
 /*! Fullscreen's or unfullscreen's the client window
   @param fs true if the window should be made fullscreen; false if it should