SchOS/docs/plan/wayland.md
Nexoniarz a4fbdb7437 epoll, eventfd, timerfd, signalfd
The set libwayland's event loop is made of, in kernel/sys/sys_event.c:
four kinds of descriptor with no inode, FD_EVENT, that read() drains
and poll() reports on. They were table entries returning ENOSYS that
read as done.

epoll registers (descriptor, file) pairs, so a closed descriptor
leaves the set; level- and edge-triggered, EPOLLONESHOT. Waiting is
poll()'s, a tick at a time. The old eventfd and signalfd numbers (284,
282) were aliased to the new calls and read flags from a garbage
register; they are their own entries now, with epoll_create and
epoll_pwait.

cmd/evtest checks each, then all four in one set. The plans are
brought up to date: everything Wayland was waiting on is built except
setsockopt.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01S1giNvrHTrPMPw7V6x1kQ4
2026-10-24 10:59:52 +02:00

7.6 KiB
Raw Blame History

The GUI becomes Wayland

Schcom survives and changes its wire format. SchWM and SchDE are deleted. What follows is why that is not a retreat, and what it costs.

Blocked on foundations.md. Everything there is built except item 4, setsockopt that does not lie: descriptor passing, shareable memory, sockets in the filesystem, dynamic linking, and the epoll/eventfd/timerfd/ signalfd set libwayland's event loop is made of.


What was deleted

projects/schwm/ and projects/schde/, both README-only; no code was lost. They are gone from the tree now rather than marked for deletion — a directory that has said "to be deleted" for months is a corner, not a decision. The arguments each made are kept below, because they are the part worth keeping.

SchWM is not abandoned — Wayland dissolves it

In X11 the window manager is a separate privileged client because X11 puts compositing in the server and policy nowhere. Wayland's central decision is that the compositor is the window manager: there is no protocol by which a second process places another's windows, and every attempt to add one has been a private extension.

So SchWM's own argument —

"Compositing is mechanical and must never stall: it runs every frame and a mistake there is a frozen screen. Window management is policy, full of special cases and personal taste, and it changes constantly."

— is a real and correct observation about X11, which Wayland answers a different way. It stays worth honouring, but as a module boundary inside Schcom, not a process boundary: policy in its own file behind its own interface. Do not keep it in its own process, because the protocol to talk to it does not exist.

SchDE is re-sited rather than abandoned

A panel, a launcher and a wallpaper are ordinary Wayland clients using wlr-layer-shell — MIT, an XML file, no dependency. They need no directory of their own until one of them is written. SchDE's other observation stands on its own and is recorded here so it does not go with the directory: a GUI terminal is not the kernel console with a window around it. The console parses ANSI because it draws straight to the framebuffer; a terminal client parses ANSI itself and renders it with proportional-capable text. The two share no code.

projects/schinst/ stays

Its GUI was the part tied to SchWM, and that part becomes a Wayland client. Everything else in it — the .sip format, mksip, the apply path, the installation environment — is untouched by any of this, and remains the best-specified unstarted work in the tree.


What survives

Schcom stays, and keeps its name. It already owns the display, allocates and owns client buffers, implements surface/attach/commit, routes input from /dev/input/eventN, composites multiple clients bottom-to-top, and cleans up after clients that die.

Its own README says the protocol is deliberately Wayland-shaped — surfaces rather than windows, buffers attached and made visible only on commit, the compositor telling clients when to draw. That was the right call and this is where it is cashed in: what changes is the wire format and the buffer handle, not the architecture.


What has to exist first

Items 1–4 of foundations.md, and the first three are absolute — libwayland does not start without them.

The sharpest is descriptor passing. wl_shm_create_pool passes a file descriptor, and there is no path in the protocol that passes an integer instead. struct schcom_surface's handle_kind field was written precisely so that switching would be a new value rather than a protocol break, and it cannot help: our protocol is the flexible one.


Port libwayland. Do not port Weston.

libwayland is the small piece: a wire protocol, an object map, and an event loop, needing libffi and — for the build-time scanner, on the host only — libexpat. A real port, but a bounded one.

Weston is the trap. It arrives welded to libinput, udev, libdrm, logind-shaped seat management and a GL renderer, and porting it means porting Linux's device management first and finding the compositor somewhere underneath.

This is precisely the lesson already recorded twice in this tree — about FreeBSD's sys/dev/usb (100k lines welded to newbus) and about FreeBSD's sys/netinet (not a library; reaches into mbufs, epoch, netisr, VNET and uma).

The tree has learned this twice. It should not pay to learn it a third time.

So Schcom links libwayland-server and remains ours. Input comes from /dev/input/eventN, which already works, rather than from libinput. Output goes through display_ops, which already exists.

Software rendering first, and probably for a long time

pixman for composition, wl_shm for buffers. Mesa means EGL means dlopen means a dynamic loader -- which now exists (see foundations.md item 5), so it is no longer what stands in the way of Mesa; a GPU driver is. Static binaries are still enough to reach a working desktop, and the desktop's own programs can stay static until something concrete demands otherwise.

One sharp edge

wl_keyboard hands the client a keymap as an XKB text blob over a file descriptor. A compositor cannot avoid xkbcommon by having simpler opinions about keyboards — the protocol requires the blob.

The cheap route is one precompiled keymap string shipped in the binary, with xkbcommon and xkeyboard-config deferred until more than one layout is wanted.


Licensing

Checked before anything is fetched — the standing rule is that the licence goes in NOTICE before the file is committed, not after.

wayland, wayland-protocols MIT
wlr-layer-shell MIT
pixman MIT
libffi MIT
libxkbcommon MIT
xkeyboard-config MIT

All GPL-2.0-or-later compatible, all needing only a NOTICE entry. The Wayland ecosystem is permissively licensed almost throughout, so nothing here raises a licensing question at all.


Milestones

W0 foundations.md items 1–4, with the combined test that passes a descriptor and shares a memfd and binds a socket at a real path.
W1 libwayland builds and installs into the sysroot. wayland-scanner runs on the host.
W2 Schcom serves wl_compositor, wl_shm, wl_surface, xdg_shell. A client draws one window.
W3 wl_seat: keyboard and pointer, from the evdev path that exists.
W4 Two clients, focus, stacking, move and resize. This is where SchWM's policy lives, as a file.
W5 wlr-layer-shell, and a panel. This is SchDE's first pixel.

Every milestone from W2 on is asserted from the host, by pixel, the way schcom-test already does. The compositor's own report that it composited something proves nothing.


What it will still not do

  • No hardware acceleration. Software rendering only, until Mesa, which is not on this plan. Dynamic linking, which it also needs, is in.
  • No XWayland, so no X11 clients, ever, unless someone ports it.
  • No mode setting. Resolution stays whatever the loader asked for — see hybrid.md, where the GPU driver's eviction is also where a modeset API would arrive.
  • No damage tracking beyond "repaint everything", no multiple outputs, no subsurfaces. Schcom's README already lists these; they are additions rather than rewrites, which is the reason for committing to the surface/commit model now.
  • One keyboard layout, until xkbcommon is ported.
  • No clipboard, no drag and drop, no screen capture protocol, none of which W0–W5 touches.