summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--openbox/moveresize.c60
-rw-r--r--openbox/resist.c64
-rw-r--r--openbox/resist.h4
3 files changed, 69 insertions, 59 deletions
diff --git a/openbox/moveresize.c b/openbox/moveresize.c
index 11cf563d..c0ddcca8 100644
--- a/openbox/moveresize.c
+++ b/openbox/moveresize.c
@@ -54,7 +54,6 @@ static gint start_x, start_y, start_cx, start_cy, start_cw, start_ch;
static gint cur_x, cur_y, cur_w, cur_h;
static guint button;
static guint32 corner;
-static ObCorner lockcorner;
static ObDirection edge_warp_dir = -1;
static ObDirection key_resize_edge = -1;
#ifdef SYNC
@@ -372,36 +371,37 @@ static gboolean sync_timeout_func(gpointer data)
#endif
static void calc_resize(gboolean keyboard, gint keydist, gint *dw, gint *dh,
- ObCorner cor)
+ ObDirection dir)
{
- gint resist, x, y, lw, lh, ow, oh, nw, nh;
+ gint resist, x = 0, y = 0, lw, lh, ow, oh, nw, nh;
ow = cur_w;
oh = cur_h;
+ nw = ow + *dw;
+ nh = oh + *dh;
+
/* resist_size_* needs the frame size */
- nw = ow + *dw +
- moveresize_client->frame->size.left +
+ nw += moveresize_client->frame->size.left +
moveresize_client->frame->size.right;
- nh = oh + *dh +
- moveresize_client->frame->size.top +
+ nh += moveresize_client->frame->size.top +
moveresize_client->frame->size.bottom;
if (keyboard) resist = keydist - 1; /* resist for one key press */
else resist = config_resist_win;
- resist_size_windows(moveresize_client, resist, &nw, &nh, cor);
+ resist_size_windows(moveresize_client, resist, &nw, &nh, dir);
if (!keyboard) resist = config_resist_edge;
- resist_size_monitors(moveresize_client, resist, &nw, &nh, cor);
+ resist_size_monitors(moveresize_client, resist, &nw, &nh, dir);
nw -= moveresize_client->frame->size.left +
moveresize_client->frame->size.right;
nh -= moveresize_client->frame->size.top +
moveresize_client->frame->size.bottom;
- /* see its actual size */
- x = 0;
- y = 0;
- client_try_configure(moveresize_client, &x, &y, &nw, &nh, &lw, &lh, TRUE);
+ *dw = nw - ow;
+ *dh = nh - oh;
+ /* make sure it's a valid size */
+ client_try_configure(moveresize_client, &x, &y, &nw, &nh, &lw, &lh, TRUE);
*dw = nw - ow;
*dh = nh - oh;
@@ -533,7 +533,6 @@ static void resize_with_keys(gint keycode, gint state)
gint dw = 0, dh = 0, pdx = 0, pdy = 0, opx, opy, px, py;
gint dist = 0, resist = 0;
ObDirection dir;
- ObCorner cor;
/* pick the edge if it needs to move */
if (keycode == ob_keycode(OB_KEY_RIGHT)) {
@@ -646,17 +645,7 @@ static void resize_with_keys(gint keycode, gint state)
}
}
- /* which corner is locked, for resistance */
- if (key_resize_edge == OB_DIRECTION_WEST)
- cor = OB_CORNER_TOPRIGHT;
- else if (key_resize_edge == OB_DIRECTION_EAST)
- cor = OB_CORNER_TOPLEFT;
- else if (key_resize_edge == OB_DIRECTION_NORTH)
- cor = OB_CORNER_BOTTOMLEFT;
- else if (key_resize_edge == OB_DIRECTION_SOUTH)
- cor = OB_CORNER_TOPLEFT;
-
- calc_resize(TRUE, resist, &dw, &dh, cor);
+ calc_resize(TRUE, resist, &dw, &dh, dir);
if (key_resize_edge == OB_DIRECTION_WEST)
cur_x -= dw;
else if (key_resize_edge == OB_DIRECTION_NORTH)
@@ -721,52 +710,53 @@ gboolean moveresize_event(XEvent *e)
do_edge_warp(e->xmotion.x_root, e->xmotion.y_root);
} else {
gint dw, dh;
+ ObDirection dir;
if (corner == prop_atoms.net_wm_moveresize_size_topleft) {
dw = -(e->xmotion.x_root - start_x);
dh = -(e->xmotion.y_root - start_y);
- lockcorner = OB_CORNER_BOTTOMRIGHT;
+ dir = OB_DIRECTION_NORTHWEST;
} else if (corner == prop_atoms.net_wm_moveresize_size_top) {
dw = 0;
dh = -(e->xmotion.y_root - start_y);
- lockcorner = OB_CORNER_BOTTOMRIGHT;
+ dir = OB_DIRECTION_NORTH;
} else if (corner == prop_atoms.net_wm_moveresize_size_topright) {
dw = (e->xmotion.x_root - start_x);
dh = -(e->xmotion.y_root - start_y);
- lockcorner = OB_CORNER_BOTTOMLEFT;
+ dir = OB_DIRECTION_NORTHEAST;
} else if (corner == prop_atoms.net_wm_moveresize_size_right) {
dw = (e->xmotion.x_root - start_x);
dh = 0;
- lockcorner = OB_CORNER_BOTTOMLEFT;
+ dir = OB_DIRECTION_EAST;
} else if (corner ==
prop_atoms.net_wm_moveresize_size_bottomright) {
dw = (e->xmotion.x_root - start_x);
dh = (e->xmotion.y_root - start_y);
- lockcorner = OB_CORNER_TOPLEFT;
+ dir = OB_DIRECTION_SOUTHEAST;
} else if (corner == prop_atoms.net_wm_moveresize_size_bottom) {
dw = 0;
dh = (e->xmotion.y_root - start_y);
- lockcorner = OB_CORNER_TOPLEFT;
+ dir = OB_DIRECTION_SOUTH;
} else if (corner ==
prop_atoms.net_wm_moveresize_size_bottomleft) {
dw = -(e->xmotion.x_root - start_x);
dh = (e->xmotion.y_root - start_y);
- lockcorner = OB_CORNER_TOPRIGHT;
+ dir = OB_DIRECTION_SOUTHWEST;
} else if (corner == prop_atoms.net_wm_moveresize_size_left) {
dw = -(e->xmotion.x_root - start_x);
dh = 0;
- lockcorner = OB_CORNER_TOPRIGHT;
+ dir = OB_DIRECTION_WEST;
} else if (corner == prop_atoms.net_wm_moveresize_size_keyboard) {
dw = (e->xmotion.x_root - start_x);
dh = (e->xmotion.y_root - start_y);
- lockcorner = OB_CORNER_TOPLEFT;
+ dir = OB_DIRECTION_SOUTHEAST;
} else
g_assert_not_reached();
dw -= cur_w - start_cw;
dh -= cur_h - start_ch;
- calc_resize(FALSE, 0, &dw, &dh, lockcorner);
+ calc_resize(FALSE, 0, &dw, &dh, dir);
cur_w += dw;
cur_h += dh;
diff --git a/openbox/resist.c b/openbox/resist.c
index fcd12ab4..a3eee7b9 100644
--- a/openbox/resist.c
+++ b/openbox/resist.c
@@ -192,7 +192,7 @@ void resist_move_monitors(ObClient *c, gint resist, gint *x, gint *y)
}
void resist_size_windows(ObClient *c, gint resist, gint *w, gint *h,
- ObCorner corn)
+ ObDirection dir)
{
GList *it;
ObClient *target; /* target */
@@ -230,23 +230,28 @@ void resist_size_windows(ObClient *c, gint resist, gint *w, gint *h,
if (snapx == NULL) {
/* horizontal snapping */
if (t < tb && b > tt) {
- switch (corn) {
- case OB_CORNER_TOPLEFT:
- case OB_CORNER_BOTTOMLEFT:
+ switch (dir) {
+ case OB_DIRECTION_EAST:
+ case OB_DIRECTION_NORTHEAST:
+ case OB_DIRECTION_SOUTHEAST:
dlt = l;
drb = r + *w - c->frame->area.width;
if (r < tl && drb >= tl &&
drb < tl + resist)
*w = tl - l, snapx = target;
break;
- case OB_CORNER_TOPRIGHT:
- case OB_CORNER_BOTTOMRIGHT:
+ case OB_DIRECTION_WEST:
+ case OB_DIRECTION_NORTHWEST:
+ case OB_DIRECTION_SOUTHWEST:
dlt = l - *w + c->frame->area.width;
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;
}
}
}
@@ -254,23 +259,28 @@ void resist_size_windows(ObClient *c, gint resist, gint *w, gint *h,
if (snapy == NULL) {
/* vertical snapping */
if (l < tr && r > tl) {
- switch (corn) {
- case OB_CORNER_TOPLEFT:
- case OB_CORNER_TOPRIGHT:
+ switch (dir) {
+ case OB_DIRECTION_SOUTH:
+ case OB_DIRECTION_SOUTHWEST:
+ case OB_DIRECTION_SOUTHEAST:
dlt = t;
drb = b + *h - c->frame->area.height;
if (b < tt && drb >= tt &&
drb < tt + resist)
*h = tt - t, snapy = target;
break;
- case OB_CORNER_BOTTOMLEFT:
- case OB_CORNER_BOTTOMRIGHT:
+ case OB_DIRECTION_NORTH:
+ case OB_DIRECTION_NORTHWEST:
+ case OB_DIRECTION_NORTHEAST:
dlt = t - *h + c->frame->area.height;
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;
}
}
}
@@ -281,7 +291,7 @@ void resist_size_windows(ObClient *c, gint resist, gint *w, gint *h,
}
void resist_size_monitors(ObClient *c, gint resist, gint *w, gint *h,
- ObCorner corn)
+ ObDirection dir)
{
gint l, t, r, b; /* my left, top, right and bottom sides */
gint dlt, drb; /* my destination left/top and right/bottom sides */
@@ -326,9 +336,10 @@ void resist_size_monitors(ObClient *c, gint resist, gint *w, gint *h,
pb = RECT_BOTTOM(*parea);
/* horizontal snapping */
- switch (corn) {
- case OB_CORNER_TOPLEFT:
- case OB_CORNER_BOTTOMLEFT:
+ switch (dir) {
+ case OB_DIRECTION_EAST:
+ case OB_DIRECTION_NORTHEAST:
+ case OB_DIRECTION_SOUTHEAST:
dlt = l;
drb = r + *w - c->frame->area.width;
if (r <= ar && drb > ar && drb <= ar + resist)
@@ -336,8 +347,9 @@ void resist_size_monitors(ObClient *c, gint resist, gint *w, gint *h,
else if (r <= pr && drb > pr && drb <= pr + resist)
*w = pr - l + 1;
break;
- case OB_CORNER_TOPRIGHT:
- case OB_CORNER_BOTTOMRIGHT:
+ case OB_DIRECTION_WEST:
+ case OB_DIRECTION_NORTHWEST:
+ case OB_DIRECTION_SOUTHWEST:
dlt = l - *w + c->frame->area.width;
drb = r;
if (l >= al && dlt < al && dlt >= al - resist)
@@ -345,12 +357,16 @@ 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 */
- switch (corn) {
- case OB_CORNER_TOPLEFT:
- case OB_CORNER_TOPRIGHT:
+ switch (dir) {
+ case OB_DIRECTION_SOUTH:
+ case OB_DIRECTION_SOUTHWEST:
+ case OB_DIRECTION_SOUTHEAST:
dlt = t;
drb = b + *h - c->frame->area.height;
if (b <= ab && drb > ab && drb <= ab + resist)
@@ -358,8 +374,9 @@ void resist_size_monitors(ObClient *c, gint resist, gint *w, gint *h,
else if (b <= pb && drb > pb && drb <= pb + resist)
*h = pb - t + 1;
break;
- case OB_CORNER_BOTTOMLEFT:
- case OB_CORNER_BOTTOMRIGHT:
+ case OB_DIRECTION_NORTH:
+ case OB_DIRECTION_NORTHWEST:
+ case OB_DIRECTION_NORTHEAST:
dlt = t - *h + c->frame->area.height;
drb = b;
if (t >= at && dlt < at && dlt >= at - resist)
@@ -367,6 +384,9 @@ 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);
diff --git a/openbox/resist.h b/openbox/resist.h
index d61e7f2e..a2b3f160 100644
--- a/openbox/resist.h
+++ b/openbox/resist.h
@@ -32,8 +32,8 @@ void resist_move_windows(struct _ObClient *c, gint resist, gint *x, gint *y);
*/
void resist_move_monitors(struct _ObClient *c, gint resist, gint *x, gint *y);
void resist_size_windows(struct _ObClient *c, gint resist, gint *w, gint *h,
- ObCorner corn);
+ ObDirection dir);
void resist_size_monitors(struct _ObClient *c, gint resist, gint *w, gint *h,
- ObCorner corn);
+ ObDirection dir);
#endif