X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fmoveresize.c;h=38dab22d07649d4a80bcac80629ba3979bf4ad15;hb=a71a98b667c298fef7895f4d9a07eccb06cc6090;hp=c34cf81b29e239877cd64419a8e1a577957ea75c;hpb=e86900bd531d9c7093f8f5f6329e89c80bfe9767;p=chaz%2Fopenbox diff --git a/openbox/moveresize.c b/openbox/moveresize.c index c34cf81b..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,13 +78,57 @@ 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); popup = NULL; } +static void get_resize_position(gint *x, gint *y, gboolean cancel) +{ + gint dw, dh; + gint w, h, lw, lh; + + *x = moveresize_client->frame->area.x; + *y = moveresize_client->frame->area.y; + + if (cancel) { + w = start_cw; + h = start_ch; + } else { + w = cur_x; + h = cur_y; + } + + /* see how much it is actually going to resize */ + { + gint cx = *x, cy = *y; + frame_frame_gravity(moveresize_client->frame, &cx, &cy, w, h); + client_try_configure(moveresize_client, &cx, &cy, &w, &h, + &lw, &lh, TRUE); + } + dw = w - moveresize_client->area.width; + dh = h - moveresize_client->area.height; + + switch (lockcorner) { + case OB_CORNER_TOPLEFT: + break; + case OB_CORNER_TOPRIGHT: + *x -= dw; + break; + case OB_CORNER_BOTTOMLEFT: + *y -= dh; + break; + case OB_CORNER_BOTTOMRIGHT: + *x -= dw; + *y -= dh; + break; + } + + frame_frame_gravity(moveresize_client->frame, x, y, w, h); +} + static void popup_coords(ObClient *c, const gchar *format, gint a, gint b) { gchar *text; @@ -105,19 +152,54 @@ 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; - - moving = (cnr == prop_atoms.net_wm_moveresize_move || - cnr == prop_atoms.net_wm_moveresize_move_keyboard); + gboolean mv = (cnr == prop_atoms.net_wm_moveresize_move || + cnr == prop_atoms.net_wm_moveresize_move_keyboard); if (moveresize_in_progress || !c->frame->visible || - !(moving ? + !(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->frame->area.x; - start_cy = c->frame->area.y; + start_cx = c->area.x; + start_cy = c->area.y; /* these adjustments for the size_inc make resizing a terminal more friendly. you essentially start the resize in the middle of the increment instead of at 0, so you have to move half an increment @@ -148,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) @@ -213,15 +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) { - grab_keyboard(FALSE); - grab_pointer(FALSE, FALSE, OB_CURSOR_NONE); + gint x, y; + + ungrab_keyboard(); + ungrab_pointer(); popup_hide(popup); @@ -238,33 +294,35 @@ void moveresize_end(gboolean cancel) } #endif - client_configure(moveresize_client, lockcorner, - moveresize_client->area.x, - moveresize_client->area.y, + 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); - /* get where the client should be */ - frame_frame_gravity(moveresize_client->frame, &cur_x, &cur_y); - client_configure(moveresize_client, OB_CORNER_TOPLEFT, 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() @@ -272,11 +330,11 @@ static void do_resize() gint x, y, w, h, lw, lh; /* see if it is actually going to resize */ - x = moveresize_client->area.x; - y = moveresize_client->area.y; + x = 0; + y = 0; w = cur_x; h = cur_y; - client_try_configure(moveresize_client, lockcorner, &x, &y, &w, &h, + client_try_configure(moveresize_client, &x, &y, &w, &h, &lw, &lh, TRUE); if (w == moveresize_client->area.width && h == moveresize_client->area.height) @@ -317,34 +375,35 @@ static void do_resize() } #endif - client_configure(moveresize_client, lockcorner, - moveresize_client->area.x, moveresize_client->area.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 */ if (config_resize_popup_show == 2 || /* == "Always" */ (config_resize_popup_show == 1 && /* == "Nonpixel" */ - (moveresize_client->size_inc.width > 1 || - moveresize_client->size_inc.height > 1)) - ) + moveresize_client->size_inc.width > 1 && + moveresize_client->size_inc.height > 1)) popup_coords(moveresize_client, "%d x %d", moveresize_client->logical_size.width, 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; @@ -352,8 +411,10 @@ static void calc_resize(gboolean resist) moveresize_client->frame->size.bottom; } -void moveresize_event(XEvent *e) +gboolean moveresize_event(XEvent *e) { + gboolean used = FALSE; + g_assert(moveresize_in_progress); if (e->type == ButtonPress) { @@ -362,15 +423,17 @@ void moveresize_event(XEvent *e) start_y = e->xbutton.y_root; button = e->xbutton.button; /* this will end it now */ } + used = e->xbutton.button == button; } else if (e->type == ButtonRelease) { if (!button || e->xbutton.button == button) { moveresize_end(FALSE); + 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); @@ -413,28 +476,33 @@ void moveresize_event(XEvent *e) } else g_assert_not_reached(); - calc_resize(TRUE); + calc_resize(FALSE); do_resize(); } + used = TRUE; } else if (e->type == KeyPress) { - if (e->xkey.keycode == ob_keycode(OB_KEY_ESCAPE)) + if (e->xkey.keycode == ob_keycode(OB_KEY_ESCAPE)) { moveresize_end(TRUE); - else if (e->xkey.keycode == ob_keycode(OB_KEY_RETURN)) + used = TRUE; + } else if (e->xkey.keycode == ob_keycode(OB_KEY_RETURN)) { moveresize_end(FALSE); - else { + used = TRUE; + } else if (e->xkey.keycode == ob_keycode(OB_KEY_RIGHT) || + e->xkey.keycode == ob_keycode(OB_KEY_LEFT) || + e->xkey.keycode == ob_keycode(OB_KEY_DOWN) || + e->xkey.keycode == ob_keycode(OB_KEY_UP)) + { if (corner == prop_atoms.net_wm_moveresize_size_keyboard) { 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); - else if (e->xkey.keycode == ob_keycode(OB_KEY_UP)) - dy = -MAX(4, moveresize_client->size_inc.height); - else - return; + dy = MAX(KEY_DIST, moveresize_client->size_inc.height); + else /* if (e->xkey.keycode == ob_keycode(OB_KEY_UP)) */ + dy = -MAX(KEY_DIST, moveresize_client->size_inc.height); cur_x += dx; cur_y += dy; @@ -446,7 +514,8 @@ void 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 @@ -454,20 +523,20 @@ void moveresize_event(XEvent *e) actually is */ start_x += dx - (cur_x - ox); start_y += dy - (cur_y - oy); + + used = TRUE; } 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 = 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; - else if (e->xkey.keycode == ob_keycode(OB_KEY_UP)) - dy = -4; - else - return; + dy = KEY_DIST; + else /* if (e->xkey.keycode == ob_keycode(OB_KEY_UP)) */ + dy = -KEY_DIST; cur_x += dx; cur_y += dy; @@ -481,7 +550,7 @@ void 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 @@ -489,6 +558,8 @@ void moveresize_event(XEvent *e) actually is */ start_x += (px - opx) - (cur_x - ox); start_y += (py - opy) - (cur_y - oy); + + used = TRUE; } } } @@ -497,6 +568,8 @@ void moveresize_event(XEvent *e) { waiting_for_sync = FALSE; /* we got our sync... */ do_resize(); /* ...so try resize if there is more change pending */ + used = TRUE; } #endif + return used; }