*output_name* The name of virtual output. If not supplied, will remove
the last virtual output added.
-*<action name="AutoPlace" />*
- Use the automatic placement policy to move the active window to a
- position on its output that will minimize overlap with other windows.
+*<action name="AutoPlace" policy="value"/>*
+ Reposition the window according to the desired placement policy.
+
+ *policy* [automatic|cursor|center] Use the specified policy, which has
+ the same meaning as the corresponding value for *<placement><policy>*.
+ Default is automatic.
*<action name="Shade" />*++
*<action name="Unshade" />*++
#include "theme.h"
enum view_placement_policy {
- LAB_PLACE_CENTER = 0,
+ LAB_PLACE_INVALID = 0,
+ LAB_PLACE_CENTER,
LAB_PLACE_CURSOR,
LAB_PLACE_AUTOMATIC
};
void view_center(struct view *view, const struct wlr_box *ref);
/**
- * view_place_initial - apply initial placement strategy to view
+ * view_place_by_policy - apply placement strategy to view
* @view: view to be placed
+ * @allow_cursor: set to false to ignore center-on-cursor policy
+ * @policy: placement policy to apply
*/
-void view_place_initial(struct view *view, bool allow_cursor);
+void view_place_by_policy(struct view *view, bool allow_cursor,
+ enum view_placement_policy);
void view_constrain_size_to_that_of_usable_area(struct view *view);
void view_restore_to(struct view *view, struct wlr_box geometry);
bool wrap);
enum view_axis view_axis_parse(const char *direction);
enum view_edge view_edge_parse(const char *direction);
+enum view_placement_policy view_placement_parse(const char *policy);
/* xdg.c */
struct wlr_xdg_surface *xdg_surface_from_view(struct view *view);
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'",
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:
} 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")) {
}
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);
}
}
+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)
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) {
}
/* 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_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