From 019e80355920a29fb1b6c800b268004e8573c98a Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Fri, 20 Jul 2007 20:09:12 -0400 Subject: [PATCH] the resistance resizing has been changed from "lock corner" to "the direction being resized" which makes so much more sense and doesn't need all this conversion back and forth --- openbox/moveresize.c | 60 +++++++++++++++++------------------------ openbox/resist.c | 64 +++++++++++++++++++++++++++++--------------- openbox/resist.h | 4 +-- 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 -- 2.45.2