neferwl private protocol. No stability promise beyond the version of the interface. Optional additions to ext-image-capture-source-v1, ext-workspace-v1 and ext-image-copy-capture-v1 for what those protocols do not cover: workspace and output-region capture sources, the frame of a workspace, and leaving a client's own surfaces (a recording HUD) out of its captures. Capture always goes through ext-image-copy-capture. The compositor applies the same rules to every capture, whatever its source: it may refuse a client (ext_image_copy_capture_session_v1.stopped), and it draws its own capture indicator on screen, never in a captured image, which no client can turn off. Global. Sources created here are ext_image_capture_source_v1 objects, used with ext_image_copy_capture_manager_v1.create_session like any other source. Sources created through it stay valid. The source is the workspace frame, without bars, whether or not the workspace is on screen: a workspace that is not on screen is rendered for capture only. Its buffer size follows the workspace frame. A session on it is stopped when the workspace is removed. A handle already removed gives a source whose sessions stop at once. The rectangle is in output-local logical pixels and is clipped to the output. The buffer covers only that rectangle, in physical pixels. A session on it is stopped when the output goes away or when nothing of the rectangle is left on the output. ext-workspace-v1 carries no geometry. The frame object reports the rectangle that a workspace source of the same handle captures. For a handle already removed, the object never sends frame. It needs no capture authorization: the frame is layout information, not pixels. The frame is the area of its output that the workspace draws in, without bars: the whole output, or the smaller size set for the workspace. The frame in output-local logical pixels. Sent when the object is created and again whenever the frame changes. Not sent once the workspace is removed. Not sent while the session is locked; the current frame is sent after unlock if it changed. Global. A recorder asks for an exclusion on its capture session and gets a token; its HUD, usually on another connection of the same user, attaches layer surfaces with that token. Frames of that session leave the attached surfaces out. Every other capture shows them. Exclusions and attachments created through it stay alive. The exclusion answers with exactly one of token or failed. It ends with the capture session. Marks a layer surface of this client as excluded from the frames of the session that owns the token. The client must have the same user ID as the compositor and must also be allowed to capture: its executable is on the capture allowlist (or the allowlist is off), it is not sandboxed, and the session is not locked. The surface must already have the wlr-layer-shell role, on the top or overlay layer, must not have mapped yet and must not ask for exclusive keyboard interactivity. At most 4 layers per exclusion. An attached layer never gets keyboard interactivity; if it moves to another layer the compositor closes it and sends detached. The attachment answers with exactly one of attached or failed. The surface is excluded from this request on, before it can map; the client must not show it before attached. Destroying it detaches every attached layer. 64 lowercase hexadecimal characters (32 random bytes). A secret for the owner and its HUD, never logged, valid until the exclusion ends. Final. Destroy the object. Created by attach_surface. Exactly one of attached or failed comes first; detached comes at most once, after attached. The surface stays excluded until its layer role is destroyed or the exclusion ends. The compositor confirmed the attachment. Safe to show. Sent once after attached. When the exclusion ended, the compositor also closed the layer surface (zwlr_layer_surface_v1.closed).