action: add ResizeRelative

This commit is contained in:
Ph42oN 2023-06-27 21:20:04 +03:00 committed by Consolatis
parent e40159470b
commit ea623daaee
4 changed files with 36 additions and 0 deletions

View file

@ -45,6 +45,11 @@ Actions are used in menus and keyboard/mouse bindings.
*<action name="Resize">*
Begin interactive resize of window under cursor
*<action name="ResizeRelative" left="" right="" top="" bottom="" >*
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.
*<action name="MoveTo" x="" y="" />*
Move to position (x, y)

View file

@ -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);

View file

@ -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);

View file

@ -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)
{