picom
The X compositor as a module (novox/hq ADR 0208, research 026).
- Installs
picom, andxorg-xpropfor setting a window's own opacity. - Claims the mesh's
node-compositorseat (no verbs yet, ADR 0208 §2) and requiresx11-display. That requirement has the machine's reach: the display server must be held on this module's own machine, or assignment is refused, naming the seat's holders. - Owns
~/.config/picom/and~/.config/picom/picom.conf, which it writes whole at every push. - Adds no start of its own. picom's package ships an XDG autostart entry
(
/etc/xdg/autostart/picom.desktop), which the session runs: thei3module'sdex --autostart. That is the tool's own grain (ADR 0208 §4) and its one start. The desktop modules follow one rule: a process has one starter. Its package's autostart entry is that starter where there is one, and thexinitrcslot where there is none.
Settings
Two preferences, each a machine's own (the per-node layer of settings), because the right values follow
the machine's graphics driver (novox/hq research 037):
| setting | default | what it changes |
|---|---|---|
backend |
glx |
how picom draws: glx on the graphics card, xrender on the CPU |
use-damage |
true |
true repaints only what changed (picom's own default); false repaints the whole screen each frame |
The defaults are what every machine ran before, so the file filled with them changes nothing. They exist
for hq issue 345: a window that is mapped but shows nothing (a calendar reminder) or stays stale after a
workspace switch (a chat window) is a known failure of glx with damage tracking on some drivers, and
xrender or use-damage false is how a machine is set to test that. The file stays trusted, so both are set at the
controller's terminal alone (issue 339): a value is pasted into picom.conf as it is, and a backend of
xrender"; write-pid-path = "… would add an option of the caller's (hq issue 346). A changed file is read at
the next picom_restart or login: the module has no unit to reload.
Tools
Served by the node's runtime as the operator account (ADR 0175). The tools find the operator's X session from the window manager's own environment, and say so plainly when nobody is logged in.
| tool | does |
|---|---|
picom_restart |
a running picom re-reads its file (SIGUSR1); hard, or none running, starts a fresh one |
picom_rules |
the global options and the window rules in force, in picom's order, and whether it runs |
picom_window_opacity |
read or set one window's own opacity, the focused window by default |
picom_toggle |
compositing off or on, for a game or a test; the next login starts it again |
A picom a tool starts runs under the account's own service manager (systemd-run --user, unit
picom). As a child of the runtime it would die whenever the runtime restarts.
What it improves on what was found
- Window rules replace
opacity-rule,inactive-opacityandinactive-dim, which picom 12 and later supersede. The behaviour is the same: only terminals are translucent (95 % focused, 75 % unfocused). The browser and video "pin to 100 %" rule went, because nothing else is made translucent any more. - Full-screen windows are opaque, a terminal included.
- One start. Today both the window manager's configuration and the autostart entry start picom, and the second one exits.
- On the desktop, picom was not running at all on the day it was measured, although both starts were
in place. It probably fails to start on that machine's GPU.
picom_restartwithhardafter assignment answers with what happened. The next step is thepicomuser unit's journal.
What it leaves as found
The window manager's own exec --no-startup-id picom line belongs to the i3 module's configuration,
which no longer carries it. Nothing else of picom's lies outside the directory this module owns.
Migration (ADR 0182)
- The first push keeps the found
picom.confonce, then writes the module's. - Until the
i3module replaces the hand-kept~/.config/i3/config, itsexec picomline starts a second picom. The second one exits at once, because a compositor is already running. Nothing to do, unless the line is still there afteri3is assigned.
Blockers
- The seat
node-compositorand the provisionx11-displayare ADR 0208's. Until the controller knows them,mctlreads the claim and the requirement as unknown, and refuses the module. xorg-xpropis declared here because thexorgmodule does not install it. Ifxorgcomes to declare it, it leaves this module, since a package is declared once per node.