X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fmoveresize.c;h=19bed579d234d2a9124c86a0ef1ac67d5860e977;hb=04b570de01abc9661f9cf30dba306e66307957f3;hp=232cc9b9716abe38d3a79138f1e969264fbe9758;hpb=acf6273feba6a8d5a5a26b33e895715d6f78fb9e;p=chaz%2Fopenbox diff --git a/openbox/moveresize.c b/openbox/moveresize.c index 232cc9b9..19bed579 100644 --- a/openbox/moveresize.c +++ b/openbox/moveresize.c @@ -25,6 +25,8 @@ #include "frame.h" #include "openbox.h" #include "resist.h" +#include "mainloop.h" +#include "modkeys.h" #include "popup.h" #include "moveresize.h" #include "config.h" @@ -38,7 +40,7 @@ #include /* 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; @@ -53,12 +55,16 @@ static gint cur_x, cur_y; 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) @@ -105,7 +111,7 @@ static void get_resize_position(gint *x, gint *y, gboolean cancel) /* 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); } @@ -127,7 +133,7 @@ static void get_resize_position(gint *x, gint *y, gboolean cancel) 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) @@ -299,9 +305,12 @@ void moveresize_end(gboolean cancel) client_configure(moveresize_client, x, y, (cancel ? start_cw : cur_x), (cancel ? start_ch : cur_y), - TRUE, TRUE); + TRUE, TRUE, FALSE); } + /* dont edge warp after its ended */ + cancel_edge_warp(); + moveresize_in_progress = FALSE; moveresize_client = NULL; } @@ -319,7 +328,7 @@ static void do_move(gboolean keyboard) client_configure(moveresize_client, cur_x, cur_y, moveresize_client->area.width, moveresize_client->area.height, - TRUE, FALSE); + TRUE, FALSE, FALSE); if (config_resize_popup_show == 2) /* == "Always" */ popup_coords(moveresize_client, "%d x %d", moveresize_client->frame->area.x, @@ -377,7 +386,7 @@ static void do_resize() #endif get_resize_position(&x, &y, FALSE); - client_configure(moveresize_client, x, y, cur_x, cur_y, TRUE, FALSE); + client_configure(moveresize_client, x, y, cur_x, cur_y, TRUE, FALSE, FALSE); /* this would be better with a fixed width font ... XXX can do it better if there are 2 text boxes */ @@ -412,11 +421,70 @@ static void calc_resize(gboolean keyboard) 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) { @@ -435,6 +503,7 @@ gboolean moveresize_event(XEvent *e) 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); @@ -529,15 +598,41 @@ gboolean moveresize_event(XEvent *e) } 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;