X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fmoveresize.c;h=38dab22d07649d4a80bcac80629ba3979bf4ad15;hb=47d63718c664f2ef58f5dfde42ebfc5cc57e123c;hp=9f9d4dfda388080c2512a5dd4c0b586b11c9d190;hpb=b5e597f1b3a810610fd63f50c55dc5a8b715744e;p=chaz%2Fopenbox diff --git a/openbox/moveresize.c b/openbox/moveresize.c index 9f9d4dfd..38dab22d 100644 --- a/openbox/moveresize.c +++ b/openbox/moveresize.c @@ -37,6 +37,9 @@ #include #include +/* 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 @@ -67,7 +70,7 @@ void moveresize_startup(gboolean reconfig) popup = popup_new(FALSE); if (!reconfig) - client_add_destructor(client_dest, NULL); + client_add_destroy_notify(client_dest, NULL); } void moveresize_shutdown(gboolean reconfig) @@ -75,7 +78,7 @@ 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); @@ -149,18 +152,51 @@ static void popup_coords(ObClient *c, const gchar *format, gint a, gint b) void moveresize_start(ObClient *c, gint x, gint y, guint b, guint32 cnr) { ObCursor cur; + gboolean mv = (cnr == prop_atoms.net_wm_moveresize_move || + cnr == prop_atoms.net_wm_moveresize_move_keyboard); - moving = (cnr == prop_atoms.net_wm_moveresize_move || - cnr == prop_atoms.net_wm_moveresize_move_keyboard); - - if (moveresize_in_progress || !frame_visible(c->frame) || - !(moving ? + if (moveresize_in_progress || !c->frame->visible || + !(mv ? (c->functions & OB_CLIENT_FUNC_MOVE) : (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); + moving = mv; moveresize_client = c; start_cx = c->area.x; start_cy = c->area.y; @@ -194,31 +230,6 @@ void moveresize_start(ObClient *c, gint x, gint y, guint b, guint32 cnr) 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) @@ -259,17 +270,14 @@ void moveresize_start(ObClient *c, gint x, gint y, guint b, guint32 cnr) 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); @@ -289,56 +297,62 @@ void moveresize_end(gboolean cancel) get_resize_position(&x, &y, cancel); client_configure(moveresize_client, x, y, (cancel ? start_cw : cur_x), - (cancel ? start_ch : cur_y), TRUE, TRUE); + (cancel ? start_ch : cur_y), + TRUE, TRUE); } moveresize_in_progress = FALSE; 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); + 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() { + gint x, y, w, h, lw, lh; + + /* see if it is actually going to resize */ + x = 0; + y = 0; + w = cur_x; + h = cur_y; + client_try_configure(moveresize_client, &x, &y, &w, &h, + &lw, &lh, TRUE); + if (w == moveresize_client->area.width && + h == moveresize_client->area.height) + { + return; + } + #ifdef SYNC if (config_resize_redraw && extensions_sync && moveresize_client->sync_request && moveresize_client->sync_counter) { XEvent ce; XSyncValue val; - gint x, y, w, h, lw, lh; /* are we already waiting for the sync counter to catch up? */ if (waiting_for_sync) return; - /* see if it is actually going to resize */ - x = 0; - y = 0; - w = cur_x; - h = cur_y; - client_try_configure(moveresize_client, &x, &y, &w, &h, - &lw, &lh, TRUE); - if (w == moveresize_client->area.width && - h == moveresize_client->area.height) - { - return; - } - /* increment the value we're waiting for */ ++moveresize_client->sync_counter_value; XSyncIntToValue(&val, moveresize_client->sync_counter_value); @@ -361,11 +375,8 @@ static void do_resize() } #endif - { - gint x, y; - get_resize_position(&x, &y, FALSE); - client_configure(moveresize_client, x, y, cur_x, cur_y, TRUE, FALSE); - } + get_resize_position(&x, &y, FALSE); + client_configure(moveresize_client, x, y, cur_x, cur_y, TRUE, FALSE); /* this would be better with a fixed width font ... XXX can do it better if there are 2 text boxes */ @@ -378,18 +389,21 @@ 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; @@ -419,7 +433,7 @@ gboolean moveresize_event(XEvent *e) 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); @@ -462,7 +476,7 @@ gboolean moveresize_event(XEvent *e) } else g_assert_not_reached(); - calc_resize(TRUE); + calc_resize(FALSE); do_resize(); } used = TRUE; @@ -482,13 +496,13 @@ gboolean moveresize_event(XEvent *e) 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; @@ -500,7 +514,8 @@ gboolean moveresize_event(XEvent *e) 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 @@ -515,13 +530,13 @@ gboolean moveresize_event(XEvent *e) 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; @@ -535,7 +550,7 @@ gboolean moveresize_event(XEvent *e) } 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