[WIKI] Wayland, Display Servers and SwayWM


Installation Advice

Installing on a VM is not recommenced in this case due to no VM offering a true representation of wayland. If required using a QEMU based solution yields better results than VirtualBox. VirtManger or GNOME Boxes are two options

If you experience problems with your hardware - including your cursor or display – you may gain a better experience using the zen kernel. It offered as a option in the installation but can also be easily installed after.

NVIDA Users

All proprietary graphics drivers are unsupported. This includes the Nvidia proprietary driver. The open source Nouveau driver is required instead. This is not going to change, don’t ask. Tip: buy your hardware with open source support in mind.

Other than that installation is the same. Community editions require an active internet connection to install

What is a Display Server

A display server or window server is a program tasked with co-coordinating the input and output of it’s clients. Any application that runs and presents its GUI in a window, is a client of the display server. A display server sits between a kernel and the client. A kernel receives information from a input device - a keyboard or mouse - and it is the display server’s job to transmit that to the correct window. If you think it in more detail - the X.org server communitcates with it’s client’s over the X11 communication protocol. They are different thing’s. When people refer to X11 or X or the X window system what they are referring to is the communication protocol. The display server can change. The X.Org implementation is the canonical implementation of X. Notable examples of display servers implementing the X11 display server protocol are X.Org Server, XFree86, XQuartz and Cygwin/X.

What Is Wayland

Wayland is a new display server communication protocol - it is a replacement for X but it is not the actual display server. In Wayland the compositor is the display server. Sway is the display server and Wayland is the communication protocol.

It’s not an X server and not a fork. It’s a protocol between a compositor and its clients.

Wayland is a communication server that controls the communication between a display server and it’s clients (the window’s, applications open). The display server’s are the compositor’s that use the protocol which additionally acts the part as the window manager.

A display server using the Wayland protocol is known as a Wayland Compositor but also performs the task as a window manager

In X lot’s of people may use a window manager then add a compositor on top. But the Wayland architecture integrates the display server, window manager and compositor into one process. Making it easier to develop and maintain . A compositing window manager gives each application its own little bit of memory buffer, and then it composites all these buffers into an image into the display memory. It’s more stable because an X window manager can crash when a single application misbehaves. A compositing window manager keeps on working.

A buffer is a area of physical memory where data is temporarily stored while it being moved. Compositing window manager’s are double buffered - being more than one buffer is used to store information. This why using a compositor reduces screen flickering even in X because you’ll see a full version of the data rather than just a partial update.

The Wayland protocol lets the compositor send the input events directly to the clients and lets the client send the damage event directly to the compositor.

The X server acts as a middleman that introduces an extra step between applications and the compositor and an extra step between the compositor and the hardware. There are other security benefits too. In X it is not possible to have GUI isolation.

Wayland is extremely interesting and it will replace X in the near future. But to tell all about would take up a long time. If are interested the official Wayland documentation is extremely good.

What compositing window’s manager exist now?

  • Sway - Sway is a tiling window manager and Wayland compositor, inspired by i3, and written in C. Sway is designed as a drop-in replacement for i3 using the more modern Wayland display server protocol and wlroots compositor library.

  • River - River is a dynamic tiling wayland compositor that takes inspiration from dwm and bspwm

  • Wayfire - Wayfire is a wayland compositor based on wlroots. It aims to create a customizable, extendable and lightweight environment without sacrificing its appearance.

  • In term’s of full desktop environment’s only Mutter (GNOME), Kwin (Plasma) and Enlightenment have Wayland support as of now.

Will my applications run wayland?

  • GTK3/4 and Qt5 will run Wayland native automatically or forcefully.

  • GTK2 and Qt4 applications cannot - but seeing as both are EOL or close too there should be no reason you should be using them.

  • Firefox will run Wayland through a environment variable

  • Electron apps do not currently support Wayland but Electron 12 was recently supported with support so it will come in the near future.

  • Other apps either will or have alternatives

Is Wayland Better and What’s Wrong With X?

Let’s see what the developer says.

The problem with X is that… it’s X. When you’re an X server there’s a tremendous amount of functionality that you must support to claim to speak the X protocol, yet nobody will ever use this. For example, core fonts; this is the original font model that was how your got text on the screen for the many first years of X11. This includes code tables, glyph rasterization and caching, XLFDs (seriously, XLFDs!). Also, the entire core rendering API that lets you draw stippled lines, polygons, wide arcs and many more state-of-the-1980s style graphics primitives. For many things we’ve been able to keep the X.org server modern by adding extensions such as XRandR, XRender and COMPOSITE and to some extent phase out less useful extensions. But we can’t ever get rid of the core rendering API and much other complexity that is rarely used in a modern desktop. With Wayland we can move the X server and all its legacy technology to an optional code path.

So yes.

Sway Window Manager

Sway is a tiling window manager and Wayland compositor, inspired by i3, and written in C. Sway is designed as a drop-in replacement for i3 using the more modern Wayland display server protocol and wlroots compositor library.

Sway is not a fork of i3. It has been written from scratch. Don’t make the devs angry. The best way to understand sway is through it’s man pages.

Installing EndeavourOS Sway for later installs if a other DE/WM has already been installed.

To Install Manually

git clone https://github.com/EndeavourOS-Community-Editions/sway.git

cd sway

bash sway-install.sh

Tutorial for Sway-WM Settings:

Background handled by swaybg
Gtk3 theme handled by lxappearance
Filebrowser = Thunar
Default Terminal-Emulator = XFCE4-Terminal and/or Termite
Text-Editor = xed/nano
Bar = Waybar
Sound = Pulseaudio

Main Keybinding’s

MOD KEY = Window Key

[mod]+Return = open floating terminal (XFCE4-Terminal)
[mod]+(Shift)+Return = open fixed terminal (Termite)
[mod]+o = open Browser (firefox)
[mod]+n = open File Manager (thunar)
[mod]+d = app menu (wofi)
[mod]+q = close focused app [kill]
(Shift)+(Print-Key) = screenshot/bring up screenshot menu
[mod]+(Shift)+e = power-menu
[mod]+r = resize mode
[mod]+(Shift)+(Space) = float window
    {HOLD DOWN} [mod] = drag floating window
[mod]+(Arrow Keys) = switch focus respectively
[mod]+(Shift)+(Minus) = send to scratchpad
[mod]+(Minus) = cycle through scratchpad

User Guide

Summary

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-subcommands…>

For details on bar subcommands, see sway-bar(5).

default_orientation horizontal|vertical|auto

Sets the default container layout for tiled containers.

include

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

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

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 workspaces.

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 []

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.

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

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

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.

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|

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:

1.Set up output max_render_time (see sway-output(5)).

2.Put the target application in full-screen and have it continuously render something.

3.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]

Moves the focused container in the direction specified. If the container, 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] <pos_y> [px]

Moves the focused container to the specified position in the workspace. If absolute is used, the position is relative to all outputs.

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

Moves the focused container to the specified mark.

move [–no-auto-back-and-forth] [container|window] [to] workspace [number]

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 |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 |current

Moves the focused workspace to the specified output.

move workspace to [output] |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

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 [ [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 [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] [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] [px|ppt] [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|toggle|t

Splits the current container, vertically or horizontally. 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

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

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 “%title (%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 [→] [workspace] [number]

Assigns views matching criteria (see CRITERIA for details) to workspace. The → (U+2192) is optional and cosmetic. This command is equivalent to:

for_window move container to workspace

assign [→] output left|right|up|down|

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 move container to output

bindsym [–whole-window] [–border] [–exclude-titlebar] [–release] [–locked] [–to-code] [–input-device=] [–no-warn] [–no-repeat] [Group<1-4>+]

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 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=] [–no-warn] [Group<1-4>+] [code] [command]

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"

client.background

This command is ignored and is only present for i3 compatibility.

client. [ [<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.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
unfocused #333333 #222222 #888888 #292d2e #222222
urgent #2f343a #900000 #ffffff #900000 #900000
placeholder #000000 #0c0c0c #ffffff #000000 #0c0c0c

default_border normal|none|pixel []

Set default border style for new tiled windows.

default_floating_border normal|none|pixel []

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

Executes shell command with sh.

exec_always

Like exec, but the shell command will be executed again after reload.

floating_maximum_size x

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 x

Specifies the minimum size of floating windows. The default is 75 x 50.

floating_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 an xwayland 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:]

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://developer.gnome.org/pango/stable/pango-Fonts.html#pango-font-description-from-string

titlebar_border_thickness

Thickness of the titlebar border in pixels

titlebar_padding []

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.

for_window

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

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 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-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

If smart_gaps are on gaps will only be enabled if a workspace has more than one child.

mark --add|–replace [–toggle]

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

Switches to the specified mode. The default mode is default.

mode [–pango_markup] <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

Prevents windows matching 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 $

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]

Adjusts the opacity of the window between 0 (completely transparent) and 1 (completely opaque). 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

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 :

Removes a binding for when changes to .

unbindsym [–whole-window] [–border] [–exclude-titlebar] [–release] [–locked] [–to-code] [–input-device=]

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=] [code] is also available for unbinding with key/button codes instead of key/button names.

unmark []

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 gaps inner|outer|horizontal|vertical|top|right|bottom|left

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 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.

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.

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.

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_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.

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.

Important Notes

Output Configuration

f you look in ~/.config/sway/config.d/output you’ll see a example config. The steps consists of.

  1. Run swaymsg -t get_outputs to get you output’s.

example output

Output eDP-1 'Unknown 0x057D 0x00000000' (focused)
  Current mode: 1920x1080 @ 60.009998 Hz
  Position: 0,0
  Scale factor: 1.000000
  Scale filter: nearest
  Subpixel hinting: unknown
  Transform: normal
  Workspace: 1
  Max render time: off
  Adaptive sync: disabled
  Available modes:
    1920x1080 @ 60.009998 Hz
  1. Change resolution and refresh rate would be something like this in the actual config file.

output HDMI-A-1 resolution 1920x1080@60Hz

  1. For scaling

output HDMI1-A-1 scale 2

You put all them in one line too like…

output HDMI-A-1 resolution 1920x1080@60Hz scale 2

Click the link in the title for more options.

Input Configuration

Similar. To obtain a list of available device identifiers, run swaymsg -t get_inputs. Settings can also be applied to all input devices by using the wildcard *

If the configuration settings do not appear to be taking effect, you could try using * instead of . If it works with the wildcard, try using a different identifier from swaymsg -t get_inputs until you find the correct input device.

An example config file will look like this. Look in ~/.config/sway/config.d/input

input type:touchpad {
      dwt enabled
      tap enabled
      natural_scroll enabled
}

Click the link in the title for more options.

Switching Keyboard Layout’s

Sway is very close to having first-class support for switching Input Methods (see Sway#4740, Sway#5890, and Sway#4932). For now, here is a setup that works through dbus allowing us to change Method in all Wayland and XWayland windows except Alacritty.

First, install these packages:

sudo pacman -S fcitx5 fcitx5-configtool \ fcitx5-gtk fcitx5-mozc fcitx5-qt

Then add the following to /etc/environment:

GTK_IM_MODULE=fcitx QT_IM_MODULE=fcitx XMODIFIERS=@im=fcitx

And this to your Sway config:

exec_always fcitx5 -d --replace

Now restart your computer.

Hopefully you now see a keyboard icon in your Waybar tray. To configure fcitx5, open fcitx5-configtool

Other Useful Links

13 Likes

Excellent work! When I have more time tomorrow I can go through this for you and correct anything grammatically incorrect for you if you would like.

1 Like

Mainly just the bit I wrote at the top! Everything after Sway User Guide comes from the man pages.

I did put it through Grammaly don’t worry!

Thank You!

1 Like

beautiful guide
good work

1 Like

when I get one more laptop I will 100%
try sway. is look very nice

1 Like

If you install Sway manually is it best to use i3 as the base or xfce?

1 Like

As always try to make a new user. But neither should cause too much of a problem. The only thing you need to careful of is theming.

What is kind of cool - but could be a problem - is that sway can respond to i3msg. You can also issue commands with i3-msg or even with i3. Which could make them conflict. To overcome this you can manually set the socket. If the the problem occurs leave it alone if it doesn’t

BASICALLY MAKE SURE YOU KILL I3 BEFORE RUNNING SWAY. DON’T BOTH OVER TWO TTY’S

If it occurs

Sway socket not detected

Using a swaymsg argument, such as swaymsg -t get_outputs, will sometimes return the message:

sway socket not detected. ERROR: Unable to connect to

when run inside a terminal multiplexer (such as gnu screen or tmux). This means swaymsg could not connect to the socket provided in your SWAYSOCK.

To view what the current value of SWAYSOCK is, type:

$ env | fgrep SWAYSOCK SWAYSOCK=/run/user/1000/sway-ipc.1000.4981.sock

To work around this problem, you may try attaching to a socket based on the running sway process:

$ export SWAYSOCK=/run/user/$(id -u)/sway-ipc.$(id -u).$(pgrep -x sway).sock

To avoid this error, run the command outside of a multiplexer.

Unable to retrieve socket path

Requesting messages from swaymsg -t on a tty may return the following message:

Unable to retrieve socket path

SWAYSOCK environment variable is set after launching Sway, therefore a workaround to this error is to request swaymsg -t [message] in a terminal inside Sway.

@OdiousImp if you’re ready with this article, you can put it on Discovery.

1 Like

One more day for spell-checking and see if I can improve it!

Then I shall be ready!

Thank You!

@Bryanpwo sorry! School started again. Can I finalise it on Saturday? It’ll be done by then

1 Like