#include "frame.h"
#include "openbox.h"
#include "resist.h"
+#include "mainloop.h"
+#include "modkeys.h"
#include "popup.h"
#include "moveresize.h"
#include "config.h"
#include <glib.h>
/* how far windows move and resize with the keyboard arrows */
-#define KEY_DIST 4
+#define KEY_DIST 8
gboolean moveresize_in_progress = FALSE;
ObClient *moveresize_client = NULL;
static guint button;
static guint32 corner;
static ObCorner lockcorner;
+static ObDirection edge_warp_dir = -1;
#ifdef SYNC
static gboolean waiting_for_sync;
#endif
static ObPopup *popup = NULL;
+static void do_edge_warp(gint x, gint y);
+static void cancel_edge_warp();
+
static void client_dest(ObClient *client, gpointer data)
{
if (moveresize_client == client)
/* see how much it is actually going to resize */
{
gint cx = *x, cy = *y;
- frame_frame_gravity(moveresize_client->frame, &cx, &cy, w, h);
+ frame_frame_gravity(moveresize_client->frame, &cx, &cy);
client_try_configure(moveresize_client, &cx, &cy, &w, &h,
&lw, &lh, TRUE);
}
break;
}
- frame_frame_gravity(moveresize_client->frame, x, y, w, h);
+ frame_frame_gravity(moveresize_client->frame, x, y);
}
static void popup_coords(ObClient *c, const gchar *format, gint a, gint b)
TRUE, TRUE, FALSE);
}
+ /* dont edge warp after its ended */
+ cancel_edge_warp();
+
moveresize_in_progress = FALSE;
moveresize_client = NULL;
}
moveresize_client->frame->size.bottom;
}
+static gboolean edge_warp_delay_func(gpointer data)
+{
+ 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;
+
+ return FALSE; /* don't repeat */
+}
+
+static void do_edge_warp(gint x, gint y)
+{
+ guint i;
+ ObDirection dir;
+
+ if (!config_mouse_screenedgetime) return;
+
+ dir = -1;
+
+ for (i = 0; i < screen_num_monitors; ++i) {
+ Rect *a = screen_physical_area_monitor(i);
+ if (x == RECT_LEFT(*a)) dir = OB_DIRECTION_WEST;
+ if (x == RECT_RIGHT(*a)) dir = OB_DIRECTION_EAST;
+ if (y == RECT_TOP(*a)) dir = OB_DIRECTION_NORTH;
+ if (y == RECT_BOTTOM(*a)) dir = OB_DIRECTION_SOUTH;
+
+ /* try check for xinerama boundaries */
+ if ((x + 1 == RECT_LEFT(*a) || x - 1 == RECT_RIGHT(*a)) &&
+ (dir == OB_DIRECTION_WEST || dir == OB_DIRECTION_EAST))
+ {
+ dir = -1;
+ }
+ if ((y + 1 == RECT_TOP(*a) || y - 1 == RECT_BOTTOM(*a)) &&
+ (dir == OB_DIRECTION_NORTH || dir == OB_DIRECTION_SOUTH))
+ {
+ dir = -1;
+ }
+ g_free(a);
+ }
+
+ if (dir != edge_warp_dir) {
+ if (dir == (ObDirection)-1)
+ cancel_edge_warp();
+ else
+ ob_main_loop_timeout_add(ob_main_loop,
+ config_mouse_screenedgetime * 1000,
+ edge_warp_delay_func,
+ NULL, NULL, NULL);
+ edge_warp_dir = dir;
+ }
+}
+
+static void cancel_edge_warp()
+{
+ ob_main_loop_timeout_remove(ob_main_loop, edge_warp_delay_func);
+}
+
gboolean moveresize_event(XEvent *e)
{
gboolean used = FALSE;
- g_assert(moveresize_in_progress);
+ if (!moveresize_in_progress) return FALSE;
if (e->type == ButtonPress) {
if (!button) {
cur_x = start_cx + e->xmotion.x_root - start_x;
cur_y = start_cy + e->xmotion.y_root - start_y;
do_move(FALSE);
+ do_edge_warp(e->xmotion.x_root, e->xmotion.y_root);
} else {
if (corner == prop_atoms.net_wm_moveresize_size_topleft) {
cur_x = start_cw - (e->xmotion.x_root - start_x);
} else if (corner == prop_atoms.net_wm_moveresize_move_keyboard) {
gint dx = 0, dy = 0, ox = cur_x, oy = cur_y;
gint opx, px, opy, py;
-
- if (e->xkey.keycode == ob_keycode(OB_KEY_RIGHT))
- dx = KEY_DIST;
- else if (e->xkey.keycode == ob_keycode(OB_KEY_LEFT))
- dx = -KEY_DIST;
- else if (e->xkey.keycode == ob_keycode(OB_KEY_DOWN))
- dy = KEY_DIST;
- else /* if (e->xkey.keycode == ob_keycode(OB_KEY_UP)) */
- dy = -KEY_DIST;
+ gint dist = KEY_DIST;
+
+ /* shift means jump to edge */
+ if (e->xkey.state & modkeys_key_to_mask(OB_MODKEY_KEY_SHIFT)) {
+ gint x, y;
+ ObDirection dir;
+
+ if (e->xkey.keycode == ob_keycode(OB_KEY_RIGHT))
+ dir = OB_DIRECTION_EAST;
+ else if (e->xkey.keycode == ob_keycode(OB_KEY_LEFT))
+ dir = OB_DIRECTION_WEST;
+ else if (e->xkey.keycode == ob_keycode(OB_KEY_DOWN))
+ dir = OB_DIRECTION_SOUTH;
+ else /* if (e->xkey.keycode == ob_keycode(OB_KEY_UP)) */
+ dir = OB_DIRECTION_NORTH;
+
+ client_find_move_directional(moveresize_client, dir,
+ &x, &y);
+ dx = x - moveresize_client->area.x;
+ dy = y - moveresize_client->area.y;
+ } else {
+ /* control means fine grained */
+ if (e->xkey.state &
+ modkeys_key_to_mask(OB_MODKEY_KEY_CONTROL))
+ dist = 1;
+
+ if (e->xkey.keycode == ob_keycode(OB_KEY_RIGHT))
+ dx = dist;
+ else if (e->xkey.keycode == ob_keycode(OB_KEY_LEFT))
+ dx = -dist;
+ else if (e->xkey.keycode == ob_keycode(OB_KEY_DOWN))
+ dy = dist;
+ else /* if (e->xkey.keycode == ob_keycode(OB_KEY_UP)) */
+ dy = -dist;
+ }
cur_x += dx;
cur_y += dy;