diff --git a/docs/labwc-config.5.scd b/docs/labwc-config.5.scd index 08c7aef6..c37dddc2 100644 --- a/docs/labwc-config.5.scd +++ b/docs/labwc-config.5.scd @@ -132,6 +132,13 @@ this is for compatibility with Openbox. be used with labwc the preferred mode of the monitor is used instead. Default is no. +## PLACEMENT + +** [center|cursor] + Specify a placement policy for new windows. The "center" policy will + always place windows at the center of the active output. The "cursor" + policy will center new windows under the cursor. Default is "center". + ## WINDOW SWITCHER ** diff --git a/docs/rc.xml.all b/docs/rc.xml.all index 7c59660a..96439dc9 100644 --- a/docs/rc.xml.all +++ b/docs/rc.xml.all @@ -14,6 +14,10 @@ no + + center + + diff --git a/include/config/rcxml.h b/include/config/rcxml.h index 62cc5a15..b6a116da 100644 --- a/include/config/rcxml.h +++ b/include/config/rcxml.h @@ -20,6 +20,11 @@ enum window_switcher_field_content { LAB_FIELD_TITLE, }; +enum view_placement_policy { + LAB_PLACE_CENTER = 0, + LAB_PLACE_CURSOR +}; + struct usable_area_override { struct border margin; char *output; @@ -40,6 +45,7 @@ struct rcxml { int gap; bool adaptive_sync; bool reuse_output_mode; + enum view_placement_policy placement_policy; /* focus */ bool focus_follow_mouse; diff --git a/include/view.h b/include/view.h index a3dd9cb0..bef7afea 100644 --- a/include/view.h +++ b/include/view.h @@ -393,6 +393,13 @@ void view_store_natural_geometry(struct view *view); * within; if NULL, view is centered within usable area of its output */ void view_center(struct view *view, const struct wlr_box *ref); + +/** + * view_place_initial - apply initial placement strategy to view + * @view: view to be placed + */ +void view_place_initial(struct view *view); + void view_restore_to(struct view *view, struct wlr_box geometry); void view_set_untiled(struct view *view); void view_maximize(struct view *view, enum view_axis axis, diff --git a/src/config/rcxml.c b/src/config/rcxml.c index efd6122f..5ff069ef 100644 --- a/src/config/rcxml.c +++ b/src/config/rcxml.c @@ -703,6 +703,12 @@ entry(xmlNode *node, char *nodename, char *content) set_bool(content, &rc.adaptive_sync); } else if (!strcasecmp(nodename, "reuseOutputMode.core")) { set_bool(content, &rc.reuse_output_mode); + } else if (!strcmp(nodename, "policy.placement")) { + if (!strcmp(content, "cursor")) { + rc.placement_policy = LAB_PLACE_CURSOR; + } else { + rc.placement_policy = LAB_PLACE_CENTER; + } } else if (!strcmp(nodename, "name.theme")) { rc.theme_name = xstrdup(content); } else if (!strcmp(nodename, "cornerradius.theme")) { @@ -949,6 +955,8 @@ rcxml_init(void) } has_run = true; + rc.placement_policy = LAB_PLACE_CENTER; + rc.xdg_shell_server_side_deco = true; rc.ssd_keep_border = true; rc.corner_radius = 8; diff --git a/src/view.c b/src/view.c index 58d77e10..232e1dca 100644 --- a/src/view.c +++ b/src/view.c @@ -678,6 +678,17 @@ view_center(struct view *view, const struct wlr_box *ref) } } +void +view_place_initial(struct view *view) +{ + if (rc.placement_policy == LAB_PLACE_CURSOR) { + view_move_to_cursor(view); + return; + } + + view_center(view, NULL); +} + static void view_apply_natural_geometry(struct view *view) { diff --git a/src/xdg.c b/src/xdg.c index 713eccd1..638e111b 100644 --- a/src/xdg.c +++ b/src/xdg.c @@ -1,4 +1,5 @@ // SPDX-License-Identifier: GPL-2.0-only + #include #include "common/macros.h" #include "common/mem.h" @@ -409,19 +410,18 @@ position_xdg_toplevel_view(struct view *view) struct wlr_xdg_toplevel *parent_xdg_toplevel = xdg_toplevel_from_view(view)->parent; - if (!parent_xdg_toplevel) { - view_center(view, NULL); - } else { - /* - * If child-toplevel-views, we center-align relative to their - * parents - */ + if (parent_xdg_toplevel) { + /* Child views are center-aligned relative to their parents */ struct view *parent = lookup_view_by_xdg_toplevel( view->server, parent_xdg_toplevel); assert(parent); view_set_output(view, parent->output); view_center(view, &parent->pending); + return; } + + /* All other views are placed according to a configured strategy */ + view_place_initial(view); } static const char * diff --git a/src/xwayland.c b/src/xwayland.c index 0c44b7c7..86f7a1ae 100644 --- a/src/xwayland.c +++ b/src/xwayland.c @@ -517,7 +517,7 @@ set_initial_position(struct view *view, } } else { if (view_is_floating(view)) { - view_center(view, NULL); + view_place_initial(view); } else { /* * View is maximized/fullscreen. Center the