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).