Repository navigation
Compatibility
What swinewm does with each sway config/runtime command. The goal is that an unmodified sway config loads: commands with no meaning on Windows (or not implemented yet but harmless to skip) are accepted and ignored with an info message. Anything else unknown is an error with a line number, as in sway.
Legend: ✅ implemented as in sway · 🟡 partly implemented · ⚪ accepted and ignored · ❌ not implemented (error)
| Feature | Status | Notes |
|---|---|---|
| Location | 🟡 |
-c <file>, else %USERPROFILE%\.swinewm\config, %XDG_CONFIG_HOME%\swinewm\config, %APPDATA%\swinewm\config, then config next to swinewm.exe
|
Comments, \ line continuation, { on the next line |
✅ | |
Blocks (mode "x" { }, bar { }, input … { }) |
✅ | Lines are prefixed with the block header, as in sway |
set $var value, $var replacement |
✅ | Longest variable name wins; $$ escapes |
include <path> |
✅ | Relative to the including file; ~ and %VAR% expanded; wildcards (*, ?, […]) in the file name, matched in sorted order and ignoring case; each file at most once; a missing file is not an error (as in sway) |
| Config errors (swaynag) | ✅ | Shown in a persistent native window with the full error list and Reload config/Dismiss buttons; it goes away after a reload without errors. swaynag_command is ignored |
exec / exec_always deferral |
✅ | Run after the config is read; exec is skipped on reload |
swinewm -C (validate config) |
✅ | |
| UTF-8 paths and BOM | ✅ |
| Command | Status | Notes |
|---|---|---|
bindsym [--release] [--no-repeat] [--locked] <combo> <command> |
🟡 |
--to-code, --no-warn, --inhibited, … accepted |
bindsym [--whole-window] [--border] [--exclude-titlebar] <mod>+button<n> <command> |
🟡 | Mouse bindings: button1–button9 (4–7 are the wheel) and BTN_* names. Without a flag a binding is for title bars, as in sway: swinewm draws title bars only for tabbed and stacked containers (a window's own title bar belongs to the window), so elsewhere only --whole-window bindings fire on windows (and on the desktop). --border never fires: Windows windows have no border swinewm can tell apart. |
bindcode [flags] <mod>+<keycode> <command>, unbindcode
|
🟡 | Numeric Windows virtual-key values (decimal, 1–255), not Linux evdev keycodes |
unbindsym |
✅ | |
bindswitch, bindgesture
|
⚪ | |
mode <name>, mode <name> { … }
|
✅ |
--pango_markup accepted |
set |
✅ | |
exec, exec_always
|
✅ | See architecture: CreateProcess, then ShellExecute; %VAR% expanded; no implicit shell. waybar, mako, makoctl, notify-send, grim run the built-in versions; a && b chains of those run like sh would. Store apps: exec shell:AppsFolder\<AppUserModelID> [args] starts them through IApplicationActivationManager, also as the shell (PowerShell's Get-StartApps lists the IDs) |
exit |
✅ | Shows all hidden windows and quits |
reload |
✅ | |
restart |
✅ | i3's command (sway has none): exits cleanly without logging off and starts swinewm.exe again with the same arguments; hidden workspaces are shown and re-tiled. For updating a running swinewm |
kill |
✅ | Sends WM_CLOSE (the application may ask to save) |
nop |
✅ | |
focus left/right/up/down |
✅ | Tree-based like sway, crosses outputs, honours focus_wrapping
|
focus parent/child, focus mode_toggle/floating/tiling
|
✅ | |
focus output <name|direction> |
✅ | |
focus prev/next [sibling] |
✅ | |
move left/right/up/down [<n> px] |
✅ | Port of sway's container_move_in_direction; floating windows move by n px |
move [container|window] [to] workspace <name|number n|next|prev|…|back_and_forth> |
✅ | Focus stays on the current workspace, like sway |
move [container|window] [to] output <name|direction> |
✅ | |
move [container|window] [to] mark <mark> |
✅ | |
move [to] scratchpad, scratchpad show
|
✅ | |
move [absolute] position center|<x> <y> |
🟡 | Floating windows; coordinates relative to the output's work area |
move workspace [to] [output] <name|direction|current> |
✅ | The workspace remembers the output for when monitors come and go |
split h/v/t/none, splith, splitv, splitt
|
✅ | |
layout splith/splitv/stacking/tabbed/default, layout toggle [split|all|…]
|
✅ | Tabbed and stacked containers get title bars drawn by swinewm (tabs side by side, or one row per child), clickable and scrollable as in sway; the windows in them lose their own title bar (border normal) |
workspace [number] <name>, next, prev, next_on_output, prev_on_output, back_and_forth, --no-auto-back-and-forth
|
✅ | |
workspace <name> output <outputs…>, workspace <name> gaps <type> <n>
|
✅ | The first connected output in the list; workspaces return to it when the monitor is plugged back in |
workspace_auto_back_and_forth |
✅ | |
floating enable/disable/toggle |
✅ | |
fullscreen [enable/disable/toggle] [global] |
🟡 |
global behaves like per-output fullscreen |
resize grow/shrink width/height/up/down/left/right [<n> [px|ppt]] [or <n> [px|ppt]] |
✅ | Port of sway's resize.c; floating windows are at least 75×50 and at most the output's work area |
resize set [width] <w> [height] <h> |
✅ | |
gaps inner/outer/horizontal/vertical/top/right/bottom/left <n> |
✅ | Config default |
gaps <type> all|current set|plus|minus|toggle <n> |
✅ | Runtime |
default_orientation, workspace_layout
|
✅ | |
focus_wrapping |
✅ | |
focus_follows_mouse yes|no|always |
✅ | Port of sway's seatop_default.c. Not while a mouse button is held, and never away from a window swinewm does not manage that has the focus (a menu or launcher); it also keeps a visible owned dialog focused instead of activating its owner underneath it |
floating_modifier <mod> [normal|inverse] |
✅ | $mod + left button moves floating windows and drags tiled ones (tiling_drag), $mod + right button resizes either, from the nearest corner; Shift keeps the aspect ratio of a floating window. A click with the modifier never reaches the window, and Win released after it does not open the Start menu |
tiling_drag enable|disable|toggle, tiling_drag_threshold <px>
|
✅ | Drop zones as in sway, shown with a translucent rectangle; dropped on a window's middle the two swap. Dragging by title bar waits for the threshold |
mouse_warping output|container|none |
✅ | After focus commands and move workspace to output, as in sway |
border none|normal|pixel [<n>]|toggle, default_border, default_floating_border
|
🟡 | The border is the window's own DWM border (Windows 11), always 1 px whatever <n> says. normal keeps the window's own title bar; pixel and none remove it (for windows that have a standard one). csd is refused |
client.focused|focused_inactive|unfocused|urgent <border> <background> <text> [<indicator> [<child_border>]] |
🟡 |
child_border colours the window border; with border normal, background and text colour the window's own title bar (standard title bars only, Windows 11). indicator colours the drop zone of tiling_drag. client.placeholder and client.background are accepted and ignored, as in sway |
smart_borders on|off|no_gaps, hide_edge_borders smart|smart_no_gaps
|
✅ | |
hide_edge_borders none|vertical|horizontal|both |
🟡 | A DWM border cannot hide single edges, so it goes only when every edge would: with both, for a window that fills its workspace |
smart_gaps on|off|toggle|inverse_outer |
✅ | As in sway: no gaps around a lone visible window (on), or outer gaps only around one (inverse_outer); the other tabs of a tabbed or stacked container do not count |
font, title_align, titlebar_padding, titlebar_border_thickness, client.focused_tab_title
|
✅ | For the tabs of tabbed and stacked containers. font takes a Pango description (pango:DejaVu Sans Mono 10); generic families map to Segoe UI, Times New Roman and Consolas |
title_format <format> |
🟡 | Tab titles: %title, %app_id, %class, %instance (the class) and %shell (win32); no Pango markup |
hide_edge_borders --i3 |
✅ | No tab for a lone child |
show_marks yes|no|toggle |
✅ | On the tabs swinewm draws (tabbed and stacked containers), right-aligned as [mark]; marks starting with _ are hidden, as in sway. A window's own title bar cannot show them |
for_window, assign (workspace, number, output, →), no_focus
|
✅ | As in sway: rules run when a window appears and again when its title changes (once per rule and window); assign picks the workspace, no_focus keeps the focus where it was |
Criteria […] <commands>
|
✅ | All tokens; what they match on Windows is listed under "Criteria" below. Regular expressions use a built-in PCRE-like engine (no look-around or back-references) |
output <name|*> bg <file> <stretch|fill|fit|center|tile> [<#color>], output … bg <#color> solid_color
|
✅ | swaybg's options; PNG, JPEG, BMP, GIF, TIFF (anything the Windows Imaging Component reads). ~, %VAR% and paths relative to the config file |
output … mode|resolution|res <w>x<h>[@<r>Hz], position|pos <x>,<y>, transform <0|90|180|270> [clockwise|anticlockwise]
|
🟡 | Through Windows' display settings, as a temporary change: Windows does not save it, and swinewm restores the saved settings when it exits or crashes and with --recover. Only modes the driver lists; positions are relative to where the config puts the primary monitor (Windows keeps it at 0,0); flipped-* rotates without mirroring |
output <identifier> |
✅ | The monitor name shown in Windows' display settings (e.g. "DELL U2720Q"); also in workspace … output and get_outputs (model) |
input <identifier> xkb_switch_layout next|prev|<index> |
✅ | Switches between the keyboard layouts installed in Windows' language settings (Settings → Time & language), in Windows' order. *, type:keyboard and swinewm:keyboard name the keyboard. A layout switched with Windows' own hotkey (Alt+Shift, Win+Space) is noticed within a second |
output … scale, enable, disable, dpms, power, adaptive_sync, subpixel, …, other input options (xkb_layout, repeat_rate, …), seat
|
⚪ | Windows settings apply (scaling is per monitor in Settings → Display; keyboard layouts in Time & language) |
bar { … }, bar <option>
|
🟡 | Enables the built-in Waybar-compatible bar; position, mode invisible|dock|toggle honoured, other swaybar options ignored (see below) |
xwayland, swaybg_command, swaynag_command, max_render_time, allow_tearing, primary_selection, inhibit_idle, shortcuts_inhibitor, popup_during_fullscreen, focus_on_window_activation, force_display_urgency_hint, new_window, new_float, floating_minimum_size, floating_maximum_size
|
⚪ | |
urgent enable|disable|allow|deny |
✅ | Windows' own "urgency" is a flashing taskbar button (FlashWindowEx); it marks the view and its workspace urgent until focused |
| Application-requested fullscreen | ✅ | A window that makes itself fullscreen (F11) becomes a sway fullscreen container and returns when it leaves fullscreen |
mark [--add|--replace] [--toggle] <id>, unmark [<id>]
|
✅ | Drawn on tabs (show_marks) |
swap container with id|con_id|mark <arg> |
✅ |
id is the window handle |
sticky enable|disable|toggle |
✅ | Floating windows follow workspace switches |
rename workspace [<old>|number <n>] to <new> |
✅ | |
opacity [set|plus|minus] <0..1> |
✅ | Makes the window layered (WS_EX_LAYERED); undone on exit, after a crash and by --recover
|
create_output |
❌ | |
explorer_taskbar autohide|show|toggle |
✅ | swinewm extension: while running next to Explorer, keep Explorer's taskbar auto-hidden (restored on exit) |
windows_theme dark|light|auto|none |
✅ | swinewm extension (config only): sets Windows' light/dark mode for apps and the system while swinewm runs; auto picks dark if the bar's background is dark. The user's own mode comes back on exit, after a crash and with --recover. Default none: Windows' setting is left alone |
sway's tokens and what they match here. Values are regular expressions
(searched anywhere in the value, as with PCRE; anchor with ^…$), or
__focused__ for the focused window's value.
| Token | Matches | Example |
|---|---|---|
app_id |
The executable's file name, ignoring case (Windows file names do) |
[app_id="^firefox"] matches firefox.exe
|
instance |
The executable's name without .exe, ignoring case |
[instance="^Discord$"] |
class |
The window class (case-sensitive) | [class="MozillaWindowClass"] |
title |
The window title (case-sensitive; (?i) for ignoring case) |
[title="(?i)picture-in-picture"] |
shell |
Always native
|
|
window_type |
normal (tiled by default) or dialog (dialogs, fixed-size windows); other types never match |
Newly mapped floating windows are raised without stealing focus, keeping owned dialogs above their parent |
id |
The window handle (HWND) as a decimal number | |
pid, con_id, con_mark, workspace, floating, tiling, urgent=first|latest…, all
|
As in sway | |
window_role, sandbox_engine, sandbox_app_id, sandbox_instance_id, tag
|
Never match (Windows has none of these) |
Regular expressions: literals, ., […] classes (with ranges, \d \w \s
and [:alpha:]-style names), ^ $ \b, * + ? {n,m} (and lazy *?),
groups, |, (?i). Not supported: look-around, back-references,
Unicode properties (\p{…}).
| Feature | Status | Notes |
|---|---|---|
waybar/config.jsonc / waybar/config, JSONC |
✅ | One bar, or an array of bars. Bars on the same edge stack in config order, and a later bar takes its edge of the space earlier bars left (as Waybar's layer-shell surfaces do) |
height, width, spacing, position (top/bottom/left/right), output, margin, margin-top/right/bottom/left, exclusive, name
|
✅ |
height is the thickness of a top or bottom bar and width of a left or right one (without it a vertical bar is twice the line height); bars always span the monitor. Left and right bars lay their modules out top to bottom. window#waybar has the position and name as classes. No layer, mode, start_hidden, ipc
|
modules-left/center/right |
✅ | |
sway/workspaces |
🟡 |
format with {name} {value} {index} {icon} {output}, format-icons, all-outputs, disable-scroll, disable-click; no persistent workspaces |
sway/mode, sway/window, sway/scratchpad
|
✅ | window: {title} {app_id}, max-length
|
clock |
🟡 |
format, format-alt (click), strftime specs; tooltip-format with {calendar} (the month, weeks from Monday, in a fixed-width font for <tt>); no calendar options, time zones or actions
|
cpu, memory, battery
|
🟡 | Main fields, states, format-icons, battery format-charging/plugged/full
|
sway/language |
✅ | The active Windows keyboard layout: {}/{short} (the region, us), {shortDescription} (the language, en), {long} (English (United States)), {variant} (a non-default layout such as Dvorak), {flag} (emoji; Windows' fonts draw two letters); hide-single-layout; #language.<short> styling. The default bar shows it with more than one layout, and a click switches |
custom/* |
✅ |
exec every interval (or "once"), once and on a signal, or continuously (one update per line, restart-interval); exec-if, exec-on-event, return-type: json (text, alt, tooltip, class, percentage) or i3blocks lines, format with {} {text} {alt} {icon} {percentage}, format-icons (string, array, object by alt), escape, hide-empty-text, on-update, max-length. Scripts run through cmd.exe /c without a window (pipes, %VARIABLES%, .bat files; PowerShell as powershell -NoProfile -File x.ps1), with %WAYBAR_OUTPUT_NAME% set to the first monitor (one script per module, not per bar); output in UTF-8 or the console code page. Signals: pkill -RTMIN+<n> waybar (also -SIGRTMIN+n, -s, killall) in exec, an on-click or swinemsg exec …. No tooltips or image-path yet |
tray |
🟡 | Windows notification area icons. icon-size, spacing, show-passive-items (icons a program hides), reverse-direction, orders, ignore-list, icons (false, or an .ico file; keys are the program, "Discord.exe" or "discord"); #tray > .active|.passive styling. Left/middle/right clicks go to the program as Explorer sends them; balloon tips become notifications. Tooltips show the program's text, or for icons that draw their own (version 4 without NIF_SHOWTIP) the program gets NIN_POPUPOPEN/NIN_POPUPCLOSE; the pointer is reported with WM_MOUSEMOVE as Explorer does. No scroll (Windows' notification area has no scroll message), no -gtk-icon-effect
|
network |
✅ | The interface of the default route, or interface (wildcards match the name, e.g. "Wi-Fi"); states wifi, ethernet, linked, disconnected, disabled (Wi-Fi radio off) with format-<state>[-<threshold>] and classes; {ifname} {ipaddr} {gwaddr} {netmask} {netmask6} {cidr} {cidr6} {essid} {bssid} {signalStrength} {signaldBm} {signalStrengthApp} {frequency} {icon}, the bandwidth* values over each interval, {rxBitrate} {txBitrate} {linkSpeed} (Waybar's unit specs such as {bandwidthDownBits:>} work), family. Windows 11 24H2 and later hide the Wi-Fi name ({essid}, {bssid}) unless location access is allowed for desktop apps; the interface still counts as Wi-Fi. Link state is read at least every 5 s |
pulseaudio, wireplumber
|
✅ | The default Windows output and input: {volume} {desc} {icon} {format_source} {source_volume} {source_desc} (wireplumber: {node_name}), format-muted, format-bluetooth[-muted], format-source[-muted], states, format-icons by port (speaker, headphone, headset, hdmi, hands-free, phone, hifi, -muted); scrolling changes the volume (scroll-step, max-volume, reverse-scrolling, target). No ignored-sinks/sink-mapping
|
disk |
✅ |
path (/ means the Windows drive, %SystemDrive%; any folder works, e.g. D:\\) or paths with header and separator; {percentage_used} {percentage_free} {total} {used} {free} {path} {specific_*} with unit, states
|
temperature |
🟡 | ACPI thermal zones from Windows' "Thermal Zone Information" counters (thermal-zone is their index); hidden when Windows reports none, as on many desktops. {temperatureC} {temperatureF} {temperatureK} {icon}, warning-threshold, critical-threshold, format-warning, format-critical. hwmon-* options do not apply |
idle_inhibitor |
✅ | A click keeps the display on and the computer awake (SetThreadExecutionState, undone on exit); {status} {icon} {timeout} {timeleft}, timeout in minutes, start-activated. No wait-for-activity
|
keyboard-state |
✅ |
numlock, capslock, scrolllock labels (#keyboard-state label.locked), format (string or per key), format-icons (locked/unlocked, or per key) |
power-profiles-daemon |
✅ | Windows' power mode (Best power efficiency, Balanced, Best performance) as power-saver, balanced, performance; with a power plan other than Balanced, the plans Power saver, Balanced and High performance. Left click: the next profile, right click: the previous one. {profile} {icon} {driver}; without format-icons the icon is SAVE, BAL or PERF (Waybar's default icons need Font Awesome) |
Others (backlight, bluetooth, mpd, …) |
❌ | Skipped with a log message |
on-click, on-click-middle, on-click-right, on-scroll-up/down
|
✅ | Run through exec; swaymsg <command>, pkill -<signal> waybar and the volume commands pactl set-sink-volume|set-sink-mute|set-source-volume|set-source-mute, wpctl set-volume|set-mute and pamixer -i|-d|--set-volume|-t|-m|-u (on the default Windows devices) run inside swinewm. A Waybar signal through pkill: RTMIN+n (custom modules), USR1 (show or hide the bar), USR2 (reload the bar) |
| Tooltips | ✅ | After the hover delay, below a top bar (above a bottom one). tooltip (false turns it off), tooltip-format, tooltip-format-<state> and each module's Waybar default (window: the whole title; battery: {timeTo}; disk: {used} used out of {total} on {path} ({percentage_used}%); scratchpad: one {app}: {title} line per window; custom: the script's tooltip, lines split by \r). Styled by tooltip and tooltip label in style.css; markup is stripped |
rotate |
✅ | 90, 180, 270 (counter-clockwise, as GTK) for text modules |
| Markup beyond stripping | ❌ | |
style.css |
🟡 | Selectors by type/#id/.class with descendants; @define-color, alpha(); colours, fonts, padding, margin, borders, box-shadow: inset; :hover (colours and borders; it does not change sizes) and :not(.class); no other pseudo-classes (:first-child, …), animations. Translucent colours (rgba(), alpha()) show the desktop behind the bar (a layered window with per-pixel alpha) |
| Feature | Status | Notes |
|---|---|---|
mako/config, global options, [criteria]
|
✅ | Criteria: app-name, summary, body, urgency, category, mode, expiring. Regex (summary~), grouping and hidden criteria not yet |
| Style options | 🟡 |
font, colours, width, height, margin, padding, outer-margin, border-size, format, text-alignment, anchor, output; border-radius, icons, progress not drawn |
| Behaviour options | ✅ |
default-timeout, ignore-timeout, max-visible, max-history, history, sort (time), invisible, on-button-*
|
notify-send |
✅ | As a command; -u -t -a -c -r, other options accepted |
makoctl dismiss [-a] [-n id] [-h], restore, invoke, mode [-a|-r|-t|-s], reload
|
✅ |
invoke dismisses (no actions yet) |
makoctl list / history
|
🟡 | Use swinemsg -t get_notifications / get_notification_history
|
| Notifications from Windows applications (toasts) | ❌ | See the project summary |
There is no grim on Windows, so it is built in: grim is a command, and
exec grim … in a sway config runs it. The default config binds Print.
| Feature | Status | Notes |
|---|---|---|
grim [file] |
✅ | Whole desktop; default file <date>_grim.png in %GRIM_DEFAULT_DIR% or the Pictures folder |
-o <output>, -g "x,y wxh", -t png|jpeg
|
✅ | Desktop coordinates in physical pixels |
-c, -q, -l, -s
|
⚪ | Accepted; the cursor is never captured |
grim - (stdout), -T, slurp
|
❌ | No pipes yet; no interactive area selection |
swinemenu.exe is the default $menu. It is a separate program, as wofi
is; any other launcher can be set in the config instead.
| Feature | Status | Notes |
|---|---|---|
--show drun (default) |
✅ | Start menu shortcuts (all users and current user; uninstallers and document shortcuts left out) and Store apps |
--show run |
✅ | Programs on PATH (.exe, .bat, .cmd, .com) |
--show dmenu, -d/--dmenu
|
✅ | Choices from standard input, the chosen (or typed) line on standard output, exit status 1 if cancelled |
-p/--prompt, -L/--lines, -W/--width
|
✅ | |
| Matching | ✅ | Every typed word must appear, ignoring case; often chosen entries first (history in %LOCALAPPDATA%\swinewm\swinemenu-*.txt) |
| Keys | ✅ | Type to filter, Up/Down, Tab, Ctrl+n/p/j/k, Page Up/Down, Enter, Esc, Ctrl+u, Ctrl+w/Ctrl+Backspace; a click starts an entry; clicking elsewhere closes it; starting it again closes it |
| Starting the choice | ✅ | Sent to swinewm as exec over IPC, so Store apps start as the shell too; without swinewm it opens the choice itself |
| Theme | 🟡 | Colours and font from the bar (get_bar_config); wofi's own config/style.css and icons are not read yet |
--open-with <file> (swinewm extension) |
✅ | Replaces Windows' "Open with" dialog: the programs registered for the file's type (SHAssocEnumHandlers, else the type's ProgIDs, OpenWithProgids and OpenWithList in the registry), the default marked; Enter opens the file with the choice, a typed program name opens it with that |
--install-open-with, --uninstall-open-with
|
✅ | Adds (or removes) "Open with swinemenu" in every file's context menu and makes swinemenu the program Windows asks for files that have none (HKCU\Software\Classes, the Unknown type's openas verb) |
| sway | swinewm |
|---|---|
| Started by a display manager or a TTY |
swinewm --set-shell makes it the Windows logon shell for the current user (--unset-shell undoes it). 🧪 swinewm --set-autostart starts it at logon next to Explorer instead, with Explorer's taskbar hidden; in first tests Explorer still took many key combinations, so this is experimental |
exit ends the Wayland session |
As the shell, exit logs off; next to Explorer it just quits |
exec in the config for autostart |
Works the same; as the shell, the Windows startup programs (Run keys, Startup folder) are started too, as Explorer would |
Known limitation as the shell (--set-shell, not --set-autostart): some
of Windows 11's own dialogs and flyouts rely on parts of Explorer that only
run when Explorer is the shell.
The "Open with" dialog (OpenWith.exe) then centres itself on the
screen's top-left corner and shows only its buttons, without the app list.
swinewm moves it to the middle of the screen, but it stays empty and does
not react to clicks (Esc closes it). Use swinemenu --open-with <file>
instead; swinemenu --install-open-with puts it in file managers' context
menus. Defaults per file type are still changed in Settings → Apps →
Default apps (Windows protects them from other programs). Win+S (search) and Win+W (widgets) likely have the
same cause.
- Modifiers:
Shift,Control/Ctrl,Mod1/Alt,Mod4/Super/Logo(the Windows key).Mod2(Num Lock) and Caps Lock never block a match. - Key names are xkb keysym names (
Return,space,minus,Left,F1,Print,XF86AudioMute, …), case-insensitive for letters. - Punctuation keys follow the US layout for now.
- Windows reserves Win+L and Ctrl+Alt+Del; they cannot be bound.
| Message | Status |
|---|---|
RUN_COMMAND |
✅ |
GET_WORKSPACES, GET_OUTPUTS, GET_TREE, GET_VERSION
|
✅ Every node has sway's and i3's fields (urgent, floating, scratchpad_state, orientation, deco_rect, window_rect, geometry, representation, …), in sway's order; window and workspace events carry the same nodes. Windows-specific values: window is the HWND, shell is win32, window_properties.instance is the window class, deco_rect covers only the tabs of tabbed and stacked containers (Windows draws a window's own title bar inside the window), and Wayland-only fields (sandbox_*, tag, foreign_toplevel_identifier) are null
|
GET_BINDING_MODES, GET_BINDING_STATE, GET_CONFIG
|
✅ |
GET_MARKS |
✅ |
GET_BAR_CONFIG |
✅ one bar, bar-0: position, height, and colors/font computed from the Waybar style.css (window, workspace buttons) |
GET_INPUTS, GET_SEATS
|
✅ Reports each successfully installed aggregate keyboard/pointer hook and one seat (seat0) with the corresponding capabilities. The keyboard lists the Windows keyboard layouts as sway's xkb_layout_names, xkb_active_layout_index and xkb_active_layout_name (English names such as "Swedish (Sweden)"). Physical devices are not exposed |
GET_NOTIFICATIONS (1000), GET_NOTIFICATION_HISTORY (1001) |
✅ swinewm extensions |
IPC_SYNC |
✅ Returns the unsupported response, as sway does |
SEND_TICK |
✅ As in sway: the payload is any text, sent to tick subscribers as {"first": false, "payload": …}; a new tick subscriber first gets {"first": true, "payload": ""}
|
SUBSCRIBE and events |
🟡 Validates subscriptions (they add up, as in sway) and streams events asynchronously; workspace focus/init/empty/move/rename/urgent, window new/close/focus/title/move/fullscreen_mode, mode (change is the mode's name), output, binding, barconfig, shutdown, tick and input (xkb_layout, when the keyboard layout changes) are covered; nothing is sent after shutdown. bar_state_update and some state changes remain unimplemented. swinemsg -t subscribe [-m] '["window"]' prints events as swaymsg does; it also accepts plain names (-m window workspace) and the [window,workspace] that Windows PowerShell before 7.3 makes of the quoted array |
| Watchdog | ✅ A companion process probes the manager's hidden window and process. After three missed probes it terminates an unresponsive manager and runs --recover; an unexpected exit also runs recovery. If SwineWM is the login shell, it starts Explorer afterward |
get_tree reports native window properties as app_id (the executable
name, e.g. notepad.exe), pid, window (the HWND) and
window_properties.class/title, plus marks and sticky.