From: Ph42oN Date: Tue, 27 Jun 2023 18:20:04 +0000 (+0300) Subject: action: add ResizeRelative X-Git-Url: https://git.mdlowis.com/?a=commitdiff_plain;h=ea623daaeec3ef21b9bfcdfc94ce84f94063f833;p=proto%2Flabwc.git action: add ResizeRelative --- diff --git a/docs/labwc-actions.5.scd b/docs/labwc-actions.5.scd index e2ba6217..1027096b 100644 --- a/docs/labwc-actions.5.scd +++ b/docs/labwc-actions.5.scd @@ -45,6 +45,11 @@ Actions are used in menus and keyboard/mouse bindings. ** Begin interactive resize of window under cursor +** + Resize window relative to its current size. Values of left, right, + top or bottom tell how much to resize on that edge of window, + positive values grow window, negative shrink window. + ** Move to position (x, y) diff --git a/include/view.h b/include/view.h index 3b3aeba8..1a8e4314 100644 --- a/include/view.h +++ b/include/view.h @@ -153,6 +153,8 @@ void view_close(struct view *view); * For move only, use view_move() */ void view_move_resize(struct view *view, struct wlr_box geo); +void view_resize_relative(struct view *view, + int left, int right, int top, int bottom); void view_move(struct view *view, int x, int y); void view_moved(struct view *view); void view_minimize(struct view *view, bool minimized); diff --git a/src/action.c b/src/action.c index 34305358..6dd370d0 100644 --- a/src/action.c +++ b/src/action.c @@ -74,6 +74,7 @@ enum action_type { ACTION_TYPE_RAISE, ACTION_TYPE_LOWER, ACTION_TYPE_RESIZE, + ACTION_TYPE_RESIZE_RELATIVE, ACTION_TYPE_MOVETO, ACTION_TYPE_MOVE_RELATIVE, ACTION_TYPE_GO_TO_DESKTOP, @@ -109,6 +110,7 @@ const char *action_names[] = { "Raise", "Lower", "Resize", + "ResizeRelative", "MoveTo", "MoveRelative", "GoToDesktop", @@ -192,6 +194,13 @@ action_arg_from_xml_node(struct action *action, char *nodename, char *content) goto cleanup; } break; + case ACTION_TYPE_RESIZE_RELATIVE: + if (!strcmp(argument, "left") || !strcmp(argument, "right") || + !strcmp(argument, "top") || !strcmp(argument, "bottom")) { + action_arg_add_int(action, argument, atoi(content)); + goto cleanup; + } + break; case ACTION_TYPE_MOVETO: case ACTION_TYPE_MOVE_RELATIVE: if (!strcmp(argument, "x") || !strcmp(argument, "y")) { @@ -603,6 +612,15 @@ actions_run(struct view *activator, struct server *server, resize_edges); } break; + case ACTION_TYPE_RESIZE_RELATIVE: + if (view) { + int left = get_arg_value_int(action, "left", 0); + int right = get_arg_value_int(action, "right", 0); + int top = get_arg_value_int(action, "top", 0); + int bottom = get_arg_value_int(action, "bottom", 0); + view_resize_relative(view, left, right, top, bottom); + } + break; case ACTION_TYPE_MOVETO: if (view) { int x = get_arg_value_int(action, "x", 0); diff --git a/src/view.c b/src/view.c index 7b459254..e22e264c 100644 --- a/src/view.c +++ b/src/view.c @@ -203,6 +203,17 @@ view_move_resize(struct view *view, struct wlr_box geo) } } +void +view_resize_relative(struct view *view, int left, int right, int top, int bottom) +{ + struct wlr_box newgeo = view->pending; + newgeo.x -= left; + newgeo.width += left + right; + newgeo.y -= top; + newgeo.height += top + bottom; + view_move_resize(view, newgeo); +} + void view_adjust_size(struct view *view, int *w, int *h) {