Repository navigation
Releases
SwineWM 0.5.0
Added
- Bar tooltips, as in Waybar:
tooltip-format,tooltip-format-<state>
and each module's default tooltip (the whole window title, battery time
left, the clock's{calendar}, disk usage, a script'stooltip,
scratchpad windows), styled bytooltipin style.css. Tray icons show
their program's tooltip, or getNIN_POPUPOPENto show their own, and
receive the pointer's movements as from Explorer. - The bar is translucent where its style says so (Waybar's default
rgba(43, 48, 59, 0.5)): it is a layered window with per-pixel alpha,
where it used to blend such colours over black. - Several bars from one Waybar config (an array), each with its own
modules and outputs;leftandrightpositions with the modules top
to bottom;margin,widthandexclusive;rotatefor text modules. - Waybar's
power-profiles-daemonmodule shows and cycles Windows' power
mode (or the power plan): power-saver, balanced, performance. :hoverand:not(.class)in the bar's style.css; the default style
has Waybar's hover rules (workspace buttons,#pulseaudio). Waybar's
#battery.critical:not(.charging)now turns a low battery red.- Keyboard layouts: Waybar's
sway/languagemodule shows the active
Windows keyboard layout (in the default bar when more than one is
installed; a click switches to the next), and sway's
input type:keyboard xkb_switch_layout next|prev|<index>switches
layouts, bound to$mod+Ctrl+spacein the default config.get_inputs
lists the layouts as sway does, and aninputevent (xkb_layout) is
sent when the layout changes, also through Windows' own hotkeys. - Waybar
custom/*modules run scripts:execwithinterval,
signalor as a continuous script,exec-if,restart-interval,
return-type: json,format-iconsbyaltor percentage,escape,
hide-empty-text,on-update. Scripts run throughcmd.exewithout a
window, each in a job object so nothing they start outlives them or
swinewm.pkill -RTMIN+8 waybar(inexec, anon-clickor
swinemsg exec) runs the modules with"signal": 8;-USR1shows or
hides the bar and-USR2reloads it, as in Waybar. - Waybar modules
network(IP Helper and the WLAN API: addresses,
Wi-Fi name and signal, bandwidth),pulseaudio/wireplumber(the
default Windows output and input; scroll for the volume),disk,
temperature(ACPI thermal zones, where Windows reports them),
idle_inhibitor(keeps the display on) andkeyboard-state. The default
bar shows the volume, the network and, where available, the temperature. - Waybar's unit formatting (
pow_format) for bandwidth and disk sizes,
with its specs ({bandwidthDownBits:>},{used:=},{total:Gi}), and
format-iconsthresholds ({"icon": …, "max": n}). pactl,wpctlandpamixervolume and mute commands inexec(an
on-click, a binding) change the Windows volume, so volume bindings from
Linux configs work.- Bar modules take
on-click-middleandon-click-right. exec swaymsg <command>(andswinemsg) runs the command in swinewm
without starting a process, so Waybaron-clicks and bindings from
Linux configs work as they are.
SwineWM 0.4.0
Added
-
IPC trees, workspaces, outputs and window/workspace events now carry all
of sway's and i3's node fields (urgent,floating,scratchpad_state,
orientation,deco_rect,window_rect,geometry,shell,
representation,window_properties.instance, …) in sway's order, so
i3 and sway IPC scripts find what they expect.percentis now worked
out as in sway. -
A native config-error nag window with the complete error list and reload
and dismiss actions. -
IPC
SUBSCRIBEsupport for workspace, window, mode, output, binding,
bar-config, shutdown and tick events;SEND_TICKnow broadcasts its tick
payload. -
IPC
GET_INPUTSandGET_SEATSnow describe SwineWM's aggregate keyboard
and pointer hooks and its single seat. -
IPC subscriptions now report window move/fullscreen changes and workspace
rename/urgency changes. -
A companion watchdog restores hidden windows after an unexpected exit or
after the manager's message loop stops responding; as the login shell it
also starts Explorer after recovery. -
smart_gaps on|off|toggle|inverse_outer, as in sway (until now accepted
and ignored). -
show_marks: marks appear on the tabs of tabbed and stacked containers
as[mark], right-aligned; marks starting with_stay hidden. -
hide_edge_borders bothhides the border of a window that fills its
workspace (a Windows border cannot hide single edges). -
bindcodeandunbindcodeaccept numeric Windows virtual-key values
(decimal, 1–255), so key bindings can be specified by code. -
New-output workspace discovery recognizes
move container to workspace
bindings as well asworkspacebindings.
Fixed
-
Switching workspace sent the window
focusevent before the workspace
focusevent, and reported the newly focused window as"visible":false.
The order is now sway's (workspace first), andvisibleis worked out
from the tree as in sway. -
swinemsg -t subscribe -m '["window","workspace"]'failed with
{"success":false}in Windows PowerShell, which drops the inner quotes
before 7.3. swinemsg now turns[window,workspace]into JSON, and also
takes plain event names:swinemsg -t subscribe -m window workspace. -
IPC events reached a subscribed client only when it sent another
message: the pipe was opened for synchronous I/O, so a waiting read
blocked every event written to it. It now uses overlapped I/O, so
listening clients (i3ipc scripts, Waybar's sway modules) get events as
they happen. Events still queued when swinewm exits are written first. -
IPC events now match sway: the
modeevent'schangeis the mode's
name (withpango_markupfrommode --pango_markup);SEND_TICKtakes
any text and broadcasts it with"first": false, and a new tick
subscriber first gets{"first": true, "payload": ""}; subscriptions add
up; theemptyworkspace event reports the workspace ascurrent; a new
window'snewevent comes before itsfocusevent; and nothing is sent
aftershutdown(nocloseevents for windows swinewm lets go of). -
swinemsg -t subscribeprints the first event, and every event with
-m/--monitor, asswaymsgdoes. -
Newly mapped floating windows are raised above their parent without
activating them, so owned dialogs do not remain obscured. -
Focus-follows-mouse keeps a visible owned dialog focused rather than
activating its owner and dropping the dialog behind it. -
Gap values are range-checked and cannot overflow layout geometry.
-
Display and DPI changes are coalesced before outputs, window layout, bars
and wallpaper are refreshed, including DPI notifications received by bars.
SwineWM 0.3.0
Mouse and decorations (see the roadmap in
doc/project_summary.md): focus follows mouse,
moving and resizing windows with the mouse, window borders and title bars
in the client.* colours, tabbed and stacked title bars, plus a
replacement for the "Open with" dialog in swinemenu.
Added
- Mouse support, ported from sway:
focus_follows_mouse yes|no|always,
floating_modifier <mod> [normal|inverse]($mod + left button moves a
floating window or drags a tiled one to another place, $mod + right
button resizes either),tiling_drag,tiling_drag_threshold,
mouse_warping output|container|none, and mouse bindings
(bindsym --whole-window $mod+button4 workspace prev). - Window decorations, as in sway:
border none|normal|pixel|toggle,
default_border,default_floating_border,client.focused,
client.focused_inactive,client.unfocused,client.urgent,
smart_borders,hide_edge_borders smart|smart_no_gapsand
opacity. On Windows 11 the border is the window's own (1 px) border in
thechild_bordercolour;border normalkeeps the window's title bar
and colours it,pixelandnoneremove it. Tiled windows get square
corners. Everything is undone when swinewm exits, after a crash and by
swinewm --recover. sway's defaults apply, so title bars now follow the
client.*colours (dark blue for the focused window) unless the config
sets other colours. - Tabbed and stacked containers get title bars, as in sway: one row of
tabs, or one row per child, in theclient.*colours withfont,
title_align,titlebar_padding,titlebar_border_thicknessand
client.focused_tab_title. A click on a tab focuses it, the wheel
switches tabs, and title bar mouse bindings (bindsym button2 kill) work
on them.title_formatsets the tab titles. - The drop zone of a dragged tiled window uses
client.focused's
indicator colour. windows_theme dark|light|auto(swinewm extension, off by default):
switches Windows' light/dark mode, which Windows' dialogs and most
applications follow, while swinewm runs;autofollows the brightness
of the bar's background. Your own setting comes back on exit, after a
crash and withswinewm --recover.swinemenu --open-with <file>, a replacement for Windows' "Open with"
dialog (which stays empty without Explorer): it lists the programs
registered for the file's type and opens the file with the chosen one.
swinemenu --install-open-withadds "Open with swinemenu" to every
file's context menu and uses swinemenu for files no program is set for;
--uninstall-open-withremoves both.
Fixed
- A floating window dragged by its title bar onto another monitor now
joins the workspace shown there, as in sway.
SwineWM 0.2.0
Sway configs that real people have: criteria and window rules, marks,
swap, sticky, resize, outputs, include and config error notifications,
plus the swinemenu launcher (see the roadmap in
doc/project_summary.md). The multi-monitor
features (output … mode|position|transform, workspace … output,
move workspace to output, hot-plug) are covered by unit tests but not
yet tested on a real multi-monitor setup; reports are welcome.
Added
swinemenu, a small launcher in the spirit of wofi/wmenu and the new
default$menu(Win+d): lists the Start menu's apps and Store apps
(--show drun), programs on PATH (--show run) or lines from standard
input (--dmenu), remembers what you pick, and takes the bar's colours
and font. swinewm starts the choice, so Store apps work as the shell.
Flow Launcher or any other launcher can still be set as$menu.- IPC
get_bar_config, as in sway: the bar's position, height, font and
colours, computed from the Waybarstyle.css. - Store apps start as the shell:
exec shell:AppsFolder\<AppUserModelID>
uses the documentedIApplicationActivationManagerinstead of the shell
namespace, which fails with "Class not registered" without Explorer.
Get-StartAppsin PowerShell lists the IDs, e.g.
bindsym $mod+c exec shell:AppsFolder\AnthropicPBC.Claude_fnn82j28hfe8t!Claude. swinewm --set-autostart/--unset-autostart(experimental): start
swinewm at logon next to Explorer, which stays the shell behind it with
its taskbar hidden (explorer_taskbar autohide, now in the default
config; no effect as the shell). In first tests Explorer still took many
key combinations;--set-shellremains the supported mode.- Criteria:
[app_id=… class=… title=… …] <commands>,for_window,
assignandno_focus, as in sway, with a built-in regular-expression
engine. On Windowsapp_idis the executable's file name (matched
ignoring case) andclassthe window class; see the token table in
doc/compatibility.md. mark,unmark,swap container with …,sticky,
rename workspace … to …,move … to mark,focus prev|next [sibling]
and the IPCget_marksrequest, as in sway.resizeis now a port of sway's:grow/shrinktowards an edge
(up/down/left/right),resize set, and<n> px or <m> ppt.- Outputs:
workspace <name> output …andworkspace <name> gaps …,
move workspace to output …; workspaces return to their monitor when
it is plugged back in, as in sway. Monitors can be named by their model
(output "DELL U2720Q" …). output … mode|position|transformchange Windows' display settings
for as long as swinewm runs (restored on exit, after a crash and with
--recover).includetakes wildcards (include config.d/*), as in sway.- Config errors are shown as a notification (swinewm's swaynag), on start
and on reload. doc/linux-users.md: Windows for Linux users (where things are,
shells, package managers, getting unstuck when swinewm is the shell).
Fixed
exec "C:\path with spaces\App.lnk"failed: sway's rule removes the
quotes of a single quoted argument, and the path was then split at its
first space. A command line that names an existing file is now opened as
a whole (this also made swinemenu's Start menu entries do nothing).- Store apps did not start from swinemenu: the activation manager is now
created withCLSCTX_ALL(as PowerShell does) instead of only as a local
server, a failed Store appexecreports failure (with the AppUserModelID
in the log), and swinemenu then tries to start the app itself. - Floating dialogs that were only partly on-screen could keep their bad
position; new dialogs are now centered unless the whole window fits on a
monitor. - As the shell, swinewm now answers programs that ask where the taskbar
is (SHAppBarMessage(ABM_GETTASKBARPOS), which went unanswered without
Explorer). - Windows that are mostly off every monitor (less than half visible) are
moved back on screen: a floating window that moves itself away is
centred again, and other windows (dialogs swinewm does not tile, such as
Windows 11's "Open with", which centres itself on the screen's corner
without Explorer as the shell) are centred on the nearest monitor.
Windows parked far away on purpose (at -32000) and windows being dragged
are left alone; each such move is logged with the window's class and
program. The "Open with" dialog still shows no app list as the shell
(seedoc/compatibility.md). tools/list-windows.batandtools/move-foreground.bat: scripts for
reporting windows that swinewm handles badly;tools/launch-store-app.bat
tests ways of starting Store apps.- A two-part version tag (
0.1) was not recognised, so its build was
versioned after the previous tag; it now means0.1.0. - The release job failed when the release had already been created on
GitHub; it now attaches the MSI and zip to it.
Release 0.1.0
Changelog
All notable changes to SwineWM. The format follows
Keep a Changelog; versions follow
Semantic Versioning (0.x: anything may still
change). A release is made by pushing a tag (0.1.0); CI then publishes
the MSI and zip with the matching section below as release notes.
0.1.0
Towards 0.1.0, the first preview (see the roadmap in
doc/project_summary.md).
Added
- Waybar's
traymodule: swinewm hosts the Windows notification area.
Programs' tray icons appear in the bar, clicks reach them as from
Explorer, balloon tips become notifications, and as the shell Windows'
volume, network and power icons are loaded. Optionsicon-size,
spacing,show-passive-items,reverse-direction,orders,
ignore-list,icons. - Built-in
grim(there is no grim on Windows):grim,-o,-g,-t,
saved to the Pictures folder; Print is bound to it.execruns
a && bchains of built-in commands. - i3's
restartcommand, for updating a running swinewm: rename the
runningswinewm.exe, copy the new one,swinemsg restart. - Versions come from the git tag:
swinewm -v,swinemsg -v,
get_version, the .exe version resource and the MSI file name show
e.g.0.1.0or0.1.0-5-g1234abcfor builds in between. - Pushing a version tag publishes a GitHub Release with the MSI and zip.
SWINEWM_LOG=error|info|debugsets the log level when no-V/-dcan
be passed (Windows starts the shell without options).
Changed
- As the shell,
swinewm.loglogs at info level by default, without
terminal colour codes, and the previous session's log is kept as
swinewm.old.log. - As the shell, the wallpaper is painted by swinewm's desktop window.
--shellis refused while Explorer runs; use
explorer_taskbar autohidenext to Explorer instead.
Fixed
--shellnext to Explorer made swinewm hang (a work-area fight with
Explorer's taskbar).- Black background instead of the wallpaper when swinewm is the shell.
- Dialogs that place themselves off-screen (Explorer's "Open with") are
centered. - Windows that were maximized when swinewm took them over were placed
slightly too high, under the bar. - Window titles with non-ASCII characters were garbled in the console.
0.0.1
The initial draft: sway's tree, commands, config and IPC as a Windows
window manager (hide-based workspaces, keyboard-hook bindings), the
built-in Waybar (config.jsonc, CSS subset, common modules) and Mako
(config, criteria, modes, notify-send, makoctl), wallpapers,
running as the Windows shell (--set-shell), and an MSI installer.
First preview release of SwineWM
The name SwineWM comes from Sway + Win(dows) = Swin, which is almost Swine. Swine is a bit too generic of a name so I specify it with WM. In general speech I can however imagine that people would say "I use Swine as my Windows UI".