swayfx/sway/sway.5.scd
Erik Reider 94ebb45ee3
rebase: Sway 1.8 (#78)
* build: bump wlroots dependency to 0.16.0

* swaymsg: replace if with switch in pretty_print

* swaymsg: add GET_TREE pretty-printing

* swaybar: fix errno handling in status_handle_readable

If getline fails once, it was not reset before the next getline
call. errno is only overwritten by getline on error.

* Add cairo_image_surface_create error handling

cairo_image_surface_create can fail, e.g. when running out of
memory or when the size is too big. Avoid crashing in this case.

Closes: https://github.com/swaywm/sway/issues/6531

* build: bump version to 1.8-dev

Historically we've been sticking with the last release number in
the master branch. However that's a bit confusing, people can't
easily figure out whether they're using a release or a work-in-progress
snapshot. Only the commit hash appended to the version number may
help, but that's not very explicit and disappears when using a
tarball.

We could bump the version in master to the next release number.
However during the RC cycle there would be a downgrade from 1.8 to
1.8-rc1. Also it would be hard to tell the difference between a
stable release and an old snapshot.

This patch introduces a new pre-release identifier, "dev". It's
alphabetically before "rc" so it should be correctly sorted by
semver comparisons. "dev" is upgraded to "rc" (and then to stable)
when doing a release. The master branch always uses a "dev"
version, only release branches use "rc" or stable versions.

* [IPC] Add repeat delay/rate info to keyboard

Closes #6735

wlroots already has the info in the struct so let's access it and print it out.

* input/seat: unset has_focus when focus_stack becomes empty

We currently track the focus of a seat in two ways: we use a list called
focus_stack to track the order in which nodes have been focused, with
the first node representing what's currently focused, and we use a
variable called has_focus to indicate whether anything has focus--i.e.
whether we should actually treat that first node as focused at any given
time.

In a number of places, we treat has_focus as implying that a focused
node exists. If it's true, we attempt to dereference the return value of
seat_get_focus(), our helper function for getting the first node in
focus_list, with no further checks. But this isn't quite correct with
the current implementation of seat_get_focus(): not only does it return
NULL when has_focus is false, it also returns NULL when focus_stack
contains no items.

In most cases, focus_stack never becomes empty and so this doesn't
matter at all. Since focus_stack stores a history of focused nodes, we
rarely remove nodes from it. The exception to this is when a node itself
goes away. In that case, we call seat_node_destroy() to remove it from
focus_stack and free it. But we don't unset has_focus if we've removed
the final node! This lets us get into a state where has_focus is true
but seat_get_focus() returns NULL, leading to a segfault when we try to
dereference it.

Fix the issue both by updating has_focus in seat_node_destroy() and by
adding an assertion in seat_get_focus() that ensures focus_stack and
has_focus are in sync, which will make it easier to track down similar
issues in the future.

Fixes #6395.

[1] There's some discussion in #1585 from when this was implemented
about whether has_focus is actually necessary; it's possible we could
remove it entirely, but for the moment this is the architecture we have.

* swaybar: fix tray_padding vs min-height re: scale

Co-authored-by: xdavidwu <xdavidwuph@gmail.com>

* swaybar: fix tray item icon scaling, positioning

* container: Fix crash when view unmaps + maps quickly

Followup on 4e4898e90f.

If a view quickly maps and unmaps repeatedly, there will be multiple
destroyed containers with same view in a single transaction. Each of
these containers will then try to destroy this view, resulting in use
after free.
The container should only destroy the view if the view still belongs
to the container.

Simple reproducer: couple XMapWindow + XUnmapWindow in a loop followed
by XDestroyWindow.

See #6605

* commands/move: Fix crash when pos_y is omitted

Fixes #6737

* Destroy sub-surfaces with parent layer-shell surface

Closes: https://github.com/swaywm/sway/issues/6337

* Add safety assert in parse_movement_unit

Let's add this just in case a caller passes argc == 0.

References: https://github.com/swaywm/sway/issues/6737#issuecomment-1008082540

* meson: check: false on run_command

Future meson releases will change the default and warns when the
implicit default is used, breaking builds.

Explicitly set check: false to maintain behavior and silence warnings.

* Print deprecation notice when running SUID

SUID privilege drop is needed for the "builtin"-backend of libseat,
which copied our old "direct" backend behavior for the sake of
compatibility and ease of transition.

libseat now has a better alternative in the form of seatd-launch. It
uses the normal seatd daemon and libseat backend and takes care of SUID
for us.

Add a soft deprecation warning to highlight our future intent of
removing this code. The deprecation cycle is needed to avoid surprises
when sway no longer drops privileges.

* xdg-shell: use toplevel geometry to adjust the popup box

`popup_unconstrain` uses view coordinates to init the output box for
popups. However wlroots expects the box to be set in a toplevel surface
coordinate system, which is not always equal to view. The difference
between those is a window geometry set via xdg-shell.

GTK4 reserves some space for client-side decoration and thus has a
window with top left corner not matching to (0, 0) of a surface. The box
calculated without taking that into account was slightly shifted
compared to the actual output and allowed to position part of the popup
off screen.

* build: fix building with basu

02b412a introduced the use of list for sdbus deps, however
it was assuming that all packages which were in a list has a version
higher than 239. That is true for libsystemd and libelogind, since they
use the same versions, however basu is using version numbers which are
way lower than what libsystemd/libelogind are using, so basu only build
is failing.

* Upgrade for wlroots surface refactoring

See [1] for details.

[1]: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3412

* commands/focus: drop trailing whitespace

* input/cursor: count pointer gestures as idle activity

Fixes https://github.com/swaywm/sway/issues/6765.

* input/cursor: treat swipe begin as idle activity too

Accidentally overlooked in fd53f80.

* treat fullscreen windows as 'tiled' for commands/focus

* transaction: destroying nodes aren't hidden

Commit 37d7bc6998 ("transaction: Only wait for ack from visible
views") introduced a check which uses view_is_visible() to check if a view
is still visible on the screen. However view_is_visible() will early
return in case the node is in the destroying state. This is incorrect
for transactions, since a destroying view which is visible will trigger
configure events for other clients. This bug was visible when repeatedly
opening and closing two views side by side, since we ignore the
destroying node we get a frame where the still open view is shown with
the old configure values and the rest is the desktop background. The
next frame is than correct again.

Fix this by considering destroying views as visible, we correctly wait
for them and send the configure events to other views in time, fixing
the background flicker.

Fixes #6473

* build: execute wlroots subproject before finding deps

wlroots often requires dependencies more recent than Sway's.
Executing the wlroots subproject first will give Meson a chance to
find these newer dependencies, possibly via subprojects.

The subproject will override the "wlroots" dependency when executed,
so we don't need to use get_variable anymore.

References: https://github.com/swaywm/sway/pull/6498#issuecomment-1001746017

* tray: do not render passive items

https://www.freedesktop.org/wiki/Specifications/StatusNotifierItem/StatusNotifierItem/#org.freedesktop.statusnotifieritem.status

* cmd/swap: error on swapping a container with itself

* input/cursor: pass through pointer hold gestures

This just follows swaywm/wlroots#3047, so `wl_pointer_gestures_v1`
clients can be notified of these events.

* swaynag: remove buffer destruction condition

An address of a variable can never be NULL, so checking it doesn't make
sense; and `destroy_buffer()` can operate on already destroyed buffers
anyway.

Fixes #6780

* Use bools for CLI flags

* xwayland: listen to `request_activate` event

When REAPER submenu is closed `XCB_CLIENT_MESSAGE` with type
`NET_ACTIVE_WINDOW` is sent to set focus to parent menu.

Closes: https://github.com/swaywm/sway/issues/6324

* chore: chase wlr_output_layout_get_box() update

https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3439

* Chase wlroots xdg-shell refactor

* Minor update to focus_on_window_activation

Removed xwayland limitation since wayland clients are supported via xdg-activation.

* Translated README into Italian

* readme: add link to Italian translation

* readme: sort language list alphabetically

* readme: use relative links for translations

* xdg-shell: use wlr_xdg_toplevel in sway_view

Improved type safety.

Closes: https://github.com/swaywm/sway/issues/6813

* xdg-shell: use wlr_xdg_popup in sway_xdg_popup

Improved type safety.

* Fix snprintf compiler warning

* Remove all sprintf calls

Replace them with snprintf, which ensures buffer overflows won't
happen.

* sway/commands: add missing wlr_keyboard interface include in xkb_switch_layout

* sway/input: use wlr_input_device from input device base

* Remove some erroneous apostrophes in comments

* Don't enter seatop_move_floating when fullscreen

Currently, a floating window that's been fullscreened can send us
xdg_toplevel::move, and we'll enter seatop_move_floating, which lets us
drag the surface around while it's fullscreen. We don't want
this--fullscreen surfaces should always be aligned to the screen--so add
the same check that seatop_default already does when entering this mode.

Tested with Weston's weston-fullscreen demo, which sends a move request
if you click anywhere on its surface.

* swaynag: die on all allocation failures

* sway/input: don't pass possibly invalid modifiers pointer

active_keyboard may be NULL, in which case an invalid pointer could be
passed to wlr_input_method_keyboard_grab_v2_send_modifiers. This
procedure call is unnecessary since wlroots commit 372a52ec "input
method: send modifiers in set_keyboard", so the call can simply be
removed.

Fixes #6836.

* sway/input: destroy sway_switch properly

Fix: #6861
Added seat_device_destroy function to seat_device_destroy function.

* commands/focus: fix segfault when no container is already focused.

Fixes #6690.

* Remove WLR_SWITCH_STATE_TOGGLE usage

Ref [1].

[1]: 4792446ee8

* Replace pcre with pcre2

Closes: https://github.com/swaywm/sway/issues/6838

* swaybar: remove swaybar_output.input_region

No need to keep the region around, we can immediately destroy it
after the wl_surface.set_input_region request.

* swaybar: set opaque region

When the background color is fully opaque, set the surface's opaque
region to the whole surface.

* Updating criteria checking with PCRE2

* swaynag: allocate button_details with details

They are used together, so it doesn't make sense to allocate them
separately.

* swaynag: statically allocate button_close, and move declaration

Every swaynag has a close button, so it doesn't make sense to
allocate it dynamically. The declaration is moved later to when
it is actually needed.

* swaynag: remove unnecessary zero of swaynag struct

Global variables are initialized to 0.

* swaynag: remove redundant status variables in main

Instead, we just use `status` for all failures.

* remove unnecessary strlen call

* sway/input/cursor: take device mm size from wlr_tablet

* sway/input/seat: take output name from specialized input device

* sway/input: follow up wlroots input device events renaming

* sway/input: fix bad position of wlr_drag

* sway/input: wlr_seat_keyboard() now takes wlr_keyboard

* bash-completion: localize variables

* sway/main: move constants off the stack

This makes stack traces from gdb slightly easier to read.

* Fix farsi label

* Avoid format-truncation warning

The existing code gives this error when compiled with GCC 12:

../sway/server.c: In function ‘server_init’:
../sway/server.c:217:75: error: ‘%d’ directive output may be truncated writing between 1 and 11 bytes into a region of size 8 [-Werror=format-truncation=]
  217 |                 snprintf(name_candidate, sizeof(name_candidate), "wayland-%d", i);
      |                                                                           ^~
../sway/server.c:217:66: note: directive argument in the range [-2147483647, 32]
  217 |                 snprintf(name_candidate, sizeof(name_candidate), "wayland-%d", i);
      |                                                                  ^~~~~~~~~~~~
../sway/server.c:217:17: note: ‘snprintf’ output between 10 and 20 bytes into a destination of size 16
  217 |                 snprintf(name_candidate, sizeof(name_candidate), "wayland-%d", i);
      |                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Because i is never negative, this is a false positive, but it is easy to
change i to unsigned to silence the error.

* Shuffle variables to satisfy -Werror=restrict

This also fixes an invalid strlen invocation on uninitialized memory.

* layer_shell: keep output non-NULL wherever possible

Our layer shell implementation assigns every layer surface to an output
on creation. It tracks this output using the output field on the
underlying wlr_layer_surface_v1 structure. As such, much of the existing
code assumes that output is always non-NULL and omits NULL checks
accordingly.

However, there are currently two cases where we destroy a
sway_layer_surface and output is NULL. The first is when we can't find
an output to assign the surface to and destroy it immediately after
creation. The second is when we destroy a surface in response to its
output getting destroyed, as we set output to NULL in
handle_output_destroy() before we call wlr_layer_surface_v1_destroy(),
which is what calls the appropriate unmap and destroy callbacks.

The former case doesn't cause any problems, since we haven't even
allocated a sway_layer_surface at that point or registered any
callbacks. The latter case, however, currently triggers a crash (#6120)
if a popup is visible, since our popup_handle_unmap() implementation
can't handle a NULL output.

To fix this issue, keep output set until right before we free the
sway_layer_surface. All we need to do is remove some of the cleanup
logic from handle_output_destroy(), since as of commit c9060bcc12
("layer-shell: replace close() with destroy()") that same logic is
guaranteed to be happen later when wlroots calls handle_destroy() as
part of wlr_layer_surface_v1_destroy().

This lets us remove some NULL checks from other unmap/destroy callbacks,
which is nice. We also don't need to check that the wlr_output points to
a valid sway_output anymore, since we unset that pointer after disabling
the output as of commit a0bbe67076 ("Address emersions comments on
output re-enabling") Just to be safe, I've added assertions that the
wlr_output is non-NULL wherever we use it.

Fixes #6120.

* Chase wlroots X11 hints update

* Add Swedish README

* Support cursor capture in grimshot

Refactor argument parser

Bring back `sh` compatibility

Default to NOTIFY=no

* Update grimshot.1.scd

Fixed typo. The object is **files**, which is plural. **image** modifies files; it's not countable.

* xkb_switch_layout: fix relative layout switches

Fixes #6011

* Implement ext-session-lock-v1

* Avoid inspecting a NULL view in seat_set_focus

Fixes #6968

* swaynag: do error checking and rename read_from_stdin

read_from_stdin not only read from stdin, but trimming trailing
newlines, so rename it to reflect this.

* swaynag: improve robustness when loading config

* swaynag: combine consecutive declaration/assignments

* config: Remove unused mouse binding structure

Mouse bindings are handled alongside normal bindings. Remove the unused
separate data structure definition to avoid confusion.

Signed-off-by: Michael Weiser <michael.weiser@gmx.de>

* Replace strncpy with memcpy

strncpy is useless here, is dangerous because it doesn't guarantee
that the string is NUL-terminated and causes the following warning:

    ../sway/criteria.c: In function ‘criteria_parse’:
    ../sway/criteria.c:712:25: error: ‘strncpy’ destination unchanged after copying no bytes [-Werror=stringop-truncation]
      712 |                         strncpy(value, valuestart, head - valuestart);
          |                         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

* Add descriptions for `stacking` and `tabbed` layouts

Resolves #5918

* man: Fix trailing spaces

* server: request xdg-shell v2

Wlroots does not yet support the newer xdg-shell versions and now
requires the compositor to set the supported xdg-shell version during
creation. Set this to v2 for sway as well.

Fixes https://github.com/swaywm/sway/issues/7001

* realtime: request SCHED_RR using CAP_SYS_NICE

Try to gain SCHED_RR (round-robin) realtime scheduling privileges before
starting the server. This requires CAP_SYS_NICE on Linux systems.
We additionally register a pthread_atfork callback which resets the
scheduling class back to SCHED_OTHER (the Linux system default).

Due to CAP_SYS_NICE, setting RLIMIT_RTPRIO has no effect on the process
as documented within man 7 sched (from Linux):

  Privileged (CAP_SYS_NICE) threads ignore the RLIMIT_RTPRIO limit;
  as with older kernels, they can make arbitrary changes to
  scheduling policy and priority. See getrlimit(2) for further
  information on RLIMIT_RTPRIO

Note that this requires the sway distribution packagers to set the
CAP_SYS_NICE capability on the sway binary.

Supersedes #6992

* ext-session-lock: disable direct scan-out when locked

* Polish the language in README.zh-CN.md & sync with English one

Co-Authored-By: Urey. Xue <urey.s.knowledge@gmail.com>

* De-duplicate IPC output descriptions

* Handle NULL output make/model/serial

* chore: chase wlroots xdg-shell update

* xdg-shell: schedule a configure on maximize request

This commit reverts 03879290dbee26127f6867ef60bc2a7f9a6c8c5f and
fc84bcb7fb0ffa29b1f9bed287762241a3473803.

* Add a Hindi (हिन्दी) translation to the README

Hindi is one of the most prominent languages of the Indian Subcontinent.
This commit adds the translation of the README into the Hindi language.
Some of the words are still written in English because there wasn't an
appropriate technical term of the word in the language.

Co-authored-by: Surendrajat <surendrajat@protonmail.com>

* sway: add bindgesture command

Co-authored-by: Michael Weiser <michael.weiser@gmx.de>

* build: link with -pthread

Fixes the following FreeBSD error:

    ld: error: undefined symbol: pthread_getschedparam
    >>> referenced by realtime.c:25 (../sway/realtime.c:25)
    >>>               sway/sway.p/realtime.c.o:(set_rr_scheduling)

Fixes: a3a82efbf6b5 ("realtime: request SCHED_RR using CAP_SYS_NICE")

* ipc: remove chatty debug log messages

These aren't particularly useful, and clobber the debug logs.

* Refuse to start when SUID is detected

This ensures that those surprised by the deprecation of SUID operation
receive an error rather than accidentally having sway run as root.

This detection will be removed in a future release.

* swaynag: move close_button up to fix SIGSEGV

When swaynag_parse_options encounters '--dismiss-button' (or its
shorthand '-s'), it sets the text of the first button in the
swaynag.buttons list, which is expected to exist and to be the dismiss
button, to the one passed by the user.

Commit 4780afb68b4ee2cdf0e4925f40cf885819f8a74a ("swaynag: statically
allocate button_close, and move declaration") moved the list
initialization to after swaynag_parse_options is called which made that
code fail.

For example, the command 'swaynag --dismiss-button Dismiss' crashes and
'swaynag --message Message --button Yes "" --dismiss-button Dismiss'
shows the wrong buttons.

Move it back to before swaynag_parse_options is called.

* config/output: use wlr_output_commit_state

This makes the code more robust because we don't potentially leave
bad state in wlr_output.pending behind anymore. This also fixes a
bug.

Closes: https://github.com/swaywm/sway/issues/7043
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3610

* Allocate enough space for `cmd_results->error`

* Remove access to wlr_input_device union

References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3626
Closes: https://github.com/swaywm/sway/issues/7077

* Rename dpms output command to power

The "dpms" command refers to VESA Display Power Management
Signaling, a deprecated standard. It's superseded by VESA DPM.

Instead of tying out command name to a particular standard, use the
neutral term "power".

* Strip quotes in bindsym --input-device=...

If the input device is quoted, which is common when using variables in the
config file, those quotes must be ignored here, or the input device will be
ignored.

Fixes #7029.

* Avoid unecessary string copy

* Reject font values that are invalid for pango

Use pango to parse font configuration early, and reject the command as
invalid if the value is invalid for pango. Since we're already parsing
the font into a `PangoFontDescription`, keep that instance around and
avoid re-parsing the font each time we render text.

Fixes: https://github.com/swaywm/sway/issues/6805

* Reuse parsed PangoFontDescription

Avoids parsing the configured font each time text is rendered.

* ipc: add "power" to output reply

* config.in: switch to `output power`

* Remove internal references to DPMS

While at it, use an int for the config field, just like we do for
all other fields.

* fix: remove redundant empty statement in main.c

This semi-colon looks like a typo. Luckily, it has no effect on the code as it's treated as an empty statement leading the switch case.

Really straightforward nitpick change, was just something I was confused by when reading over the code.

* input: chase delta_discrete semantics change

* swaymsg: fix floating_nodes being ignored

Fix floating_nodes being ignored in pretty_print_tree.

* ipc: make get_deco_rect check config->hide_lone_tab

Without this, the `IPC_GET_TREE` ipc call would return false information
about the container's `deco_rect` and `rect` properties if
`hide_edge_borders --i3` was in effect.

* grimshot: fix tilde expansion within quotes

* Enable single-pixel-buffer-v1

References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3428

* sway-output.5: improve display of parameter

Since "width" and "height" are separate parameters, show them as such.

* man: sway(5) move fixes

* ipc: drop WLR_OUTPUT_ADAPTIVE_SYNC_UNKNOWN case

This has been removed from wlroots.

* config/output: test adaptive sync

Required for [1].

[1]: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3637

* Fix crash in xdg_activation_v1.c

wlr_xdg_surface_from_wlr_surface() can return a NULL pointer, so check for NULL before dereferencing it.

* sway: Add non-desktop-output type

Currently, when encountering a non-desktop display, sway offers the
output for leasing and returns without storing it in a sway specific
output type like `struct sway_output`.  Additionally, running
`swaymsg -t get_outputs` doesn't show non-desktop outputs.

This commit stores the non-desktop outputs into a struct called
`sway_output_non_desktop`, and adds them to a list on `sway_root`

* sway: add non-desktop outputs to json when running `swaymsg -t get_outputs`

* swaymsg: show non-desktop property when pretty printing outputs

* man: Add XWayland information

* ipc: expose mode picture aspect ratio

* swaymsg: show mode picture aspect ratio

* build: simplify protocol paths

No need for arrays here.

* sway/commands/output: Add command for unplugging non-physical outputs

* Improve Japanese translation

* allow pointer_constraints on layer_shell surfaces

* check for NULL

* use seat directly

* Use keyboard_state.focused_surface directly

* input: focus floating container when clicked on border

Fixes #7209.

* input: focus container when scrolling on titlebar

Fixes #6503.

* Fix leaks in criteria_destroy()

* Avoid double free in criteria_destroy()

* Add support for ext-idle-notify-v1

References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3753

* input: tweak focus behavior to allow focusing parent containers

Sway focuses the inactive child when focusing split containers. However,
there is currently no way to focus the parent container itself by mouse.
A user must use the keyboard to do so.

This commit maintains the current behavior, but makes it such that a
second click on the split container titlebar (i.e., after its children
are visible) focuses the split container itself.

* Fix keymap being NULL and segfaulting on dev add

Moved `libinput_config` to the callers of
`sway_input_configure_libinput_device` so that we send the event after
the added event.

* Rework session lock keyboard focus handling

When removing outputs, it is possible to end up in a situation where
none of the session lock client's surfaces have keyboard focus,
resulting in it not receiving keyboard events.  Track the focused
surface and update it as needed on surface destroy.

* Fix focus tracking when session lock is active

Remove the incorrect attempt to block focus changes when an input grab
is present and replace it with the same logic used for layer_shell-based
screen lockers: restore the focus after changing it.

This fixes a use-after-free of seat->workspace if outputs are destroyed
while a screen lock is enabled.

* container_floating_set_default_size: Store workspace size box on the stack

* Support libinput's 1.21 new dwtp option

Support the new dwtp (disable while trackpointing) option introduced in
libinput 1.21, allowing users to control whether the trackpoint (like
those in Thinkpads, but not only) should be disabled while using the
keyboard/touchpad.

See: https://gitlab.freedesktop.org/libinput/libinput/-/issues/731

* tree: support formatting null titles

Any windows that have never had a title set visually behave closer to
that of an empty title, but are unformattable, as the code bails out
early on a NULL title.

* criteria: allow matching on empty (NULL) titles

* criteria: allow matching for NULL string criteria

* ci: install hwdata

* Use wl_signal_emit_mutable()

This function fixes segfaults when emitting a signal potentially
removes arbitrary listeners.

* Use wlr_damage_ring

wlr_output_damage is to be replaced with wlr_damage_ring, so use that.

* lock: fix crash on output destroy

Closes: https://github.com/swaywm/sway/issues/7120

* container_get_siblings: handle NULL workspace

* ci: checkout wlroots 0.16.0

* workspace_create: Don't allow NULL name

(cherry picked from commit 34933bb84350fe805d82276ea02d5732546e9993)

* output: set damage ring bounds to pixel values

Fixes: https://github.com/swaywm/sway/issues/7254
(cherry picked from commit 85005b52fe5b832e4ea914fa28048b0c5c803769)

* Use shm_open instead of mkstemp

shm_open is more reliable because it does not require
a writeable filesystem folder, unlike mkstemp.

(cherry picked from commit e2bc8866f46701e9c825ad7fa5baac02b2e4898f)

* build: drop wayland-scanner fallback

(cherry picked from commit 366f6ef3d31688631dc453028e108f98a1d7ab57)

* build: unify server & client protocol generation

No need to make a difference here, let's just generate header
files for both.

(cherry picked from commit 5be5a038da8a3789a19945719f2a27233291445d)

* build: drop "server" from target name for protocol code

(cherry picked from commit e5475d9310941ce88ed016ce1515b36e3a440252)

* build: drop intermediate libraries for protocols

(cherry picked from commit af8a5a8918ef42336194fb1077b008a736de7af9)

* root: move the workspace matching code to its own file

This removes the pid_workspace bits from tree/root before it gets
too interesting.

No functional change.

(cherry picked from commit eb5021ef990fb29ff86544aea58d687ad62c757a)

* node: prettify node type names

(cherry picked from commit 1c4b94ae3ca94b972410c80a61404a347af1ee68)

* launcher: track workspaces by node

This removes the need to rename the pid_workspaces when a workspace
is renamed.

It also opens the possibility of tracking other node types. Tracking
containers would allow application to be placed correctly in the
container tree even if the user has moved their focus elsewhere since
it was launched.

(cherry picked from commit 3b49f2782e8faf68766269b9c7390b16e25ae824)

* launcher: use xdga tokens

This reuses wlroots token tracking for workspace matching. It doesn't
export any xdga tokens for clients yet.

(cherry picked from commit bd66f4943da1c96edc3ba49573e27b42b688c543)

* launcher: rename pid_workspace to launcher_ctx

Soon we will match views with more than just a pid.

(cherry picked from commit d75c9f9722389d441fd24bd490c5cf12c4bef39a)

* view: associate launch contexts with views

Views now maintain a reference to a launch context which, as a last
resort, is populated at map time with a context associated with its pid.
This opens the possibility of populating it before map via another
source, e.g. xdga-tokens or configuration.

(cherry picked from commit 864b3a9a18f236f92f1898bb44ab977ceaebfd68)

* launcher: initialize launcher_ctxs once on startup

(cherry picked from commit 66568508c06267445489d655c91c94a34d6d9ffe)

* launcher: fudge the interface a bit

We want to create a context before knowing the pid it will match with.

(cherry picked from commit bdeb9f95651f6c99cc2f4cfb59020ddee202cf36)

* launcher: export xdga tokens and use them for workspace matching

(cherry picked from commit 30ad4dc4a5a41ce7c7aa85096a6e18f374172983)

* launcher: export X startup ids and use them for workspace matching

(cherry picked from commit 28fda4c0d38907fab94dc7d82c9dcf0754748b4e)

* swaybar: Prioritize hotspot events to bar bindings

This is consistent with i3bar's behaviour, and for example, allows binding a
command to button1, while still being able to click on tray icons or other
zones on the bar's status line which may have their own bindings.

E.g., in Sway, without this commit, this config. makes tray icons unclickable:

    bar {
        # ...
        bindsym button1 exec swaynag -m You_clicked_the_tray._Want_some_help?
    }

But the same configuration in i3 (with i3-nagbar) keeps tray items clickable.

Signed-off-by: Joan Bruguera <joanbrugueram@gmail.com>
(cherry picked from commit 53f9dbd424dc173a85c9f4cd30802259d38b1ef4)

* swaybar: Make hotspots block bar release bindings

The previous commit prioritized hotspots before bar bindings for press events,
which matches i3's behaviour. However, since hotspots don't need to do any
processing on release events, those were not handled, and simply fell through
to `bindsym --release` bar bindings (if any).

This is counter-intuitive, and doesn't match i3's behaviour. Instead in case
a hotspot handles the press event, it should also handle the release event,
doing nothing, but blocking the event from triggering a --release bar binding.

E.g., in Sway, without this commit, this config. shows a text on tray clicks:

    bar {
        # ...
        bindsym --release button1 exec swaynag -m I_got_the_release_event.
    }

But the same configuration in i3 (with i3-nagbar) doesn't show the text.

Signed-off-by: Joan Bruguera <joanbrugueram@gmail.com>
(cherry picked from commit 94b69acf0d7b26ee5af2172300cb18473508da76)

* build: drop unused wayland-egl dependency

(cherry picked from commit 37e4a3d6370dc6ba2b0877d588845c06781e880e)

* build: bump version to 1.8-rc1

* Fix build on Debian Stable

(cherry picked from commit dca0bb5749bc16f91ab964fc1b06ebb9a453368f)

* build: fix have_xwayland when xcb-icccm is not found

xcb-icccm is required to build Xwayland support.

Backported from commit d41f11e6bd8cef80f02dda4c66d4a31611aed753.

* build: bump version to 1.8-rc2

* seat: Avoid sending redundant keymaps on reload

When we reload the config, we reset every input device and re-apply
configuration from the config file. This means that the keyboard keymap
is updated at least once during config reload, more if the config file
contains keyboard configuration.

When they keyboard keymap changes and is updated through wlr_seat, the
keymap ends up sent to every keyboard bound in every client, seemingly
multiple times. On an x230 of mine with a keyboard layout set in the
config file, I see 42 keymap events sent to foot on config reload.

Reduce events from keyboard configurations by skipping all but the
currently active keyboard for the seat, and by clearing the active
keyboard during input manager device reset. After this change, I only
see a single just-in-time keymap event.

Fixes: https://github.com/swaywm/sway/issues/6654

* criteria: be lenient on window_role and instance too

* build: bump version to 1.8-rc3

* commands/move: Warp cursor after moving workspace to another output

This makes sway's behavior consistent with i3 when `mouse_warping` is
set to any value besides `none`.

Fixes #7027.

(cherry picked from commit e3c63bf58d0744dfb436f0f38442ce3735e40f47)

* seat: Set keyboard if seat keyboard is NULL

sway sends wl_keyboard.enter on seat focus change and when a keyboard
active on a seat is configured. If all keyboards are removed and a
keyboard is added back without changing the focused client, no new
notify event would be sent despite having keyboard focus. This could
lead to key events without notify, which is a protocol violation.

As a quick fix, when configuring a keyboard on a seat where no keyboard
is currently active, activate the keyboard so that a focused surface
will receive a notify event.

Regressed by: e1b268af98edeb09e570e8855ef64f0719cbafe2
Closes: https://github.com/swaywm/sway/issues/7330

(cherry picked from commit 1ade0ce753dc5f588584f444ce80d27c3b1e4300)

* build: bump version to 1.8-rc4

* swaynag: fix NULL font description

The font description was only set if provided on the CLI. It was
left NULL for the defaults and when reading from the config file.

Closes: https://github.com/swaywm/sway/issues/7186
(cherry picked from commit fd0af78e43f4dd67a404f475c676b25ae38a4b82)

* build: bump version to 1.8

* Removed other README languages

* Fixed build issues

* Removed alpha from render_data struct

* Updated PKGBUILDs and COPR spec

* Update sway/desktop/render.c

Co-authored-by: Alexis Tacnet <alexistacnet@gmail.com>

* Fixed deco_data not being initialized properly

* Replaced wlr_egl_(make|unset)_current with eglMakeCurrent

* Added matrix_projection into fx_renderer

Signed-off-by: Michael Weiser <michael.weiser@gmx.de>
Co-authored-by: Sefa Eyeoglu <contact@scrumplex.net>
Co-authored-by: Simon Ser <contact@emersion.fr>
Co-authored-by: Seth Barberee <seth.barberee@gmail.com>
Co-authored-by: Thomas Hebb <tommyhebb@gmail.com>
Co-authored-by: Nathan Schulte <nmschulte@gmail.com>
Co-authored-by: xdavidwu <xdavidwuph@gmail.com>
Co-authored-by: David Rosca <nowrep@gmail.com>
Co-authored-by: David96 <david@hameipe.de>
Co-authored-by: Kenny Levinsen <kl@kl.wtf>
Co-authored-by: Aleksei Bavshin <alebastr89@gmail.com>
Co-authored-by: Kirill Chibisov <contact@kchibisov.com>
Co-authored-by: Tudor Brindus <me@tbrindus.ca>
Co-authored-by: Patrick Hilhorst <git@hilhorst.be>
Co-authored-by: Rouven Czerwinski <rouven@czerwinskis.de>
Co-authored-by: Tobias Bengfort <tobias.bengfort@posteo.de>
Co-authored-by: Ronan Pigott <rpigott@berkeley.edu>
Co-authored-by: Kirill Primak <vyivel@eclair.cafe>
Co-authored-by: Tuomas Yrjölä <mail@yrhki.fi>
Co-authored-by: Kirill Primak <vyivel@posteo.net>
Co-authored-by: Alexander Browne <elcste@users.noreply.github.com>
Co-authored-by: Marco Rubin <20150305+Rubo3@users.noreply.github.com>
Co-authored-by: Muhamed Hobi <woohoomoo2u@gmail.com>
Co-authored-by: Simon Zeni <simon@bl4ckb0ne.ca>
Co-authored-by: Nihal Jere <nihal@nihaljere.xyz>
Co-authored-by: Alexander Gramiak <agrambot@gmail.com>
Co-authored-by: Moon Sungjoon <sumoon@seoulsaram.org>
Co-authored-by: Nicolas Avrutin <nicolas@avrutin.net>
Co-authored-by: ndren <andreien@ctemplar.com>
Co-authored-by: Bill Li <billli11hkb@gmail.com>
Co-authored-by: Leonardo Hernández Hernández <leohdz172@protonmail.com>
Co-authored-by: Oğuz Ersen <oguz@ersen.moe>
Co-authored-by: Manuel Stoeckl <code@mstoeckl.com>
Co-authored-by: Yasin Silavi <59373143+sttatusx@users.noreply.github.com>
Co-authored-by: Daniel De Graaf <code@danieldg.net>
Co-authored-by: kraftwerk28 <kefirchik3@gmail.com>
Co-authored-by: Eskil <67291226+eschillus@users.noreply.github.com>
Co-authored-by: Alice Carroll <git@alice-carroll.pet>
Co-authored-by: Alan <51193876+Pound-Hash@users.noreply.github.com>
Co-authored-by: Victor Makarov <vitja.makarov@gmail.com>
Co-authored-by: Michael Weiser <michael.weiser@gmx.de>
Co-authored-by: -k <slowdive@me.com>
Co-authored-by: Hongyi <61831273+FrozenArcher@users.noreply.github.com>
Co-authored-by: Urey. Xue <urey.s.knowledge@gmail.com>
Co-authored-by: LordRishav <75823494+LordRishav@users.noreply.github.com>
Co-authored-by: Surendrajat <surendrajat@protonmail.com>
Co-authored-by: Florian Franzen <Florian.Franzen@gmail.com>
Co-authored-by: Greg Depoire--Ferrer <greg@gregdf.com>
Co-authored-by: Thomas Jost <schnouki@schnouki.net>
Co-authored-by: Hugo Osvaldo Barrera <hugo@barrera.io>
Co-authored-by: zkldi <ktchidev@gmail.com>
Co-authored-by: llyyr <llyyr.public@gmail.com>
Co-authored-by: Baltazár Radics <baltazar.radics@gmail.com>
Co-authored-by: Martin Michlmayr <tbm@cyrius.com>
Co-authored-by: Filip Szczepański <jazz2rulez@gmail.com>
Co-authored-by: Alex Maese <memaese@hotmail.com>
Co-authored-by: マリウス <marius@xn--gckvb8fzb.com>
Co-authored-by: Andri Yngvason <andri@yngvason.is>
Co-authored-by: ohno418 <yutaro.ono.418@gmail.com>
Co-authored-by: Ferdinand Schober <ferdinand.schober@fau.de>
Co-authored-by: cparm <armelcadetpetit@gmail.com>
Co-authored-by: Yaroslav de la Peña Smirnov <yps@yaroslavps.com>
Co-authored-by: Alexander Orzechowski <orzechowski.alexander@gmail.com>
Co-authored-by: pudiva chip líquida <pudiva@skylittlesystem.org>
Co-authored-by: Puck Meerburg <puck@puckipedia.com>
Co-authored-by: Callum Andrew <calcium@mailbox.org>
Co-authored-by: Ronan Pigott <ronan@rjp.ie>
Co-authored-by: Joan Bruguera <joanbrugueram@gmail.com>
Co-authored-by: nerdopolis <bluescreen_avenger@verizon.net>
Co-authored-by: Ankit Pandey <anpandey@protonmail.com>
Co-authored-by: Alexis Tacnet <alexistacnet@gmail.com>
2023-01-04 17:32:43 -05:00

1052 lines
42 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

sway(5)
# NAME
sway - configuration file and commands
# DESCRIPTION
A sway configuration file is a list of sway commands that are executed by sway
on startup. These commands usually consist of setting your preferences and
setting key bindings. An example config is likely present in /etc/sway/config
for you to check out.
Lines in the configuration file might be extended through multiple lines by
adding a '\\' character at the end of line. e.g.:
```
bindsym Shift+XF86AudioRaiseVolume exec \\
pactl set-sink-volume @DEFAULT_SINK@ -1%
```
Commands can also be given as a block in the form *command { <subcommands...>
}*. Anything before the opening *{* will be prepended to the lines inside the
block. For example:
```
output eDP-1 {
background ~/wallpaper.png fill
resolution 1920x1080
}
```
is identical to
```
output eDP-1 background ~/wallpaper.png fill
output eDP-1 resolution 1920x1080
```
These commands can be executed in your config file, via *swaymsg*(1), or via
the bindsym command.
# COMMAND CONVENTIONS
Commands are split into several arguments using spaces. You can enclose
arguments with quotation marks (*"..."* or *'...'*) to add spaces to a single
argument. You may also run several commands in order by separating each with
*,* or *;*. Criteria is retained across commands separated by *,*, but will be
reset (and allow for new criteria, if desired) for commands separated by a *;*.
Throughout the documentation, *|* is used to distinguish between arguments for
which you may only select one. *[...]* is used for optional arguments, and
*<...>* for arguments where you are expected to supply some value.
# COMMANDS
This section only lists general commands. For input and output commands, refer
to *sway-input*(5) and *sway-output*(5).
The following commands may only be used in the configuration file.
*bar* [<bar-id>] <bar-subcommands...>
For details on bar subcommands, see *sway-bar*(5).
*default_orientation* horizontal|vertical|auto
Sets the default container layout for tiled containers.
*include* <path>
Includes another file from _path_. _path_ can be either a full path or a
path relative to the parent config, and expands shell syntax (see
*wordexp*(3) for details). The same include file can only be included once;
subsequent attempts will be ignored.
*swaybg_command* <command>
Executes custom background _command_. Default is _swaybg_. Refer to
*sway-output*(5) for more information.
It can be disabled by setting the command to a single dash:
_swaybg\_command -_
*swaynag_command* <command>
Executes custom command for _swaynag_. Default is _swaynag_. Additional
arguments may be appended to the end. This should only be used to either
direct sway to call swaynag from a custom path or to provide additional
arguments. This should be placed at the top of the config for the best
results.
It can be disabled by setting the command to a single dash:
_swaynag\_command -_
*workspace_layout* default|stacking|tabbed
Specifies the initial layout for new containers in an empty workspace.
*xwayland* enable|disable|force
Enables or disables Xwayland support, which allows X11 applications to be
used. _enable_ will lazily load Xwayland so Xwayland will not be launched
until the first client attempts to connect. In some cases, such as slower
machines, it may be desirable to have Xwayland started immediately by
using _force_ instead of _enable_.
The following commands cannot be used directly in the configuration file.
They are expected to be used with *bindsym* or at runtime through *swaymsg*(1).
*border* none|normal|csd|pixel [<n>]
Set border style for focused window. _normal_ includes a border of
thickness _n_ and a title bar. _pixel_ is a border without title bar _n_
pixels thick. Default is _normal_ with border thickness 2. _csd_ is short
for client-side-decorations, which allows the client to draw its own
decorations.
*border* toggle
Cycles through the available border styles.
*exit*
Exit sway and end your Wayland session.
*floating* enable|disable|toggle
Make focused view floating, non-floating, or the opposite of what it is now.
<criteria> *focus*
Moves focus to the container that matches the specified criteria.
*focus* up|right|down|left
Moves focus to the next container in the specified direction.
*focus* prev|next [sibling]
Moves focus to the previous or next container in the current layout. By default,
the last active child of the newly focused container will be focused. The _sibling_
option indicates not to immediately focus a child of the container.
*focus* child
Moves focus to the last-focused child of the focused container.
*focus* parent
Moves focus to the parent of the focused container.
*focus* output up|right|down|left
Moves focus to the next output in the specified direction.
*focus* output <name>
Moves focus to the named output.
*focus* tiling
Sets focus to the last focused tiling container.
*focus* floating
Sets focus to the last focused floating container.
*focus* mode_toggle
Moves focus between the floating and tiled layers.
*fullscreen* [enable|disable|toggle] [global]
Makes focused view fullscreen, non-fullscreen, or the opposite of what it
is now. If no argument is given, it does the same as _toggle_. If _global_
is specified, the view will be fullscreen across all outputs.
*gaps* inner|outer|horizontal|vertical|top|right|bottom|left all|current
set|plus|minus|toggle <amount>
Changes the _inner_ or _outer_ gaps for either _all_ workspaces or the
_current_ workspace. _outer_ gaps can be altered per side with _top_,
_right_, _bottom_, and _left_ or per direction with _horizontal_ and
_vertical_.
*inhibit_idle* focus|fullscreen|open|none|visible
Set/unset an idle inhibitor for the view. _focus_ will inhibit idle when
the view is focused by any seat. _fullscreen_ will inhibit idle when the
view is fullscreen (or a descendant of a fullscreen container) and is
visible. _open_ will inhibit idle until the view is closed (or the
inhibitor is unset/changed). _visible_ will inhibit idle when the view is
visible on any output. _none_ will remove any existing idle inhibitor for
the view.
This can also be used with criteria to set an idle inhibitor for any
existing view or with _for_window_ to set idle inhibitors for future views.
*layout* default|splith|splitv|stacking|tabbed
Sets the layout mode of the focused container.
When using the _stacking_ layout, only the focused window in the container is
displayed, with the opened windows' list on the top of the container.
The _tabbed_ layout is similar to _stacking_, but the windows list is vertically
split.
*layout* toggle [split|all]
Cycles the layout mode of the focused container though a preset list of
layouts. If no argument is given, then it cycles through stacking, tabbed
and the last split layout. If _split_ is given, then it cycles through
splith and splitv. If _all_ is given, then it cycles through every layout.
*layout* toggle [split|tabbed|stacking|splitv|splith] [split|tabbed|stacking|splitv|splith]...
Cycles the layout mode of the focused container through a list of layouts.
*max_render_time* off|<msec>
Controls when the relevant application is told to render this window, as a
positive number of milliseconds before the next time sway composites the
output. A smaller number leads to fresher rendered frames being composited
by sway and lower perceived input latency, but if set too low, the
application may not finish rendering before sway composites the output,
leading to delayed frames.
When set to off, the relevant application is told to render this window
immediately after display refresh. How much time is left for rendering
before sway composites the output at that point depends on the output
*max_render_time* setting.
To set this up for optimal latency:
. Set up *output max_render_time* (see *sway-output*(5)).
. Put the target application in _full-screen_ and have it continuously
render something.
. Start by setting *max_render_time 1*. If the application drops
frames, increment by *1*.
This setting only has an effect if a per-output *max_render_time* is in
effect on the output the window is currently on. See *sway-output*(5) for
further details.
*move* left|right|up|down [<px> px]
Moves the focused container in the direction specified. The optional _px_
argument specifies how many pixels to move the container. If unspecified,
the default is 10 pixels. Pixels are ignored when moving tiled containers.
*move* [absolute] position <pos_x> [px|ppt] <pos_y> [px|ppt]
Moves the focused container to the specified position in the workspace.
The position can be specified in pixels or percentage points, omitting
the unit defaults to pixels. If _absolute_ is used, the position is
relative to all outputs. _absolute_ can not be used with percentage points.
*move* [absolute] position center
Moves the focused container to be centered on the workspace. If _absolute_
is used, it is moved to the center of all outputs.
*move* position cursor|mouse|pointer
Moves the focused container to be centered on the cursor.
*move* [container|window] [to] mark <mark>
Moves the focused container to the specified mark.
*move* [--no-auto-back-and-forth] [container|window] [to] workspace [number] <name>
Moves the focused container to the specified workspace. The string _number_
is optional and is used to match a workspace with the same number, even if
it has a different name.
*move* [container|window] [to] workspace prev|next|current
Moves the focused container to the previous, next or current workspace on
this output, or if no workspaces remain, the previous or next output.
*move* [container|window] [to] workspace prev_on_output|next_on_output
Moves the focused container to the previous or next workspace on this
output, wrapping around if already at the first or last workspace.
*move* [container|window] [to] workspace back_and_forth
Moves the focused container to previously focused workspace.
*move* [container|window] [to] output <name-or-id>|current
Moves the focused container to the specified output.
*move* [container|window] [to] output up|right|down|left
Moves the focused container to next output in the specified
direction.
*move* [container|window] [to] scratchpad
Moves the focused container to the scratchpad.
*move* workspace [to] output <name-or-id>|current
Moves the focused workspace to the specified output.
*move* workspace to [output] <name-or-id>|current
Moves the focused workspace to the specified output.
*move* workspace [to] output up|right|down|left
Moves the focused workspace to next output in the specified direction.
*move* workspace to [output] up|right|down|left
Moves the focused workspace to next output in the specified direction.
*nop* <comment>
A no operation command that can be used to override default behaviour. The
optional comment argument is ignored, but logged for debugging purposes.
*reload*
Reloads the sway config file and applies any changes. The config file is
located at path specified by the command line arguments when started,
otherwise according to the priority stated in *sway*(1).
*rename* workspace [<old_name>] to <new_name>
Rename either <old_name> or the focused workspace to the <new_name>
*resize* shrink|grow width|height [<amount> [px|ppt]]
Resizes the currently focused container by _amount_, specified in pixels or
percentage points. If the units are omitted, floating containers are resized
in px and tiled containers by ppt. _amount_ will default to 10 if omitted.
*resize* set height <height> [px|ppt]
Sets the height of the container to _height_, specified in pixels or
percentage points. If the units are omitted, floating containers are
resized in px and tiled containers by ppt. If _height_ is 0, the container
will not be resized.
*resize* set [width] <width> [px|ppt]
Sets the width of the container to _width_, specified in pixels or
percentage points. If the units are omitted, floating containers are
resized in px and tiled containers by ppt. If _width_ is 0, the container
will not be resized.
*resize* set [width] <width> [px|ppt] [height] <height> [px|ppt]
Sets the width and height of the container to _width_ and _height_,
specified in pixels or percentage points. If the units are omitted,
floating containers are resized in px and tiled containers by ppt. If
_width_ or _height_ is 0, the container will not be resized on that axis.
*scratchpad* show
Shows a window from the scratchpad. Repeatedly using this command will
cycle through the windows in the scratchpad.
*shortcuts_inhibitor* enable|disable
Enables or disables the ability of clients to inhibit keyboard
shortcuts for a view. This is primarily useful for virtualization and
remote desktop software. It affects either the currently focused view
or a set of views selected by criteria. Subcommand _disable_
additionally deactivates any active inhibitors for the given view(s).
Criteria are particularly useful with the *for_window* command to
configure a class of views differently from the per-seat defaults
established by the *seat* subcommand of the same name. See
*sway-input*(5) for more ways to affect inhibitors.
*split* vertical|v|horizontal|h|none|n|toggle|t
Splits the current container, vertically or horizontally. When _none_ is
specified, the effect of a previous split is undone if the current
container is the only child of a split parent. When _toggle_ is
specified, the current container is split opposite to the parent
container's layout.
*splith*
Equivalent to *split horizontal*
*splitv*
Equivalent to *split vertical*
*splitt*
Equivalent to *split toggle*
*sticky* enable|disable|toggle
"Sticks" a floating window to the current output so that it shows up on all
workspaces.
*swap* container with id|con_id|mark <arg>
Swaps the position, geometry, and fullscreen status of two containers. The
first container can be selected either by criteria or focus. The second
container can be selected by _id_, _con_id_, or _mark_. _id_ can only be
used with xwayland views. If the first container has focus, it will retain
focus unless it is moved to a different workspace or the second container
becomes fullscreen on the same workspace as the first container. In either
of those cases, the second container will gain focus.
*title_format* <format>
Sets the format of window titles. The following placeholders may be used:
%title - The title supplied by the window ++
%app_id - The wayland app ID (applicable to wayland windows only) ++
%class - The X11 classname (applicable to xwayland windows only) ++
%instance - The X11 instance (applicable to xwayland windows only) ++
%shell - The protocol the window is using (typically xwayland or
xdg_shell)
This command is typically used with *for_window* criteria. For example:
for_window [title="."] title_format "<b>%title</b> (%app_id)"
Note that markup requires pango to be enabled via the *font* command.
The default format is "%title".
The following commands may be used either in the configuration file or at
runtime.
*assign* <criteria> [→] [workspace] [number] <workspace>
Assigns views matching _criteria_ (see *CRITERIA* for details) to
_workspace_. The → (U+2192) is optional and cosmetic. This command is
equivalent to:
for_window <criteria> move container to workspace <workspace>
*assign* <criteria> [→] output left|right|up|down|<name>
Assigns views matching _criteria_ (see *CRITERIA* for details) to the
specified output. The → (U+2192) is optional and cosmetic. This command is
equivalent to:
for_window <criteria> move container to output <output>
*bindsym* [--whole-window] [--border] [--exclude-titlebar] [--release] [--locked] \
[--to-code] [--input-device=<device>] [--no-warn] [--no-repeat] [Group<1-4>+]<key combo> \
<command>
Binds _key combo_ to execute the sway command _command_ when pressed. You
may use XKB key names here (*wev*(1) is a good tool for discovering these).
With the flag _--release_, the command is executed when the key combo is
released. If _input-device_ is given, the binding will only be executed for
that input device and will be executed instead of any binding that is
generic to all devices. If a group number is given, then the binding will
only be available for that group. By default, if you overwrite a binding,
swaynag will give you a warning. To silence this, use the _--no-warn_ flag.
Unless the flag _--locked_ is set, the command will not be run when a
screen locking program is active. If there is a matching binding with
and without _--locked_, the one with will be preferred when locked and the
one without will be preferred when unlocked. If there are matching bindings
and one has both _--input-device_ and _--locked_ and the other has neither,
the former will be preferred even when unlocked.
Unless the flag _--inhibited_ is set, the command will not be run when
a keyboard shortcuts inhibitor is active for the currently focused
window. Such inhibitors are usually requested by remote desktop and
virtualization software to enable the user to send keyboard shortcuts
to the remote or virtual session. The _--inhibited_ flag allows one to
define bindings which will be exempt from pass-through to such
software. The same preference logic as for _--locked_ applies.
Unless the flag _--no-repeat_ is set, the command will be run
repeatedly when the key is held, according to the repeat
settings specified in the input configuration.
Bindings to keysyms are layout-dependent. This can be changed with the
_--to-code_ flag. In this case, the keysyms will be translated into the
corresponding keycodes in the first configured layout.
Mouse bindings operate on the container under the cursor instead of the
container that has focus. Mouse buttons can either be specified in the form
_button[1-9]_ or by using the name of the event code (ex _BTN\_LEFT_ or
_BTN\_RIGHT_). For the former option, the buttons will be mapped to their
values in X11 (1=left, 2=middle, 3=right, 4=scroll up, 5=scroll down,
6=scroll left, 7=scroll right, 8=back, 9=forward). For the latter option,
you can find the event names using _libinput debug-events_.
The priority for matching bindings is as follows: input device, group,
and locked state.
_--whole-window_, _--border_, and _--exclude-titlebar_ are mouse-only options
which affect the region in which the mouse bindings can be triggered. By
default, mouse bindings are only triggered when over the title bar. With the
_--border_ option, the border of the window will be included in this region.
With the _--whole-window_ option, the cursor can be anywhere over a window
including the title, border, and content. _--exclude-titlebar_ can be used in
conjunction with any other option to specify that the titlebar should be
excluded from the region of consideration.
If _--whole-window_ is given, the command can be triggered when the cursor
is over an empty workspace. Using a mouse binding over a layer surface's
exclusive region is not currently possible.
Example:
```
# Execute firefox when alt, shift, and f are pressed together
bindsym Mod1+Shift+f exec firefox
```
*bindcode* [--whole-window] [--border] [--exclude-titlebar] [--release] \
[--locked] [--input-device=<device>] [--no-warn] [Group<1-4>+]<code> <command>
is also available for binding with key/button codes instead of key/button names.
*bindswitch* [--locked] [--no-warn] [--reload] <switch>:<state> <command>
Binds <switch> to execute the sway command _command_ on state changes.
Supported switches are _lid_ (laptop lid) and _tablet_ (tablet mode)
switches. Valid values for _state_ are _on_, _off_ and _toggle_. These
switches are on when the device lid is shut and when tablet mode is active
respectively. _toggle_ is also supported to run a command both when the
switch is toggled on or off.
Unless the flag _--locked_ is set, the command will not be run when a
screen locking program is active. If there is a matching binding with
and without _--locked_, the one with will be preferred when locked and the
one without will be preferred when unlocked.
If the _--reload_ flag is given, the binding will also be executed when
the config is reloaded. _toggle_ bindings will not be executed on reload.
The _--locked_ flag will operate as normal so if the config is reloaded
while locked and _--locked_ is not given, the binding will not be executed.
By default, if you overwrite a binding, swaynag will give you a warning. To
silence this, use the _--no-warn_ flag.
Example:
```
# Show the virtual keyboard when tablet mode is entered.
bindswitch tablet:on busctl call --user sm.puri.OSK0 /sm/puri/OSK0 sm.puri.OSK0 SetVisible b true
# Log a message when the laptop lid is opened or closed.
bindswitch lid:toggle exec echo "Lid moved"
```
*bindgesture* [--exact] [--input-device=<device>] [--no-warn] \
<gesture>[:<fingers>][:directions] <command>
Binds _gesture_ to execute the sway command _command_ when detected.
Currently supports the _hold_, _pinch_ or _swipe_ gesture. Optionally
can be limited to bind to a certain number of _fingers_ or, for a
_pinch_ or _swipe_ gesture, to certain _directions_.
[[ *type*
:[ *fingers*
:< *direction*
| hold
:- 1 - 5
: none
| swipe
: 3 - 5
: up, down, left, right
| pinch
: 2 - 5
: all above + inward, outward, clockwise, counterclockwise
The _fingers_ can be limited to any sensible number or left empty to accept
any finger counts.
Valid directions are _up_, _down_, _left_ and _right_, as well as _inward_,
_outward_, _clockwise_, _counterclockwise_ for the _pinch_ gesture.
Multiple directions can be combined by a plus.
If a _input-device_ is given, the binding will only be executed for
that input device and will be executed instead of any binding that is
generic to all devices. By default, if you overwrite a binding,
swaynag will give you a warning. To silence this, use the _--no-warn_ flag.
The _--exact_ flag can be used to ensure a binding only matches when exactly
all specified directions are matched and nothing more. If there is matching
binding with _--exact_, it will be preferred.
The priority for matching bindings is as follows: input device, then
exact matches followed by matches with the highest number of matching
directions.
Gestures executed while the pointer is above a bar are not handled by sway.
See the respective documentation, e.g. *bindgesture* in *sway-bar*(5).
Example:
```
# Allow switching between workspaces with left and right swipes
bindgesture swipe:right workspace prev
bindgesture swipe:left workspace next
# Allow container movements by pinching them
bindgesture pinch:inward+up move up
bindgesture pinch:inward+down move down
bindgesture pinch:inward+left move left
bindgesture pinch:inward+right move right
```
*client.background* <color>
This command is ignored and is only present for i3 compatibility.
*client.<class>* <border> <background> <text> [<indicator> [<child_border>]]
Configures the color of window borders and title bars. The first three
colors are required. When omitted _indicator_ will use a sane default and
_child_border_ will use the color set for _background_. Colors may be
specified in hex, either as _#RRGGBB_ or _#RRGGBBAA_.
The available classes are:
*client.focused*
The window that has focus.
*client.focused_inactive*
The most recently focused view within a container which is not focused.
*client.focused_tab_title*
A view that has focused descendant container.
Tab or stack container title that is the parent of the focused container
but is not directly focused. Defaults to focused_inactive if not
specified and does not use the indicator and child_border colors.
*client.placeholder*
Ignored (present for i3 compatibility).
*client.unfocused*
A view that does not have focus.
*client.urgent*
A view with an urgency hint. *Note*: Native Wayland windows do not
support urgency. Urgency only works for Xwayland windows.
The meaning of each color is:
_border_
The border around the title bar.
_background_
The background of the title bar.
_text_
The text color of the title bar.
_indicator_
The color used to indicate where a new view will open. In a tiled
container, this would paint the right border of the current view if a
new view would be opened to the right.
_child_border_
The border around the view itself.
The default colors are:
[- *class*
:[ _border_
:[ _background_
:[ _text_
:[ _indicator_
:[ _child_border_
|[ *background*
: n/a
: #ffffff
: n/a
: n/a
: n/a
| *focused*
: #4c7899
: #285577
: #ffffff
: #2e9ef4
: #285577
| *focused_inactive*
: #333333
: #5f676a
: #ffffff
: #484e50
: #5f676a
| *focused_tab_title*
: #333333
: #5f676a
: #ffffff
: n/a
: n/a
| *unfocused*
: #333333
: #222222
: #888888
: #292d2e
: #222222
| *urgent*
: #2f343a
: #900000
: #ffffff
: #900000
: #900000
| *placeholder*
: #000000
: #0c0c0c
: #ffffff
: #000000
: #0c0c0c
*corner_radius* <radius>
Set corner radius for new windows.
*dim_inactive* <value>
Adjusts the dimming of inactive windows between 0.0 (no dimming) and 1.0
(fully dimmed) while 0.0 is the default value.
*dim_inactive_colors.unfocused* <hex color>
The color to dim inactive windows with. Example color: #000000FF
*dim_inactive_colors.urgent* <hex color>
The color to dim inactive urgent windows with. Example color: #900000FF
*default_border* normal|none|pixel [<n>]
Set default border style for new tiled windows.
*default_floating_border* normal|none|pixel [<n>]
Set default border style for new floating windows. This only applies to
windows that are spawned in floating mode, not windows that become floating
afterwards.
*exec* <shell command>
Executes _shell command_ with sh.
*exec_always* <shell command>
Like *exec*, but the shell command will be executed _again_ after *reload*.
*floating_maximum_size* <width> x <height>
Specifies the maximum size of floating windows. -1 x -1 removes the upper
limit. The default is 0 x 0, which will use the width and height of the
entire output layout as the maximums
*floating_minimum_size* <width> x <height>
Specifies the minimum size of floating windows. The default is 75 x 50.
*floating_modifier* <modifier> [normal|inverse]
When the _modifier_ key is held down, you may hold left click to move
windows, and right click to resize them. Setting _modifier_ to _none_
disables this feature. If _inverse_ is specified, left click is used for
resizing and right click for moving.
*focus_follows_mouse* yes|no|always
If set to _yes_, moving your mouse over a window will focus that window. If
set to _always_, the window under the cursor will always be focused, even
after switching between workspaces.
*focus_on_window_activation* smart|urgent|focus|none
This option determines what to do when a client requests window activation.
If set to _urgent_, the urgent state will be set for that window. If set to
_focus_, the window will become focused. If set to _smart_, the window will
become focused only if it is already visible, otherwise the urgent state
will be set. Default is _urgent_.
*focus_wrapping* yes|no|force|workspace
This option determines what to do when attempting to focus over the edge
of a container. If set to _no_, the focused container will retain focus,
if there are no other containers in the direction. If set to _yes_, focus
will be wrapped to the opposite edge of the container, if there are no
other containers in the direction. If set to _force_, focus will be wrapped
to the opposite edge of the container, even if there are other containers
in the direction. If set to _workspace_, focus will wrap like in the _yes_
case and additionally wrap when moving outside of workspaces boundaries.
Default is _yes_.
*font* [pango:]<font>
Sets font to use for the title bars. To enable support for pango markup,
preface the font name with _pango:_. For example, _monospace 10_ is the
default font. To enable support for pango markup, _pango:monospace 10_
should be used instead. Regardless of whether pango markup is enabled,
_font_ should be specified as a pango font description. For more
information on pango font descriptions, see
https://docs.gtk.org/Pango/type_func.FontDescription.from_string.html#description
*force_display_urgency_hint* <timeout> [ms]
If an application on another workspace sets an urgency hint, switching to this
workspace may lead to immediate focus of the application, which also means the
window decoration color would be immediately reset to *client.focused*. This
may make it unnecessarily hard to tell which window originally raised the
event. This option allows one to set a _timeout_ in ms to delay the urgency hint reset.
*titlebar_border_thickness* <thickness>
Thickness of the titlebar border in pixels
*titlebar_padding* <horizontal> [<vertical>]
Padding of the text in the titlebar. _horizontal_ value affects horizontal
padding of the text while _vertical_ value affects vertical padding (space
above and below text). Padding includes titlebar borders so their value
should be greater than titlebar_border_thickness. If _vertical_ value is
not specified it is set to the _horizontal_ value. If _corner_radius_ is set
to be greater than the _horizontal_ or _vertical_ value, the value will be
treated as that of _corner_radius_.
*for_window* <criteria> <command>
Whenever a window that matches _criteria_ appears, run list of commands.
See *CRITERIA* for more details.
*gaps* inner|outer|horizontal|vertical|top|right|bottom|left <amount>
Sets default _amount_ pixels of _inner_ or _outer_ gap, where the inner
affects spacing around each view and outer affects the spacing around each
workspace. Outer gaps are in addition to inner gaps. To reduce or remove
outer gaps, outer gaps can be set to a negative value. _outer_ gaps can
also be specified per side with _top_, _right_, _bottom_, and _left_ or
per direction with _horizontal_ and _vertical_.
This affects new workspaces only, and is used when the workspace doesn't
have its own gaps settings (see: workspace <ws> gaps ...).
*hide_edge_borders* [--i3] none|vertical|horizontal|both|smart|smart_no_gaps
Hides window borders adjacent to the screen edges. Default is _none_. The
_--i3_ option enables i3-compatible behavior to hide the title bar on
tabbed and stacked containers with one child. The _smart_|_smart_no_gaps_
options are equivalent to setting _smart_borders_ smart|no_gaps and
_hide_edge_borders_ none.
*input* <input_device> <input-subcommands...>
For details on input subcommands, see *sway-input*(5).
\* may be used in lieu of a specific device name to configure all input
devices. A list of input device names may be obtained via *swaymsg -t
get_inputs*.
*seat* <seat> <seat-subcommands...>
For details on seat subcommands, see *sway-input*(5).
*kill*
Kills (closes) the currently focused container and all of its children.
*smart_borders* on|no_gaps|off
If smart_borders are _on_, borders will only be enabled if the workspace
has more than one visible child. If smart_borders is set to _no_gaps_,
borders will only be enabled if the workspace has more than one visible
child and gaps equal to zero.
*smart_gaps* on|off|toggle|inverse_outer
If smart_gaps are _on_ gaps will only be enabled if a workspace has more
than one child. If smart_gaps are _inverse_outer_ outer gaps will only
be enabled if a workspace has exactly one child.
*mark* --add|--replace [--toggle] <identifier>
Marks are arbitrary labels that can be used to identify certain windows and
then jump to them at a later time. Each _identifier_ can only be set on a
single window at a time since they act as a unique identifier. By default,
*mark* sets _identifier_ as the only mark on a window. _--add_ will instead
add _identifier_ to the list of current marks for that window. If _--toggle_
is specified mark will remove _identifier_ if it is already marked.
*mode* <mode>
Switches to the specified mode. The default mode is _default_.
*mode* [--pango_markup] <mode> <mode-subcommands...>
The only valid _mode-subcommands..._ are *bindsym*, *bindcode*,
*bindswitch*, and *set*. If _--pango_markup_ is given, then _mode_ will be
interpreted as pango markup.
*mouse_warping* output|container|none
If _output_ is specified, the mouse will be moved to new outputs as you
move focus between them. If _container_ is specified, the mouse will be
moved to the middle of the container on switch. Default is _output_.
*no_focus* <criteria>
Prevents windows matching <criteria> from being focused automatically when
they're created. This has no effect on the first window in a workspace.
*output* <output_name> <output-subcommands...>
For details on output subcommands, see *sway-output*(5).
\* may be used in lieu of a specific output name to configure all outputs.
A list of output names may be obtained via *swaymsg -t get_outputs*.
*popup_during_fullscreen* smart|ignore|leave_fullscreen
Determines what to do when a fullscreen view opens a dialog.
If _smart_ (the default), the dialog will be displayed. If _ignore_, the
dialog will not be rendered. If _leave_fullscreen_, the view will exit
fullscreen mode and the dialog will be rendered.
*set* $<name> <value>
Sets variable $_name_ to _value_. You can use the new variable in the
arguments of future commands. When the variable is used, it can be escaped
with an additional $ (ie $$_name_) to have the replacement happen at run
time instead of when reading the config. However, it does not always make
sense for the variable to be replaced at run time since some arguments do
need to be known at config time.
*show_marks* yes|no
If *show_marks* is yes, marks will be displayed in the window borders.
Any mark that starts with an underscore will not be drawn even if
*show_marks* is yes. The default is _yes_.
*opacity* [set|plus|minus] <value>
Adjusts the opacity of the window between 0 (completely transparent) and
1 (completely opaque). If the operation is omitted, _set_ will be used.
*saturation* [set|plus|minus] <value>
Adjusts the saturation (Digital Vibrance) of the window between 0 (black and
white) and 2 (over saturated which is suited for some FPS games) while 1 is
the default saturation. If the operation is omitted, _set_ will be used.
*tiling_drag* enable|disable|toggle
Sets whether or not tiling containers can be dragged with the mouse. If
_enabled_ (default), the _floating_mod_ can be used to drag tiling, as well
as floating, containers. Using the left mouse button on title bars without
the _floating_mod_ will also allow the container to be dragged. _toggle_
should not be used in the config file.
*tiling_drag_threshold* <threshold>
Sets the threshold that must be exceeded for a container to be dragged by
its titlebar. This has no effect if _floating_mod_ is used or if
_tiling_drag_ is set to _disable_. Once the threshold has been exceeded
once, the drag starts and the cursor can come back inside the threshold
without stopping the drag. _threshold_ is multiplied by the scale of the
output that the cursor on. The default is 9.
*title_align* left|center|right
Sets the title alignment. If _right_ is selected and _show_marks_ is set
to _yes_, the marks will be shown on the _left_ side instead of the
_right_ side.
*unbindswitch* <switch>:<state>
Removes a binding for when <switch> changes to <state>.
*unbindgesture* [--exact] [--input-device=<device>] \
<gesture>[:<fingers>][:directions]
Removes a binding for the specified _gesture_, _fingers_
and _directions_ combination.
*unbindsym* [--whole-window] [--border] [--exclude-titlebar] [--release] [--locked] \
[--to-code] [--input-device=<device>] <key combo>
Removes the binding for _key combo_ that was previously bound with the
given flags. If _input-device_ is given, only the binding for that
input device will be unbound.
*unbindcode* [--whole-window] [--border] [--exclude-titlebar] [--release] \
[--locked] [--input-device=<device>] <code>
is also available for unbinding with key/button codes instead of key/button names.
*unmark* [<identifier>]
*unmark* will remove _identifier_ from the list of current marks on a
window. If _identifier_ is omitted, all marks are removed.
*urgent* enable|disable|allow|deny
Using _enable_ or _disable_ manually sets or unsets the window's urgent
state. Using _allow_ or _deny_ controls the window's ability to set itself
as urgent. By default, windows are allowed to set their own urgency.
*workspace* [--no-auto-back-and-forth] [number] <[num:]name>
Switches to the specified workspace. The _num:_ portion of the name is
optional and will be used for ordering. If _num:_ is not given and
_name_ is a number, then it will be also be used for ordering.
If the _no-auto-back-and-forth_ option is given, then this command will
not perform a back-and-forth operation when the workspace is already
focused and _workspace_auto_back_and_forth_ is enabled.
If the _number_ keyword is specified and a workspace with the number
already exists, then the workspace with the number will be used. If a
workspace with the number does not exist, a new workspace will be created
with the name _name_.
*workspace* prev|next
Switches to the next workspace on the current output or on the next output
if currently on the last workspace.
*workspace* prev_on_output|next_on_output
Switches to the next workspace on the current output.
*workspace* back_and_forth
Switches to the previously focused workspace.
*workspace* <name> gaps inner|outer|horizontal|vertical|top|right|bottom|left
<amount>
Specifies that workspace _name_ should have the given gaps settings when it
is created.
This command does not affect existing workspaces. To alter the gaps of an
existing workspace, use the _gaps_ command.
*workspace* <name> output <outputs...>
Specifies that workspace _name_ should be shown on the specified _outputs_.
Multiple outputs can be listed and the first available will be used. If the
workspace gets placed on an output further down the list and an output that
is higher on the list becomes available, the workspace will be moved to the
higher priority output.
This command does not affect existing workspaces. To move an existing
workspace, use the _move_ command in combination with the _workspace_
criteria (non-empty workspaces only) or _workspace_ command (to switch
to the workspace before moving).
*workspace_auto_back_and_forth* yes|no
When _yes_, repeating a workspace switch command will switch back to the
prior workspace. For example, if you are currently on workspace 1,
switch to workspace 2, then invoke the *workspace 2* command again, you
will be returned to workspace 1. Default is _no_.
# CRITERIA
A criteria is a string in the form of, for example:
```
[class="[Rr]egex.*" title="some title"]
```
The string contains one or more (space separated) attribute/value pairs. They
are used by some commands to choose which views to execute actions on. All
attributes must match for the criteria to match. Criteria is retained across
commands separated by a *,*, but will be reset (and allow for new criteria, if
desired) for commands separated by a *;*.
Criteria may be used with either the *for_window* or *assign* commands to
specify operations to perform on new views. A criteria may also be used to
perform specific commands (ones that normally act upon one window) on all views
that match that criteria. For example:
Focus on a window with the mark "IRC":
```
[con_mark="IRC"] focus
```
Kill all windows with the title "Emacs":
```
[class="Emacs"] kill
```
You may like to use swaymsg -t get_tree for finding the values of these
properties in practice for your applications.
The following attributes may be matched with:
*app_id*
Compare value against the app id. Can be a regular expression. If value is
\_\_focused\_\_, then the app id must be the same as that of the currently
focused window. _app_id_ are specific to Wayland applications.
*class*
Compare value against the window class. Can be a regular expression. If
value is \_\_focused\_\_, then the window class must be the same as that of
the currently focused window. _class_ are specific to X11 applications and
require XWayland.
*con_id*
Compare against the internal container ID, which you can find via IPC. If
value is \_\_focused\_\_, then the id must be the same as that of the
currently focused window.
*con_mark*
Compare against the window marks. Can be a regular expression.
*floating*
Matches floating windows.
*id*
Compare value against the X11 window ID. Must be numeric. id is specific to
X11 applications and requires XWayland.
*instance*
Compare value against the window instance. Can be a regular expression. If
value is \_\_focused\_\_, then the window instance must be the same as that
of the currently focused window. instance is specific to X11 applications and
requires XWayland.
*pid*
Compare value against the window's process ID. Must be numeric.
*shell*
Compare value against the window shell, such as "xdg_shell" or "xwayland".
Can be a regular expression. If value is \_\_focused\_\_, then the shell
must be the same as that of the currently focused window.
*tiling*
Matches tiling windows.
*title*
Compare against the window title. Can be a regular expression. If value is
\_\_focused\_\_, then the window title must be the same as that of the
currently focused window.
*urgent*
Compares the urgent state of the window. Can be _first_, _last_, _latest_,
_newest_, _oldest_ or _recent_.
*window_role*
Compare against the window role (WM_WINDOW_ROLE). Can be a regular
expression. If value is \_\_focused\_\_, then the window role must be the
same as that of the currently focused window. window_role is specific to X11
applications and requires XWayland.
*window_type*
Compare against the window type (\_NET_WM_WINDOW_TYPE). Possible values
are normal, dialog, utility, toolbar, splash, menu, dropdown_menu,
popup_menu, tooltip and notification. window_type is specific to X11
applications and requires XWayland.
*workspace*
Compare against the workspace name for this view. Can be a regular
expression. If the value is \_\_focused\_\_, then all the views on the
currently focused workspace matches.
# SEE ALSO
*sway*(1) *sway-input*(5) *sway-output*(5) *sway-bar*(5) *sway-ipc*(7)