X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fmoveresize.c;h=b0b1f2a106daabeda8afb1a38aa3947084a8cc42;hb=378adaa94f0fac07dc65f0531e950c7ec8944cdf;hp=6db822c3f9d3b0d4a3e6bb7303fa9e1782b60369;hpb=8740c30588bde9bda786677247e7e4271734b383;p=chaz%2Fopenbox diff --git a/openbox/moveresize.c b/openbox/moveresize.c index 6db822c3..b0b1f2a1 100644 --- a/openbox/moveresize.c +++ b/openbox/moveresize.c @@ -82,6 +82,50 @@ void moveresize_shutdown(gboolean reconfig) 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; @@ -115,9 +159,11 @@ void moveresize_start(ObClient *c, gint x, gint y, guint b, guint32 cnr) (c->functions & OB_CLIENT_FUNC_RESIZE))) return; + frame_end_iconify_animation(c->frame); + 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 @@ -220,6 +266,8 @@ void moveresize_start(ObClient *c, gint x, gint y, guint b, guint32 cnr) void moveresize_end(gboolean cancel) { + gint x, y; + grab_keyboard(FALSE); grab_pointer(FALSE, FALSE, OB_CURSOR_NONE); @@ -238,9 +286,8 @@ 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); } @@ -256,9 +303,7 @@ static void do_move(gboolean resist) resist_move_monitors(moveresize_client, &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); if (config_resize_popup_show == 2) /* == "Always" */ @@ -282,11 +327,11 @@ static void do_resize() return; /* 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) @@ -316,17 +361,18 @@ static void do_resize() } #endif - client_configure(moveresize_client, lockcorner, - moveresize_client->area.x, moveresize_client->area.y, - cur_x, cur_y, TRUE, FALSE); + { + gint x, y; + 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); @@ -351,8 +397,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) { @@ -361,9 +409,11 @@ 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) { @@ -415,12 +465,19 @@ void moveresize_event(XEvent *e) calc_resize(TRUE); 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; @@ -430,10 +487,8 @@ void moveresize_event(XEvent *e) dx = -MAX(4, 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)) + else /* if (e->xkey.keycode == ob_keycode(OB_KEY_UP)) */ dy = -MAX(4, moveresize_client->size_inc.height); - else - return; cur_x += dx; cur_y += dy; @@ -453,6 +508,8 @@ 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; @@ -463,10 +520,8 @@ void moveresize_event(XEvent *e) dx = -4; else if (e->xkey.keycode == ob_keycode(OB_KEY_DOWN)) dy = 4; - else if (e->xkey.keycode == ob_keycode(OB_KEY_UP)) + else /* if (e->xkey.keycode == ob_keycode(OB_KEY_UP)) */ dy = -4; - else - return; cur_x += dx; cur_y += dy; @@ -488,6 +543,8 @@ void moveresize_event(XEvent *e) actually is */ start_x += (px - opx) - (cur_x - ox); start_y += (py - opy) - (cur_y - oy); + + used = TRUE; } } } @@ -496,6 +553,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; }