static guint button;
static guint32 corner;
static ObDirection edge_warp_dir = -1;
+static gboolean edge_warp_odd = FALSE;
static ObDirection key_resize_edge = -1;
#ifdef SYNC
static gboolean waiting_for_sync;
ObCursor cur;
gboolean mv = (cnr == prop_atoms.net_wm_moveresize_move ||
cnr == prop_atoms.net_wm_moveresize_move_keyboard);
+ gint up = 1;
+ gint left = 1;
if (moveresize_in_progress || !c->frame->visible ||
!(mv ?
(c->functions & OB_CLIENT_FUNC_RESIZE)))
return;
- if (cnr == prop_atoms.net_wm_moveresize_size_topleft)
+ if (cnr == prop_atoms.net_wm_moveresize_size_topleft) {
cur = OB_CURSOR_NORTHWEST;
- else if (cnr == prop_atoms.net_wm_moveresize_size_top)
+ up = left = -1;
+ } else if (cnr == prop_atoms.net_wm_moveresize_size_top) {
cur = OB_CURSOR_NORTH;
- else if (cnr == prop_atoms.net_wm_moveresize_size_topright)
+ up = -1;
+ } else if (cnr == prop_atoms.net_wm_moveresize_size_topright) {
cur = OB_CURSOR_NORTHEAST;
- else if (cnr == prop_atoms.net_wm_moveresize_size_right)
+ up = -1;
+ } else if (cnr == prop_atoms.net_wm_moveresize_size_right)
cur = OB_CURSOR_EAST;
else if (cnr == prop_atoms.net_wm_moveresize_size_bottomright)
cur = OB_CURSOR_SOUTHEAST;
else if (cnr == prop_atoms.net_wm_moveresize_size_bottom)
cur = OB_CURSOR_SOUTH;
- else if (cnr == prop_atoms.net_wm_moveresize_size_bottomleft)
+ else if (cnr == prop_atoms.net_wm_moveresize_size_bottomleft) {
cur = OB_CURSOR_SOUTHWEST;
- else if (cnr == prop_atoms.net_wm_moveresize_size_left)
+ left = -1;
+ } else if (cnr == prop_atoms.net_wm_moveresize_size_left) {
cur = OB_CURSOR_WEST;
- else if (cnr == prop_atoms.net_wm_moveresize_size_keyboard)
+ left = -1;
+ } else if (cnr == prop_atoms.net_wm_moveresize_size_keyboard)
cur = OB_CURSOR_SOUTHEAST;
else if (cnr == prop_atoms.net_wm_moveresize_move)
cur = OB_CURSOR_MOVE;
friendly. you essentially start the resize in the middle of the
increment instead of at 0, so you have to move half an increment
either way instead of a full increment one and 1 px the other. */
- start_x = x - (mv ? 0 : c->size_inc.width / 2);
- start_y = y - (mv ? 0 : c->size_inc.height / 2);
+ start_x = x - (mv ? 0 : left * c->size_inc.width / 2);
+ start_y = y - (mv ? 0 : up * c->size_inc.height / 2);
corner = cnr;
button = b;
key_resize_edge = -1;
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 (!keyboard &&
+ (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;
+ }
+
/* resist_size_* needs the frame size */
nw += moveresize_client->frame->size.left +
moveresize_client->frame->size.right;
*dw = nw - ow;
*dh = nh - oh;
- /* make sure it's a valid size */
+ /* take aspect ratios into account for resistance */
+ if (!keyboard &&
+ (moveresize_client->max_ratio || moveresize_client->min_ratio))
+ {
+ 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;
{
guint d;
- d = screen_find_desktop(screen_desktop, edge_warp_dir, TRUE, FALSE);
- if (d != screen_desktop) screen_set_desktop(d, TRUE);
-
- edge_warp_dir = -1;
+ /* only fire every second time. so it's fast the first time, but slower
+ after that */
+ if (edge_warp_odd) {
+ d = screen_find_desktop(screen_desktop, edge_warp_dir, TRUE, FALSE);
+ if (d != screen_desktop) screen_set_desktop(d, TRUE);
+ }
+ edge_warp_odd = !edge_warp_odd;
- return FALSE; /* don't repeat */
+ return TRUE; /* do repeat ! */
}
static void do_edge_warp(gint x, gint y)
}
if (dir != edge_warp_dir) {
- if (dir == (ObDirection)-1)
- cancel_edge_warp();
- else
+ cancel_edge_warp();
+ if (dir != (ObDirection)-1) {
+ edge_warp_odd = TRUE; /* switch on the first timeout */
ob_main_loop_timeout_add(ob_main_loop,
config_mouse_screenedgetime * 1000,
edge_warp_delay_func,
NULL, NULL, NULL);
+ }
edge_warp_dir = dir;
}
}