Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Everything not built yet

The roadmap says why things come in the order they do. This says what there is to do — the whole list, so that nothing is missing because nobody thought to look for it. What to do first is the daily-drive label. This page carries no status: a row leaves when its gap is closed.

Written by asking the compositor rather than by remembering: the “have” list below is wayland-info against a running Solium, and the “missing” list is every protocol in wayland-protocols, wayland-protocols-wlr and wayland-protocols-misc that is not in it. Twenty-seven globals in, about forty out; the list below is the count.

Everything here is on the tracker: writing this page found thirty-one gaps that were not, and they were filed as #53–#83.

A shell can run inside Solium, hosted in its QML engine, or as a program of its own over wlr-layer-shell (see shell-boundary.md). Where a row below says a shell cannot do something, it means the second kind unless it says otherwise.

What is there today

wl_compositor · wl_subcompositor · wl_shm · wl_seat · wl_output · wl_data_device_manager · xdg_wm_base · zxdg_decoration_manager_v1 · zxdg_output_manager_v1 · xdg_activation_v1 · zwlr_layer_shell_v1 · zwlr_screencopy_manager_v1 · ext_session_lock_manager_v1 · ext_idle_notifier_v1 · zwp_idle_inhibit_manager_v1 · zwlr_output_power_manager_v1 · wp_presentation · wp_viewporter · wp_fractional_scale_manager_v1 · zwp_linux_dmabuf_v1 · xdg_wm_dialog_v1 · wp_single_pixel_buffer_manager_v1 · zwp_relative_pointer_manager_v1 · zwp_pointer_constraints_v1 · zwp_primary_selection_device_manager_v1 · wp_cursor_shape_manager_v1 · zwp_text_input_manager_v3, plus xwayland_shell_v1 to the X server only.


1. Blocks a normal day

Each of these is a day where somebody stops using the compositor.

what breaks without it
#26 input-method-v2no CJK, no emoji picker, no on-screen keyboard — and the on-screen keyboard is what a phone is. text-input-v3 is answered, but only to learn where the focused field’s caret is: no text goes back to it. A compose key does work meanwhile: keyboard = { options = "compose:ralt" }
#50 ext-foreign-toplevel-lista shell that is a program of its own cannot list windows, so it cannot have a task switcher; switching to one needs zwlr_foreign_toplevel_management_v1 as well
#51 wlr-output-managementmonitors are arranged by the configuration: sol.monitors places and scales them, and super+shift+r applies a change. No client can do it, so kanshi and a settings panel cannot work, and a monitor’s mode and rotation are read only when it is added
#52 data-controlno clipboard manager can work
#55 zwp_virtual_keyboard_v1the other half of an on-screen keyboard. input-method-v2 says what was typed; this is how anything types it
#56 window rulesa script can read a window’s app_id, and tiling.client_size_ignore matches on it, but there is no way to say “this application starts on that workspace, floating, this size”. Not a protocol — a gap in the scripting surface, and the first thing anyone configures

2. An application will hit it

Not a whole day lost — one application, or one workflow, that does not work.

who needs it
#58 keyboard-shortcuts-inhibita VM, a remote desktop, or a terminal multiplexer that wants Super for itself. Without it, those keys are eaten forever
#59 linux-drm-syncobj (explicit sync)modern Vulkan and NVIDIA clients. Its absence is stutter and the occasional torn frame, and it is the single most-reported “your compositor is broken” on other projects
#67 xdg-foreign-v2a file chooser or a screen-share dialog that has to be parented to the window that opened it. Otherwise it lands wherever the layout puts it
#68 wp-security-context-v1how a Flatpak identifies itself. Without it there is no way to treat sandboxed clients differently, ever
#60 ext-workspace-v1Solium has workspaces, in workspaces.lua, and no client can see or switch them. A shell that is a client cannot show which one you are on; a hosted shell can, through Workspaces (#166)
#69 zwlr_gamma_control_v1night light. gammastep and redshift speak only this
#61 KDE server-decorationsome Qt applications ask for decorations with this and nothing else, and draw none when it is missing
#62 zwp_tablet_manager_v2drawing tablets, and the stylus on any 2-in-1 — which is a form factor this project is explicitly for
#70 wp_pointer_gesturestouchpad pinch and swipe reaching clients. A browser cannot pinch-zoom
#37 tearing-control-v1a game that wants to opt out of vsync
#71 wp_content_type_v1lets a surface say “I am video” so VRR and tearing decisions can be made for it rather than guessed
#47 ext-image-copy-capture-v1the successor to wlr-screencopy. Nothing speaks it here yet; everything will
#73 xdg_toplevel_icon_v1window icons — which a task switcher needs and cannot get any other way
#75 wp_alpha_modifier_v1per-window opacity without asking the client to redraw. Free, given the render path already scales and warps

3. Later, or for the shape this project is going

#76 wp_fifo_v1 + wp_commit_timing_v1the modern frame-pacing pair. Solium’s own pacing is good; this is how clients participate in it
#77 wp_color_management_v1HDR, and the ceiling on #46 10-bit output
#78 ext_background_effect_v1blur behind a surface. For a compositor whose whole argument is that it looks like one thing, this is more interesting than it sounds
#79 the long tailxdg-session-management, wlr-virtual-pointer, drm-lease, ext-transient-seat, xdg-toplevel-tag, pointer-warp, color-representation. One issue rather than seven, because none of them has a client or a story yet. Split one out the moment something real needs it

Deliberately not, with reasons in #79: wl_drm, zwlr_input_inhibit_v1, fullscreen-shell, linux-explicit-synchronization, zwlr_export_dmabuf_v1, input-timestamps.


4. Not protocols

The session

#153 logindthe Lock and PrepareForSleep signals are ignored, so loginctl lock-session and whatever locks that way do nothing, and locking before suspend is up to swayidle -w
#151 media keysno volume, brightness, media, screenshot or lock keys are bound by default
#157 libinput device settingsnone are set: no tap-to-click, which libinput leaves off, so tapping a touchpad does nothing; no acceleration profile or speed, disable-while-typing, left-handed mode or middle-button emulation; and natural scrolling comes only from the form factor, for every device at once

The backend

#63 multi-GPUudev::primary_gpu and nothing else. A laptop with a discrete card renders on one of them, and a monitor on the other card’s port cannot be driven at all
#44 monitor identitya screen is matched by which port it is in, so moving a cable moves the configuration
#45 mirroringno way to put one screen on another. Every presentation wants it
#46 10-bit
#80 runtime rotationtransform is read from the configuration when a screen is added; a tablet cannot rotate when it is turned
#42 absolute devicesa touchscreen is glued to the first monitor
#64 suspend and resumenever tested. logind pauses and resumes the session’s devices; whether Solium comes back is unknown

Correctness and confidence

#48 the seat flakethree of forty-three logged sessions got no input devices. Devices arrive within a few seconds or not at all, so a longer watchdog would not have saved one; the cause is not known
#65 a hardware soakthe compositor has never run unattended for hours on a real session. SOLIUM_SOAK_TTY=1 dev/soak.sh can do it, though only its clients churn there, since the TTY backend ignores the scripted key presses; no run is recorded
#40 xwayland selection flusha workaround waiting on Smithay
#180 an X11 window’s launcha window exists from the keypress that launches it, as a loading window until its application has drawn, but an X11 application’s window never replaces it, so the loading window stays on screen
#66 packagingdev/install.sh installs from a checkout and dev/rpm.sh builds a Fedora 44 package of one, but there are no packages in a repository: no COPR, no Arch PKGBUILD. --config (#106) and the configuration directory’s name (#107) are worth settling first
#82 crash recoverythe compositor dying takes the session with it. There is no supervisor and nothing to come back to

The product

E7 touch, gestures, form factorsthe animation engine takes an initial velocity precisely so a gesture’s throw can be handed to it. Nothing yet hands it one, and gestures come after v0.1.0
#181 touch on the compositor’s own UItouch reaches applications’ windows and a tap focuses the window under it, but nothing the compositor draws reacts to a finger (frame buttons, a hosted shell scene, the overview, window edges), because touch goes only to client surfaces; a script hears no touch either
E8 settingsa surface built from what scripts declare rather than a fixed schema
the dock, and the morphsol.present_from already grows a window out of the rectangle an icon occupied, and a genie can aim at a window or a scripted surface. What is missing is a dock icon to aim at. A dock hosted in the compositor is in the same engine, and the plan is for its QML to name the icon so an animation can follow it while it moves; nothing of that is built, and it is tracked under Later in #169. Only a dock that runs as its own program would need a protocol to hand the rectangle over
#30 a minimise stateso the genie animation means something
#83 portalsxdg-desktop-portal-wlr can screen-share through wlr-screencopy, but nothing has been configured or tested end to end, and file chooser and settings portals are separate again

What this list is not

It is not a plan, and length is not weight: wp_alpha_modifier_v1 is close to free, since the render path already carries an opacity, while #153 is the difference between a laptop that locks before it sleeps and one that wakes up unlocked. The label orders these and the roadmap says why; this only makes sure none of them is forgotten.