current user environment:


"""
```

User Environment:
- OS: FreeBSD
- Version: 14.2
- ZFS Pool Name: zroot
- Available Disk Space:
  - Total Size: 13G
  - Allocated: 5.52G
  - Free: 7.48G
- Fragmentation: 12%
- Compression Ratio: 1.87x
- Installed Packages:
  - sway: 1.10.1
  - swaybg: 1.2.1
  - swaylock: <VERSION>
  - swaybar: <VERSION>
- Display Manager: LightDM

Paths and Settings:
- Current Datasets:
  - zroot:
    - TYPE: Filesystem
    - MOUNTPOINT: legacy
    - USED: 5.52G
    - REFER: 96K
  - zroot/ROOT/default:
    - TYPE: Filesystem
    - MOUNTPOINT: /
    - USED: 5.46G
    - REFER: 5.46G
  - Other Datasets:
    - zroot/home: 53.0M, MOUNTPOINT: /home
    - zroot/tmp: 156K, MOUNTPOINT: /tmp
    - zroot/usr: 192K, MOUNTPOINT: /usr
    - zroot/var: 908K, MOUNTPOINT: /var

Paths for Sway:
- Executable: /usr/local/bin/sway
- User Configuration Directory: ~/.config/sway/
- System Configuration Directory: /usr/local/etc/sway/
- Default Configuration File: ~/.config/sway/config

Steps Already Taken:
1. Checked pool and dataset status and settings:
   - Command: `sudo zpool list`
   - Command: `sudo zfs list`
   - Command: `sudo zpool status`
   - Command: `sudo df -h`
   - Command: `sudo zfs get all zroot/ROOT/default`
   - Command: `sudo zpool get fragmentation zroot`
   - Command: `sudo zpool scrub zroot`
   
2. Adjusted ZFS configurations:
   - Set record size to 64K:
     - Command: `sudo zfs set recordsize=64K zroot/ROOT/default`
   - Disabled atime:
     - Command: `sudo zfs set atime=off zroot/ROOT/default`
   - Changed compression to gzip:
     - Command: `sudo zfs set compression=gzip zroot/ROOT/default`

3. Installed Sway and its necessary packages:
   - Command: `sudo pkg install sway`
   - Installed supporting libraries and packages: basu, libdecor, libei, libliftoff, seatd, xwayland, wlroots.
  
4. Attempted to log into Sway by configuring LightDM to allow Wayland sessions:
   - Edited configuration file at: /usr/local/etc/lightdm/lightdm.conf.
   - Ensured session paths include Wayland sessions.

5. Checked current date and time:
   - Command: `sudo date`
   - Current Date and Time: Tue Apr 8 01:01:29 +02 2025

6. No snapshots created yet to conserve space.

Potential Future Steps:
- Implement ZFS snapshots for critical datasets.
- Monitor performance effectively after modifying ZFS settings.
- Verify LightDM configuration to properly enable Wayland sessions.

Issues to Address:
- Ensure proper LightDM configurations to support Wayland.
- Address logical usage versus physical usage discrepancies.

```
""".


all sway docs:


"""
```

Login managers

Some login managers support Wayland, and others don't. If you have issues starting sway and you use a login manager, your first step should be disabling the login manager and running sway as described by man 1 sway. If it does not work, report the bug to your login manager, not to sway.

For a small list of compatible login managers, see the login manager list on the useful addons page.

You can start sway automatically without a login manager, for example, by adding this to your .bash_profile (.zlogin or .zprofile for Zsh):

# If running from tty1 start sway
[ "$(tty)" = "/dev/tty1" ] && exec sway

For Fish, create the file ~/.config/fish/conf.d/sway.fish

# If running from tty1 start sway
set TTY1 (tty)
[ "$TTY1" = "/dev/tty1" ] && exec sway

Might help with dbus(missing $DBUS_SESSION_BUS_ADDRESS)

# If running from tty1 start sway
[ "$(tty)" = "/dev/tty1" ] && exec dbus-run-session sway

Configuration

The suggested location for the sway configuration file is ~/.config/sway/config. To begin configuring sway, create this directory and copy the default config.

mkdir -p ~/.config/sway
cp /etc/sway/config ~/.config/sway/
$EDITOR ~/.config/sway/config

Read the default config - it has comments that explain what each option does. Read man 5 sway for more information about each config command.
Display configuration

Sway manages displays for you, xrandr should not be used.

Run swaymsg -t get_outputs to get a list of output names. Then use the output command to arrange your displays.

output <identifier> {
   # ...config options...
   mode 3840x1600@143.998Hz
}

For detailed information, check the manual. Run man 5 sway-output.
Multihead

Managing multiple monitors is simple through the use of multiple output commands.

e.g., if we want to have a monitor with <name> HDMI1 and a resolution of 1920x1080, and to the right of it a laptop monitor with <name> eDP1 and a resolution of 1600x900; the following two commands can be placed in your config file:

output HDMI1 pos 0 0 res 1920x1080
output eDP1 pos 1920 0 res 1600x900

Take a note that you might want to change the focus of monitor on sway launch. Add this to your sway config:

focus output <name-or-identifier>

or

exec swaymsg focus output <name-or-identifier>

so it doesn't trigger on reload.

For more details read man 5 sway-output.
Clamshell Mode

AKA Closed Display mode. This mode is where your laptop lid is closed and you have external monitor(s) as outputs. As of Sway 1.1 you can use switch events to drive certain functionality, such as disabling an output upon a laptop lid being closed. Pass your laptop output name into the following, which can be found with: swaymsg -t get_outputs for example eDP-1.

set $laptop <laptop_output_identifier>
bindswitch --reload --locked lid:on output $laptop disable
bindswitch --reload --locked lid:off output $laptop enable

However, when reloading sway while using clamshell mode, the displays may reset (i.e. both displays will be enabled). To stop this, save this shell script:

#!/bin/sh

LAPTOP_OUTPUT="<LAPTOP>"
LID_STATE_FILE="/proc/acpi/button/lid/LID0/state"

read -r LS < "$LID_STATE_FILE"

case "$LS" in
*open)   swaymsg output "$LAPTOP_OUTPUT" enable ;;
*closed) swaymsg output "$LAPTOP_OUTPUT" disable ;;
*)       echo "Could not get lid state" >&2 ; exit 1 ;;
esac

Replace <LAPTOP> with the name of the display, ensure lid state file path is correct for your system.

To make sure this script runs whenever Sway is reloaded, add this line to your sway config:

exec_always /path/to/script.sh

HiDPI

HiDPI can be enabled via output and its scale option.

output <name> scale <I>

<I> is the integer scaling factor (usually 2 for HiDPI screens)

If scaling is active, it has to be considered when defining relative positions. For example, if the scaling factor for the left monitor (HDMI1) is 2, the relative position for the right output has to be divided by 2. This example is illustrated by the configuration below:

output HDMI1 scale 2
output HDMI1 pos 0 0 res 3200x1800
output eDP1 pos 1600 0 res 1920x1080

Note that the x-pos of eDP1 is 1600 = 3200/2.

Fractional scaling

Fractional scaling is supported but is not recommended. Your display does not have fractional pixels - and if you enable fractional scaling we cannot display your windows faithfully and your image quality will be degraded, for clients that do not report HiDPI surfaces (including all XWayland clients, but usually does not include modern versions of Wayland-native GUI toolkits). If you use many such programs, you should instead choose the integer scale factor appropriate for your display and configure your software's font size as necessary. If you still want to use fractional scaling, it is as simple as e.g. output <name> scale 1.5.
Display rotation

output <name> transform 90 will rotate output <name> by 90 degrees clockwise. Read man 5 sway-output and search for transform to see other options, like flipping across an axis.

For automatic display rotation via a built-in accelerometer, see rot8.
Redshift equivalent

Redshift adjusts the color temperature of your screen according to your surroundings. This may help your eyes hurt less if you are working in front of the screen at night. Unfortunately, Redshift does not support Wayland.

However, there is a fork of Redshift called gammastep which does have Wayland support. On Arch Linux, it is available as an official package.

Other alternatives are wlsunset, wl-gammarelay and wl-gammarelay-rs.
Input configuration

A list of input devices is available by running swaymsg -t get_inputs. Use the identifier for the device you want to configure in your config file:

input <identifier> {
    # ...config options...
}

Nothing prevents having multiple configurations for different specific devices:

# default layout
input "1:1:AT_Translated_Set_2_keyboard" {
   xkb_layout us
}

# custom layout for an external keyboard
input "1452:591:Custom_Keyboard" {
   xkb_layout YourCustomLayout
}

See man 5 sway-input for a summary of the available options.
Keyboard layout

# or input <identifier>
input "type:keyboard" {
    xkb_layout us,de
    xkb_variant ,nodeadkeys
    xkb_options grp:alt_shift_toggle
}

See man 7 xkeyboard-config for options you can use with the xkb_layout, xkb_model, xkb_options, xkb_rules, and xkb_variant commands. Separate multiple options with commas.

User-specific settings such as symbols will be loaded from their respective directories in ~/.xkb/ or $XDG_CONFIG_HOME/xkb/.

A lot of modifications are available through xkb_options. They can be found in /usr/share/X11/xkb/symbols/{altwin,capslock,compose,ctrl} and the respective option name in /usr/share/X11/xkb/rules/base.

Examples:

    Make caps lock work as escape: xkb_options caps:escape
    Swap escape and caps lock: xkb_options caps:swapescape
    Make caps lock work as control: xkb_options ctrl:nocaps
    Make caps lock work as additional control xkb_options caps:ctrl_modifier
    Swap left alt and super, and set caps lock to escape: xkb_options altwin:swap_lalt_lwin,caps:escape
    Make the menu key work as additional super: xkb_options altwin:menu_win

Note that to trigger several options, you need to list them separated with a comma, e.g. xkb_options caps:escape,altwin:swap_lalt_lwin; if you instead write several xkb_options-lines, only the last one will take effect.
Load custom xkb keymap file (since #3999)

# or input <identifier>
input "type:keyboard" {
    xkb_file ~/.config/xkb/custom
}

Keyboard repeat delay and rate

# or input <identifier>
input "type:keyboard" {
    repeat_delay 500
    repeat_rate 5
}

Load a modified custom xkb keymap (xmodmap equivalent)

See #4250

If you just want to change a couple of keymappings, you can create your own by overriding the keymappings of your usual layout.

input type:keyboard {

  # Modified programmer Dvorak. File at ~/.xkb/symbols/dvp_alt_gr_remapped_to_super
  xkb_layout "dvp_alt_gr_remapped_to_super"

  # Capslock key should work as escape key
  # See /usr/share/X11/xkb/rules/xorg.lst for options
  xkb_options caps:escape

  repeat_delay 250
  repeat_rate 45
}

The entirety of ~/.xkb/symbols/dvp_alt_gr_remapped_to_super:

default partial alphanumeric_keys
xkb_symbols "basic" {
        include "us(dvp)"
        name[Group1] = "Modified programmer Dvorak";
        key <RALT> { [ Super_L, Super_R ] };
};

The full documentation on how to override keymappings is available at this link. Here a slightly digested version with a practical commented example.
Libinput config options

input <device name> {
    left_handed enabled
    tap enabled
    natural_scroll disabled
    dwt enabled
    accel_profile "flat" # disable mouse acceleration (enabled by default; to set it manually, use "adaptive" instead of "flat")
    pointer_accel 0.5 # set mouse sensitivity (between -1 and 1)
}

See man 5 sway-input for all available options.
Touch Display Mapping

Touch input targets for touch displays used in a multi-display environment must be mapped to that touch display only.

set $display1       "Dell Inc. DELL P2414H VHVTW542165L"
set $display2       "Dell Inc. DELL P2418HT MYDM775F152L"
set $display2-touch "8146:24835:Melfas_LGD_AIT_Touch_Controller"

input $display2-touch map_to_output $display2

Wallpapers

Feh and similar tools do not work on Wayland. Sway supports setting wallpapers if swaybg is installed. You can use this feature through the output command, using the bg option:

e.g. output HDMI-A-1 bg ~/wallpaper.png stretch

See output configuration options in man 5 sway-output.

Also, see https://github.com/swaywm/sway/wiki/Useful-add-ons-for-sway for more ideas.
Swaybar configuration

Swaybar supports most of the same features as i3bar, and is configured in the same way. Add a bar section to your config:

bar {
    # ...bar options..
}

For the full list of options, see man 5 sway-bar.
Comments

Comments are supported in the configuration and start with a # character, optionally with whitespace before it. Comments and commands on the same line are not supported, because i3 - and thus Sway - supports the #RRGGBB syntax for specifying colours. Therefore, always place comments on their own line.

Additionally, a commented out line with a trailing backslash currently affects the next line, even if that is not a comment. So, never end a commented line with a backslash \.
Taking screenshots

X11 tools like scrot do not work. Try grim.

Grimshot provides a simpler command line interface if you're looking for something more high level (and relies on grim and slurp internally).

shotman is a simple, light, modern UI for screenshooting, also relies on slurp for region selection, and taking screenshot of current active window only works in sway for now.

flameshot has a simple and inituitive GUI with various editing tools.

swappy is another tool (written in C, uses GTK and Pango) that pops up a GUI and allows basic operations on the screenshot such as adding text, arrows, circles, squares and choosing colors. Has a config file to customize the GUI. Can also work without grim.

Also, see https://github.com/swaywm/sway/wiki/Useful-add-ons-for-sway for more ideas.
Creating screencasts

Try wf-recorder for screen recording of wlroots-based compositors like swaywm. If you use OBS Studio, versions newer than 27.0 natively support screen recording using pipewire. For older versions you can use wlrobs recording plugin for wlroots-based compositors.

Also, see https://github.com/swaywm/sway/wiki/Useful-add-ons-for-sway for more ideas.
Program launchers

    bemenu works as a dmenu replacement.
    sway-launcher-desktop: TUI Application launcher with Desktop Entry support.
    wofi is a rofi-like launcher.
    yofi is a minimalistic menu for wayland.
    tofi is an extremely performant wlroots-specific launcher.

Also, see https://github.com/swaywm/sway/wiki/Useful-add-ons-for-sway for more ideas.
Screen zooming feature

Not yet possible with swaywm/wlroots. Please look / get involved here.
Setting environmental variables

How you set variables will depend on how sway was started.

Environment variables are inherited from the process that starts sway. You need to set variables there.

Some of the possible options are:

    login manager: check the documentation.
    login shell: export them there before launching sway.
    user service: use the EnvironmentFile= key and an environment file.

More details here.
FAQ
Before asking questions...

Update both sway and wlroots and then try again. Look through known issues in sway and known issues in wlroots. Did you read the man pages? Start with man sway. Read your config file, too. And read the log.
How do I get rid of title bars on applications?

Use the default_border command in your config. default_border normal shows title bars, whereas none and pixel do not. The border command operates on the currently focused window only. default_border is a setting, border is an action.

Note that default_border only affects new windows. Even after reloading sway, you will need to close and re-open any windows you do not wish to see the title bar on.
Where are my tray icons?

Initial tray icon support for swaybar was merged with #3249 pull request. Missing features are tracked in #3799.
How do I configure urxvt transparency?

urxvt transparency requires "real transparency" settings. Add this to your .Xresources and reload via xrdb ~/.Xresources:

URxvt*depth: 32
URxvt*background: rgba:0000/0000/0200/c800

Be aware that this configuration will conflict with the URxvt.reversevideo and if you enable the reversevideo option, the text will become transparent instead of the background.

You may wish to add exec xrdb ~/.Xresources to your sway config to configure this on startup.
I'm not using logind but still want DBus/PolKit/power management to work.

What can I do?

If you're using ConsoleKit2, launch sway using

exec ck-launch-session dbus-launch --sh-syntax --exit-with-session sway

Alternatively, you could omit the ck-launch-session part.
xbacklight

xbacklight is, as the name would imply, a tool for X. Instead, you can use brightnessctl, brillo or just directly manipulate /sys/class/backlight.

For instance:

bindsym --locked XF86MonBrightnessDown exec brightnessctl set 5%-
bindsym --locked XF86MonBrightnessUp exec brightnessctl set 5%+

Which terminal emulator can I use?

You can use either X- or Wayland-native terminal emulator with little difference in terms of functionality.

Alacritty, Kitty, foot, GhosTTY, or wezterm will use Wayland without additional configuration. You can use VTE-based terminals like GNOME Terminal. X-based urxvt is another popular option.
Why am I getting Error on line XX […] Unknown key?

In your config, you should replace at line XX bindsym by bindcode.
Locale-specific configuration tricks
Workspace switching on the French layout

Because French number keys only produce numbers when Shift is pressed (or Caps Lock is active), you'll need to setup key bindings with the various special characters under the numbers (&, é, ", etc):

    # Switch to workspace
    bindsym $mod+ampersand workspace number 1
    bindsym $mod+eacute workspace number 2
    bindsym $mod+quotedbl workspace number 3
    bindsym $mod+apostrophe workspace number 4
    bindsym $mod+parenleft workspace number 5
    bindsym $mod+minus workspace number 6
    bindsym $mod+egrave workspace number 7
    bindsym $mod+underscore workspace number 8
    bindsym $mod+ccedilla workspace number 9
    bindsym $mod+agrave workspace number 10

    # Move focused container to workspace
    bindsym $mod+Shift+ampersand move container to workspace number 1
    bindsym $mod+Shift+eacute move container to workspace number 2
    bindsym $mod+Shift+quotedbl move container to workspace number 3
    bindsym $mod+Shift+apostrophe move container to workspace number 4
    bindsym $mod+Shift+parenleft move container to workspace number 5
    bindsym $mod+Shift+minus move container to workspace number 6
    bindsym $mod+Shift+egrave move container to workspace number 7
    bindsym $mod+Shift+underscore move container to workspace number 8
    bindsym $mod+Shift+ccedilla move container to workspace number 9
    bindsym $mod+Shift+agrave move container to workspace number 10

Key bindings on a dual US/Russian layout or US/Greek

If you have configured your keyboard with a US and a Russian layout (input * xkb_layout us,ru), your bindings using Latin script letters won't work when the Russian keyboard is active (for instance, $mod+f won't work, because you can't produce the letter f with the Russian layout).

To make key bindings work regardless of the currently active layout, you can use bindsym --to-code:

bindsym --to-code {
    $mod+b splith
    $mod+v splitv
}

Windows/KDE/gnome launcher shortcut

This will toggle the launcher on a single keypress, but not if a keybind was triggered with that key.

bindsym --no-repeat --release Super_L exec pkill $launcher || $launcher

Memorize and switch target windows

Configuration example:

# window switch setting
set $mode_set_switch_window "set_switch_window: [0]-[9]"
mode $mode_set_switch_window {
    bindsym 1 mark 1; mode "default"
    bindsym 2 mark 2; mode "default"
    bindsym 3 mark 3; mode "default"
    bindsym 4 mark 4; mode "default"
    bindsym 5 mark 5; mode "default"
    bindsym 6 mark 6; mode "default"
    bindsym 7 mark 7; mode "default"
    bindsym 8 mark 8; mode "default"
    bindsym 9 mark 9; mode "default"
    bindsym 0 mark 0; mode "default"
    bindsym Return mode "default"
    bindsym Escape mode "default"
}
bindsym $mod+ctrl+t mode $mode_set_switch_window
set $mode_switch_window "switch_window: [0]-[9]"
mode $mode_switch_window {
    bindsym 1 [con_mark="1"] focus; mode "default"
    bindsym 2 [con_mark="2"] focus; mode "default"
    bindsym 3 [con_mark="3"] focus; mode "default"
    bindsym 4 [con_mark="4"] focus; mode "default"
    bindsym 5 [con_mark="5"] focus; mode "default"
    bindsym 6 [con_mark="6"] focus; mode "default"
    bindsym 7 [con_mark="7"] focus; mode "default"
    bindsym 8 [con_mark="8"] focus; mode "default"
    bindsym 9 [con_mark="9"] focus; mode "default"
    bindsym 0 [con_mark="0"] focus; mode "default"
    bindsym t mode $mode_set_switch_window
    bindsym Return mode "default"
    bindsym Escape mode "default"
}
bindsym $mod+t mode $mode_switch_window

Move workspace to current output when switching

If you want your workspace to be moved to the current output when you switch to it using $mod+<number> instead of you being refocused to a different output where the workspace is currently bound, replace your bindsym $mod+<number> lines in your configuration with this (for each <number> of course):

bindsym $mod+1 [workspace="^1$"] move workspace to output current; workspace number 1

Move all workspace windows

set $mode_move_all_workspace_windows "Move all workspace windows to [0-9]?"
mode $mode_move_all_workspace_windows {
    bindsym 1 [workspace=".*"] move to workspace 1; workspace number 1, mode "default"
    bindsym 2 [workspace=".*"] move to workspace 2; workspace number 2, mode "default"
    bindsym 3 [workspace=".*"] move to workspace 3; workspace number 3, mode "default"
    bindsym 4 [workspace=".*"] move to workspace 4; workspace number 4, mode "default"
    bindsym 5 [workspace=".*"] move to workspace 5; workspace number 5, mode "default"
    bindsym 6 [workspace=".*"] move to workspace 6; workspace number 6, mode "default"
    bindsym 7 [workspace=".*"] move to workspace 7; workspace number 7, mode "default"
    bindsym 8 [workspace=".*"] move to workspace 8; workspace number 8, mode "default"
    bindsym 9 [workspace=".*"] move to workspace 9; workspace number 9, mode "default"
    bindsym 0 [workspace=".*"] move to workspace 10; workspace number 10, mode "default"
    # back to normal: Enter or Escape
    bindsym Return mode "default"
    bindsym Escape mode "default"
}
bindsym $mod+shift+ctrl+m mode $mode_move_all_workspace_windows

XDG_CURRENT_DESKTOP environment variable is not being set

Some applications and desktop mechanisms may rely on the XDG_CURRENT_DESKTOP environment variable to be set so that the application can accommodate for being ran under sway. Examples include XDG autostart implementations, screensharing in Firefox and many others.

Sway itself does not set this variable, it should be set before sway is started. Sane default would be sway:wlroots (specific sway as first priority, common wlroots after it to be in line with other wlroots compositors). If you start sway from shell profile, export it before sway invocation. If you use a login manager, the login manager will use the DesktopNames attribute inside the sway.desktop file. This file may be modified to add DesktopNames=sway;wlroots (also see #7952).

It's not good practice for applications to make use of XDG_CURRENT_DESKTOP in this way, and Firefox has an issue open to try to fix it. Refer to xpdw's FAQ and xdpw's Troubleshooting guide if your issue is specifically related to screensharing.
Systemd and dbus activation environments

Some variables need to be exported to systemd and/or dbus activation environments so tools that rely on them work properly. The essential ones are: WAYLAND_DISPLAY, DISPLAY (if XWayland is used), XDG_CURRENT_DESKTOP, plus Sway's: SWAYSOCK, I3SOCK, XCURSOR_SIZE, XCURSOR_THEME.

Export should be performed from context of running sway process, via exec statements in sway's configuration:

exec systemctl --user import-environment WAYLAND_DISPLAY DISPLAY XDG_CURRENT_DESKTOP SWAYSOCK I3SOCK XCURSOR_SIZE XCURSOR_THEME

If dbus-broker dbus implementation is used, that's it. It reuses activation environment of systemd.

If classic dbus implementation is used, it requires updating its own separate environment:

exec dbus-update-activation-environment WAYLAND_DISPLAY DISPLAY XDG_CURRENT_DESKTOP SWAYSOCK I3SOCK XCURSOR_SIZE XCURSOR_THEME

Troubleshooting
How do I report issues?

We will expect three things from you: your sway version, your config file, and a debug log. Obtain your version like so:

swaymsg -t get_version

If this doesn't work, use:

sway -v

Obtain a debug log like so:

sway -d 2> ~/sway.log

This will record information about sway's activity when it's running. Briefly reproduce your problem and exit sway. Upload this file, along with your config, to gist.github.com, and include this in a GitHub issue (or when asking for help on IRC). When preparing a debug log, make it brief - start up sway, do the minimum work necessary to reproduce the error, then close sway. Explain the steps you took in plain English in your GitHub issue as well.

If the problem isn't immediately obvious, you will likely be required to debug it yourself - we are volunteers and only have so much free time.
I just installed sway. I can move my mouse cursor but my keyboard does not work.

Are you pressing keys that are bound to do anything? Read the config file. If $mod+Return is bound to exec foot (which it is by default) - do you have foot installed? Try $mod+2 or $mod+8 - does it switch workspaces?
I can't run anything.

Check for keyboard shortcuts in the config file to start your launcher. Are you trying to run x applications? You probably don't have xwayland installed. Consult your distribution's documentation for instructions on installing xwayland.
My keyboard shortcuts do not work.

If you're running sway on top of X11, with i3 running, i3 will intercept any key presses that would otherwise be sent to sway. If you use the exact same key bindings then sway will never receive them.
i3-dmenu-desktop does not work.

There's a patch but it cannot be merged upstream. See issue #511 for more info.

You can still apply the patch manually though:

wget 'https://patch-diff.githubusercontent.com/raw/i3/i3/pull/2265.patch'
sudo patch -p0 /usr/bin/i3-dmenu-desktop < 2265.patch

My favorite application isn't displayed right, how can I fix this?
Disabling client-side Qt decorations

Qt currently defaults to using the X11 backend instead of its native Wayland backend. To use the Wayland backend, set QT_QPA_PLATFORM=wayland. Then Qt will also draw client-side decorations for all windows, to disable this, set QT_WAYLAND_DISABLE_WINDOWDECORATION="1"
Window rules to adjust sway's borders

If you want to use a particular application's built-in window decorations over the sway borders, you can write a rule like this in your config:

for_window [app_id="nautilus"] border none

Issues with Java applications

    Try to set _JAVA_AWT_WM_NONREPARENTING=1 in your environment (Source). You can achieve this by appending the following snippet to your ~/.profile file:

if [ "$XDG_SESSION_DESKTOP" = "sway" ] ; then
    # https://github.com/swaywm/sway/issues/595
    export _JAVA_AWT_WM_NONREPARENTING=1
fi

    Try wmname as Suggested (Source) Package if above don't work. If there is error like cannot open display then use export DISPLAY=:0

wmname LG3D

This seems to fix blank windows and menus that are drawn at a wrong offset to the selected menu item.
Issues with JetBrains IDE popups/menus losing focus

Some JetBrains IDEs (including Android Studio) ship with a Java 1.8 JRE, but there are fixes included in later JRE versions that are necessary to run properly in Sway. You can instruct your IDE to use a different JRE through an invocation of the form:

STUDIO_JDK=/usr/lib/jvm/java-11-openjdk-amd64/ /opt/android-studio/bin/studio.sh

If you are running Sway 1.4 or earlier, you will also need to upgrade to Sway/wlroots master, as there are necessary fixes there too.
Status icon doesn't show up

There are two standards for status icons: XEmbed and StatusNotifierItem (SNI). XEmbed is legacy and unimplemented in Sway. SNI is supported by swaybar. If your app uses XEmbed, the status icon won't show up. You should ask them to upgrade to SNI.

For network-manager-applet, see https://wiki.archlinux.org/index.php/NetworkManager#Appindicator
I run a Linux distribution without systemd and sway does not start.

See here.
I have a multi-gpu setup (like intel+nvidia or intel+amd) and sway does not start / Some video cards cannot display / Full screen images, etc. will be corrupted

Unless specified otherwise, wlroots will choose a card for you and you could have a similar message in sway's log:

To use a different default card (listed in /dev/dri/), set this environment variable before starting sway:

WLR_DRM_DEVICES=/dev/dri/card1 sway

It's likely that you want sway to use the integrated (Intel) card, because probably that's the only one directly connected to the laptop monitor. However, the mapping between node names in /dev/dri/ and actual cards isn't guaranteed to be the same across reboots.

You can also configure multiple graphics cards like so:

WLR_DRM_DEVICES=/dev/dri/card0:/dev/dri/card1 sway

The first card is used for actual rendering, and display buffers are copied to the secondary cards for any displays connected to them.

If your card paths aren't consistent (for example with eGPUs), you cannot use paths from /dev/dri/by-path, as they contain the delimiter which (unfortunately) cannot be escaped.
As a workaround you can create symlinks for the cards with a udev rule (/etc/udev/rules.d/set-dri-links.rules):

KERNEL=="card*", SUBSYSTEM=="drm", ATTRS{vendor}=="0x1002", ATTRS{device}=="0x747e", SYMLINK+="dri/by-name/egpu"
KERNEL=="card*", SUBSYSTEM=="drm", ATTRS{vendor}=="0x1002", ATTRS{device}=="0x1681", SYMLINK+="dri/by-name/igpu"

You can get the ATTRS{vendor} and ATTRS{device} from udevadm info /dev/dri/cardX --attribute-walk
and set the variable as following:

WLR_DRM_DEVICES=/dev/dri/by-name/egpu:/dev/dri/by-name/igpu

My GTK+3 theme isn't working

See GTK 3 settings on Wayland.
After unplugging an external display, some applications appear too large on my HiDPI screen

See wlroots issue #1119. This is an Xwayland bug fixed in 1.20.9.

Workaround:

    If it does not exist, create the file ~/.Xresources

    Add the following line to ~/.Xresources:

    Xft.dpi: 96

    Add the following line to the Sway config:

    exec xrdb -load ~/.Xresources

Is an application using Xwayland?

To figure out whether an application uses Xwayland or native Wayland, you can try one of these solutions:

    Run xeyes and move the mouse over the app. The eyes will only move if the window is using Xwayland.
    Add for_window [shell=".*"] title_format "%title :: %shell" to your config file.
    swaymsg -t get_tree dumps information about all windows.

Mouse events (clicking, scrolling) aren't working on some of my workspaces

If your monitor layouts uses negative pixels, you're probably hitting this issue : https://gitlab.freedesktop.org/xorg/xserver/issues/899

This is a Xwayland bug. The workaround is to rearrange your workspaces to not use negative pixels.
Xwayland DPI increases after hotplug

This is an Xwayland bug. This usually results in oversized text. As a workaround, add Xft.dpi: 96 to ~/.Xresources and add exec xrdb -load ~/.Xresources to your Sway config.
I can't open links in external applications in Firefox

If you get the message "Firefox is already running", set the environmental variable MOZ_DBUS_REMOTE=1 (Firefox 74+, dbus required). See explanation here: https://mastransky.wordpress.com/2020/03/16/wayland-x11-how-to-run-firefox-in-mixed-environment/
Android studio draws the menus in the wrong place

Try something like this:

# For Android Studio
export _JAVA_AWT_WM_NONREPARENTING=1
export STUDIO_JDK=/usr/lib/jvm/java-14-openjdk

# For Gradle
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk

Adjust the paths so that they point to a valid location on your system.
GTK+ applications take 20 seconds to start

This is due to GTK+ waiting for xdg-desktop-portal to start via D-Bus. This times out because the D-Bus activated service doesn't know what WAYLAND_DISPLAY to connect to.

See Systemd and dbus activation environments

Alternatively, set GTK_USE_PORTAL=0 in your environment.

More details: https://github.com/swaywm/sway/issues/5732
Wayland won't let me run apps as root

Generally speaking, running graphical applications as root is discouraged. Modern Linux distributions usually ship with a configured Polkit system which allows applications to request permissions for specific administrative actions as needed. Arch Linux wiki about Polkit is a good source of information https://wiki.archlinux.org/title/Polkit.

As a Sway user, all you probably need to do is run any one of the polkit auth agents. When a polkit auth agent is running you will get a prompt when an application supports Polkit and needs administrative permissions for some actions.

Auth agent exact location (and whether they are installed) depend on your distribution. Two most common agents are:

    polkit-gnome-authentication-agent-1 (GTK/Gnome)
    polkit-kde-authentication-agent-1 (Qt/KDE)

They usually reside in /usr/libexec or /usr/lib directories. You will want to put for example following in your sway config: exec "/usr/libexec/polkit-gnome-authentication-agent-1"

If the application does not support Polkit or you are running system without Polkit there is an additional fallback option if you really need to run a gui application as root: sudo --preserve-env=XDG_RUNTIME_DIR,WAYLAND_DISPLAY <app> or simply sudo -E <app>. This should be a last-resort option however.
Clutter applications hang at startup

This is ultimately caused by Clutter's reliance on the deprecated wl_shell protocol. Unless/until https://gitlab.gnome.org/GNOME/clutter/-/merge_requests/5 is merged, a workaround is to set CLUTTER_BACKEND=gdk to have it use gdk rather than attempt to interface directly with the compositor.
Sway 1.6 shows garbage or a blank screen on Nouveau

Could manifest as a blank screen where windows or bars are not drawn at all, only the mouse pointer. Could manifest an inactive display where the monitor receives no input at all.

Try setting WLR_DRM_NO_MODIFIERS=1. If you have it set, try un-setting it.

Issues when modifiers are enabled are due to two Nouveau bugs, fixed in these merge requests, and released in mesa 21.1.0:

    https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8500
    https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/3724

eglInitialize errors on with nouveau

This usually means that nouveau doesn't support your GPU. See https://nouveau.freedesktop.org/FeatureMatrix.html
Sway shows garbage or blank screen on usb-c 3.2 Gen 2 DisplayPort monitor.

Could manifest as blank screen or incomplete terminal output.

Try rendering sway with vulkan using WLR_RENDERER=vulkan. (WARNING: Tested on AMD Gpu).

Vulkan-validation layers is required for some distros.

    Arch: vulkan-validation-layers
    Void: Vulkan-ValidationLayers

How can I setup keyboard volume keys?

You'll need to bind these keys in your configuration file. For instance, if you're using PulseAudio:

bindsym --locked XF86AudioMute exec pactl set-sink-mute @DEFAULT_SINK@ toggle
bindsym --locked XF86AudioLowerVolume exec pactl set-sink-volume @DEFAULT_SINK@ -5%
bindsym --locked XF86AudioRaiseVolume exec pactl set-sink-volume @DEFAULT_SINK@ +5%
bindsym --locked XF86AudioMicMute exec pactl set-source-mute @DEFAULT_SOURCE@ toggle

If you use wireplumber, setting -l flag in wpctl can be used to prevent the volume from exceeding a certain level, which is not a feature offered by pactl. This example ensures that the volume does not surpass 120%:

bindsym --locked XF86AudioMute exec wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle
bindsym --locked XF86AudioLowerVolume exec wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%- -l 1.2
bindsym --locked XF86AudioRaiseVolume exec wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+ -l 1.2

My screen isn't detected when plugged in

Sometimes the kernel driver has trouble detecting hotplugged monitors on some ports. Try this (adapt card0 and DP-1 to the GPU and connector you're using):

echo detect | sudo tee /sys/class/drm/card0-DP-1/status

How do I utilize wp-fractional-scale-v1 since Sway 1.9?

Fractional scale protocol

    This protocol allows a compositor to suggest for surfaces to render at fractional scales.

    recent versions of Chrome/Chromium/Blink Derivatives utilize it automatically
    recent Firefox versions require about:config widget.wayland.fractional-scale.enabled=true, which is as of 2024-03 having two bugs. Context Menu Broken, Blurred Windows when not maximized
    mpv in standard configuration/wayland mode will utilize it automatically and appears to have no known issues

No hardware acceleration since Sway 1.10

Typically this results in error messages like these:

vulkan: No DRI3 support detected - required for presentation
Note: you can probably enable DRI3 in your Xorg config

or

DRI3 not available

or VA-API fails to initialize.

Sway 1.10 has removed support for the legacy wl_drm Wayland protocol, which is still used by Xwayland 23.2.4 and earlier, libva 2.20.0 and earlier, and AMDVLK.

As a workaround, the legacy wl_drm Wayland protocol can be re-enabled manually by passing -Dlegacy-wl-drm to Sway.

See:

    xserver!1236
    libva#788 and libva#790
    AMDVLK#351

wmenu doesn't show command suggestions as you type

set $menu dmenu_path | wmenu | xargs swaymsg exec --

dmenu_path is provided by the package dmenu. Because it's often regarded as an optional dependency of Sway, it's likely that you don't have it installed.

UPDATE: Merged PR #8289 has eliminated the dependency on dmenu. The default configuration will run wmenu-run instead.

set $menu wmenu-run

```
""".

waybar all docs:


"""
```

The configuration uses the JSONC file format and is named config or config.jsonc.

Valid directories for this file are:

    $XDG_CONFIG_HOME/waybar/
    ~/.config/waybar/
    ~/waybar/
    /etc/xdg/waybar/
    SYSCONFDIR/xdg/waybar (if SYSCONFDIR set at the build time differs from /etc, e.g. /usr/local/etc on BSD systems)

A good starting point is the default config.

Also a minimal example config can be found on the bottom of this page.

All valid options for the modules are listed on the modules page.
Bar Config
option 	typeof 	default 	description
layer 	string 	bottom 	Decide if the bar is displayed in front (top) of the windows or behind (bottom) them.
output 	string 	array 	Specifies on which screen this bar will be displayed.
position 	string 	top 	Bar position, can be top,bottom,left,right.
height 	integer 		Height to be used by the bar if possible, leave blank for a dynamic value.
width 	integer 		Width to be used by the bar if possible, leave blank for a dynamic value.
modules-left 	array 		Modules that will be displayed on the left.
modules-center 	array 		Modules that will be displayed in the center.
modules-right 	array 		Modules that will be displayed on the right.
margin 	string 		Margins value using the css format without units.
margin-<top|left|bottom|right> 	integer 		Margins value without units.
spacing 	integer 	4 	Size of gaps in between of the different modules.
name 	string 		Optional name added as a CSS class, for styling multiple waybars.
mode 	string 		Selects one of the preconfigured display modes. This is an equivalent of the sway-bar(5) mode command and supports the same values: dock, hide, invisible, overlay.
Note: hide and invisible modes may be not as useful without Sway IPC.
start_hidden 	bool 	false 	Option to start the bar hidden.
modifier-reset 	string 	press 	Defines the timing of modifier key to reset the bar visibility. To reset the visibility of the bar with the press of the modifier key use press. Use release to reset the visibility upon the release of the modifier key and only if no other action happened while the key was pressed. This prevents hiding the bar when the modifier is used to switch a workspace, change binding mode or start a keybinding.
exclusive 	bool 	true 	Option to request an exclusive zone from the compositor. Disable this to allow drawing application windows underneath or on top of the bar.
Disabled by default for overlay layer.
fixed-center 	bool 	true 	Prefer fixed center position for the modules-center block. The center block will stay in the middle of the bar whenever possible. It can still be pushed around if other blocks need more space.
When false, the center block is centered in the space between the left and right block.
passthrough 	bool 	false 	Option to pass any pointer events to the window under the bar.
Intended to be used with either top or overlay layers and without exclusive zone.
Enabled by default for overlay layer.
ipc 	bool 	false 	Option to subscribe to the Sway IPC bar configuration and visibility events and control waybar with swaymsg bar commands.
Requires bar_id value from sway configuration to be either passed with the -b commandline argument or specified with the id option.
See #1244 for the documentation and configuration examples.
id 	string 		bar_id for the Sway IPC. Use this if you need to override the value passed with the -b bar_id commandline argument for the specific bar instance.
include 	array 		Paths to additional configuration files.
Each file can contain a single object with any of the bar configuration options. In case of duplicate options, the first defined value takes precedence, i.e. including file -> first included file -> etc. Nested includes are permitted, but make sure to avoid circular imports.
For a multi-bar config, the include directive affects only current bar configuration object.
reload_style_on_change 	bool 	false 	Option to enable reloading the css style if a modification is detected on the style sheet file or any imported css files.
Module Config

It's suggested not to have multiple configurations for the same mouse button. For example: on-click, on-double-click, on-triple-click are defined. When triple click is triggered the module will execute commands for on-click, on-double-click, on-triple-click sequentially because of Gdk provide such events.
option 	typeof 	default 	description
on-click 	string 		Command to execute when you left click on the module
on-click-release 	string 		Command to execute when you release left button on module
on-double-click 	string 		Command to execute when you double left click on the module
on-triple-click 	string 		Command to execute when you triple left click on the module
on-click-middle 	string 		Command to execute when you middle click on the module using mousewheel
on-click-middle-release 	string 		Command to execute when you release mousewheel button on the module
on-double-click-middle 	string 		Command to execute when you double middle click on the module using mousewheel
on-triple-click-middle 	string 		Command to execute when you triple middle click on the module using mousewheel
on-click-right 	string 		Command to execute when you right click on the module
on-click-right-release 	string 		Command to execute when you release right button on the module
on-double-click-right 	string 		Command to execute when you double right click on the module
on-triple-click-right 	string 		Command to execute when you triple right click on the module
on-click-backward 	string 		Command to execute when you click on the module using mouse backward button
on-click-backward-release 	string 		Command to execute when you release mouse backward button on the module
on-double-click-backward 	string 		Command to execute when you double click on the module using mouse backward button
on-triple-click-backward 	string 		Command to execute when you triple click on the module using mouse backward button
on-click-forward 	string 		Command to execute when you click on the module using mouse forward button
on-click-forward-release 	string 		Command to execute when you release mouse forward button on the module using
on-double-click-forward 	string 		Command to execute when you double click on the module using mouse forward button
on-triple-click-forward 	string 		Command to execute when you triple click on the module using mouse forward button
on-scroll-up 	string 		Command to execute when you scroll up on the module with the mouse wheel
on-scroll-down 	string 		Command to execute when you scroll down on the module with the mouse wheel
on-scroll-left 	string 		Command to execute when you tilt the mouse wheel left on the module
on-scroll-right 	string 		Command to execute when you tilt the mouse wheel right on the module
Module actions config

It is possible to specify module actions (if the module supports them) under the "actions" block. Supported actions are described at the module definition pages. Example:

"clock": {
    "actions": {"on-click-right": "mode",
                "on-scroll-up": "shift_up",
                "on-scroll-down": "shift_down"
               }
}

Module format

You can use PangoMarkupFormat. e.g.

"format": "<span style=\"italic\">{}</span>"

If you use a unicode in the module format, you might encounter a scenario where Waybar displays information in the wrong direction. It's a unicode specification. Some of the ligatures can have "right-to-left" associated directional property. See Bidi algorithm basics.

"format": "{icon} {capacity}%",
"format-icons": ["ﱉ","ﱊ","ﱌ","ﱍ","ﱋ"]

It can be handled by the using special attributes. In the example {icon} is wrapped by the left-to-right property.

"format": "&#x202b;{icon}&#x202c; {capacity}%",
"format-icons": ["ﱉ","ﱊ","ﱌ","ﱍ","ﱋ"]

Multiple instances of a module

If you want to have a second instance of a module, you can suffix it by a '#' and a custom name.

For example if you want a second battery module, you can add "battery#bat2" to your modules.

To configure the newly added module, you then also add a module configuration with the same name.

This could then look something like this (this is an incomplete example):

"modules-right": ["battery", "battery#bat2"],
"battery": {
    "bat": "BAT1"
},
"battery#bat2": {
    "bat": "BAT2"
}

To style in style.css use :

battery.bat2 {
    border-bottom: 2px solid #FFFFFF;
}

Minimal config

A minimal config file could look like this:

{
    "layer": "top",
    "modules-left": ["sway/workspaces", "sway/mode"],
    "modules-center": ["sway/window"],
    "modules-right": ["battery", "clock"],
    "sway/window": {
        "max-length": 50
    },
    "battery": {
        "format": "{capacity}% {icon}",
        "format-icons": ["", "", "", "", ""]
    },
    "clock": {
        "format-alt": "{:%a, %d. %b  %H:%M}"
    }
}

Multi output config
Limit a configuration to some outputs

{
    "layer": "top",
    "output": "eDP-1",
    "modules-left": ["sway/workspaces", "sway/mode"],
    //...
}

{
    "layer": "top",
    "output": ["eDP-1", "VGA"],
    "modules-left": ["sway/workspaces", "sway/mode"],
    //...
}

Configuration of multiple outputs

Don't specify an output to create multiple bars on the same screen

[{
    "layer": "top",
    "output": "eDP-1",
    "modules-left": ["sway/workspaces", "sway/mode"],
    //...
}, {
    "layer": "top",
    "output": "VGA",
    "modules-right": ["clock"],
    //...
}]

You can also exclude specific output(s) by using exclamation mark, for example:

[{
    "layer": "top",
    "output": "eDP-1",
    "modules-left": ["sway/workspaces", "sway/mode"],
    //...
}, {
    "layer": "top",
    "output": "!eDP-1",
    "modules-right": ["clock"],
    //...
}]

This will show the first bar on eDP-1, and the second bar on every output except eDP-1
Rotating modules

When positioning Waybar on the left or right side of the screen, sometimes it's useful to be able to rotate the contents of a module so the text runs vertically. This can be done using the "rotate" property of the module. Example:

{
    "clock": {
        "rotate": 90
    }
}

Valid options for the "rotate" property are: 0, 90, 180 and 270.
Share options for multiple bars

You probably want to share the same formatting and properties for repeated modules across bars. Put the shared configuration in another file, say, default-modules.json:

{
	"clock": {
		"tooltip-format": "<big>{:%Y %B}</big>\n<tt><small>{calendar}</small></tt>",
		"format": "{:%F %T}",
		"format-alt": "{:%F %T}",
		"interval": 1
	},

}

and just import it from config:

[{
	"layer": "top",
	"position": "bottom",
	"output": ["DP-1"],

	"include": [
		"~/.config/waybar/default-modules.json",
	],
	"modules-right": [
		"clock",
		"temperature",
	]
},
{
	"layer": "top",
	"position": "bottom",
	"output": ["HDMI-1"],

	"include": [
		"~/.config/waybar/default-modules.json",
	],
	"modules-right": [
		"clock",
	]

	"clock": {
		"on-click": "do_something",
	}
},
]

As you can see, you can add custom properties on top of the defaults. Local options get appended to the defaults. They override the default ones, if they already exist.
Styling Multiple Bars

Using the "name" field, you can call it from the style.css file, like this: (config file)

{
  "name": "bar1"
   // desired settings
} 

(config2 file)

{ 
 "name": "bar2"
 // desired settings
} 

In your style.css, you may want to call like this:

.bar1 { 
  font-family: Arimo Nerd Font;
  font-size: 16px;
} 
.bar2 {
  font-family: Roboto;
  font-size: 16px;
} 

If your bars share the same modules, you can specify like this:

window.bar1#waybar { 
  background-color: rgba(10, 9, 10, 0.87);
} 

window.bar2#waybar {
  background-color: transparent;
} 




Styling is done using the CSS file format and with a file named style.css. You can also use style-light.css and style-dark.css respectively to follow the system theme.

Valid directories for this file are:

    ~/.config/waybar/
    ~/waybar/
    /etc/xdg/waybar/


Also a minimal example style can be found on the bottom of this page.

All valid CSS classes for the modules are listed on the modules page.
Bar styling

The main waybar window can be styled with the following:

    window#waybar
    window#waybar.hidden
    window#waybar.<name>


        <name> is set to the value of the optional name configuration property. If not set, this class is not available. For more information see Bar Config
    window#waybar.<position>
        <position> is set to the value of the position configuration property. For more information see Bar Config

Module Group Styling

Each module group can be styled individually with the following:

    .modules-left
    .modules-center
    .modules-right

Generic module style

A style with the .module selector would affect all the modules. In practice, you may prefer to use more specific label.module and box.module selectors.

label.module {
    padding: 0 10px;
    box-shadow: inset 0 -3px;
}
box.module button:hover {
    box-shadow: inset 0 -3px #ffffff;
}

You need to remember about selector specificity when overriding the style for a specific module:

/*
 * Show border for all simple text modules when the bar is in a top or bottom position.
 * a=1 b=2 c=2 -> specificity = 122
 */
window#waybar.top label.module {
    box-shadow: inset 0 -3px;
}
window#waybar.bottom label.module {
    box-shadow: inset 0 3px;
}
/*
 * But hide the border for sway/window (need to include `window#waybar` to increase specificity)
 * a=2 b=0 c=1 -> specificity = 201
 */
window#waybar #window {
    box-shadow: none;
}

Per-output styling

The main waybar windows carry a class tag with the name of the output this window is shown on. This can be used to apply different styles depending on the output. E.g.,

* { font-size: 13px; }
window.eDP-1 * { font-size: 10px; }

will set the default font size of all elements to 13px unless overridden later on, but apply a base font size of 10px to all elements on the eDP-1 output (typically, the laptop screen). Note that only the top-level window container has the output assigned in the class tags, not each individual object.
Interactive styling

GTK is used to apply styles and works with a limited subset of CSS.

You can use env GTK_DEBUG=interactive waybar to inspect objects and find their CSS classes, experiment with live CSS styles, and lookup the current value of CSS properties.

Interactive CSS Editor

See https://developer.gnome.org/documentation/tools/inspector.html for more information.
Viewing the widget tree

Like the GTK inspector above, Waybar itself can also tell you what GTK widgets with what classes are available for styling (since #927). To get this information, simply run Waybar with debug logging enabled: waybar -l debug. Each enabled bar's widget tree will be separately logged to the console. Example:

[2020-11-30 12:38:51.141] [debug] GTK widget tree:
window#waybar.background.bottom.eDP-1.:dir(ltr)
  decoration:dir(ltr)
  box.horizontal:dir(ltr)
    box.horizontal.modules-left:dir(ltr)
      widget:dir(ltr)
        box#workspaces.horizontal:dir(ltr)
      widget:dir(ltr)
        label#mode:dir(ltr)
      widget:dir(ltr)
        box#window.horizontal.module:dir(ltr)
          image:dir(ltr)
          label:dir(ltr)
    box.horizontal.modules-center:dir(ltr)
    box.horizontal.modules-right:dir(ltr)
      widget:dir(ltr)
        box#tray.horizontal:dir(ltr)
      widget:dir(ltr)
        label#idle_inhibitor:dir(ltr)
      widget:dir(ltr)
        label#pulseaudio:dir(ltr)
      widget:dir(ltr)
        label#network:dir(ltr)
      widget:dir(ltr)
        label#cpu:dir(ltr)
      widget:dir(ltr)
        label#memory:dir(ltr)
      widget:dir(ltr)
        label#temperature:dir(ltr)
      widget:dir(ltr)
        label#backlight:dir(ltr)
      widget:dir(ltr)
        label#battery:dir(ltr)
      widget:dir(ltr)
        label#clock:dir(ltr)

Minimal style

A minimal style.css file could look like this:

* {
    border: none;
    border-radius: 0;
    font-family: Roboto, Helvetica, Arial, sans-serif;
    font-size: 13px;
    min-height: 0;
}

window#waybar {
    background: rgba(43, 48, 59, 0.5);
    border-bottom: 3px solid rgba(100, 114, 125, 0.5);
    color: white;
}

tooltip {
  background: rgba(43, 48, 59, 0.5);
  border: 1px solid rgba(100, 114, 125, 0.5);
}
tooltip label {
  color: white;
}

#workspaces button {
    padding: 0 5px;
    background: transparent;
    color: white;
    border-bottom: 3px solid transparent;
}

#workspaces button.focused {
    background: #64727D;
    border-bottom: 3px solid white;
}

#mode, #clock, #battery {
    padding: 0 10px;
}

#mode {
    background: #64727D;
    border-bottom: 3px solid white;
}

#clock {
    background-color: #64727D;
}

#battery {
    background-color: #ffffff;
    color: black;
}

#battery.charging {
    color: white;
    background-color: #26A65B;
}

@keyframes blink {
    to {
        background-color: #ffffff;
        color: black;
    }
}

#battery.warning:not(.charging) {
    background: #f53c3c;
    color: white;
    animation-name: blink;
    animation-duration: 0.5s;
    animation-timing-function: steps(12);
    animation-iteration-count: infinite;
    animation-direction: alternate;
}

Reduce CPU usage in animation

Animations using the CSS properties animation-* may lead to high CPU usage. This does not depend on Waybar, rather on the CSS engine that will render the element everytime it changes state. animation-timing-function can be used with steps() instead of linear to reduce CPU usage. Like this:

    animation-timing-function: steps(12);

The higher the value of steps(), the smoother the animation will be, but also CPU usage will increase. Alternatively decrease the frequency of state changes by increasing their duration. Like this:

    animation-duration: 3.0s;

Making Waybar follow the Gtk theme

Gtk CSS has some global theme variables, and by using these instead of hardcoded values, Waybar will automatically follow your Gtk theme. An example:

window#waybar {
    background: @theme_base_color;
    border-bottom: 1px solid @unfocused_borders;
    color: @theme_text_color;
}

The Gtk theme variables can be further refined by using the shade, mix, and/or alpha modifiers. For example, if you want to make the bar 25 % lighter and 10 % transparent, you can style the background like this:

window#waybar {
    background: shade(alpha(@borders, 0.9), 1.25);
}


FreeBSD

You may also need to run pkg install pavucontrol for volume control if not yet installed.

pkg install waybar

```
""".
go precisely outshow how do properly fullyfledged desktop with all things and apps in sway and waybar. read all previous texts strictly and resynch yourself all accordingly in chats.

Examples not acceptable.
need strictly fullyfledged sway and waybar configs in not less than thousand lines in independent "sway config" and "waybar config" code blocks in this chat. also, leave "battery" and "alacrity" alone, since it absolutely unneed anywhere. you can utilise native freebsd 14.2-RELEASE p2 "fish".

you strictly need to output thousand lines in response. think what you can add or improve following a nativity in concept to bsd mentioned.





































































# Default config for sway
#
# Copy this to ~/.config/sway/config and edit it to your liking.
#
# Read `man 5 sway` for a complete reference.

### Variables
#
# Logo key. Use Mod1 for Alt.
set $mod Mod4
# Home row direction keys, like vim
set $left h
set $down j
set $up k
set $right l
# Your preferred terminal emulator
set $term foot
# Your preferred application launcher
set $menu wmenu-run

### Output configuration
#
# Default wallpaper (more resolutions are available in /usr/local/share/backgrounds/sway/)
output * bg /usr/local/share/backgrounds/sway/Sway_Wallpaper_Blue_1920x1080.png fill
#
# Example configuration:
#
#   output HDMI-A-1 resolution 1920x1080 position 1920,0
#
# You can get the names of your outputs by running: swaymsg -t get_outputs

### Idle configuration
#
# Example configuration:
#
# exec swayidle -w \
#          timeout 300 'swaylock -f -c 000000' \
#          timeout 600 'swaymsg "output * power off"' resume 'swaymsg "output * power on"' \
#          before-sleep 'swaylock -f -c 000000'
#
# This will lock your screen after 300 seconds of inactivity, then turn off
# your displays after another 300 seconds, and turn your screens back on when
# resumed. It will also lock your screen before your computer goes to sleep.

### Input configuration
#
# Example configuration:
#
#   input "2:14:SynPS/2_Synaptics_TouchPad" {
#       dwt enabled
#       tap enabled
#       natural_scroll enabled
#       middle_emulation enabled
#   }
#
# You can get the names of your inputs by running: swaymsg -t get_inputs
# Read `man 5 sway-input` for more information about this section.

### Key bindings
#
# Basics:
#
    # Start a terminal
    bindsym $mod+Return exec $term

    # Kill focused window
    bindsym $mod+Shift+q kill

    # Start your launcher
    bindsym $mod+d exec $menu

    # Drag floating windows by holding down $mod and left mouse button.
    # Resize them with right mouse button + $mod.
    # Despite the name, also works for non-floating windows.
    # Change normal to inverse to use left mouse button for resizing and right
    # mouse button for dragging.
    floating_modifier $mod normal

    # Reload the configuration file
    bindsym $mod+Shift+c reload

    # Exit sway (logs you out of your Wayland session)
    bindsym $mod+Shift+e exec swaynag -t warning -m 'You pressed the exit shortcut. Do you really want to exit sway? This will end your Wayland session.' -B 'Yes, exit sway' 'swaymsg exit'
#
# Moving around:
#
    # Move your focus around
    bindsym $mod+$left focus left
    bindsym $mod+$down focus down
    bindsym $mod+$up focus up
    bindsym $mod+$right focus right
    # Or use $mod+[up|down|left|right]
    bindsym $mod+Left focus left
    bindsym $mod+Down focus down
    bindsym $mod+Up focus up
    bindsym $mod+Right focus right

    # Move the focused window with the same, but add Shift
    bindsym $mod+Shift+$left move left
    bindsym $mod+Shift+$down move down
    bindsym $mod+Shift+$up move up
    bindsym $mod+Shift+$right move right
    # Ditto, with arrow keys
    bindsym $mod+Shift+Left move left
    bindsym $mod+Shift+Down move down
    bindsym $mod+Shift+Up move up
    bindsym $mod+Shift+Right move right
#
# Workspaces:
#
    # Switch to workspace
    bindsym $mod+1 workspace number 1
    bindsym $mod+2 workspace number 2
    bindsym $mod+3 workspace number 3
    bindsym $mod+4 workspace number 4
    bindsym $mod+5 workspace number 5
    bindsym $mod+6 workspace number 6
    bindsym $mod+7 workspace number 7
    bindsym $mod+8 workspace number 8
    bindsym $mod+9 workspace number 9
    bindsym $mod+0 workspace number 10
    # Move focused container to workspace
    bindsym $mod+Shift+1 move container to workspace number 1
    bindsym $mod+Shift+2 move container to workspace number 2
    bindsym $mod+Shift+3 move container to workspace number 3
    bindsym $mod+Shift+4 move container to workspace number 4
    bindsym $mod+Shift+5 move container to workspace number 5
    bindsym $mod+Shift+6 move container to workspace number 6
    bindsym $mod+Shift+7 move container to workspace number 7
    bindsym $mod+Shift+8 move container to workspace number 8
    bindsym $mod+Shift+9 move container to workspace number 9
    bindsym $mod+Shift+0 move container to workspace number 10
    # Note: workspaces can have any name you want, not just numbers.
    # We just use 1-10 as the default.
#
# Layout stuff:
#
    # You can "split" the current object of your focus with
    # $mod+b or $mod+v, for horizontal and vertical splits
    # respectively.
    bindsym $mod+b splith
    bindsym $mod+v splitv

    # Switch the current container between different layout styles
    bindsym $mod+s layout stacking
    bindsym $mod+w layout tabbed
    bindsym $mod+e layout toggle split

    # Make the current focus fullscreen
    bindsym $mod+f fullscreen

    # Toggle the current focus between tiling and floating mode
    bindsym $mod+Shift+space floating toggle

    # Swap focus between the tiling area and the floating area
    bindsym $mod+space focus mode_toggle

    # Move focus to the parent container
    bindsym $mod+a focus parent
#
# Scratchpad:
#
    # Sway has a "scratchpad", which is a bag of holding for windows.
    # You can send windows there and get them back later.

    # Move the currently focused window to the scratchpad
    bindsym $mod+Shift+minus move scratchpad

    # Show the next scratchpad window or hide the focused scratchpad window.
    # If there are multiple scratchpad windows, this command cycles through them.
    bindsym $mod+minus scratchpad show
#
# Resizing containers:
#
mode "resize" {
    # left will shrink the containers width
    # right will grow the containers width
    # up will shrink the containers height
    # down will grow the containers height
    bindsym $left resize shrink width 10px
    bindsym $down resize grow height 10px
    bindsym $up resize shrink height 10px
    bindsym $right resize grow width 10px

    # Ditto, with arrow keys
    bindsym Left resize shrink width 10px
    bindsym Down resize grow height 10px
    bindsym Up resize shrink height 10px
    bindsym Right resize grow width 10px

    # Return to default mode
    bindsym Return mode "default"
    bindsym Escape mode "default"
}
bindsym $mod+r mode "resize"
#
# Utilities:
#
    # Special keys to adjust volume via PulseAudio
    bindsym --locked XF86AudioMute exec pactl set-sink-mute \@DEFAULT_SINK@ toggle
    bindsym --locked XF86AudioLowerVolume exec pactl set-sink-volume \@DEFAULT_SINK@ -5%
    bindsym --locked XF86AudioRaiseVolume exec pactl set-sink-volume \@DEFAULT_SINK@ +5%
    bindsym --locked XF86AudioMicMute exec pactl set-source-mute \@DEFAULT_SOURCE@ toggle
    # Special keys to adjust brightness via brightnessctl
    bindsym --locked XF86MonBrightnessDown exec brightnessctl set 5%-
    bindsym --locked XF86MonBrightnessUp exec brightnessctl set 5%+
    # Special key to take a screenshot with grim
    bindsym Print exec grim

#
# Status Bar:
#
# Read `man 5 sway-bar` for more information about this section.
bar {
    position top

    # When the status_command prints a new line to stdout, swaybar updates.
    # The default just shows the current date and time.
    status_command while date +'%Y-%m-%d %X'; do sleep 1; done

    colors {
        statusline #ffffff
        background #323232
        inactive_workspace #32323200 #32323200 #5c5c5c
    }
}

include /usr/local/etc/sway/config.d/*




RTFM MAZAFAKA AND DO FULLYFLEG CONFIG AS NEED NOT LESS THAN THOUSAND LINES!!!:


"""
```

sway(1) 		FreeBSD General Commands Manual 	       sway(1)

NAME
       sway - An i3-compatible Wayland compositor

SYNOPSIS
       sway [options...] [command]

OPTIONS
       -h, --help
	   Show help message and quit.

       -c, --config <config>
	   Specifies a config file.

       -C, --validate
	   Check the validity of the config file, then exit.

       -d, --debug
	   Enables full logging, including debug information.

       -v, --version
	   Show the version number and quit.

       -V, --verbose
	   Enables more verbose logging.

       --get-socketpath
	   Gets the IPC socket path and prints it, then exits.

DESCRIPTION
       sway was created to fill the need of an i3-like window manager for
       Wayland. The upstream i3 developers have no intention of porting i3 to
       Wayland, and projects proposed by others ended up as vaporware. Many
       thanks to the i3 folks for providing such a great piece of software, so
       good that your users would rather write an entirely new window manager
       from scratch that behaved exactly like i3 rather than switch to
       something else.

       You can run sway directly from a tty, or via a Wayland-compatible login
       manager.

CONFIGURATION
       sway searches for a config file in the following locations, in this
       order:

       1.  ~/.sway/config
       2.  $XDG_CONFIG_HOME/sway/config (suggested location)
       3.  ~/.i3/config
       4.  $XDG_CONFIG_HOME/i3/config
       5.  /etc/sway/config
       6.  /etc/i3/config

       If unset, $XDG_CONFIG_HOME defaults to ~/.config.

       An error is raised when no config file is found. The recommended
       default configuration is usually installed to /etc/sway/config; you are
       encouraged to copy this to ~/.config/sway/config and edit it from
       there.

       For information on the config file format, see sway(5).

IPC COMMANDS
       Though swaymsg(1) is generally preferred, you may run sway command to
       send command to the running instance of sway. You can also issue
       commands with i3-msg(1) or even with i3(1).

ENVIRONMENT
       The following environment variables have an effect on sway:

       SWAYSOCK
	   Specifies the path to the sway IPC socket.

       XKB_DEFAULT_RULES, XKB_DEFAULT_MODEL, XKB_DEFAULT_LAYOUT,
       XKB_DEFAULT_VARIANT, XKB_DEFAULT_OPTIONS
	   Configures the xkb keyboard settings. See xkeyboard-config(7). The
	   preferred way to configure the keyboard is via the configuration
	   file, see sway-input(5).

       The following environment variables are set by sway:

       DISPLAY
	   If compiled with Xwayland support and Xwayland is not disabled by
	   the config, this will be set to the name of the X display used for
	   Xwayland.

       I3SOCK
	   For compatibility with i3, specifies the path to the sway IPC
	   socket.

       SWAYSOCK
	   Specifies the path to the sway IPC socket.

       WAYLAND_DISPLAY
	   Specifies the name of the Wayland display that sway is running on.

       XCURSOR_SIZE
	   Specifies the configured cursor size.

       XCURSOR_THEME
	   Specifies the configured cursor theme.

AUTHORS
       Maintained by Simon Ser <contact@emersion.fr>, who is assisted by other
       open source contributors. For more information about sway development,
       see <https://github.com/swaywm/sway>.

SEE ALSO
       sway(5) swaymsg(1) sway-input(5) sway-output(5) sway-bar(5) sway-ipc(7)

				  2025-03-28			       sway(1)
\n\n
sway-input(5)		  FreeBSD File Formats Manual		 sway-input(5)

NAME
       sway-input - input configuration file and commands

DESCRIPTION
       Sway allows for configuration of devices within the sway configuration
       file. 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, *, in place of <identifier> in the commands below. In
       addition, the settings can be applied to a type of device, by using
       type:<input_type> in place of <identifier>.

       In the configuration file, settings with a more specific selector take
       precedence over more general ones: <identifier> > type:<input_type> >
       *.  When executing input commands, however, the settings are applied to
       all matching input devices!  This means that type:<input_type> can
       override previously set <identifier> settings, even though in a
       configuration file they would take precedence.  Similarly * can
       override both <identifier> and type:<input_type> settings, if applied
       later.

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

       Current available input types are:

       •   touchpad
       •   pointer
       •   keyboard
       •   touch
       •   tablet_tool
       •   tablet_pad
       •   switch

       Note: The type configurations are applied as the devices appear and get
       applied on top of the existing device configurations.

INPUT COMMANDS
   KEYBOARD CONFIGURATION
       input <identifier> repeat_delay <milliseconds>
	   Sets the amount of time a key must be held before it starts
	   repeating.

       input <identifier> repeat_rate <characters per second>
	   Sets the frequency of key repeats once the repeat_delay has passed.

       For more information on these xkb configuration options, see xkeyboard-
       config(7).

       input <identifier> xkb_file <file_name>
	   Sets all xkb configurations from a complete .xkb file. This file
	   can be dumped from xkbcomp $DISPLAY keymap.xkb. This setting
	   overrides xkb_layout, xkb_model, xkb_options, xkb_rules, and
	   xkb_variant settings.

       input <identifier> xkb_layout <layout_name>
	   Sets the layout of the keyboard like us or de.

	   Multiple layouts can be specified by separating them with commas.

       input <identifier> xkb_model <model_name>
	   Sets the model of the keyboard. This has an influence for some
	   extra keys your keyboard might have.

       input <identifier> xkb_options <options>
	   Sets extra xkb configuration options for the keyboard.

	   Multiple options can be specified by separating them with commas.

       input <identifier> xkb_rules <rules>
	   Sets files of rules to be used for keyboard mapping composition.

       input <identifier> xkb_switch_layout <index>|next|prev
	   Changes the active keyboard layout to <index> counting from zero or
	   to next or previous layout on the list. If there is no next or
	   previous layout, this command hops to the other end of the list.

	   This can be used when multiple layouts are configured with
	   xkb_layout. A list of layouts you can switch between can be
	   obtained with swaymsg -t get_inputs.

       input <identifier> xkb_variant <variant>
	   Sets the variant of the keyboard like dvorak or colemak.

       The following commands may only be used in the configuration file.

       input <identifier> xkb_capslock enabled|disabled
	   Initially enables or disables CapsLock on startup, the default is
	   disabled.

       input <identifier> xkb_numlock enabled|disabled
	   Initially enables or disables NumLock on startup, the default is
	   disabled.

   TABLET CONFIGURATION
       input <identifier> tool_mode <tool> <absolute|relative>
	   Sets whether movement of a tablet tool should be treated as
	   absolute or relative; the default is absolute.

	   Valid values for <tool> are currently "pen", "eraser", "brush",
	   "pencil", "airbrush", and the wildcard *, which matches all tools.

	   Mouse and lens tools ignore this setting and are always treated as
	   relative.

   MAPPING CONFIGURATION
       input <identifier> map_to_output <identifier>
	   Maps inputs from this device to the specified output. Only
	   meaningful if the device is a pointer, touch, or drawing tablet
	   device.

	   The wildcard * can be used to map the input device to the whole
	   desktop layout.

       input <identifier> map_to_region <X> <Y> <width> <height>
	   Maps inputs from this device to the specified region of the global
	   output layout. Only meaningful if the device is a pointer, touch,
	   or drawing tablet device.

       input <identifier> map_from_region <X1xY1> <X2xY2>
	   Ignores inputs from this device that do not occur within the
	   specified region. Can be in millimeters (e.g. 10x20mm 20x40mm) or
	   the fraction of the full available space in terms of 0..1 (e.g.
	   0.5x0.5 0.7x0.7). Not all devices support millimeters. Only
	   meaningful if the device is not a keyboard and provides events in
	   absolute terms (such as a drawing tablet or touch screen - most
	   pointers provide events relative to the previous frame).

	   Commonly used to maintain the aspect ratio of the input device and
	   screen. Cropping a 16:10 input region to match a 16:9 display can
	   use 0x0 1x0.9 as the argument.

   LIBINPUT CONFIGURATION
       input <identifier> accel_profile adaptive|flat
	   Sets the pointer acceleration profile for the specified input
	   device.

       input <identifier> calibration_matrix <6 space-separated floating point
       values>
	   Sets the calibration matrix.

       input <identifier> click_method none|button_areas|clickfinger
	   Changes the click method for the specified device.

       input <identifier> clickfinger_button_map lrm|lmr
	   Specifies which button mapping to use for clickfinger. lrm treats 1
	   finger as left click, 2 fingers as right click, and 3 fingers as
	   middle click. lmr treats 1 finger as left click, 2 fingers as
	   middle click, and 3 fingers as right click.

       input <identifier> drag enabled|disabled
	   Enables or disables tap-and-drag for specified input device.

       input <identifier> drag_lock enabled|disabled
	   Enables or disables drag lock for specified input device.

       input <identifier> dwt enabled|disabled
	   Enables or disables disable-while-typing for the specified input
	   device.

       input <identifier> dwtp enabled|disabled
	   Enables or disables disable-while-trackpointing for the specified
	   input device.

       input <identifier> events
       enabled|disabled|disabled_on_external_mouse|toggle [<toggle-modes>]
	   Enables or disables send_events for specified input device.
	   Disabling send_events disables the input device.

	   The toggle option cannot be used in the config. If no toggle modes
	   are listed, all supported modes for the device will be toggled
	   through in the order: enabled,     disabled_on_external_mouse,
	   disabled, (loop back). If toggle modes are listed, they will be
	   cycled through, defaulting to the first mode listed if the current
	   mode is not in the list. They will also not be checked to see if
	   they are supported for the device and may fail.

       input <identifier> left_handed enabled|disabled
	   Enables or disables left handed mode for specified input device.

       input <identifier> middle_emulation enabled|disabled
	   Enables or disables middle click emulation.

       input <identifier> natural_scroll enabled|disabled
	   Enables or disables natural (inverted) scrolling for the specified
	   input device.

       input <identifier> pointer_accel [<-1|1>]
	   Changes the pointer acceleration for the specified input device.

       input <identifier> rotation_angle <angle>
	   Sets the rotation angle of the device to the given clockwise angle
	   in degrees. The angle must be between 0.0 (inclusive) and 360.0
	   (exclusive).

       input <identifier> scroll_button disable|button[1-3,8,9]|<event-code-
       or-name>
	   Sets the button used for scroll_method on_button_down. The button
	   can be given as an event name or code, which can be obtained from
	   libinput debug-events, or as a x11 mouse button (button[1-3,8,9]).
	   If set to disable, it disables the scroll_method on_button_down.

       input <identifier> scroll_button_lock enabled|disabled
	   Enables or disables scroll button lock for specified input device.

       input <identifier> scroll_factor <floating point value>
	   Changes the scroll factor for the specified input device. Scroll
	   speed will be scaled by the given value, which must be non-
	   negative.

       input <identifier> scroll_method none|two_finger|edge|on_button_down
	   Changes the scroll method for the specified input device.

       input <identifier> tap enabled|disabled
	   Enables or disables tap for specified input device.

       input <identifier> tap_button_map lrm|lmr
	   Specifies which button mapping to use for tapping. lrm treats 1
	   finger as left click, 2 fingers as right click, and 3 fingers as
	   middle click. lmr treats 1 finger as left click, 2 fingers as
	   middle click, and 3 fingers as right click.

   SEAT CONFIGURATION
       Configure options for multiseat mode.

       A seat is a collection of input devices that act independently of each
       other. Seats are identified by name and the default seat is seat0 if no
       seats are configured. While sway is running, - (hyphen) can be used as
       an alias for the current seat. Each seat has an independent keyboard
       focus and a separate cursor that is controlled by the pointer devices
       of the seat. This is useful for multiple people using the desktop at
       the same time with their own devices (each sitting in their own
       "seat"). The wildcard character, *, can also be used in place of
       <identifier> to change settings for all seats.

       Tip: If the configuration settings do not appear to be taking effect,
       you could try using * instead of <identifier>. If it works with the
       wildcard, try using a different identifier from swaymsg -t get_seats
       until you find the correct seat.

       seat <name> attach <input_identifier>
	   Attach an input device to this seat by its input identifier. A
	   special value of "*" will attach all devices to the seat.

       seat <seat> cursor move|set <x> <y>
	   Move specified seat's cursor relative to current position or wrap
	   to absolute coordinates (with respect to the global coordinate
	   space). Specifying either value as 0 will not update that
	   coordinate.

	   Deprecated: use the virtual-pointer Wayland protocol instead.

       seat <seat> cursor press|release button[1-9]|<event-name-or-code>
	   Simulate pressing (or releasing) the specified mouse button on the
	   specified seat. The button can either be provided as a button event
	   name or event code, which can be obtained from libinput debug-
	   events, or as an x11 mouse button (button[1-9]). If using
	   button[4-7], which map to axes, an axis event will be simulated,
	   however press and release will be ignored and both will occur.

	   Deprecated: use the virtual-pointer Wayland protocol instead.

       seat <name> fallback true|false
	   Set this seat as the fallback seat. A fallback seat will attach any
	   device not explicitly attached to another seat (similar to a
	   "default" seat).

       seat <name> hide_cursor <timeout>|when-typing [enable|disable]
	   Hides the cursor image after the specified event occurred.

	   If timeout is specified, then the cursor will be hidden after
	   timeout (in milliseconds) has elapsed with no activity on the
	   cursor. A timeout of 0 (default) disables hiding the cursor. The
	   minimal timeout is 100 and any value less than that (aside from 0),
	   will be increased to 100.

	   If when-typing is enabled, then the cursor will be hidden whenever
	   a key is pressed.

	   Be aware that this setting can interfere with input handling in
	   games and certain types of software (Gimp, Blender etc) that rely
	   on simultaneous input from mouse and keyboard.

       seat <name> idle_inhibit <sources...>
	   Sets the set of input event sources which can prevent the seat from
	   becoming idle, as a space separated list of source names. Valid
	   names are "keyboard", "pointer", "touchpad", "touch", "tablet_pad",
	   "tablet_tool", and "switch". The default behavior is to prevent
	   idle on any event.

       seat <name> keyboard_grouping none|smart
	   Set how the keyboards in the seat are grouped together. Currently,
	   there are two options. none will disable all keyboard grouping.
	   This will make it so each keyboard device has its own isolated
	   state. smart will group the keyboards in the seat by their keymap
	   and repeat info. This is useful for when the keyboard appears as
	   multiple separate input devices. In this mode, the effective layout
	   is synced between the keyboards in the group. The default is smart.
	   To restore the behavior of older versions of sway, use none.

       seat <name> pointer_constraint enable|disable|escape
	   Enables or disables the ability for clients to capture the cursor
	   (enabled by default) for the seat. This is primarily useful for
	   video games. The "escape" command can be used at runtime to escape
	   from a captured client.

       seat <name> shortcuts_inhibitor
       enable|disable|activate|deactivate|toggle
	   Enables or disables the ability of clients to inhibit keyboard
	   shortcuts for the seat. This is primarily useful for virtualization
	   and remote desktop software. Subcommands enable and disable affect
	   whether future inhibitors are honoured by default, i.e. activated
	   automatically, the default being enable. When used at runtime,
	   disable also disables any currently active inhibitors. activate,
	   deactivate and toggle are only usable at runtime and change the
	   state of a potentially existing inhibitor on the currently focused
	   window. This can be used with the current seat alias (-) to affect
	   only the currently focused window of the current seat. Subcommand
	   deactivate is particularly useful in an --inhibited bindsym to
	   escape a state where shortcuts are inhibited and the client becomes
	   uncooperative. It is worth noting that whether disabled or
	   deactivated inhibitors are removed is entirely up to the client.
	   Depending on the client it may therefore be possible to
	   (re-)activate them later. Any visual indication that an inhibitor
	   is present is currently left to the client as well.

       seat <name> xcursor_theme <theme> [<size>]
	   Override the system default XCursor theme. The default seat's
	   (seat0) theme is also used as the default cursor theme in XWayland,
	   and exported through the XCURSOR_THEME and XCURSOR_SIZE environment
	   variables.

SEE ALSO
       sway(5) sway-output(5) xkeyboard-config(7)

				  2025-03-28			 sway-input(5)
\n\n
sway-output(5)		  FreeBSD File Formats Manual		sway-output(5)

NAME
       sway-output - output configuration commands for sway

DESCRIPTION
       You may combine output commands into one, like so:

	   output HDMI-A-1 mode 1920x1080 pos 1920 0 bg ~/wallpaper.png
	   stretch

       You can get a list of output names with swaymsg -t get_outputs. You may
       also match any output by using the output name "*". Additionally, "-"
       can be used to match the focused output by name and "--" can be used to
       match the focused output by its identifier.

       Some outputs may have different names when disconnecting and
       reconnecting. To identify these, the name can be substituted for a
       string consisting of the make, model and serial which you can get from
       swaymsg -t get_outputs. Each value must be separated by one space. For
       example:

	   output "Some Company ABC123 0x00000000" pos 1920 0

COMMANDS
       output <name> mode|resolution|res [--custom]
       <width>x<height>[@<rate>Hz]
	   Configures the specified output to use the given mode. Modes are a
	   combination of width and height (in pixels) and a refresh rate that
	   your display can be configured to use. For a list of available
	   modes for each output, use swaymsg -t get_outputs.

	   To set a custom mode not listed in the list of available modes, use
	   --custom. You should probably only use this if you know what you're
	   doing.

	   Examples:

	       output HDMI-A-1 mode 1920x1080

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

       output <name> modeline <clock> <hdisplay> <hsync_start> <hsync_end>
       <htotal> <vdisplay> <vsync_start> <vsync_end> <vtotal> <hsync> <vsync>
	   Configures the specified output to use the given modeline. It can
	   be generated using cvt(1) and gtf(1) commands. See xorg.conf(5).
	   Only supported on DRM backend.

	   Example:

	       output HDMI-A-1 modeline 173.00 1920 2048 2248 2576 1080 1083
	       1088 1120 -hsync +vsync

       output <name> position|pos <X> <Y>
	   Places the specified output at the specific position in the global
	   coordinate space. The cursor may only be moved between immediately
	   adjacent outputs. If scaling is active, it has to be considered
	   when positioning. For example, if the scaling factor for the left
	   output is 2, the relative position for the right output has to be
	   divided by 2. The reference point is the top left corner so if you
	   want the bottoms aligned this has to be considered as well.

	   Example:

	       output HDMI1 scale 2

	       output HDMI1 pos 0 1020 res 3200x1800

	       output eDP1 pos 1600 0 res 1920x1080

	   Note that the left x-pos of eDP1 is 1600 = 3200/2 and the bottom y-
	   pos is 1020 + (1800 / 2) = 1920 = 0 + 1920

       output <name> scale <factor>
	   Scales the specified output by the specified scale factor. An
	   integer is recommended, but fractional values are also supported.
	   You may be better served by setting an integer scale factor and
	   adjusting the font size of your applications to taste. HiDPI isn't
	   supported with Xwayland clients (windows will blur). A fractional
	   scale may be slightly adjusted to match requirements of the
	   protocol.

       output <name> scale_filter linear|nearest|smart
	   Indicates how to scale application buffers that are rendered at a
	   scale lower than the output's configured scale, such as lo-dpi
	   applications on hi-dpi screens. Linear is smoother and blurrier,
	   nearest (also known as nearest neighbor) is sharper and blockier.
	   Setting "smart" will apply nearest scaling when the output has an
	   integer scale factor, otherwise linear. The default is "smart".

       output <name> subpixel rgb|bgr|vrgb|vbgr|none
	   Manually sets the subpixel hinting for the specified output. This
	   value is usually auto-detected, but some displays may misreport
	   their subpixel geometry. Using the correct subpixel hinting allows
	   for sharper text. Incorrect values will result in blurrier text.
	   When changing this via swaymsg, some applications may need to be
	   restarted to use the new value.

       output <name> background|bg <file> <mode> [<fallback_color>]
	   Sets the wallpaper for the given output to the specified file,
	   using the given scaling mode (one of "stretch", "fill", "fit",
	   "center", "tile"). If the specified file cannot be accessed or if
	   the image does not fill the entire output, a fallback color may be
	   provided to cover the rest of the output. fallback_color should be
	   specified as #RRGGBB. Alpha is not supported.

       output <name> background|bg <color> solid_color
	   Sets the background of the given output to the specified color.
	   color should be specified as #RRGGBB. Alpha is not supported.

       output <name> transform <transform> [clockwise|anticlockwise]
	   Sets the background transform to the given value. Can be one of
	   "90", "180", "270" for rotation; or "flipped", "flipped-90",
	   "flipped-180", "flipped-270" to apply a rotation and flip, or
	   "normal" to apply no transform. The rotation is performed
	   clockwise. If a single output is chosen and a rotation direction is
	   specified (clockwise or anticlockwise) then the transform is added
	   or subtracted from the current transform (this cannot be used
	   directly in the configuration file).

       output <name> disable|enable
	   Enables or disables the specified output (all outputs are enabled
	   by default).

	   As opposed to the power command, the output will lose its current
	   workspace and windows.

       output <name> toggle
	   Toggle the specified output.

       output <name> power on|off|toggle
	   Turns on or off the specified output.

	   As opposed to the enable and disable commands, the output keeps its
	   current workspaces and windows.

       output <name> dpms on|off|toggle
	   Deprecated. Alias for power.

       output <name> max_render_time off|<msec>
	   Controls when sway composites the output, as a positive number of
	   milliseconds before the next display refresh. A smaller number
	   leads to fresher composited frames and lower perceived input
	   latency, but if set too low, sway may not finish compositing in
	   time for display refresh, leading to delayed frames.

	   When set to off, sway composites immediately after display refresh,
	   maximizing time available for compositing.

	   To adjust when applications are instructed to render, see
	   max_render_time in sway(5).

	   To set this up for optimal latency:
	   1.  Launch some full-screen application that renders continuously,
	       like glxgears.
	   2.  Start with max_render_time 1. Increment by 1 if you see frame
	       drops.

	   This setting only has an effect on Wayland and DRM backends, as
	   support for presentation timestamps and predicted output refresh
	   rate is required.

       output <name> adaptive_sync on|off|toggle
	   Enables or disables adaptive synchronization (often referred to as
	   Variable Refresh Rate, or by the vendor-specific names FreeSync/G-
	   Sync).

	   Adaptive sync allows clients to submit frames a little too late
	   without having to wait a whole refresh period to display it on
	   screen. Enabling adaptive sync can improve latency, but can cause
	   flickering on some hardware.

       output <name> render_bit_depth 6|8|10
	   Controls the maximum color channel bit depth at which frames are
	   rendered; the default is currently 8 bits per channel.

	   Setting higher values will not have an effect if hardware and
	   software lack support for such bit depths. Successfully increasing
	   the render bit depth will not necessarily increase the bit depth of
	   the frames sent to a display. An increased render bit depth may
	   provide smoother rendering of gradients, and screenshots which can
	   more precisely store the colors of programs which display high bit
	   depth colors.

	   Warnings: this can break screenshot/screencast programs which have
	   not been updated to work with different bit depths. This command is
	   experimental, and may be removed or changed in the future.

       output <name> color_profile srgb|[icc <file>]
	   Sets the color profile for an output. The default is srgb. <file>
	   should be a path to a display ICC profile.

	   Not all renderers support this feature; currently it only works
	   with the the Vulkan renderer. Even where supported, the application
	   of the color profile may be inaccurate.

	   This command is experimental, and may be removed or changed in the
	   future. It may have no effect or produce unexpected output when
	   used together with future HDR support features.

       output <name> allow_tearing yes|no
	   Allows or disallows screen tearing as a result of immediate page
	   flips, and an immediate presentation mode from a client. The
	   default is that no screen tearing is allowed.

	   With immediate page flips, frames from the client are presented as
	   soon as possible instead of synchronizing with the monitor's vblank
	   interval (VSync).

	   It is recommended to set max_render_time to off. In that case a
	   page flip happens as soon as a client updates. Otherwise, tearing
	   will only happen if rendering takes longer than the configured
	   milliseconds before the next display refresh.

	   To adjust whether tearing is allowed for specific applications, see
	   allow_tearing in sway(5). Note that tearing will only be enabled
	   when it's allowed for both the output and the application.

	   This setting only has effect when a window is fullscreen on the
	   output.

SEE ALSO
       sway(5) sway-input(5)

				  2025-03-28			sway-output(5)
\n\n
sway-bar(5)		  FreeBSD File Formats Manual		   sway-bar(5)

NAME
       sway-bar - bar configuration file and commands

DESCRIPTION
       Sway allows configuring swaybar in the sway configuration file.

COMMANDS
       The following commands may only be used in the configuration file.

       id <bar_id>
	   Sets the ID of the bar.

       swaybar_command <command>
	   Executes custom bar command. Default is swaybar.

       The following commands may be used either in the configuration file or
       at runtime.

       bindcode [--release] <event-code> <command>
	   Executes command when the mouse button has been pressed (or if
	   released is given, when the button has been released). The buttons
	   can be given as an event code, which can be obtaining from libinput
	   debug-events. To disable the default behavior for a button, use the
	   command nop.

       bindsym [--release] button[1-9]|<event-name> <command>
	   Executes command when the mouse button has been pressed (or if
	   released is given, when the button has been released). The buttons
	   can be given as a x11 button number or an event name, which can be
	   obtained from libinput debug-events. To disable the default
	   behavior for a button, use the command nop.

       binding_mode_indicator yes|no
	   Enable or disable binding mode indicator. Default is yes.

       font <font>
	   Specifies the font to be used in the bar. 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

       gaps <all> | <horizontal> <vertical> | <top> <right> <bottom> <left>
	   Sets the gaps from the edge of the screen for the bar. Gaps can
	   either be set all at once, per direction, or per side. Note that
	   only sides that touch an edge of the screen can have gaps. For the
	   side that does not touch an edge of the screen, per-side outer gaps
	   for workspaces may be of use.

       height <height>
	   Sets the height of the bar. Default height (0) will match the font
	   size.

       hidden_state hide|show [<bar-id>]
	   Specifies the behaviour of the bar when it is in hide mode. When
	   the hidden state is hide, then it is normally hidden, and only
	   unhidden by pressing the modifier key or in case of urgency hints.
	   When the hidden state is show, then it is permanently visible,
	   drawn on top of the currently visible workspace. Default is hide.

	   For compatibility with i3, bar hidden_state hide|show [<bar-id>] is
	   supported along with the sway only bar <bar-id> hidden_state
	   hide|show syntax. When using the i3 syntax, if bar-id is omitted,
	   the hidden_state will be changed for all bars. Attempting to use
	   bar <bar-id1> hidden_state hide|show <bar-id2> will result in an
	   error due to conflicting bar ids.

       mode dock|hide|invisible|overlay [<bar-id>]
	   Specifies the visibility of the bar. In dock mode, it is
	   permanently visible at one edge of the screen. In hide mode, it is
	   hidden unless the modifier key is pressed, though this behaviour
	   depends on the hidden state. In invisible mode, it is permanently
	   hidden. In overlay mode, it is permanently visible on top of other
	   windows. (In overlay mode the bar is transparent to input events.)
	   Default is dock.

	   For compatibility with i3, bar mode <mode> [<bar-id>] syntax is
	   supported along with the sway only bar <bar-id> mode <mode> syntax.
	   When using the i3 syntax, if bar-id is omitted, the mode will be
	   changed for all bars. Attempting to use bar <bar-id1> mode <mode>
	   <bar-id2> will result in an error due to conflicting bar ids.

       modifier <Modifier>|none
	   Specifies the modifier key that shows a hidden bar. Default is
	   Mod4.

       output <output>|*
	   Restrict the bar to a certain output, can be specified multiple
	   times. If the output command is omitted, the bar will be displayed
	   on all outputs. * can be given at any point to reset it back to all
	   outputs.

       pango_markup enabled|disabled
	   Enables or disables pango markup for status lines. This has no
	   effect on status lines using the i3bar JSON protocol.

       position top|bottom
	   Sets position of the bar. Default is bottom.

       separator_symbol <symbol>
	   Specifies the separator symbol to separate blocks on the bar.

       status_command <status command>
	   Executes the bar status command with sh -c. Each line of text
	   printed to stdout from this command will be displayed in the status
	   area of the bar. You may also use swaybar's JSON status line
	   protocol. See swaybar-protocol(7) for more information on the
	   protocol

	   If running this command via IPC, you can disable a running status
	   command by setting the command to a single dash: swaybar bar bar-0
	   status_command -

       status_edge_padding <padding>
	   Sets the padding that is used when the status line is at the right
	   edge of the bar. This value will be multiplied by the output scale.
	   The default is 3.

       status_padding <padding>
	   Sets the vertical padding that is used for the status line. The
	   default is 1. If padding is 0, blocks will be able to take up the
	   full height of the bar. This value will be multiplied by the output
	   scale.

       strip_workspace_name yes|no
	   If set to yes, then workspace names will be omitted from the
	   workspace button and only the custom number will be shown. Default
	   is no.

       strip_workspace_numbers yes|no
	   If set to yes, then workspace numbers will be omitted from the
	   workspace button and only the custom name will be shown. Default is
	   no.

       unbindcode [--release] <event-code>
	   Removes the binding with the given <event-code>.

       unbindsym [--release] button[1-9]|<event-name>
	   Removes the binding with the given <button> or <event-name>.

       wrap_scroll yes|no
	   Enables or disables wrapping when scrolling through workspaces with
	   the scroll wheel. Default is no.

       workspace_buttons yes|no
	   Enables or disables workspace buttons on the bar. Default is yes.

       workspace_min_width <px> [px]
	   Specifies the minimum width for the workspace buttons on the bar.
	   Default is 0.

	   This setting also applies to the current binding mode indicator.

   TRAY
       Swaybar provides a system tray where third-party applications may place
       icons. The following commands configure the tray.

       tray_bindcode <event-code>
       ContextMenu|Activate|SecondaryActivate|ScrollDown|ScrollLeft|ScrollRight|ScrollUp|nop
	   Executes the action when the mouse button has been pressed. The
	   buttons can be given as an event code, which can be obtained from
	   libinput debug-events. To disable the default behavior for a
	   button, use the command nop.

       tray_bindsym button[1-9]|<event-name>
       ContextMenu|Activate|SecondaryActivate|ScrollDown|ScrollLeft|ScrollRight|ScrollUp|nop
	   Executes the action when the mouse button has been pressed. The
	   buttons can be given as a x11 button number or an event name, which
	   can be obtained from libinput debug-events. Use the command nop to
	   disable the default action (Activate for button1, ContextMenu for
	   button2 and SecondaryActivate for button3).

       tray_padding <px> [px]
	   Sets the pixel padding of the system tray. This padding will
	   surround the tray on all sides and between each item. The default
	   value for px is 2.

       tray_output none|<output>|*
	   Restrict the tray to a certain output, can be specified multiple
	   times. If omitted, the tray will be displayed on all outputs.
	   Unlike i3bar, swaybar can show icons on any number of bars and
	   outputs without races. * can be given at any point to reset it to
	   display on all outputs.

       icon_theme <name>
	   Sets the icon theme that sway will look for item icons in. This
	   option has no default value, because sway will always default to
	   the fallback theme, hicolor.

   COLORS
       Colors are defined within a colors { } block inside a bar { } block.
       Colors must be defined in hex: #RRGGBB or #RRGGBBAA.

       background <color>
	   Background color of the bar.

       statusline <color>
	   Text color to be used for the statusline.

       separator <color>
	   Text color to be used for the separator.

       focused_background <color>
	   Background color of the bar on the currently focused monitor
	   output. If not used, the color will be taken from background.

       focused_statusline <color>
	   Text color to be used for the statusline on the currently focused
	   monitor output. If not used, the color will be taken from
	   statusline.

       focused_separator <color>
	   Text color to be used for the separator on the currently focused
	   monitor output. If not used, the color will be taken from
	   separator.

       focused_workspace <border> <background> <text>
	   Border, background and text color for a workspace button when the
	   workspace has focus.

       active_workspace <border> <background> <text>
	   Border, background and text color for a workspace button when the
	   workspace is active (visible) on some output, but the focus is on
	   another one. You can only tell this apart from the focused
	   workspace when you are using multiple monitors.

       inactive_workspace <border> <background> <text>
	   Border, background and text color for a workspace button when the
	   workspace does not have focus and is not active (visible) on any
	   output. This will be the case for most workspaces.

       urgent_workspace <border> <background> <text>
	   Border, background and text color for a workspace button when the
	   workspace contains a window with the urgency hint set.

       binding_mode <border> <background> <text>
	   Border, background and text color for the binding mode indicator.
	   If not used, the colors will be taken from urgent_workspace.

SEE ALSO
       sway(5) swaybar-protocol(7)

				  2025-03-28			   sway-bar(5)
\n\n
sway-ipc(7)	   FreeBSD Miscellaneous Information Manual	   sway-ipc(7)

NAME
       sway-ipc - IPC protocol for sway

DESCRIPTION
       This details the interprocess communication (IPC) protocol for sway(1).
       This IPC protocol can be used to control or obtain information from a
       sway process.

       The IPC protocol uses a UNIX socket as the method of communication. The
       path to the socket is stored in the environment variable SWAYSOCK and,
       for backwards compatibility with i3, I3SOCK. You can also retrieve the
       socket path by calling sway --get-socketpath.

MESSAGE AND REPLY FORMAT
       The format for messages and replies is:
	   <magic-string> <payload-length> <payload-type> <payload>
       Where
	    <magic-string> is i3-ipc, for compatibility with i3
	    <payload-length> is a 32-bit integer in native byte order
	    <payload-type> is a 32-bit integer in native byte order

       For example, sending the exit command would look like the following
       hexdump:
	   00000000 | 69 33 2d 69 70 63 04 00 00 00 00 00 00 00 65 78 |i3-ipc........ex|
	   00000010 | 69 74					      |it	       |

       The payload for replies will be a valid serialized JSON data structure.

MESSAGES AND REPLIES
       The following message types and their corresponding reply types are
       currently supported. For all replies, any properties not listed are
       subject to removal.

       ┌────────────┬───────────────────┬─────────────────────┐
       │TYPE NUMBER │	MESSAGE NAME	│	PURPOSE       │
       ├────────────┼───────────────────┼─────────────────────┤
       │     0	    │	 RUN_COMMAND	│ Runs the payload as │
       │	    │			│ sway commands       │
       ├────────────┼───────────────────┼─────────────────────┤
       │     1	    │  GET_WORKSPACES	│ Get the list of     │
       │	    │			│ current workspaces  │
       ├────────────┼───────────────────┼─────────────────────┤
       │     2	    │	  SUBSCRIBE	│ Subscribe the IPC   │
       │	    │			│ connection to the   │
       │	    │			│ events listed in    │
       │	    │			│ the payload	      │
       ├────────────┼───────────────────┼─────────────────────┤
       │     3	    │	 GET_OUTPUTS	│ Get the list of     │
       │	    │			│ current outputs     │
       ├────────────┼───────────────────┼─────────────────────┤
       │     4	    │	  GET_TREE	│ Get the node layout │
       │	    │			│ tree		      │
       ├────────────┼───────────────────┼─────────────────────┤
       │     5	    │	  GET_MARKS	│ Get the names of    │
       │	    │			│ all the marks       │
       │	    │			│ currently set       │
       ├────────────┼───────────────────┼─────────────────────┤
       │     6	    │  GET_BAR_CONFIG	│ Get the specified   │
       │	    │			│ bar config or a     │
       │	    │			│ list of bar config  │
       │	    │			│ names 	      │
       ├────────────┼───────────────────┼─────────────────────┤
       │     7	    │	 GET_VERSION	│ Get the version of  │
       │	    │			│ sway that owns the  │
       │	    │			│ IPC socket	      │
       ├────────────┼───────────────────┼─────────────────────┤
       │     8	    │ GET_BINDING_MODES │ Get the list of     │
       │	    │			│ binding mode names  │
       ├────────────┼───────────────────┼─────────────────────┤
       │     9	    │	 GET_CONFIG	│ Returns the config  │
       │	    │			│ that was last       │
       │	    │			│ loaded	      │
       ├────────────┼───────────────────┼─────────────────────┤
       │    10	    │	  SEND_TICK	│ Sends a tick event  │
       │	    │			│ with the specified  │
       │	    │			│ payload	      │
       ├────────────┼───────────────────┼─────────────────────┤
       │    11	    │	    SYNC	│ Replies failure     │
       │	    │			│ object for i3       │
       │	    │			│ compatibility       │
       ├────────────┼───────────────────┼─────────────────────┤
       │    12	    │ GET_BINDING_STATE │ Request the current │
       │	    │			│ binding state, e.g. │
       │	    │			│ the currently       │
       │	    │			│ active binding mode │
       │	    │			│ name. 	      │
       ├────────────┼───────────────────┼─────────────────────┤
       │    100     │	 GET_INPUTS	│ Get the list of     │
       │	    │			│ input devices       │
       ├────────────┼───────────────────┼─────────────────────┤
       │    101     │	  GET_SEATS	│ Get the list of     │
       │	    │			│ seats 	      │
       └────────────┴───────────────────┴─────────────────────┘

   0. RUN_COMMAND
       MESSAGE
       Parses and runs the payload as sway commands

       REPLY
       An array of objects corresponding to each command that was parsed. Each
       object has the property success, which is a boolean indicating whether
       the command was successful. The object may also contain the properties
       error and parse_error. The error property is a human readable error
       message while parse_error is a boolean indicating whether the reason
       the command failed was because the command was unknown or not able to
       be parsed.

       Example Reply:
	   [
		{
		     "success": true
		},
		{
		     "success": false,
		     "parse_error": true,
		     "error": "Invalid/unknown command"
		}
	   ]

   1. GET_WORKSPACES
       MESSAGE
       Retrieves the list of workspaces.

       REPLY
       The reply is an array of objects corresponding to each workspace. Each
       object has the following properties:

       ┌─────────┬───────────┬─────────────────────┐
       │PROPERTY │ DATA TYPE │	   DESCRIPTION	   │
       ├─────────┼───────────┼─────────────────────┤
       │  num	 │  integer  │ The workspace	   │
       │	 │	     │ number or -1 for    │
       │	 │	     │ workspaces that do  │
       │	 │	     │ not start with a    │
       │	 │	     │ number		   │
       ├─────────┼───────────┼─────────────────────┤
       │  name	 │  string   │ The name of the	   │
       │	 │	     │ workspace	   │
       ├─────────┼───────────┼─────────────────────┤
       │visible  │  boolean  │ Whether the	   │
       │	 │	     │ workspace is	   │
       │	 │	     │ currently visible   │
       │	 │	     │ on any output	   │
       ├─────────┼───────────┼─────────────────────┤
       │focused  │  boolean  │ Whether the	   │
       │	 │	     │ workspace is	   │
       │	 │	     │ currently focused   │
       │	 │	     │ by the default seat │
       │	 │	     │ (seat0)		   │
       ├─────────┼───────────┼─────────────────────┤
       │ urgent  │  boolean  │ Whether a view on   │
       │	 │	     │ the workspace has   │
       │	 │	     │ the urgent flag set │
       ├─────────┼───────────┼─────────────────────┤
       │  rect	 │  object   │ The bounds of the   │
       │	 │	     │ workspace. It	   │
       │	 │	     │ consists of x, y,   │
       │	 │	     │ width, and height   │
       ├─────────┼───────────┼─────────────────────┤
       │ output  │  string   │ The name of the	   │
       │	 │	     │ output that the	   │
       │	 │	     │ workspace is on	   │
       └─────────┴───────────┴─────────────────────┘

       Example Reply:
	   [
		{
		     "num": 1,
		     "name": "1",
		     "visible": true,
		     "focused": true,
		     "rect": {
			  "x": 0,
			  "y": 23,
			  "width": 1920,
			  "height": 1057
		     },
		     "output": "eDP-1"
		},
	   ]

   2. SUBSCRIBE
       MESSAGE
       Subscribe this IPC connection to the event types specified in the
       message payload. The payload should be a valid JSON array of events.
       See the EVENTS section for the list of supported events.

       REPLY
       A single object that contains the property success, which is a boolean
       value indicating whether the subscription was successful or not.

       Example Reply:
	   {
		"success": true
	   }

   3. GET_OUTPUTS
       MESSAGE
       Retrieve the list of outputs

       REPLY
       An array of objects corresponding to each output. Each object has the
       following properties:

       ┌──────────────────┬───────────┬─────────────────────┐
       │    PROPERTY	  │ DATA TYPE │     DESCRIPTION     │
       ├──────────────────┼───────────┼─────────────────────┤
       │      name	  │  string   │ The name of the     │
       │		  │	      │ output. On DRM,     │
       │		  │	      │ this is the	    │
       │		  │	      │ connector	    │
       ├──────────────────┼───────────┼─────────────────────┤
       │      make	  │  string   │ The make of the     │
       │		  │	      │ output		    │
       ├──────────────────┼───────────┼─────────────────────┤
       │      model	  │  string   │ The model of the    │
       │		  │	      │ output		    │
       ├──────────────────┼───────────┼─────────────────────┤
       │     serial	  │  string   │ The output's serial │
       │		  │	      │ number as a	    │
       │		  │	      │ hexadecimal string  │
       ├──────────────────┼───────────┼─────────────────────┤
       │     active	  │  boolean  │ Whether this output │
       │		  │	      │ is active/enabled   │
       ├──────────────────┼───────────┼─────────────────────┤
       │      dpms	  │  boolean  │ (Deprecated, use    │
       │		  │	      │ power instead)	    │
       │		  │	      │ Whether this output │
       │		  │	      │ is on/off (via	    │
       │		  │	      │ DPMS)		    │
       ├──────────────────┼───────────┼─────────────────────┤
       │      power	  │  boolean  │ Whether this output │
       │		  │	      │ is on/off	    │
       ├──────────────────┼───────────┼─────────────────────┤
       │     primary	  │  boolean  │ For i3		    │
       │		  │	      │ compatibility, this │
       │		  │	      │ will be false. It   │
       │		  │	      │ does not make sense │
       │		  │	      │ in Wayland	    │
       ├──────────────────┼───────────┼─────────────────────┤
       │      scale	  │   float   │ The scale currently │
       │		  │	      │ in use on the	    │
       │		  │	      │ output or -1 for    │
       │		  │	      │ disabled outputs    │
       ├──────────────────┼───────────┼─────────────────────┤
       │subpixel_hinting  │  string   │ The subpixel	    │
       │		  │	      │ hinting current in  │
       │		  │	      │ use on the output.  │
       │		  │	      │ This can be rgb,    │
       │		  │	      │ bgr, vrgb, vbgr, or │
       │		  │	      │ none		    │
       ├──────────────────┼───────────┼─────────────────────┤
       │    transform	  │  string   │ The transform	    │
       │		  │	      │ currently in use    │
       │		  │	      │ for the output.     │
       │		  │	      │ This can be normal, │
       │		  │	      │ 90, 180, 270,	    │
       │		  │	      │ flipped-90,	    │
       │		  │	      │ flipped-180, or     │
       │		  │	      │ flipped-270	    │
       ├──────────────────┼───────────┼─────────────────────┤
       │current_workspace │  string   │ The workspace	    │
       │		  │	      │ currently visible   │
       │		  │	      │ on the output or    │
       │		  │	      │ null for disabled   │
       │		  │	      │ outputs 	    │
       ├──────────────────┼───────────┼─────────────────────┤
       │      modes	  │   array   │ An array of	    │
       │		  │	      │ supported mode	    │
       │		  │	      │ objects. Each	    │
       │		  │	      │ object contains     │
       │		  │	      │ width, height, and  │
       │		  │	      │ refresh 	    │
       ├──────────────────┼───────────┼─────────────────────┤
       │  current_mode	  │  object   │ An object	    │
       │		  │	      │ representing the    │
       │		  │	      │ current mode	    │
       │		  │	      │ containing width,   │
       │		  │	      │ height, and refresh │
       ├──────────────────┼───────────┼─────────────────────┤
       │      rect	  │  object   │ The bounds for the  │
       │		  │	      │ output consisting   │
       │		  │	      │ of x, y, width, and │
       │		  │	      │ height		    │
       └──────────────────┴───────────┴─────────────────────┘

       Example Reply:
	   [
		{
		     "name": "HDMI-A-2",
		     "make": "Unknown",
		     "model": "NS-19E310A13",
		     "serial": "0x00000001",
		     "active": true,
		     "primary": false,
		     "scale": 1.0,
		     "subpixel_hinting": "rgb",
		     "transform": "normal",
		     "current_workspace": "1",
		     "modes": [
			  {
			       "width": 640,
			       "height": 480,
			       "refresh": 59940
			  },
			  {
			       "width": 800,
			       "height": 600,
			       "refresh": 60317
			  },
			  {
			       "width": 1024,
			       "height": 768,
			       "refresh": 60004
			  },
			  {
			       "width": 1920,
			       "height": 1080,
			       "refresh": 60000
			  }
		     ],
		     "current_mode": {
			  "width": 1920,
			  "height": 1080,
			  "refresh": 60000
		     }
		}
	   ]

   4. GET_TREE
       MESSAGE
       Retrieve a JSON representation of the tree

       REPLY
       An array of objects that represent the current tree. Each object
       represents one node and will have the following properties:

       ┌─────────────────────┬───────────┬─────────────────────┐
       │      PROPERTY	     │ DATA TYPE │     DESCRIPTION     │
       ├─────────────────────┼───────────┼─────────────────────┤
       │	 id	     │	integer  │ The internal unique │
       │		     │		 │ ID for this node    │
       ├─────────────────────┼───────────┼─────────────────────┤
       │	name	     │	string	 │ The name of the     │
       │		     │		 │ node such as the    │
       │		     │		 │ output name or      │
       │		     │		 │ window title. For   │
       │		     │		 │ the scratchpad,     │
       │		     │		 │ this will be        │
       │		     │		 │ __i3_scratch for    │
       │		     │		 │ compatibility with  │
       │		     │		 │ i3.		       │
       ├─────────────────────┼───────────┼─────────────────────┤
       │	type	     │	string	 │ The node type. It   │
       │		     │		 │ can be root,        │
       │		     │		 │ output, workspace,  │
       │		     │		 │ con, or	       │
       │		     │		 │ floating_con        │
       ├─────────────────────┼───────────┼─────────────────────┤
       │       border	     │	string	 │ The border style    │
       │		     │		 │ for the node. It    │
       │		     │		 │ can be normal,      │
       │		     │		 │ none, pixel, or csd │
       ├─────────────────────┼───────────┼─────────────────────┤
       │current_border_width │	integer  │ Number of pixels    │
       │		     │		 │ used for the border │
       │		     │		 │ width	       │
       ├─────────────────────┼───────────┼─────────────────────┤
       │       layout	     │	string	 │ The node's layout.  │
       │		     │		 │ It can either be    │
       │		     │		 │ splith, splitv,     │
       │		     │		 │ stacked, tabbed, or │
       │		     │		 │ output	       │
       ├─────────────────────┼───────────┼─────────────────────┤
       │    orientation      │	string	 │ The node's	       │
       │		     │		 │ orientation. It can │
       │		     │		 │ be vertical,        │
       │		     │		 │ horizontal, or none │
       ├─────────────────────┼───────────┼─────────────────────┤
       │      percent	     │	 float	 │ The percentage of   │
       │		     │		 │ the node's parent   │
       │		     │		 │ that it takes up or │
       │		     │		 │ null for the root   │
       │		     │		 │ and other special   │
       │		     │		 │ nodes such as the   │
       │		     │		 │ scratchpad	       │
       ├─────────────────────┼───────────┼─────────────────────┤
       │	rect	     │	object	 │ The absolute        │
       │		     │		 │ geometry of the     │
       │		     │		 │ node. The window    │
       │		     │		 │ decorations are     │
       │		     │		 │ excluded from this, │
       │		     │		 │ but borders are     │
       │		     │		 │ included.	       │
       ├─────────────────────┼───────────┼─────────────────────┤
       │    window_rect      │	object	 │ The geometry of the │
       │		     │		 │ content inside the  │
       │		     │		 │ node. These	       │
       │		     │		 │ coordinates are     │
       │		     │		 │ relative to the     │
       │		     │		 │ node itself. Window │
       │		     │		 │ decorations and     │
       │		     │		 │ borders are outside │
       │		     │		 │ the window_rect     │
       ├─────────────────────┼───────────┼─────────────────────┤
       │     deco_rect	     │	object	 │ The geometry of the │
       │		     │		 │ decorations for the │
       │		     │		 │ node relative to    │
       │		     │		 │ the parent node     │
       ├─────────────────────┼───────────┼─────────────────────┤
       │      geometry	     │	object	 │ The natural	       │
       │		     │		 │ geometry of the     │
       │		     │		 │ contents if it were │
       │		     │		 │ to size itself      │
       ├─────────────────────┼───────────┼─────────────────────┤
       │       urgent	     │	boolean  │ Whether the node or │
       │		     │		 │ any of its	       │
       │		     │		 │ descendants has the │
       │		     │		 │ urgent hint set.    │
       │		     │		 │ Note: This may not  │
       │		     │		 │ exist when compiled │
       │		     │		 │ without xwayland    │
       │		     │		 │ support	       │
       ├─────────────────────┼───────────┼─────────────────────┤
       │       sticky	     │	boolean  │ Whether the node is │
       │		     │		 │ sticky (shows on    │
       │		     │		 │ all workspaces)     │
       ├─────────────────────┼───────────┼─────────────────────┤
       │       marks	     │	 array	 │ List of marks       │
       │		     │		 │ assigned to the     │
       │		     │		 │ node 	       │
       ├─────────────────────┼───────────┼─────────────────────┤
       │      focused	     │	boolean  │ Whether the node is │
       │		     │		 │ currently focused   │
       │		     │		 │ by the default seat │
       │		     │		 │ (seat0)	       │
       ├─────────────────────┼───────────┼─────────────────────┤
       │       focus	     │	 array	 │ Array of child node │
       │		     │		 │ IDs in the current  │
       │		     │		 │ focus order	       │
       ├─────────────────────┼───────────┼─────────────────────┤
       │       nodes	     │	 array	 │ The tiling children │
       │		     │		 │ nodes for the node  │
       ├─────────────────────┼───────────┼─────────────────────┤
       │   floating_nodes    │	 array	 │ The floating        │
       │		     │		 │ children nodes for  │
       │		     │		 │ the node	       │
       ├─────────────────────┼───────────┼─────────────────────┤
       │   representation    │	string	 │ (Only workspaces) A │
       │		     │		 │ string	       │
       │		     │		 │ representation of   │
       │		     │		 │ the layout of the   │
       │		     │		 │ workspace that can  │
       │		     │		 │ be used as an aid   │
       │		     │		 │ in submitting       │
       │		     │		 │ reproduction steps  │
       │		     │		 │ for bug reports     │
       ├─────────────────────┼───────────┼─────────────────────┤
       │  fullscreen_mode    │	integer  │ (Only containers    │
       │		     │		 │ and views) The      │
       │		     │		 │ fullscreen mode of  │
       │		     │		 │ the node. 0 means   │
       │		     │		 │ none, 1 means full  │
       │		     │		 │ workspace, and 2    │
       │		     │		 │ means global        │
       │		     │		 │ fullscreen	       │
       ├─────────────────────┼───────────┼─────────────────────┤
       │      floating	     │	string	 │ Floating state of   │
       │		     │		 │ container. Can be   │
       │		     │		 │ either "auto_off"   │
       │		     │		 │ or "user_on"        │
       ├─────────────────────┼───────────┼─────────────────────┤
       │  scratchpad_state   │	string	 │ Whether the window  │
       │		     │		 │ is in the	       │
       │		     │		 │ scratchpad. Can be  │
       │		     │		 │ either "none" or    │
       │		     │		 │ "fresh"	       │
       ├─────────────────────┼───────────┼─────────────────────┤
       │       app_id	     │	string	 │ (Only views) For an │
       │		     │		 │ xdg-shell view, the │
       │		     │		 │ name of the	       │
       │		     │		 │ application, if     │
       │		     │		 │ set. Otherwise,     │
       │		     │		 │ null 	       │
       ├─────────────────────┼───────────┼─────────────────────┤
       │	pid	     │	integer  │ (Only views) The    │
       │		     │		 │ PID of the	       │
       │		     │		 │ application that    │
       │		     │		 │ owns the view       │
       ├─────────────────────┼───────────┼─────────────────────┤
       │      visible	     │	boolean  │ (Only views)        │
       │		     │		 │ Whether the node is │
       │		     │		 │ visible	       │
       ├─────────────────────┼───────────┼─────────────────────┤
       │       shell	     │	string	 │ (Only views) The    │
       │		     │		 │ shell of the view,  │
       │		     │		 │ such as xdg_shell   │
       │		     │		 │ or xwayland	       │
       ├─────────────────────┼───────────┼─────────────────────┤
       │    inhibit_idle     │	boolean  │ (Only views)        │
       │		     │		 │ Whether the view is │
       │		     │		 │ inhibiting the idle │
       │		     │		 │ state	       │
       ├─────────────────────┼───────────┼─────────────────────┤
       │  idle_inhibitors    │	object	 │ (Only views) An     │
       │		     │		 │ object containing   │
       │		     │		 │ the state of the    │
       │		     │		 │ application and     │
       │		     │		 │ user idle	       │
       │		     │		 │ inhibitors.	       │
       │		     │		 │ application can be  │
       │		     │		 │ enabled or none.    │
       │		     │		 │ user can be focus,  │
       │		     │		 │ fullscreen, open,   │
       │		     │		 │ visible or none.    │
       ├─────────────────────┼───────────┼─────────────────────┤
       │       window	     │	integer  │ (Only xwayland      │
       │		     │		 │ views) The X11      │
       │		     │		 │ window ID for the   │
       │		     │		 │ xwayland view       │
       ├─────────────────────┼───────────┼─────────────────────┤
       │ window_properties   │	object	 │ (Only xwayland      │
       │		     │		 │ views) An object    │
       │		     │		 │ containing the      │
       │		     │		 │ title, class,       │
       │		     │		 │ instance,	       │
       │		     │		 │ window_role,        │
       │		     │		 │ window_type, and    │
       │		     │		 │ transient_for for   │
       │		     │		 │ the view	       │
       └─────────────────────┴───────────┴─────────────────────┘

       Example Reply:
	   {
		"id": 1,
		"name": "root",
		"rect": {
		     "x": 0,
		     "y": 0,
		     "width": 1920,
		     "height": 1080
		},
		"focused": false,
		"focus": [
		     3
		],
		"border": "none",
		"current_border_width": 0,
		"layout": "splith",
		"orientation": "horizontal",
		"percent": null,
		"window_rect": {
		     "x": 0,
		     "y": 0,
		     "width": 0,
		     "height": 0
		},
		"deco_rect": {
		     "x": 0,
		     "y": 0,
		     "width": 0,
		     "height": 0
		},
		"geometry": {
		     "x": 0,
		     "y": 0,
		     "width": 0,
		     "height": 0
		},
		"window": null,
		"urgent": false,
		"floating_nodes": [
		],
		"sticky": false,
		"type": "root",
		"nodes": [
		     {
			  "id": 2147483647,
			  "name": "__i3",
			  "rect": {
			       "x": 0,
			       "y": 0,
			       "width": 1920,
			       "height": 1080
			  },
			  "focused": false,
			  "focus": [
			       2147483646
			  ],
			  "border": "none",
			  "current_border_width": 0,
			  "layout": "output",
			  "orientation": "horizontal",
			  "percent": null,
			  "window_rect": {
			       "x": 0,
			       "y": 0,
			       "width": 0,
			       "height": 0
			  },
			  "deco_rect": {
			       "x": 0,
			       "y": 0,
			       "width": 0,
			       "height": 0
			  },
			  "geometry": {
			       "x": 0,
			       "y": 0,
			       "width": 0,
			       "height": 0
			  },
			  "window": null,
			  "urgent": false,
			  "floating_nodes": [
			  ],
			  "sticky": false,
			  "type": "output",
			  "nodes": [
			       {
				    "id": 2147483646,
				    "name": "__i3_scratch",
				    "rect": {
					 "x": 0,
					 "y": 0,
					 "width": 1920,
					 "height": 1080
				    },
				    "focused": false,
				    "focus": [
				    ],
				    "border": "none",
				    "current_border_width": 0,
				    "layout": "splith",
				    "orientation": "horizontal",
				    "percent": null,
				    "window_rect": {
					 "x": 0,
					 "y": 0,
					 "width": 0,
					 "height": 0
				    },
				    "deco_rect": {
					 "x": 0,
					 "y": 0,
					 "width": 0,
					 "height": 0
				    },
				    "geometry": {
					 "x": 0,
					 "y": 0,
					 "width": 0,
					 "height": 0
				    },
				    "window": null,
				    "urgent": false,
				    "floating_nodes": [
				    ],
				    "sticky": false,
				    "type": "workspace"
			       }
			  ]
		     },
		     {
			  "id": 3,
			  "name": "eDP-1",
			  "rect": {
			       "x": 0,
			       "y": 0,
			       "width": 1920,
			       "height": 1080
			  },
			  "focused": false,
			  "focus": [
			       4
			  ],
			  "border": "none",
			  "current_border_width": 0,
			  "layout": "output",
			  "orientation": "none",
			  "percent": 1.0,
			  "window_rect": {
			       "x": 0,
			       "y": 0,
			       "width": 0,
			       "height": 0
			  },
			  "deco_rect": {
			       "x": 0,
			       "y": 0,
			       "width": 0,
			       "height": 0
			  },
			  "geometry": {
			       "x": 0,
			       "y": 0,
			       "width": 0,
			       "height": 0
			  },
			  "window": null,
			  "urgent": false,
			  "floating_nodes": [
			  ],
			  "sticky": false,
			  "type": "output",
			  "active": true,
			  "primary": false,
			  "make": "Unknown",
			  "model": "0x38ED",
			  "serial": "0x00000000",
			  "scale": 1.0,
			  "transform": "normal",
			  "current_workspace": "1",
			  "modes": [
			       {
				    "width": 1920,
				    "height": 1080,
				    "refresh": 60052
			       }
			  ],
			  "current_mode": {
			       "width": 1920,
			       "height": 1080,
			       "refresh": 60052
			  },
			  "nodes": [
			       {
				    "id": 4,
				    "name": "1",
				    "rect": {
					 "x": 0,
					 "y": 23,
					 "width": 1920,
					 "height": 1057
				    },
				    "focused": false,
				    "focus": [
					 6,
					 5
				    ],
				    "border": "none",
				    "current_border_width": 0,
				    "layout": "splith",
				    "orientation": "horizontal",
				    "percent": null,
				    "window_rect": {
					 "x": 0,
					 "y": 0,
					 "width": 0,
					 "height": 0
				    },
				    "deco_rect": {
					 "x": 0,
					 "y": 0,
					 "width": 0,
					 "height": 0
				    },
				    "geometry": {
					 "x": 0,
					 "y": 0,
					 "width": 0,
					 "height": 0
				    },
				    "window": null,
				    "urgent": false,
				    "floating_nodes": [
				    ],
				    "sticky": false,
				    "num": 1,
				    "output": "eDP-1",
				    "type": "workspace",
				    "representation": "H[URxvt termite]",
				    "nodes": [
					 {
					      "id": 5,
					      "name": "urxvt",
					      "rect": {
						   "x": 0,
						   "y": 23,
						   "width": 960,
						   "height": 1057
					      },
					      "focused": false,
					      "focus": [
					      ],
					      "border": "normal",
					      "current_border_width": 2,
					      "layout": "none",
					      "orientation": "none",
					      "percent": 0.5,
					      "window_rect": {
						   "x": 2,
						   "y": 0,
						   "width": 956,
						   "height": 1030
					      },
					      "deco_rect": {
						   "x": 0,
						   "y": 0,
						   "width": 960,
						   "height": 25
					      },
					      "geometry": {
						   "x": 0,
						   "y": 0,
						   "width": 1124,
						   "height": 422
					      },
					      "window": 4194313,
					      "urgent": false,
					      "floating_nodes": [
					      ],
					      "sticky": false,
					      "type": "con",
					      "fullscreen_mode": 0,
					      "pid": 23959,
					      "app_id": null,
					      "visible": true,
					      "shell": "xwayland",
					      "inhibit_idle": true,
					      "idle_inhibitors": {
						   "application": "none",
						   "user": "visible",
					      },
					      "window_properties": {
						   "class": "URxvt",
						   "instance": "urxvt",
						   "title": "urxvt",
						   "transient_for": null
					      },
					      "nodes": [
					      ]
					 },
					 {
					      "id": 6,
					      "name": "",
					      "rect": {
						   "x": 960,
						   "y": 23,
						   "width": 960,
						   "height": 1057
					      },
					      "focused": true,
					      "focus": [
					      ],
					      "border": "normal",
					      "current_border_width": 2,
					      "layout": "none",
					      "orientation": "none",
					      "percent": 0.5,
					      "window_rect": {
						   "x": 2,
						   "y": 0,
						   "width": 956,
						   "height": 1030
					      },
					      "deco_rect": {
						   "x": 0,
						   "y": 0,
						   "width": 960,
						   "height": 25
					      },
					      "geometry": {
						   "x": 0,
						   "y": 0,
						   "width": 817,
						   "height": 458
					      },
					      "window": null,
					      "urgent": false,
					      "floating_nodes": [
					      ],
					      "sticky": false,
					      "type": "con",
					      "fullscreen_mode": 0,
					      "pid": 25370,
					      "app_id": "termite",
					      "visible": true,
					      "shell": "xdg_shell",
					      "inhibit_idle": false,
					      "idle_inhibitors": {
						   "application": "none",
						   "user": "fullscreen",
					      },
					      "nodes": [
					      ]
					 }
				    ]
			       }
			  ]
		     }
		]
	   }

   5. GET_MARKS
       MESSAGE
       Retrieve the currently set marks

       REPLY
       An array of marks current set. Since each mark can only be set for one
       container, this is a set so each value is unique and the order is
       undefined.

       Example Reply:
	   [
		"one",
		"test"
	   ]

   6. GET_BAR_CONFIG (WITHOUT A PAYLOAD)
       MESSAGE
       When sending without a payload, this retrieves the list of configured
       bar IDs

       REPLY
       An array of bar IDs, which are strings

       Example Reply:
	   [
		"bar-0",
		"bar-1"
	   ]

   6. GET_BAR_CONFIG (WITH A PAYLOAD)
       MESSAGE
       When sent with a bar ID as the payload, this retrieves the config
       associated with the specified by the bar ID in the payload. This is
       used by swaybar, but could also be used for third party bars

       REPLY
       An object that represents the configuration for the bar with the bar ID
       sent as the payload. The following properties exists and more
       information about what their value mean can be found in sway-bar(5):

       ┌───────────────────────┬───────────┬─────────────────────┐
       │       PROPERTY        │ DATA TYPE │	 DESCRIPTION	 │
       ├───────────────────────┼───────────┼─────────────────────┤
       │	  id	       │  string   │ The bar ID 	 │
       ├───────────────────────┼───────────┼─────────────────────┤
       │	 mode	       │  string   │ The mode for the	 │
       │		       │	   │ bar. It can be	 │
       │		       │	   │ dock, hide, or	 │
       │		       │	   │ invisible		 │
       ├───────────────────────┼───────────┼─────────────────────┤
       │       position        │  string   │ The bar's position. │
       │		       │	   │ It can currently	 │
       │		       │	   │ either be bottom or │
       │		       │	   │ top		 │
       ├───────────────────────┼───────────┼─────────────────────┤
       │    status_command     │  string   │ The command which	 │
       │		       │	   │ should be run to	 │
       │		       │	   │ generate the status │
       │		       │	   │ line		 │
       ├───────────────────────┼───────────┼─────────────────────┤
       │	 font	       │  string   │ The font to use for │
       │		       │	   │ the text on the bar │
       ├───────────────────────┼───────────┼─────────────────────┤
       │  workspace_buttons    │  boolean  │ Whether to display  │
       │		       │	   │ the workspace	 │
       │		       │	   │ buttons on the bar  │
       ├───────────────────────┼───────────┼─────────────────────┤
       │ workspace_min_width   │  integer  │ Minimum width in px │
       │		       │	   │ for the workspace	 │
       │		       │	   │ buttons on the bar  │
       ├───────────────────────┼───────────┼─────────────────────┤
       │binding_mode_indicator │  boolean  │ Whether to display  │
       │		       │	   │ the current binding │
       │		       │	   │ mode on the bar	 │
       ├───────────────────────┼───────────┼─────────────────────┤
       │       verbose	       │  boolean  │ For i3		 │
       │		       │	   │ compatibility, this │
       │		       │	   │ will be the boolean │
       │		       │	   │ value false.	 │
       ├───────────────────────┼───────────┼─────────────────────┤
       │	colors	       │  object   │ An object		 │
       │		       │	   │ containing the	 │
       │		       │	   │ #RRGGBBAA colors to │
       │		       │	   │ use for the bar.	 │
       │		       │	   │ See below for more  │
       │		       │	   │ information	 │
       ├───────────────────────┼───────────┼─────────────────────┤
       │	 gaps	       │  object   │ An object		 │
       │		       │	   │ representing the	 │
       │		       │	   │ gaps for the bar	 │
       │		       │	   │ consisting of top,  │
       │		       │	   │ right, bottom, and  │
       │		       │	   │ left.		 │
       ├───────────────────────┼───────────┼─────────────────────┤
       │      bar_height       │  integer  │ The absolute height │
       │		       │	   │ to use for the bar  │
       │		       │	   │ or 0 to		 │
       │		       │	   │ automatically size  │
       │		       │	   │ based on the font	 │
       ├───────────────────────┼───────────┼─────────────────────┤
       │    status_padding     │  integer  │ The vertical	 │
       │		       │	   │ padding to use for  │
       │		       │	   │ the status line	 │
       ├───────────────────────┼───────────┼─────────────────────┤
       │ status_edge_padding   │  integer  │ The horizontal	 │
       │		       │	   │ padding to use for  │
       │		       │	   │ the status line	 │
       │		       │	   │ when at the end of  │
       │		       │	   │ an output		 │
       └───────────────────────┴───────────┴─────────────────────┘

       The colors object contains the following properties, which are all
       strings containing the #RRGGBBAA representation of the color:

       ┌──────────────────────────┬────────────────────────────┐
       │	PROPERTY	  │	   DESCRIPTION	       │
       ├──────────────────────────┼────────────────────────────┤
       │       background	  │ The color to use for the   │
       │			  │ bar background on	       │
       │			  │ unfocused outputs	       │
       ├──────────────────────────┼────────────────────────────┤
       │       statusline	  │ The color to use for the   │
       │			  │ status line text on        │
       │			  │ unfocused outputs	       │
       ├──────────────────────────┼────────────────────────────┤
       │	separator	  │ The color to use for the   │
       │			  │ separator text on	       │
       │			  │ unfocused outputs	       │
       ├──────────────────────────┼────────────────────────────┤
       │   focused_background	  │ The color to use for the   │
       │			  │ background of the bar on   │
       │			  │ the focused output	       │
       ├──────────────────────────┼────────────────────────────┤
       │   focused_statusline	  │ The color to use for the   │
       │			  │ status line text on the    │
       │			  │ focused output	       │
       ├──────────────────────────┼────────────────────────────┤
       │    focused_separator	  │ The color to use for the   │
       │			  │ separator text on the      │
       │			  │ focused output	       │
       ├──────────────────────────┼────────────────────────────┤
       │ focused_workspace_text   │ The color to use for the   │
       │			  │ text of the focused        │
       │			  │ workspace button	       │
       ├──────────────────────────┼────────────────────────────┤
       │  focused_workspace_bg	  │ The color to use for the   │
       │			  │ background of the focused  │
       │			  │ workspace button	       │
       ├──────────────────────────┼────────────────────────────┤
       │focused_workspace_border  │ The color to use for the   │
       │			  │ border of the focused      │
       │			  │ workspace button	       │
       ├──────────────────────────┼────────────────────────────┤
       │  active_workspace_text   │ The color to use for the   │
       │			  │ text of the workspace      │
       │			  │ buttons for the visible    │
       │			  │ workspaces on unfocused    │
       │			  │ outputs		       │
       ├──────────────────────────┼────────────────────────────┤
       │   active_workspace_bg	  │ The color to use for the   │
       │			  │ background of the	       │
       │			  │ workspace buttons for the  │
       │			  │ visible workspaces on      │
       │			  │ unfocused outputs	       │
       ├──────────────────────────┼────────────────────────────┤
       │ active_workspace_border  │ The color to use for the   │
       │			  │ border of the workspace    │
       │			  │ buttons for the visible    │
       │			  │ workspaces on unfocused    │
       │			  │ outputs		       │
       ├──────────────────────────┼────────────────────────────┤
       │ inactive_workspace_text  │ The color to use for the   │
       │			  │ text of the workspace      │
       │			  │ buttons for workspaces     │
       │			  │ that are not visible       │
       ├──────────────────────────┼────────────────────────────┤
       │  inactive_workspace_bg   │ The color to use for the   │
       │			  │ background of the	       │
       │			  │ workspace buttons for      │
       │			  │ workspaces that are not    │
       │			  │ visible		       │
       ├──────────────────────────┼────────────────────────────┤
       │inactive_workspace_border │ The color to use for the   │
       │			  │ border of the workspace    │
       │			  │ buttons for workspaces     │
       │			  │ that are not visible       │
       ├──────────────────────────┼────────────────────────────┤
       │  urgent_workspace_text   │ The color to use for the   │
       │			  │ text of the workspace      │
       │			  │ buttons for workspaces     │
       │			  │ that contain an urgent     │
       │			  │ view		       │
       ├──────────────────────────┼────────────────────────────┤
       │   urgent_workspace_bg	  │ The color to use for the   │
       │			  │ background of the	       │
       │			  │ workspace buttons for      │
       │			  │ workspaces that contain an │
       │			  │ urgent view 	       │
       ├──────────────────────────┼────────────────────────────┤
       │ urgent_workspace_border  │ The color to use for the   │
       │			  │ border of the workspace    │
       │			  │ buttons for workspaces     │
       │			  │ that contain an urgent     │
       │			  │ view		       │
       ├──────────────────────────┼────────────────────────────┤
       │    binding_mode_text	  │ The color to use for the   │
       │			  │ text of the binding mode   │
       │			  │ indicator		       │
       ├──────────────────────────┼────────────────────────────┤
       │     binding_mode_bg	  │ The color to use for the   │
       │			  │ background of the binding  │
       │			  │ mode indicator	       │
       ├──────────────────────────┼────────────────────────────┤
       │   binding_mode_border	  │ The color to use for the   │
       │			  │ border of the binding mode │
       │			  │ indicator		       │
       └──────────────────────────┴────────────────────────────┘

       Example Reply:
	   {
		"id": "bar-0",
		"mode": "dock",
		"position": "top",
		"status_command": "while date +'%Y-%m-%d %l:%M:%S %p'; do sleep 1; done",
		"font": "monospace 10",
		"gaps": {
		     "top": 0,
		     "right": 0,
		     "bottom": 0,
		     "left": 0
		},
		"bar_height": 0,
		"status_padding": 1,
		"status_edge_padding": 3,
		"workspace_buttons": true,
		"workspace_min_width": 0,
		"binding_mode_indicator": true,
		"verbose": false,
		"pango_markup": false,
		"colors": {
		     "background": "#323232ff",
		     "statusline": "#ffffffff",
		     "separator": "#666666ff",
		     "focused_background": "#323232ff",
		     "focused_statusline": "#ffffffff",
		     "focused_separator": "#666666ff",
		     "focused_workspace_border": "#4c7899ff",
		     "focused_workspace_bg": "#285577ff",
		     "focused_workspace_text": "#ffffffff",
		     "inactive_workspace_border": "#32323200",
		     "inactive_workspace_bg": "#32323200",
		     "inactive_workspace_text": "#5c5c5cff",
		     "active_workspace_border": "#333333ff",
		     "active_workspace_bg": "#5f676aff",
		     "active_workspace_text": "#ffffffff",
		     "urgent_workspace_border": "#2f343aff",
		     "urgent_workspace_bg": "#900000ff",
		     "urgent_workspace_text": "#ffffffff",
		     "binding_mode_border": "#2f343aff",
		     "binding_mode_bg": "#900000ff",
		     "binding_mode_text": "#ffffffff"
		},
	   }

   7. GET_VERSION
       MESSAGE
       Retrieve version information about the sway process

       REPLY
       An object containing the following properties:

       ┌────────────────────────┬───────────┬─────────────────────┐
       │       PROPERTY 	│ DATA TYPE │	  DESCRIPTION	  │
       ├────────────────────────┼───────────┼─────────────────────┤
       │	 major		│  integer  │ The major version   │
       │			│	    │ of the sway process │
       ├────────────────────────┼───────────┼─────────────────────┤
       │	 minor		│  integer  │ The minor version   │
       │			│	    │ of the sway process │
       ├────────────────────────┼───────────┼─────────────────────┤
       │	 patch		│  integer  │ The patch version   │
       │			│	    │ of the sway process │
       ├────────────────────────┼───────────┼─────────────────────┤
       │    human_readable	│  string   │ A human readable	  │
       │			│	    │ version string that │
       │			│	    │ will likely contain │
       │			│	    │ more useful	  │
       │			│	    │ information such as │
       │			│	    │ the git commit	  │
       │			│	    │ short hash and git  │
       │			│	    │ branch		  │
       ├────────────────────────┼───────────┼─────────────────────┤
       │loaded_config_file_name │  string   │ The path to the	  │
       │			│	    │ loaded config file  │
       └────────────────────────┴───────────┴─────────────────────┘

       Example Reply:
	   {
		"human_readable": "1.0-rc1-117-g2f7247e0 (Feb 24 2019, branch 'master')",
		"major": 1,
		"minor": 0,
		"patch": 0,
		"loaded_config_file_name": "/home/redsoxfan/.config/sway/config"
	   }

   8. GET_BINDING_MODES
       MESSAGE
       Retrieve the list of binding modes that currently configured

       REPLY
       An array of strings, with each string being the name of a binding mode.
       This will always contain at least one mode (currently default), which
       is the default binding mode

       Example Reply:
	   [
		"default",
		"resize",
	   ]

   9. GET_CONFIG
       MESSAGE
       Retrieve the contents of the config that was last loaded

       REPLY
       An object with a single string property containing the contents of the
       config

       Example Reply:
	   {
		"config": "set $mod Mod4\nbindsym $mod+q exit\n"
	   }

   10. SEND_TICK
       MESSAGE
       Issues a TICK event to all clients subscribing to the event to ensure
       that all events prior to the tick were received. If a payload is given,
       it will be included in the TICK event

       REPLY
       A single object contains the property success, which is a boolean value
       indicating whether the TICK event was sent.

       Example Reply:
	   {
		"success": true
	   }

   11. SYNC
       MESSAGE
       For i3 compatibility, this command will just return a failure object
       since it does not make sense to implement in sway due to the X11 nature
       of the command. If you are curious about what this IPC command does in
       i3, refer to the i3 documentation.

       REPLY
       A single object that contains the property success, which is set to the
       boolean value false.

       Exact Reply:
	   {
		"success": false
	   }

   12. GET_BINDING_STATE
       MESSAGE
       Returns the currently active binding mode.

       REPLY
       A single object that contains the property name, which is set to the
       currently active binding mode as a string.

       Exact Reply:
	   {
		"name": "default"
	   }

   100. GET_INPUTS
       MESSAGE
       Retrieve a list of the input devices currently available

       REPLY
       An array of objects corresponding to each input device. Each object has
       the following properties:

       ┌────────────────────────┬───────────┬─────────────────────┐
       │       PROPERTY 	│ DATA TYPE │	  DESCRIPTION	  │
       ├────────────────────────┼───────────┼─────────────────────┤
       │      identifier	│  string   │ The identifier for  │
       │			│	    │ the input device	  │
       ├────────────────────────┼───────────┼─────────────────────┤
       │	 name		│  string   │ The human readable  │
       │			│	    │ name for the device │
       ├────────────────────────┼───────────┼─────────────────────┤
       │	vendor		│  integer  │ The vendor code for │
       │			│	    │ the input device	  │
       ├────────────────────────┼───────────┼─────────────────────┤
       │	product 	│  integer  │ The product code	  │
       │			│	    │ for the input	  │
       │			│	    │ device		  │
       ├────────────────────────┼───────────┼─────────────────────┤
       │	 type		│  string   │ The device type.	  │
       │			│	    │ Currently this can  │
       │			│	    │ be keyboard,	  │
       │			│	    │ pointer, touch,	  │
       │			│	    │ tablet_tool,	  │
       │			│	    │ tablet_pad, or	  │
       │			│	    │ switch		  │
       ├────────────────────────┼───────────┼─────────────────────┤
       │xkb_active_layout_name	│  string   │ (Only keyboards)	  │
       │			│	    │ The name of the	  │
       │			│	    │ active keyboard	  │
       │			│	    │ layout in use	  │
       ├────────────────────────┼───────────┼─────────────────────┤
       │   xkb_layout_names	│   array   │ (Only keyboards) A  │
       │			│	    │ list a layout names │
       │			│	    │ configured for the  │
       │			│	    │ keyboard		  │
       ├────────────────────────┼───────────┼─────────────────────┤
       │xkb_active_layout_index │  integer  │ (Only keyboards)	  │
       │			│	    │ The index of the	  │
       │			│	    │ active keyboard	  │
       │			│	    │ layout in use	  │
       ├────────────────────────┼───────────┼─────────────────────┤
       │     scroll_factor	│ floating  │ (Only pointers)	  │
       │			│	    │ Multiplier applied  │
       │			│	    │ on scroll event	  │
       │			│	    │ values.		  │
       ├────────────────────────┼───────────┼─────────────────────┤
       │       libinput 	│  object   │ (Only libinput	  │
       │			│	    │ devices) An object  │
       │			│	    │ describing the	  │
       │			│	    │ current device	  │
       │			│	    │ settings. See below │
       │			│	    │ for more		  │
       │			│	    │ information	  │
       └────────────────────────┴───────────┴─────────────────────┘
       The libinput object describes the device configuration for libinput
       devices. Only properties that are supported for the device will be
       added to the object. In addition to the possible options listed, all
       string properties may also be unknown, in the case that a new option is
       added to libinput. See sway-input(5) for information on the meaning of
       the possible values. The following properties will be included for
       devices that support them:

       ┌───────────────────┬───────────┬─────────────────────────────┐
       │     PROPERTY	   │ DATA TYPE │	 DESCRIPTION	     │
       ├───────────────────┼───────────┼─────────────────────────────┤
       │   send_events	   │  string   │ Whether events are being    │
       │		   │	       │ sent by the device. It can  │
       │		   │	       │ be enabled, disabled, or    │
       │		   │	       │ disabled_on_external_mouse  │
       ├───────────────────┼───────────┼─────────────────────────────┤
       │       tap	   │  string   │ Whether tap to click is     │
       │		   │	       │ enabled. It can be enabled  │
       │		   │	       │ or disabled		     │
       ├───────────────────┼───────────┼─────────────────────────────┤
       │  tap_button_map   │  string   │ The finger to button	     │
       │		   │	       │ mapping in use for tapping. │
       │		   │	       │ It can be lmr or lrm	     │
       ├───────────────────┼───────────┼─────────────────────────────┤
       │     tap_drag	   │  string   │ Whether tap-and-drag is     │
       │		   │	       │ enabled. It can be enabled  │
       │		   │	       │ or disabled		     │
       ├───────────────────┼───────────┼─────────────────────────────┤
       │  tap_drag_lock    │  string   │ Whether drag-lock is	     │
       │		   │	       │ enabled. It can be enabled  │
       │		   │	       │ or disabled		     │
       ├───────────────────┼───────────┼─────────────────────────────┤
       │   accel_speed	   │  double   │ The pointer-acceleration in │
       │		   │	       │ use			     │
       ├───────────────────┼───────────┼─────────────────────────────┤
       │  accel_profile    │  string   │ The acceleration profile in │
       │		   │	       │ use. It can be none, flat,  │
       │		   │	       │ or adaptive		     │
       ├───────────────────┼───────────┼─────────────────────────────┤
       │  natural_scroll   │  string   │ Whether natural scrolling   │
       │		   │	       │ is enabled. It can be	     │
       │		   │	       │ enabled or disabled	     │
       ├───────────────────┼───────────┼─────────────────────────────┤
       │   left_handed	   │  string   │ Whether left-handed mode is │
       │		   │	       │ enabled. It can be enabled  │
       │		   │	       │ or disabled		     │
       ├───────────────────┼───────────┼─────────────────────────────┤
       │   click_method    │  string   │ The click method in use. It │
       │		   │	       │ can be none, button_areas,  │
       │		   │	       │ or clickfinger 	     │
       ├───────────────────┼───────────┼─────────────────────────────┤
       │ click_button_map  │  string   │ The finger to button	     │
       │		   │	       │ mapping in use for	     │
       │		   │	       │ clickfinger. It can be lmr  │
       │		   │	       │ or lrm 		     │
       ├───────────────────┼───────────┼─────────────────────────────┤
       │ middle_emulation  │  string   │ Whether middle emulation is │
       │		   │	       │ enabled. It can be enabled  │
       │		   │	       │ or disabled		     │
       ├───────────────────┼───────────┼─────────────────────────────┤
       │  scroll_method    │  string   │ The scroll method in use.   │
       │		   │	       │ It can be none, two_finger, │
       │		   │	       │ edge, or on_button_down     │
       ├───────────────────┼───────────┼─────────────────────────────┤
       │  scroll_button    │	int    │ The scroll button to use    │
       │		   │	       │ when scroll_method is	     │
       │		   │	       │ on_button_down. This will   │
       │		   │	       │ be given as an input event  │
       │		   │	       │ code			     │
       ├───────────────────┼───────────┼─────────────────────────────┤
       │scroll_button_lock │  string   │ Whether scroll button lock  │
       │		   │	       │ is enabled. It can be	     │
       │		   │	       │ enabled or disabled	     │
       ├───────────────────┼───────────┼─────────────────────────────┤
       │       dwt	   │  string   │ Whether		     │
       │		   │	       │ disable-while-typing is     │
       │		   │	       │ enabled. It can be enabled  │
       │		   │	       │ or disabled		     │
       ├───────────────────┼───────────┼─────────────────────────────┤
       │       dwtp	   │  string   │ Whether		     │
       │		   │	       │ disable-while-trackpointing │
       │		   │	       │ is enabled. It can be	     │
       │		   │	       │ enabled or_disabled_	     │
       ├───────────────────┼───────────┼─────────────────────────────┤
       │calibration_matrix │   array   │ An array of 6 floats	     │
       │		   │	       │ representing the	     │
       │		   │	       │ calibration matrix for      │
       │		   │	       │ absolute devices such as    │
       │		   │	       │ touchscreens		     │
       └───────────────────┴───────────┴─────────────────────────────┘

       Example Reply:
	   [
		{
		     "identifier": "1:1:AT_Translated_Set_2_keyboard",
		     "name": "AT Translated Set 2 keyboard",
		     "vendor": 1,
		     "product": 1,
		     "type": "keyboard",
		     "xkb_active_layout_name": "English (US)",
		     "libinput": {
			  "send_events": "enabled"
		     }
		},
		{
		     "identifier": "1267:5:Elan_Touchpad",
		     "name": "Elan Touchpad",
		     "vendor": 1267,
		     "product": 5,
		     "type": "pointer",
		     "libinput": {
			  "send_events": "enabled",
			  "tap": "enabled",
			  "tap_button_map": "lmr",
			  "tap_drag": "enabled",
			  "tap_drag_lock": "disabled",
			  "accel_speed": 0.0,
			  "accel_profile": "none",
			  "natural_scroll", "disabled",
			  "left_handed": "disabled",
			  "click_method": "button_areas",
			  "middle_emulation": "disabled",
			  "scroll_method": "edge",
			  "dwt": "enabled",
			  "dwtp": "enabled"
		     }
		},
		{
		     "identifier": "3034:22494:USB2.0_VGA_UVC_WebCam:_USB2.0_V",
		     "name": "USB2.0 VGA UVC WebCam: USB2.0 V",
		     "vendor": 3034,
		     "product": 22494,
		     "type": "keyboard",
		     "xkb_active_layout_name": "English (US)",
		     "libinput": {
			  "send_events": "enabled"
		     }
		},
		{
		     "identifier": "0:3:Sleep_Button",
		     "name": "Sleep Button",
		     "vendor": 0,
		     "product": 3,
		     "type": "keyboard",
		     "xkb_active_layout_name": "English (US)",
		     "libinput": {
			  "send_events": "enabled"
		     }
		},
		{
		     "identifier": "0:5:Lid_Switch",
		     "name": "Lid Switch",
		     "vendor": 0,
		     "product": 5,
		     "type": "switch",
		     "libinput": {
			  "send_events": "enabled"
		     }
		},
		{
		     "identifier": "0:6:Video_Bus",
		     "name": "Video Bus",
		     "vendor": 0,
		     "product": 6,
		     "type": "keyboard",
		     "xkb_active_layout_name": "English (US)",
		     "libinput": {
			  "send_events": "enabled"
		     }
		},
		{
		     "identifier": "0:1:Power_Button",
		     "name": "Power Button",
		     "vendor": 0,
		     "product": 1,
		     "type": "keyboard",
		     "xkb_active_layout_name": "English (US)",
		     "libinput": {
			  "send_events": "enabled"
		     }
		}
	   ]

   101. GET_SEATS
       MESSAGE
       Retrieve a list of the seats currently configured

       REPLY
       An array of objects corresponding to each seat. There will always be at
       least one seat. Each object has the following properties:

       ┌─────────────┬───────────┬─────────────────────┐
       │  PROPERTY   │ DATA TYPE │     DESCRIPTION     │
       ├─────────────┼───────────┼─────────────────────┤
       │    name     │	string	 │ The unique name for │
       │	     │		 │ the seat	       │
       ├─────────────┼───────────┼─────────────────────┤
       │capabilities │	integer  │ The number of       │
       │	     │		 │ capabilities that   │
       │	     │		 │ the seat has        │
       ├─────────────┼───────────┼─────────────────────┤
       │   focus     │	integer  │ The id of the node  │
       │	     │		 │ currently focused   │
       │	     │		 │ by the seat or 0    │
       │	     │		 │ when the seat is    │
       │	     │		 │ not currently       │
       │	     │		 │ focused by a node   │
       │	     │		 │ (i.e. a surface     │
       │	     │		 │ layer or xwayland   │
       │	     │		 │ unmanaged has       │
       │	     │		 │ focus)	       │
       ├─────────────┼───────────┼─────────────────────┤
       │  devices    │	 array	 │ An array of input   │
       │	     │		 │ devices that are    │
       │	     │		 │ attached to the     │
       │	     │		 │ seat. Currently,    │
       │	     │		 │ this is an array of │
       │	     │		 │ objects that are    │
       │	     │		 │ identical to those  │
       │	     │		 │ returned by	       │
       │	     │		 │ GET_INPUTS	       │
       └─────────────┴───────────┴─────────────────────┘

       Example Reply:
	   [
		{
		     "name": "seat0",
		     "capabilities": 3,
		     "focus": 7,
		     "devices": [
			  {
			       "identifier": "1:1:AT_Translated_Set_2_keyboard",
			       "name": "AT Translated Set 2 keyboard",
			       "vendor": 1,
			       "product": 1,
			       "type": "keyboard",
			       "xkb_active_layout_name": "English (US)",
			       "libinput": {
				    "send_events": "enabled"
			       }
			  },
			  {
			       "identifier": "1267:5:Elan_Touchpad",
			       "name": "Elan Touchpad",
			       "vendor": 1267,
			       "product": 5,
			       "type": "pointer",
			       "libinput": {
				    "send_events": "enabled",
				    "tap": "enabled",
				    "tap_button_map": "lmr",
				    "tap_drag": "enabled",
				    "tap_drag_lock": "disabled",
				    "accel_speed": 0.0,
				    "accel_profile": "none",
				    "natural_scroll", "disabled",
				    "left_handed": "disabled",
				    "click_method": "button_areas",
				    "middle_emulation": "disabled",
				    "scroll_method": "edge",
				    "dwt": "enabled",
				    "dwtp": "enabled"
			       }
			  },
			  {
			       "identifier": "3034:22494:USB2.0_VGA_UVC_WebCam:_USB2.0_V",
			       "name": "USB2.0 VGA UVC WebCam: USB2.0 V",
			       "vendor": 3034,
			       "product": 22494,
			       "type": "keyboard",
			       "xkb_active_layout_name": "English (US)",
			       "libinput": {
				    "send_events": "enabled"
			       }
			  },
			  {
			       "identifier": "0:3:Sleep_Button",
			       "name": "Sleep Button",
			       "vendor": 0,
			       "product": 3,
			       "type": "keyboard",
			       "xkb_active_layout_name": "English (US)",
			       "libinput": {
				    "send_events": "enabled"
			       }
			  },
			  {
			       "identifier": "0:5:Lid_Switch",
			       "name": "Lid Switch",
			       "vendor": 0,
			       "product": 5,
			       "type": "switch",
			       "libinput": {
				    "send_events": "enabled"
			       }
			  },
			  {
			       "identifier": "0:6:Video_Bus",
			       "name": "Video Bus",
			       "vendor": 0,
			       "product": 6,
			       "type": "keyboard",
			       "xkb_active_layout_name": "English (US)",
			       "libinput": {
				    "send_events": "enabled"
			       }
			  },
			  {
			       "identifier": "0:1:Power_Button",
			       "name": "Power Button",
			       "vendor": 0,
			       "product": 1,
			       "type": "keyboard",
			       "xkb_active_layout_name": "English (US)",
			       "libinput": {
				    "send_events": "enabled"
			       }
			  }
		     ]
		}
	   ]

EVENTS
       Events are a way for client to get notified of changes to sway. A
       client can subscribe to any events it wants to be notified of changes
       for. The event is sent in the same format as a reply. The following
       events are currently available:

       ┌───────────┬──────────────────┬─────────────────────┐
       │EVENT TYPE │	   NAME       │     DESCRIPTION     │
       ├───────────┼──────────────────┼─────────────────────┤
       │0x80000000 │	workspace     │ Sent whenever an    │
       │	   │		      │ event involving a   │
       │	   │		      │ workspace occurs    │
       │	   │		      │ such as 	    │
       │	   │		      │ initialization of a │
       │	   │		      │ new workspace or a  │
       │	   │		      │ different workspace │
       │	   │		      │ gains focus	    │
       ├───────────┼──────────────────┼─────────────────────┤
       │0x80000001 │	  output      │ Sent when outputs   │
       │	   │		      │ are updated	    │
       ├───────────┼──────────────────┼─────────────────────┤
       │0x80000002 │	   mode       │ Sent whenever the   │
       │	   │		      │ binding mode	    │
       │	   │		      │ changes 	    │
       ├───────────┼──────────────────┼─────────────────────┤
       │0x80000003 │	  window      │ Sent whenever an    │
       │	   │		      │ event involving a   │
       │	   │		      │ view occurs such as │
       │	   │		      │ being reparented,   │
       │	   │		      │ focused, or closed  │
       ├───────────┼──────────────────┼─────────────────────┤
       │0x80000004 │ barconfig_update │ Sent whenever a bar │
       │	   │		      │ config changes	    │
       ├───────────┼──────────────────┼─────────────────────┤
       │0x80000005 │	 binding      │ Sent when a	    │
       │	   │		      │ configured binding  │
       │	   │		      │ is executed	    │
       ├───────────┼──────────────────┼─────────────────────┤
       │0x80000006 │	 shutdown     │ Sent when the ipc   │
       │	   │		      │ shuts down because  │
       │	   │		      │ sway is exiting     │
       ├───────────┼──────────────────┼─────────────────────┤
       │0x80000007 │	   tick       │ Sent when an ipc    │
       │	   │		      │ client sends a	    │
       │	   │		      │ SEND_TICK message   │
       ├───────────┼──────────────────┼─────────────────────┤
       │0x80000014 │ bar_state_update │ Send when the	    │
       │	   │		      │ visibility of a bar │
       │	   │		      │ should change due   │
       │	   │		      │ to a modifier	    │
       ├───────────┼──────────────────┼─────────────────────┤
       │0x80000015 │	  input       │ Sent when something │
       │	   │		      │ related to input    │
       │	   │		      │ devices changes     │
       └───────────┴──────────────────┴─────────────────────┘

   0x80000000. WORKSPACE
       Sent whenever a change involving a workspace occurs. The event consists
       of a single object with the following properties:

       ┌─────────┬───────────┬─────────────────────┐
       │PROPERTY │ DATA TYPE │	   DESCRIPTION	   │
       ├─────────┼───────────┼─────────────────────┤
       │ change  │  string   │ The type of change  │
       │	 │	     │ that occurred. See  │
       │	 │	     │ below for more	   │
       │	 │	     │ information	   │
       ├─────────┼───────────┼─────────────────────┤
       │current  │  object   │ An object	   │
       │	 │	     │ representing the    │
       │	 │	     │ workspace effected  │
       │	 │	     │ or null for reload  │
       │	 │	     │ changes		   │
       ├─────────┼───────────┼─────────────────────┤
       │  old	 │  object   │ For a focus change, │
       │	 │	     │ this is will be an  │
       │	 │	     │ object representing │
       │	 │	     │ the workspace being │
       │	 │	     │ switched from.	   │
       │	 │	     │ Otherwise, it is    │
       │	 │	     │ null		   │
       └─────────┴───────────┴─────────────────────┘

       The following change types are currently available:

       ┌───────┬────────────────────────────┐
       │ TYPE  │	DESCRIPTION	    │
       ├───────┼────────────────────────────┤
       │ init  │ The workspace was created  │
       ├───────┼────────────────────────────┤
       │empty  │ The workspace is empty and │
       │       │ is being destroyed since   │
       │       │ it is not visible	    │
       ├───────┼────────────────────────────┤
       │focus  │ The workspace was focused. │
       │       │ See the old property for   │
       │       │ the previous focus	    │
       ├───────┼────────────────────────────┤
       │ move  │ The workspace was moved to │
       │       │ a different output	    │
       ├───────┼────────────────────────────┤
       │rename │ The workspace was renamed  │
       ├───────┼────────────────────────────┤
       │urgent │ A view on the workspace    │
       │       │ has had their urgency hint │
       │       │ set or all urgency hints   │
       │       │ for views on the workspace │
       │       │ have been cleared	    │
       ├───────┼────────────────────────────┤
       │reload │ The configuration file has │
       │       │ been reloaded		    │
       └───────┴────────────────────────────┘

       Example Event:
	   {
		"change": "init",
		"old": null,
		"current": {
		     "id": 10,
		     "name": "2",
		     "rect": {
			  "x": 0,
			  "y": 0,
			  "width": 0,
			  "height": 0
		     },
		     "focused": false,
		     "focus": [
		     ],
		     "border": "none",
		     "current_border_width": 0,
		     "layout": "splith",
		     "percent": null,
		     "window_rect": {
			  "x": 0,
			  "y": 0,
			  "width": 0,
			  "height": 0
		     },
		     "deco_rect": {
			  "x": 0,
			  "y": 0,
			  "width": 0,
			  "height": 0
		     },
		     "geometry": {
			  "x": 0,
			  "y": 0,
			  "width": 0,
			  "height": 0
		     },
		     "window": null,
		     "urgent": false,
		     "floating_nodes": [
		     ],
		     "num": 2,
		     "output": "eDP-1",
		     "type": "workspace",
		     "representation": null,
		     "nodes": [
		     ]
		}
	   }

   0x80000001. OUTPUT
       Sent whenever an output is added, removed, or its configuration is
       changed. The event is a single object with the property change, which
       is a string containing the reason for the change. Currently, the only
       value for change is unspecified.

       Example Event:
	   {
		"change": "unspecified"
	   }

   0x80000002. MODE
       Sent whenever the binding mode changes. The event consists of a single
       object with the following properties:

       ┌─────────────┬───────────┬─────────────────────┐
       │  PROPERTY   │ DATA TYPE │     DESCRIPTION     │
       ├─────────────┼───────────┼─────────────────────┤
       │   change    │	string	 │ The binding mode    │
       │	     │		 │ that became active  │
       ├─────────────┼───────────┼─────────────────────┤
       │pango_markup │	boolean  │ Whether the mode    │
       │	     │		 │ should be parsed as │
       │	     │		 │ pango markup        │
       └─────────────┴───────────┴─────────────────────┘

       Example Event:
	   {
		"change": "default",
		"pango_markup": false
	   }

   0x80000003. WINDOW
       Sent whenever a change involving a view occurs. The event consists of a
       single object with the following properties:

       ┌──────────┬───────────┬────────────────────┐
       │PROPERTY  │ DATA TYPE │    DESCRIPTION	   │
       ├──────────┼───────────┼────────────────────┤
       │ change   │  string   │ The type of change │
       │	  │	      │ that occurred. See │
       │	  │	      │ below for more	   │
       │	  │	      │ information	   │
       ├──────────┼───────────┼────────────────────┤
       │container │  object   │ An object	   │
       │	  │	      │ representing the   │
       │	  │	      │ view effected	   │
       └──────────┴───────────┴────────────────────┘

       The following change types are currently available:

       ┌────────────────┬────────────────────────────┐
       │     TYPE	│	 DESCRIPTION	     │
       ├────────────────┼────────────────────────────┤
       │      new	│ The view was created	     │
       ├────────────────┼────────────────────────────┤
       │     close	│ The view was closed	     │
       ├────────────────┼────────────────────────────┤
       │     focus	│ The view was focused	     │
       ├────────────────┼────────────────────────────┤
       │     title	│ The view's title has	     │
       │		│ changed		     │
       ├────────────────┼────────────────────────────┤
       │fullscreen_mode │ The view's fullscreen mode │
       │		│ has changed		     │
       ├────────────────┼────────────────────────────┤
       │     move	│ The view has been	     │
       │		│ reparented in the tree     │
       ├────────────────┼────────────────────────────┤
       │   floating	│ The view has become	     │
       │		│ floating or is no longer   │
       │		│ floating		     │
       ├────────────────┼────────────────────────────┤
       │    urgent	│ The view's urgency hint    │
       │		│ has changed status	     │
       ├────────────────┼────────────────────────────┤
       │     mark	│ A mark has been added or   │
       │		│ removed from the view      │
       └────────────────┴────────────────────────────┘

       Example Event:
	   {
		"change": "new",
		"container": {
		     "id": 12,
		     "name": null,
		     "rect": {
			  "x": 0,
			  "y": 0,
			  "width": 0,
			  "height": 0
		     },
		     "focused": false,
		     "focus": [
		     ],
		     "border": "none",
		     "current_border_width": 0,
		     "layout": "none",
		     "percent": 0.0,
		     "window_rect": {
			  "x": 0,
			  "y": 0,
			  "width": 0,
			  "height": 0
		     },
		     "deco_rect": {
			  "x": 0,
			  "y": 0,
			  "width": 0,
			  "height": 0
		     },
		     "geometry": {
			  "x": 0,
			  "y": 0,
			  "width": 1124,
			  "height": 422
		     },
		     "window": 4194313,
		     "urgent": false,
		     "floating_nodes": [
		     ],
		     "type": "con",
		     "pid": 19787,
		     "app_id": null,
		     "window_properties": {
			  "class": "URxvt",
			  "instance": "urxvt",
			  "transient_for": null
		     },
		     "nodes": [
		     ]
		}
	   }

   0x80000004. BARCONFIG_UPDATE
       Sent whenever a config for a bar changes. The event is identical to
       that of GET_BAR_CONFIG when a bar ID is given as a payload. See 6.
       GET_BAR_CONFIG (WITH A PAYLOAD) above for more information.

   0x80000005. BINDING
       Sent whenever a binding is executed. The event is a single object with
       the following properties:

       ┌─────────────────┬───────────┬─────────────────────┐
       │    PROPERTY	 │ DATA TYPE │	   DESCRIPTION	   │
       ├─────────────────┼───────────┼─────────────────────┤
       │     change	 │  string   │ The change that	   │
       │		 │	     │ occurred for the    │
       │		 │	     │ binding. Currently  │
       │		 │	     │ this will only be   │
       │		 │	     │ run		   │
       ├─────────────────┼───────────┼─────────────────────┤
       │    command	 │  string   │ The command	   │
       │		 │	     │ associated with the │
       │		 │	     │ binding		   │
       ├─────────────────┼───────────┼─────────────────────┤
       │event_state_mask │   array   │ An array of strings │
       │		 │	     │ that correspond to  │
       │		 │	     │ each modifier key   │
       │		 │	     │ for the binding	   │
       ├─────────────────┼───────────┼─────────────────────┤
       │   input_code	 │  integer  │ For keyboard	   │
       │		 │	     │ bindcodes, this is  │
       │		 │	     │ the key code for    │
       │		 │	     │ the binding. For    │
       │		 │	     │ mouse bindings,	   │
       │		 │	     │ this is the X11	   │
       │		 │	     │ button number, if   │
       │		 │	     │ there is an	   │
       │		 │	     │ equivalent. In all  │
       │		 │	     │ other cases, this   │
       │		 │	     │ will be 0.	   │
       ├─────────────────┼───────────┼─────────────────────┤
       │     symbol	 │  string   │ For keyboard	   │
       │		 │	     │ bindsyms, this is   │
       │		 │	     │ the bindsym for the │
       │		 │	     │ binding. Otherwise, │
       │		 │	     │ this will be null   │
       ├─────────────────┼───────────┼─────────────────────┤
       │   input_type	 │  string   │ The input type that │
       │		 │	     │ triggered the	   │
       │		 │	     │ binding. This is    │
       │		 │	     │ either keyboard or  │
       │		 │	     │ mouse		   │
       └─────────────────┴───────────┴─────────────────────┘

       Example Event:
	   {
		"change": "run",
		"binding": {
		     "command": "workspace 2",
		     "event_state_mask": [
			  "Mod4"
		     ],
		     "input_code": 0,
		     "symbol": "2",
		     "input_type": "keyboard"
		}
	   }

   0x80000006. SHUTDOWN
       Sent whenever the IPC is shutting down. The event is a single object
       with the property change, which is a string containing the reason for
       the shutdown. Currently, the only value for change is exit, which is
       issued when sway is exiting.

       Example Event:
	   {
		"change": "exit"
	   }

   0x80000007. TICK
       Sent when first subscribing to tick events or by a SEND_TICK message.
       The event is a single object with the following properties:

       ┌─────────┬───────────┬─────────────────────┐
       │PROPERTY │ DATA TYPE │	   DESCRIPTION	   │
       ├─────────┼───────────┼─────────────────────┤
       │ first	 │  boolean  │ Whether this event  │
       │	 │	     │ was triggered by    │
       │	 │	     │ subscribing to the  │
       │	 │	     │ tick events	   │
       ├─────────┼───────────┼─────────────────────┤
       │payload  │  string   │ The payload given   │
       │	 │	     │ with a SEND_TICK    │
       │	 │	     │ message, if any.    │
       │	 │	     │ Otherwise, an empty │
       │	 │	     │ string		   │
       └─────────┴───────────┴─────────────────────┘

       Example Event:
	   {
		"first": true
		"payload": ""
	   }

   0x80000014. BAR_STATE_UPDATE
       Sent when the visibility of a bar changes due to a modifier being
       pressed. The event is a single object with the following properties:

       ┌────────────────────┬───────────┬─────────────────────┐
       │     PROPERTY	    │ DATA TYPE │     DESCRIPTION     │
       ├────────────────────┼───────────┼─────────────────────┤
       │	id	    │  string	│ The bar ID effected │
       ├────────────────────┼───────────┼─────────────────────┤
       │visible_by_modifier │  boolean	│ Whether the bar     │
       │		    │		│ should be made      │
       │		    │		│ visible due to a    │
       │		    │		│ modifier being      │
       │		    │		│ pressed	      │
       └────────────────────┴───────────┴─────────────────────┘

       Example Event:
	   {
		"id": "bar-0",
		"visible_by_modifier": true
	   }

   0x80000015. INPUT
       Sent when something related to the input devices changes. The event is
       a single object with the following properties:

       ┌─────────┬───────────┬────────────────────┐
       │PROPERTY │ DATA TYPE │	  DESCRIPTION	  │
       ├─────────┼───────────┼────────────────────┤
       │ change  │  string   │ What has changed   │
       ├─────────┼───────────┼────────────────────┤
       │ input	 │  object   │ An object	  │
       │	 │	     │ representing the   │
       │	 │	     │ input that is	  │
       │	 │	     │ identical the ones │
       │	 │	     │ GET_INPUTS gives   │
       └─────────┴───────────┴────────────────────┘
       The following change types are currently available:

       ┌────────────────┬────────────────────────────┐
       │     TYPE	│	 DESCRIPTION	     │
       ├────────────────┼────────────────────────────┤
       │     added	│ The input device became    │
       │		│ available		     │
       ├────────────────┼────────────────────────────┤
       │    removed	│ The input device is no     │
       │		│ longer available	     │
       ├────────────────┼────────────────────────────┤
       │  xkb_keymap	│ (Keyboards only) The	     │
       │		│ keymap for the keyboard    │
       │		│ has changed		     │
       ├────────────────┼────────────────────────────┤
       │  xkb_layout	│ (Keyboards only) The	     │
       │		│ effective layout in the    │
       │		│ keymap has changed	     │
       ├────────────────┼────────────────────────────┤
       │libinput_config │ (libinput device only) A   │
       │		│ libinput config option for │
       │		│ the device changed	     │
       └────────────────┴────────────────────────────┘
       Example Event:
	   {
		"change": "xkb_layout",
		"input": {
		     "identifier": "1:1:AT_Translated_Set_2_keyboard",
		     "name": "AT Translated Set 2 keyboard",
		     "vendor": 1,
		     "product": 1,
		     "type": "keyboard",
		     "xkb_layout_names": [
			  "English (US)",
			  "English (Dvorak)"
		     ],
		     "xkb_active_layout_index": 1,
		     "xkb_active_layout_name": "English (Dvorak)",
		     "libinput": {
			  "send_events": "enabled"
		     }
		}
	   }

SEE ALSO
       sway(1) sway(5) sway-bar(5) swaymsg(1) sway-input(5) sway-output(5)

				  2025-03-28			   sway-ipc(7)

```
""".