#include <X11/Xlib.h>
#include <glib.h>
+/* how far windows move and resize with the keyboard arrows */
+#define KEY_DIST 4
+
gboolean moveresize_in_progress = FALSE;
ObClient *moveresize_client = NULL;
#ifdef SYNC
popup = popup_new(FALSE);
if (!reconfig)
- client_add_destructor(client_dest, NULL);
+ client_add_destroy_notify(client_dest, NULL);
}
void moveresize_shutdown(gboolean reconfig)
if (!reconfig) {
if (moveresize_in_progress)
moveresize_end(FALSE);
- client_remove_destructor(client_dest);
+ client_remove_destroy_notify(client_dest);
}
popup_free(popup);
(c->functions & OB_CLIENT_FUNC_RESIZE)))
return;
+ if (cnr == prop_atoms.net_wm_moveresize_size_topleft)
+ cur = OB_CURSOR_NORTHWEST;
+ else if (cnr == prop_atoms.net_wm_moveresize_size_top)
+ cur = OB_CURSOR_NORTH;
+ else if (cnr == prop_atoms.net_wm_moveresize_size_topright)
+ cur = OB_CURSOR_NORTHEAST;
+ 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)
+ cur = OB_CURSOR_SOUTHWEST;
+ else if (cnr == prop_atoms.net_wm_moveresize_size_left)
+ cur = OB_CURSOR_WEST;
+ 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;
+ else if (cnr == prop_atoms.net_wm_moveresize_move_keyboard)
+ cur = OB_CURSOR_MOVE;
+ else
+ g_assert_not_reached();
+
+ /* keep the pointer bounded to the screen for move/resize */
+ if (!grab_pointer(FALSE, TRUE, cur))
+ return;
+ if (!grab_keyboard()) {
+ ungrab_pointer();
+ return;
+ }
+
+ frame_end_iconify_animation(c->frame);
+
moveresize_client = c;
start_cx = c->area.x;
start_cy = c->area.y;
moveresize_in_progress = TRUE;
- if (corner == prop_atoms.net_wm_moveresize_size_topleft)
- cur = OB_CURSOR_NORTHWEST;
- else if (corner == prop_atoms.net_wm_moveresize_size_top)
- cur = OB_CURSOR_NORTH;
- else if (corner == prop_atoms.net_wm_moveresize_size_topright)
- cur = OB_CURSOR_NORTHEAST;
- else if (corner == prop_atoms.net_wm_moveresize_size_right)
- cur = OB_CURSOR_EAST;
- else if (corner == prop_atoms.net_wm_moveresize_size_bottomright)
- cur = OB_CURSOR_SOUTHEAST;
- else if (corner == prop_atoms.net_wm_moveresize_size_bottom)
- cur = OB_CURSOR_SOUTH;
- else if (corner == prop_atoms.net_wm_moveresize_size_bottomleft)
- cur = OB_CURSOR_SOUTHWEST;
- else if (corner == prop_atoms.net_wm_moveresize_size_left)
- cur = OB_CURSOR_WEST;
- else if (corner == prop_atoms.net_wm_moveresize_size_keyboard)
- cur = OB_CURSOR_SOUTHEAST;
- else if (corner == prop_atoms.net_wm_moveresize_move)
- cur = OB_CURSOR_MOVE;
- else if (corner == prop_atoms.net_wm_moveresize_move_keyboard)
- cur = OB_CURSOR_MOVE;
- else
- g_assert_not_reached();
-
#ifdef SYNC
if (config_resize_redraw && !moving && extensions_shape &&
moveresize_client->sync_request && moveresize_client->sync_counter)
waiting_for_sync = FALSE;
}
#endif
-
- grab_pointer(TRUE, FALSE, cur);
- grab_keyboard(TRUE);
}
void moveresize_end(gboolean cancel)
{
gint x, y;
- grab_keyboard(FALSE);
- grab_pointer(FALSE, FALSE, OB_CURSOR_NONE);
+ ungrab_keyboard();
+ ungrab_pointer();
popup_hide(popup);
moveresize_client = NULL;
}
-static void do_move(gboolean resist)
+static void do_move(gboolean keyboard)
{
- if (resist) {
- resist_move_windows(moveresize_client, &cur_x, &cur_y);
- resist_move_monitors(moveresize_client, &cur_x, &cur_y);
- }
+ gint resist;
+
+ if (keyboard) resist = KEY_DIST - 1; /* resist for one key press */
+ else resist = config_resist_win;
+ resist_move_windows(moveresize_client, resist, &cur_x, &cur_y);
+ if (!keyboard) resist = config_resist_edge;
+ resist_move_monitors(moveresize_client, resist, &cur_x, &cur_y);
client_configure(moveresize_client, cur_x, cur_y,
moveresize_client->area.width,
moveresize_client->area.height, TRUE, FALSE);
if (config_resize_popup_show == 2) /* == "Always" */
popup_coords(moveresize_client, "%d x %d",
- moveresize_client->frame->area.x,
- moveresize_client->frame->area.y);
+ moveresize_client->frame->area.x,
+ moveresize_client->frame->area.y);
}
static void do_resize()
moveresize_client->logical_size.height);
}
-static void calc_resize(gboolean resist)
+static void calc_resize(gboolean keyboard)
{
+ gint resist;
+
/* resist_size_* needs the frame size */
cur_x += moveresize_client->frame->size.left +
moveresize_client->frame->size.right;
cur_y += moveresize_client->frame->size.top +
moveresize_client->frame->size.bottom;
- if (resist) {
- resist_size_windows(moveresize_client, &cur_x, &cur_y, lockcorner);
- resist_size_monitors(moveresize_client, &cur_x, &cur_y, lockcorner);
- }
+ if (keyboard) resist = KEY_DIST - 1; /* resist for one key press */
+ else resist = config_resist_win;
+ resist_size_windows(moveresize_client, resist, &cur_x, &cur_y, lockcorner);
+ if (!keyboard) resist = config_resist_edge;
+ resist_size_monitors(moveresize_client, resist, &cur_x, &cur_y,lockcorner);
cur_x -= moveresize_client->frame->size.left +
moveresize_client->frame->size.right;
start_y = e->xbutton.y_root;
button = e->xbutton.button; /* this will end it now */
}
- used = TRUE;
+ used = e->xbutton.button == button;
} else if (e->type == ButtonRelease) {
if (!button || e->xbutton.button == button) {
moveresize_end(FALSE);
+ used = TRUE;
}
- used = TRUE;
} else if (e->type == MotionNotify) {
if (moving) {
cur_x = start_cx + e->xmotion.x_root - start_x;
cur_y = start_cy + e->xmotion.y_root - start_y;
- do_move(TRUE);
+ do_move(FALSE);
} else {
if (corner == prop_atoms.net_wm_moveresize_size_topleft) {
cur_x = start_cw - (e->xmotion.x_root - start_x);
} else
g_assert_not_reached();
- calc_resize(TRUE);
+ calc_resize(FALSE);
do_resize();
}
used = TRUE;
gint dx = 0, dy = 0, ox = cur_x, oy = cur_y;
if (e->xkey.keycode == ob_keycode(OB_KEY_RIGHT))
- dx = MAX(4, moveresize_client->size_inc.width);
+ dx = MAX(KEY_DIST, moveresize_client->size_inc.width);
else if (e->xkey.keycode == ob_keycode(OB_KEY_LEFT))
- dx = -MAX(4, moveresize_client->size_inc.width);
+ dx = -MAX(KEY_DIST, moveresize_client->size_inc.width);
else if (e->xkey.keycode == ob_keycode(OB_KEY_DOWN))
- dy = MAX(4, moveresize_client->size_inc.height);
+ dy = MAX(KEY_DIST, moveresize_client->size_inc.height);
else /* if (e->xkey.keycode == ob_keycode(OB_KEY_UP)) */
- dy = -MAX(4, moveresize_client->size_inc.height);
+ dy = -MAX(KEY_DIST, moveresize_client->size_inc.height);
cur_x += dx;
cur_y += dy;
while (XCheckTypedEvent(ob_display, MotionNotify, &ce));
}
- do_resize(FALSE);
+ calc_resize(TRUE);
+ do_resize();
/* because the cursor moves even though the window does
not nessesarily (resistance), this adjusts where the curor
gint opx, px, opy, py;
if (e->xkey.keycode == ob_keycode(OB_KEY_RIGHT))
- dx = 4;
+ dx = KEY_DIST;
else if (e->xkey.keycode == ob_keycode(OB_KEY_LEFT))
- dx = -4;
+ dx = -KEY_DIST;
else if (e->xkey.keycode == ob_keycode(OB_KEY_DOWN))
- dy = 4;
+ dy = KEY_DIST;
else /* if (e->xkey.keycode == ob_keycode(OB_KEY_UP)) */
- dy = -4;
+ dy = -KEY_DIST;
cur_x += dx;
cur_y += dy;
}
screen_pointer_pos(&px, &py);
- do_move(FALSE);
+ do_move(TRUE);
/* because the cursor moves even though the window does
not nessesarily (resistance), this adjusts where the curor