action: allow configurable policy in AutoPlace action

Closes: #1784.
This commit is contained in:
Andrew J. Hesford 2024-05-07 09:46:05 -04:00 committed by Johan Malm
parent 208f383c66
commit 89589f17c4
8 changed files with 60 additions and 21 deletions

View file

@ -422,6 +422,19 @@ action_arg_from_xml_node(struct action *action, const char *nodename, const char
goto cleanup;
}
break;
case ACTION_TYPE_AUTO_PLACE:
if (!strcmp(argument, "policy")) {
enum view_placement_policy policy =
view_placement_parse(content);
if (policy == LAB_PLACE_INVALID) {
wlr_log(WLR_ERROR, "Invalid argument for action %s: '%s' (%s)",
action_names[action->type], argument, content);
} else {
action_arg_add_int(action, argument, policy);
}
goto cleanup;
}
break;
}
wlr_log(WLR_ERROR, "Invalid argument for action %s: '%s'",
@ -1030,10 +1043,10 @@ actions_run(struct view *activator, struct server *server,
break;
case ACTION_TYPE_AUTO_PLACE:
if (view) {
struct wlr_box geometry = view->pending;
if (placement_find_best(view, &geometry)) {
view_move(view, geometry.x, geometry.y);
}
enum view_placement_policy policy =
action_get_int(action, "policy", LAB_PLACE_AUTOMATIC);
view_place_by_policy(view,
/* allow_cursor */ true, policy);
}
break;
case ACTION_TYPE_TOGGLE_TEARING:

View file

@ -873,11 +873,8 @@ entry(xmlNode *node, char *nodename, char *content)
} else if (!strcasecmp(nodename, "reuseOutputMode.core")) {
set_bool(content, &rc.reuse_output_mode);
} else if (!strcmp(nodename, "policy.placement")) {
if (!strcmp(content, "automatic")) {
rc.placement_policy = LAB_PLACE_AUTOMATIC;
} else if (!strcmp(content, "cursor")) {
rc.placement_policy = LAB_PLACE_CURSOR;
} else {
rc.placement_policy = view_placement_parse(content);
if (rc.placement_policy == LAB_PLACE_INVALID) {
rc.placement_policy = LAB_PLACE_CENTER;
}
} else if (!strcmp(nodename, "name.theme")) {

View file

@ -833,12 +833,13 @@ view_center(struct view *view, const struct wlr_box *ref)
}
void
view_place_initial(struct view *view, bool allow_cursor)
view_place_by_policy(struct view *view, bool allow_cursor,
enum view_placement_policy policy)
{
if (allow_cursor && rc.placement_policy == LAB_PLACE_CURSOR) {
if (allow_cursor && policy == LAB_PLACE_CURSOR) {
view_move_to_cursor(view);
return;
} else if (rc.placement_policy == LAB_PLACE_AUTOMATIC) {
} else if (policy == LAB_PLACE_AUTOMATIC) {
struct wlr_box geometry = view->pending;
if (placement_find_best(view, &geometry)) {
view_move(view, geometry.x, geometry.y);
@ -1866,6 +1867,24 @@ view_edge_parse(const char *direction)
}
}
enum view_placement_policy
view_placement_parse(const char *policy)
{
if (!policy) {
return LAB_PLACE_CENTER;
}
if (!strcasecmp(policy, "automatic")) {
return LAB_PLACE_AUTOMATIC;
} else if (!strcasecmp(policy, "cursor")) {
return LAB_PLACE_CURSOR;
} else if (!strcasecmp(policy, "center")) {
return LAB_PLACE_CENTER;
}
return LAB_PLACE_INVALID;
}
void
view_snap_to_edge(struct view *view, enum view_edge edge,
bool across_outputs, bool store_natural_geometry)
@ -1969,7 +1988,8 @@ view_move_to_output(struct view *view, struct output *output)
struct wlr_box output_area = output_usable_area_in_layout_coords(output);
view->pending.x = output_area.x;
view->pending.y = output_area.y;
view_place_initial(view, /* allow_cursor */ false);
view_place_by_policy(view,
/* allow_cursor */ false, rc.placement_policy);
} else if (view->maximized != VIEW_AXIS_NONE) {
view_apply_maximized_geometry(view);
} else if (view->tiled) {

View file

@ -530,7 +530,7 @@ set_initial_position(struct view *view)
}
/* All other views are placed according to a configured strategy */
view_place_initial(view, /* allow_cursor */ true);
view_place_by_policy(view, /* allow_cursor */ true, rc.placement_policy);
}
static const char *

View file

@ -571,7 +571,8 @@ set_initial_position(struct view *view,
view_constrain_size_to_that_of_usable_area(view);
if (view_is_floating(view)) {
view_place_initial(view, /* allow_cursor */ true);
view_place_by_policy(view,
/* allow_cursor */ true, rc.placement_policy);
} else {
/*
* View is maximized/fullscreen. Center the