spec: split v0 core from desktop tier
This commit is contained in:
1 parent
37550f447d
commit
3c1cfe351c
1 file changed
+348
-131
@@ -1,7 +1,7 @@
|
||||
# Ferese Window Manager Specification
|
||||
|
||||
Status: Draft for implementation
|
||||
Target: Ferese v0
|
||||
Target: Ferese v0 core and desktop-tier roadmap
|
||||
Language: Rust
|
||||
Display protocol: Wayland
|
||||
|
||||
@@ -11,8 +11,9 @@ Ferese is a Wayland tiling compositor for a conventional, keyboard-friendly
|
||||
desktop. It combines predictable window management with compositor-owned rounded
|
||||
geometry, shadows, animation, transparency, and semantic glass materials.
|
||||
|
||||
This document is the implementation source of truth for Ferese v0. The terms
|
||||
**MUST**, **MUST NOT**, **SHOULD**, **SHOULD NOT**, and **MAY** are normative.
|
||||
This document is the implementation source of truth for Ferese v0 and records
|
||||
the gated desktop-tier roadmap. The terms **MUST**, **MUST NOT**, **SHOULD**,
|
||||
**SHOULD NOT**, and **MAY** are normative within the tier being specified.
|
||||
|
||||
## 2. Product principles
|
||||
|
||||
@@ -27,9 +28,10 @@ This document is the implementation source of truth for Ferese v0. The terms
|
||||
|
||||
## 3. Scope
|
||||
|
||||
### 3.1 v0 requirements
|
||||
### 3.1 v0 core requirements
|
||||
|
||||
Ferese v0 MUST provide:
|
||||
Ferese v0 is the smallest independently usable native-Wayland release. It MUST
|
||||
provide:
|
||||
|
||||
- native Wayland compositing;
|
||||
- automatic and manually adjustable tiling;
|
||||
@@ -38,20 +40,35 @@ Ferese v0 MUST provide:
|
||||
- keyboard and pointer input;
|
||||
- native Wayland clipboard, primary selection, and drag-and-drop;
|
||||
- client-side and server-side decoration negotiation;
|
||||
- rounded clipping, borders, shadows, transparency, and backdrop blur;
|
||||
- rounded clipping, borders, shadows, and transparency;
|
||||
- frame-timestamp-driven window and workspace animations;
|
||||
- damage-aware rendering and blur caching;
|
||||
- damage-aware rendering;
|
||||
- validated live configuration reload;
|
||||
- authenticated local IPC and a command-line client;
|
||||
- a graphical settings application;
|
||||
- an overview, launcher, OSD, and basic notifications;
|
||||
- direct application launching;
|
||||
- standard layer-shell support under the policy in Section 8;
|
||||
- a direct DRM/KMS session; and
|
||||
- XWayland support, including clipboard interoperability.
|
||||
- the required native protocol baseline in Section 8.1.
|
||||
|
||||
The completed v0 MUST support routine software-development work without regular
|
||||
compositor restarts.
|
||||
The completed v0 MUST support routine native-Wayland software-development work
|
||||
without regular compositor restarts. The graphical Ferese shell is not required
|
||||
for basic window management or application launching.
|
||||
|
||||
### 3.2 Non-goals
|
||||
### 3.2 Desktop tier
|
||||
|
||||
The desktop tier builds on the v0 core and includes:
|
||||
|
||||
- backdrop blur and semantic glass materials;
|
||||
- the Ferese overview, launcher UI, workspace strip, OSD, and notifications;
|
||||
- the graphical settings application;
|
||||
- portal-backed screenshots and screen sharing; and
|
||||
- X11 compatibility through `xwayland-satellite` unless an architectural
|
||||
decision record selects another design.
|
||||
|
||||
These features MUST NOT delay the v0 core. Each MUST degrade or fail without
|
||||
terminating the compositor or invalidating managed-window state.
|
||||
|
||||
### 3.3 Non-goals
|
||||
|
||||
The following are outside v0:
|
||||
|
||||
@@ -81,7 +98,7 @@ daemon is not part of v0.
|
||||
code MUST NOT run inside the compositor.
|
||||
|
||||
```text
|
||||
Wayland/XWayland clients
|
||||
Wayland clients (plus optional X11 satellite)
|
||||
|
|
||||
v
|
||||
protocol adapters
|
||||
@@ -147,9 +164,7 @@ requests MUST enter core policy through explicit domain operations rather than
|
||||
mutating unrelated managers directly. A representative shape is:
|
||||
|
||||
```rust
|
||||
pub enum Action {
|
||||
WindowMapped(WindowId),
|
||||
WindowUnmapped(WindowId),
|
||||
pub enum Command {
|
||||
Focus(Direction),
|
||||
Move(Direction),
|
||||
Resize(Direction, f32),
|
||||
@@ -159,14 +174,54 @@ pub enum Action {
|
||||
ToggleFullscreen(WindowId),
|
||||
SetConfig(ConfigChange),
|
||||
}
|
||||
|
||||
pub enum Event {
|
||||
WindowMapped(WindowMapData),
|
||||
WindowUnmapped(WindowId),
|
||||
OutputConnected(OutputDescriptor),
|
||||
OutputDisconnected(OutputId),
|
||||
SurfaceCommitted(SurfaceCommit),
|
||||
}
|
||||
|
||||
pub struct WindowMapData {
|
||||
pub window: WindowId,
|
||||
pub surface: SurfaceId,
|
||||
pub app_id: Option<String>,
|
||||
pub title: Option<String>,
|
||||
pub parent: Option<WindowId>,
|
||||
pub requested_fullscreen: bool,
|
||||
pub constraints: SizeConstraints,
|
||||
}
|
||||
```
|
||||
|
||||
An action is applied as one state transaction. The transaction MUST either
|
||||
A command or event is applied as one state transaction. Commands express
|
||||
requested policy changes; events describe facts received from protocol or
|
||||
backend adapters and include the metadata needed to apply policy. Neither type
|
||||
MUST be used for emitted notifications.
|
||||
|
||||
The transaction MUST either
|
||||
complete with all Section 5 invariants restored or leave authoritative state
|
||||
unchanged. Rendering, protocol configure requests, IPC events, and persistence
|
||||
are consequences emitted after the state transition; they MUST NOT become a
|
||||
second source of policy state.
|
||||
|
||||
### 4.5 Threading and execution
|
||||
|
||||
The calloop thread owns the Wayland display, input dispatch, authoritative
|
||||
`FereseState`, policy transactions, configure scheduling, and scene publication.
|
||||
No other thread may mutate compositor state or Wayland objects.
|
||||
|
||||
Shader compilation, image decoding, configuration file I/O, IPC serialization,
|
||||
and other bounded background work MAY run on workers. Workers receive immutable
|
||||
snapshots or owned messages and return results through bounded channels. The
|
||||
calloop thread validates each result against current identifiers and generations
|
||||
before applying it. Rendering MAY run on the calloop thread initially; if moved
|
||||
to a render thread, scene snapshots and buffer ownership MUST cross an explicit
|
||||
handoff and never require input dispatch to wait for GPU completion.
|
||||
|
||||
Blocking filesystem, process-wait, D-Bus, portal, and client IPC operations MUST
|
||||
NOT run on the calloop thread.
|
||||
|
||||
## 5. Authoritative state
|
||||
|
||||
The compositor MUST maintain one state root:
|
||||
@@ -253,11 +308,17 @@ pub struct Workspace {
|
||||
|
||||
pub struct SeatState {
|
||||
pub id: SeatId,
|
||||
pub keyboard_focus: Option<WindowId>,
|
||||
pub keyboard_focus: FocusTarget,
|
||||
pub pointer_focus: Option<SurfaceId>,
|
||||
pub focused_output: Option<OutputId>,
|
||||
pub focused_workspace: Option<WorkspaceId>,
|
||||
}
|
||||
|
||||
pub enum FocusTarget {
|
||||
None,
|
||||
Window(WindowId),
|
||||
Shell(SurfaceId),
|
||||
}
|
||||
```
|
||||
|
||||
`Workspace::last_focused` is restoration/history state only. It MUST NOT be
|
||||
@@ -274,8 +335,9 @@ These invariants MUST hold after every state transaction:
|
||||
5. A window with `WindowPlacement::Floating` appears exactly once in the
|
||||
floating list and not in the tree.
|
||||
6. Fullscreen does not alter the window's underlying placement membership.
|
||||
7. `seat.keyboard_focus`, when present, refers to a managed window on
|
||||
`seat.focused_workspace`.
|
||||
7. A `FocusTarget::Window` refers to a managed window on
|
||||
`seat.focused_workspace`; a `FocusTarget::Shell` refers to a live, authorized
|
||||
interactive shell surface.
|
||||
8. `Workspace::last_focused`, when present, refers to a window belonging to that
|
||||
workspace.
|
||||
9. At most one window is fullscreen on a workspace at a time.
|
||||
@@ -297,6 +359,19 @@ When switching to a workspace that is already visible on another output, Ferese
|
||||
MUST focus that output and workspace instead of moving or swapping the workspace.
|
||||
Explicit workspace-move commands are responsible for relocating workspaces.
|
||||
|
||||
Mapping a normal application while another window is fullscreen MUST preserve
|
||||
the fullscreen window and place the new window into the underlying layout or
|
||||
floating list without revealing or focusing it. An urgent indication MAY be
|
||||
shown. A transient with a valid parent is floating by default, centered over and
|
||||
constrained to the parent's visible output, and follows the parent's workspace.
|
||||
Activation policy, not mapping alone, determines whether a transient receives
|
||||
focus.
|
||||
|
||||
Window rules MAY match normalized `app_id`, title, and transient metadata and
|
||||
set initial workspace, floating state, dimensions, or fullscreen state. Rules
|
||||
MUST be evaluated deterministically before insertion. Title matching SHOULD be
|
||||
avoided when a stable `app_id` exists.
|
||||
|
||||
## 6. Layout
|
||||
|
||||
```rust
|
||||
@@ -328,6 +403,19 @@ The engine consumes a layout tree, usable logical geometry, size constraints,
|
||||
and tiling configuration. It returns a deterministic `WindowId -> RectF` map and
|
||||
constraint warnings. Identical input MUST produce identical output.
|
||||
|
||||
The following tree invariants MUST hold after every layout transaction:
|
||||
|
||||
1. The tree is acyclic and every reachable node has exactly one parent except
|
||||
the root, which has none.
|
||||
2. Both children of a split exist and are distinct.
|
||||
3. A stack contains at least two children and its `active` index is in bounds.
|
||||
4. Removing a child collapses a one-child split or stack into its remaining
|
||||
child; removing the last child removes that branch.
|
||||
5. Every tiled window is represented by exactly one reachable leaf and every
|
||||
reachable window leaf refers to a tiled window in the same workspace.
|
||||
6. The focused leaf inside a stack is the active child's recursively focused
|
||||
window; directional operations enter a stack through its active child.
|
||||
|
||||
### 6.1 Automatic insertion
|
||||
|
||||
1. The first tiled window becomes the root.
|
||||
@@ -356,7 +444,9 @@ tiled window has no outer gap.
|
||||
Ferese MUST distinguish buffer, surface-local, logical-output, and physical
|
||||
coordinates. Layout and input policy use logical coordinates. Rendering performs
|
||||
physical conversion. Fractional scaling MUST avoid cumulative rounding errors
|
||||
between adjacent tiles.
|
||||
between adjacent tiles. The renderer MUST snap shared logical boundaries once
|
||||
per output and derive adjacent physical rectangles from those same snapped
|
||||
edges; it MUST NOT independently round each tile's origin and size.
|
||||
|
||||
A managed window has three geometry domains that MUST remain distinct:
|
||||
|
||||
@@ -407,6 +497,20 @@ to avoid a visible source-size discontinuity. Whether using a live committed
|
||||
buffer or snapshot, client content MUST remain aligned with the visual geometry
|
||||
used for hit testing.
|
||||
|
||||
During a non-interactive resize, committed content is scaled uniformly to cover
|
||||
the visual content box and clipped to that box, anchored at its top-left content
|
||||
origin. Ferese MUST NOT expose uninitialized regions. When a matching commit
|
||||
arrives it replaces the scaled source without restarting the animation. A commit
|
||||
is matching when its acknowledged configure and effective buffer geometry match
|
||||
the requested client size after scale and transform.
|
||||
|
||||
If a client has not acknowledged and committed the final configure within 500
|
||||
ms, Ferese MUST stop waiting for visual completion, retain the target layout,
|
||||
and continue presenting the latest valid content using the same scale-and-clip
|
||||
policy. The timeout is diagnostic rather than permission to send repeated
|
||||
configures. A client commit larger than its assigned tile is clipped to the
|
||||
tile; it MUST NOT overlap adjacent managed windows or change layout geometry.
|
||||
|
||||
During an interactive resize, configure events MAY follow pointer motion subject
|
||||
to normal coalescing and client responsiveness. Keyboard navigation MUST use the
|
||||
target layout topology, not transient visual geometry.
|
||||
@@ -416,6 +520,12 @@ to `visual.target`. Geometry uses spring animation; opacity, dimming, blur
|
||||
intensity, and overlays use bounded easing. Updates MUST use presentation or
|
||||
monotonic frame timestamps and MUST NOT assume a fixed refresh rate.
|
||||
|
||||
The default geometry spring uses mass `1.0`, stiffness `320.0`, and damping
|
||||
`36.0`, which is approximately critically damped. Geometry defaults MUST NOT
|
||||
overshoot shared tile boundaries. User-configured underdamped geometry springs
|
||||
MAY overshoot numerically, but their rendered content remains clipped to the
|
||||
animated allocation and MUST NOT cover adjacent windows.
|
||||
|
||||
Animations MUST stop within configured tolerances. Hidden animations SHOULD stop
|
||||
requesting frames. Opening, closing, or moving a window MUST never block input.
|
||||
|
||||
@@ -423,8 +533,8 @@ requesting frames. Opening, closing, or moving a window MUST never block input.
|
||||
|
||||
### 8.1 Required native protocols
|
||||
|
||||
Before the native desktop is usable, Ferese MUST support the stable protocols
|
||||
needed for:
|
||||
Before the native desktop is usable, Ferese MUST support the following core
|
||||
protocols and widely deployed extensions:
|
||||
|
||||
- compositor, subcompositor, shared memory, and outputs;
|
||||
- xdg-shell;
|
||||
@@ -436,12 +546,28 @@ needed for:
|
||||
- relative pointer and pointer constraints;
|
||||
- presentation timing;
|
||||
- viewporter and fractional scaling;
|
||||
- idle inhibition; and
|
||||
- layer-shell;
|
||||
- screencopy with the capture authorization policy from Section 13;
|
||||
- cursor-shape-v1;
|
||||
- text-input-v3 and input-method-v2;
|
||||
- keyboard-shortcuts-inhibit-v1;
|
||||
- idle-notify-v1 and idle-inhibit-v1;
|
||||
- xdg-foreign-v2;
|
||||
- single-pixel-buffer-v1; and
|
||||
- Linux dma-buf where supported.
|
||||
|
||||
Layer-shell, screencopy, virtual input, and session-lock MAY be added after their
|
||||
security policy is specified. Their absence does not block v0 unless a Ferese
|
||||
component requires them.
|
||||
Layer-shell is a public standard role and MUST NOT require a Ferese private
|
||||
capability. Ferese MUST enforce exclusive-zone, focus, namespace, and layer
|
||||
policy so ordinary panels, launchers, and notification daemons can use it
|
||||
without receiving unrestricted compositor authority. Input-method access,
|
||||
screencopy, and shortcut inhibition MUST use explicit user/session policy;
|
||||
binding a public global alone MUST NOT silently grant capture or persistent
|
||||
keyboard interception.
|
||||
|
||||
Virtual input and session-lock MAY be added after their security and failure
|
||||
policies are specified. Portal integration is not a Wayland protocol: the
|
||||
desktop tier MUST separately provide an XDG Desktop Portal backend and PipeWire
|
||||
integration for interactive screenshots and screen sharing.
|
||||
|
||||
### 8.2 Decorations
|
||||
|
||||
@@ -452,12 +578,17 @@ mode.
|
||||
|
||||
### 8.3 XWayland
|
||||
|
||||
XWayland windows use the same `Window` abstraction as native surfaces. The
|
||||
layout engine MUST remain protocol-agnostic.
|
||||
The desktop tier SHOULD use `xwayland-satellite`, launched on demand, so X11
|
||||
clients become ordinary xdg-shell toplevels from Ferese's perspective. The
|
||||
layout engine and `Window` abstraction MUST remain protocol-agnostic. Clipboard
|
||||
and primary-selection interoperability depend on the corresponding public
|
||||
Wayland protocols remaining available to the satellite.
|
||||
|
||||
XWayland support includes startup, mapping, focus, tiled geometry, floating
|
||||
hints, selection bridging, and correct stacking for popups and override-redirect
|
||||
windows.
|
||||
An embedded X11 window manager requires an architectural decision record and
|
||||
MUST justify the additional selection, focus, stacking, and override-redirect
|
||||
policy. Tests MUST cover X11 menus, dialogs, games, and applications that request
|
||||
absolute positioning; the satellite approach reduces compositor complexity but
|
||||
does not guarantee every X11 positioning convention.
|
||||
|
||||
## 9. Scene and rendering
|
||||
|
||||
@@ -486,6 +617,9 @@ intermediates rather than full-resolution per-frame blur.
|
||||
|
||||
## 10. Material system
|
||||
|
||||
This section specifies the desktop-tier material system. It is not a v0 release
|
||||
gate.
|
||||
|
||||
Initial semantic materials are:
|
||||
|
||||
```text
|
||||
@@ -530,20 +664,21 @@ tuning is complete.
|
||||
|
||||
### 10.1 Built-in visual profile
|
||||
|
||||
v0 provides one restrained dark profile rather than a theme engine. Its defaults
|
||||
are a subtle blue focus accent, 14 logical-pixel window radius, 10 logical-pixel
|
||||
tiling gaps, soft shadows, 24 logical-pixel backdrop blur, and mildly increased
|
||||
glass saturation. Focused and foreground content MUST remain distinguishable
|
||||
The desktop tier provides one restrained dark profile rather than a theme
|
||||
engine. Its defaults are a subtle blue focus accent, 14 logical-pixel window
|
||||
radius, 10 logical-pixel tiling gaps, soft shadows, 24 logical-pixel backdrop
|
||||
blur, and mildly increased glass saturation. Focused and foreground content MUST remain distinguishable
|
||||
without requiring transparency. Blur, glow, borders, and shadows SHOULD establish
|
||||
hierarchy rather than compete for attention. Settings, overview, notifications,
|
||||
launcher, and OSD MUST use the same semantic materials and spacing system.
|
||||
|
||||
## 11. Shell and overview
|
||||
|
||||
`ferese-shell` owns overview controls, launcher, workspace strip, notifications,
|
||||
and volume and brightness OSD. Screenshot UI MAY be added after capture policy
|
||||
and implementation are complete. The shell uses a capability-scoped private
|
||||
Wayland connection plus authenticated IPC.
|
||||
This section specifies desktop-tier behavior. `ferese-shell` owns overview
|
||||
controls, launcher, workspace strip, notifications, and volume and brightness
|
||||
OSD. Screenshot UI MAY be added after capture policy and implementation are
|
||||
complete. The shell uses a capability-scoped private Wayland connection plus
|
||||
authenticated IPC.
|
||||
|
||||
Overview MUST NOT require copying each managed window into the shell process.
|
||||
The compositor owns the live window presentation and enters an overview scene
|
||||
@@ -558,12 +693,14 @@ MUST animate those same nodes back to the current layout targets. Workspace
|
||||
switching from overview MUST obey Section 5.4. Search MAY wait for the launcher
|
||||
milestone.
|
||||
|
||||
### 11.1 Private shell surfaces
|
||||
### 11.1 Shell surfaces
|
||||
|
||||
Because layer-shell is not required for v0, Ferese MUST provide a private
|
||||
`ferese-shell-v1` protocol to clients with the `shell-surfaces` capability. A
|
||||
shell surface is not a managed application window and MUST NOT enter tiling,
|
||||
workspace focus history, or normal application task switching.
|
||||
`ferese-shell` MUST use standard layer-shell for launcher, workspace UI,
|
||||
notifications, and OSD surfaces. Such a surface is not a managed application
|
||||
window and MUST NOT enter tiling, workspace focus history, or normal application
|
||||
task switching. Ferese MAY use a minimal private `ferese-shell-v1` protocol for
|
||||
overview control and compositor-owned live-window selection, but it MUST NOT
|
||||
duplicate the standard layer-shell role or geometry model.
|
||||
|
||||
Initial semantic roles are:
|
||||
|
||||
@@ -575,9 +712,9 @@ notification
|
||||
osd
|
||||
```
|
||||
|
||||
The compositor owns placement, z-order bounds, input region enforcement, and
|
||||
output association for these roles. The shell provides content and requests a
|
||||
role; it MUST NOT receive unrestricted arbitrary z-order or geometry authority.
|
||||
The compositor enforces layer, exclusive-zone, focus, input-region, and output
|
||||
policy. The shell provides content and requests a standard layer-shell role; it
|
||||
MUST NOT receive unrestricted arbitrary z-order or geometry authority.
|
||||
Interactive shell surfaces MAY receive keyboard/pointer focus while active, but
|
||||
Ferese MUST restore the prior managed-window focus when the interaction ends.
|
||||
Destroying or disconnecting the shell client MUST remove its shell surfaces
|
||||
@@ -595,8 +732,8 @@ trusted component is the sole exception during that component's initial exec;
|
||||
the component MUST mark it close-on-exec before it can launch any child.
|
||||
|
||||
`ferese-shell` MUST implement the standard `org.freedesktop.Notifications` D-Bus
|
||||
service for basic notifications. v0 MUST support summary, body, icon metadata,
|
||||
expiry, replacement, close, and actions. Notification content is untrusted:
|
||||
service for basic notifications. The desktop tier MUST support summary, body,
|
||||
icon metadata, expiry, replacement, close, and actions. Notification content is untrusted:
|
||||
markup, image paths, and action identifiers MUST be parsed and rendered without
|
||||
command execution. If the shell restarts, it MUST reacquire the service and
|
||||
continue without affecting managed windows.
|
||||
@@ -630,7 +767,7 @@ speed = 1.0
|
||||
|
||||
[animations.spring]
|
||||
stiffness = 320.0
|
||||
damping = 28.0
|
||||
damping = 36.0
|
||||
mass = 1.0
|
||||
|
||||
[tiling]
|
||||
@@ -641,6 +778,16 @@ default_split = "automatic"
|
||||
|
||||
[input]
|
||||
focus_follows_mouse = false
|
||||
xkb_layout = "us"
|
||||
xkb_variant = ""
|
||||
xkb_options = []
|
||||
repeat_rate = 25
|
||||
repeat_delay_ms = 600
|
||||
|
||||
[input.touchpad]
|
||||
tap = true
|
||||
natural_scroll = true
|
||||
disable_while_typing = true
|
||||
|
||||
[commands]
|
||||
terminal = ["foot"]
|
||||
@@ -658,17 +805,36 @@ action = "close"
|
||||
keys = "Super+Tab"
|
||||
action = "show-overview"
|
||||
|
||||
[[bindings]]
|
||||
keys = "Super+H"
|
||||
match = "keysym"
|
||||
action = "focus"
|
||||
argument = "left"
|
||||
|
||||
[[bindings]]
|
||||
keys = "Super+Space"
|
||||
action = "show-launcher"
|
||||
|
||||
# Example: remove a built-in binding.
|
||||
[[bindings]]
|
||||
keys = "Super+Q"
|
||||
disabled = true
|
||||
|
||||
[[window_rules]]
|
||||
app_id = "org.example.DialogApp"
|
||||
floating = true
|
||||
```
|
||||
|
||||
Command values are argument arrays, never shell command strings. Binding records
|
||||
use a normalized key chord, action, and optional argument. The complete built-in
|
||||
set is listed in Section 14; when a user supplies a record for a chord it
|
||||
replaces that default. Duplicate normalized chords, unknown actions, invalid
|
||||
arguments, and references to missing commands MUST fail validation. Every
|
||||
built-in binding MUST be expressible and replaceable through this schema.
|
||||
use a normalized key chord, match mode, action, and optional argument. `keysym`
|
||||
matching is the default and follows the active XKB layout. `physical` matching
|
||||
uses XKB physical key names and is independent of the selected layout. The
|
||||
complete built-in set is listed in Section 14; when a user supplies a record for
|
||||
the same chord and match mode it replaces that default. A record with
|
||||
`disabled = true` and no action explicitly unbinds the matching default.
|
||||
Duplicate normalized bindings, unknown actions, invalid arguments, and
|
||||
references to missing commands MUST fail validation. Every built-in binding
|
||||
MUST be expressible, replaceable, and removable through this schema.
|
||||
|
||||
Unknown fields SHOULD warn. Invalid types, non-finite values, negative sizes,
|
||||
and out-of-range opacity MUST fail validation.
|
||||
@@ -695,7 +861,7 @@ capabilities are:
|
||||
|
||||
```text
|
||||
effects
|
||||
shell-surfaces
|
||||
overview-control
|
||||
global-metadata
|
||||
capture
|
||||
virtual-input
|
||||
@@ -709,12 +875,17 @@ arguments, environment secrets, or a discoverable private socket path.
|
||||
|
||||
The compositor associates an explicit capability set with each private Wayland
|
||||
client and filters private globals and requests against that set. In particular,
|
||||
`ferese-effects-v1` requires `effects` and `ferese-shell-v1` requires
|
||||
`shell-surfaces`. `ferese-shell` receives only the capabilities required by
|
||||
enabled shell features.
|
||||
`ferese-effects-v1` requires `effects` and the private overview requests in
|
||||
`ferese-shell-v1` require `overview-control`. `ferese-shell` receives only the
|
||||
capabilities required by enabled shell features.
|
||||
`ferese-settings` receives `effects` when spawned as a trusted Ferese component;
|
||||
its configuration changes still use the normal validated IPC path.
|
||||
|
||||
The private `capture` capability permits unattended capture only for a trusted
|
||||
component. Public screencopy clients remain subject to the interactive or
|
||||
configured capture policy and do not acquire this capability merely by binding
|
||||
the public screencopy global.
|
||||
|
||||
If a trusted component launches another privileged Ferese component, it MUST ask
|
||||
the compositor to create and pass a new capability-scoped private connection;
|
||||
it MUST NOT forward its own Wayland descriptor or capabilities.
|
||||
@@ -783,7 +954,16 @@ queue overflows rather than block the compositor.
|
||||
|
||||
Ferese MUST support click-to-focus, configurable focus-follows-pointer, floating
|
||||
move/resize, tiled rearrangement and divider resizing, pointer constraints,
|
||||
relative pointer, and configurable bindings.
|
||||
relative pointer, cursor-shape, text input, configurable XKB layout and repeat,
|
||||
touchpad tap/natural-scroll policy, and configurable bindings. Default bindings
|
||||
match keysyms, so `Super+H/J/K/L` follows the active keyboard layout. Users MAY
|
||||
select physical matching per binding when spatial key positions are desired.
|
||||
|
||||
A focused client MAY inhibit compositor shortcuts only while its requesting
|
||||
surface is visible and holds keyboard focus. Ferese MUST retain an emergency
|
||||
escape binding that cannot be inhibited. Input-method activation MUST follow the
|
||||
focused text-input request and MUST NOT grant the input-method client general
|
||||
shortcut or capture authority.
|
||||
|
||||
```text
|
||||
Super+Enter terminal
|
||||
@@ -798,6 +978,10 @@ Super+Space launcher
|
||||
Super+Tab overview
|
||||
```
|
||||
|
||||
The launcher and overview bindings are desktop-tier defaults and MUST be
|
||||
installed only when their actions are available. Their absence from a v0-only
|
||||
installation is not a binding error.
|
||||
|
||||
Bare `Super` MUST NOT activate overview. Interactive grabs MUST have explicit
|
||||
cancellation. Losing a device, seat, surface, or output during a grab MUST end it
|
||||
safely.
|
||||
@@ -829,6 +1013,15 @@ workspace unless the removed output held the seat focus. In that case, the
|
||||
removed output's active workspace becomes active on the target and the seat's
|
||||
managed-window focus is restored there where possible.
|
||||
|
||||
Ferese MUST derive a persistent output identity from stable connector and EDID
|
||||
properties and record the workspaces evacuated during the compositor lifetime.
|
||||
When that output returns, those workspaces return to it atomically if they still
|
||||
reside on their automatic migration target and have not been explicitly moved
|
||||
since disconnection. Its previous active workspace is restored when available.
|
||||
Explicit user movement wins; Ferese MUST NOT take a workspace back from a new
|
||||
assignment. If no recorded workspace can return, normal new-output assignment
|
||||
applies.
|
||||
|
||||
## 16. Performance and observability
|
||||
|
||||
The target is sustained output refresh at 60 Hz on integrated graphics during
|
||||
@@ -846,15 +1039,17 @@ animations. Performance tracing MUST be optional. Suggested targets are
|
||||
|
||||
Unit tests MUST cover insertion, deletion, focus, movement, ratios, constraints,
|
||||
resize, stacks, floating transitions, fullscreen placement preservation,
|
||||
workspace migration, gaps, and deterministic geometry. They MUST NOT require
|
||||
Wayland. Property tests
|
||||
SHOULD prove arbitrary operation sequences do not duplicate or lose windows.
|
||||
workspace migration and restoration, gaps, shared-edge rounding, and
|
||||
deterministic geometry. They MUST NOT require Wayland. Property tests SHOULD
|
||||
prove arbitrary operation sequences preserve acyclic trees, valid parentage and
|
||||
stack cardinality, and do not duplicate or lose windows.
|
||||
|
||||
### 17.2 Configuration
|
||||
|
||||
Tests MUST cover defaults, partial files, unknown fields, invalid and non-finite
|
||||
values, duplicate key chords, unknown binding actions, missing command
|
||||
references, reload rollback, serialization, and atomic updates.
|
||||
references, keysym versus physical matching, default unbinding, window-rule
|
||||
ordering, reload rollback, serialization, and atomic updates.
|
||||
|
||||
### 17.3 IPC and security
|
||||
|
||||
@@ -877,7 +1072,9 @@ scene transitions, notification replacement/actions, and shell restart.
|
||||
|
||||
## 18. Milestones
|
||||
|
||||
A milestone is complete only when its acceptance criteria pass.
|
||||
A milestone is complete only when its acceptance criteria pass. M0 through M6
|
||||
form the v0 release path. M7 through M10 are independently gated desktop-tier
|
||||
work and MUST NOT delay the v0 release.
|
||||
|
||||
### M0: Native window on screen
|
||||
|
||||
@@ -916,70 +1113,87 @@ per-frame configure events; a client may commit its final size mid-animation
|
||||
without restarting the transition; inverse-transformed hit testing matches the
|
||||
visible surface; input stays responsive.
|
||||
|
||||
### M4: Visual foundation
|
||||
### M4: Early hardware session
|
||||
|
||||
Implement rounded clipping, shadows, active borders, transparency, background,
|
||||
and damage expansion.
|
||||
Implement the smallest useful libseat, DRM/KMS, GBM, libinput, and session-
|
||||
lifecycle path for one output. Record page-flip presentation timestamps and
|
||||
missed-deadline metrics. Keep the nested backend for development.
|
||||
|
||||
Acceptance: masks clip correctly; old and new movement bounds repaint;
|
||||
fullscreen has no unintended corners or gaps.
|
||||
Acceptance: Ferese starts from a TTY, renders the M3 workload directly, survives
|
||||
session deactivate/reactivate, and drives animation from measured presentation
|
||||
timing. Frame pacing and animation are measured on the reference integrated GPU
|
||||
before blur or shell work begins.
|
||||
|
||||
### M5: Glass materials
|
||||
### M5: Native desktop interoperability
|
||||
|
||||
Implement semantic materials, capture, dual Kawase blur, tint, saturation, noise,
|
||||
caching, invalidation, and the private effects protocol.
|
||||
Implement layer-shell, cursor-shape, text-input/input-method, shortcut inhibit,
|
||||
idle notify/inhibit, xdg-foreign, single-pixel-buffer, screencopy authorization,
|
||||
multi-output hotplug, and the remaining Section 8.1 protocols.
|
||||
|
||||
Acceptance: a Ferese panel blurs only content behind it; backdrop changes
|
||||
Acceptance: representative native panels, launchers, notification daemons, IMEs,
|
||||
VM/remote-desktop clients, and screenshot clients exercise their protocols;
|
||||
output removal and return obey Section 15; security-sensitive requests are
|
||||
denied without the required policy decision.
|
||||
|
||||
### M6: Shippable v0 core
|
||||
|
||||
Implement rounded clipping, shadows, active borders, transparency, damage
|
||||
expansion, validated textual configuration, input settings, window rules,
|
||||
direct application launching, IPC, and `feresectl`. Complete native-client crash,
|
||||
soak, and performance testing.
|
||||
|
||||
Acceptance: masks and damage are correct; configuration reload is transactional;
|
||||
defaults can be replaced or unbound; `feresectl` commands work reliably; a
|
||||
configured terminal launches without shell parsing; malformed clients do not
|
||||
affect availability; a 24-hour native-client soak has no compositor crash or
|
||||
unbounded resource growth; all Section 3.1 requirements pass.
|
||||
|
||||
### M7: Glass materials
|
||||
|
||||
Before choosing a shell toolkit, build a minimal `wayland-client` probe that
|
||||
creates a layer-shell surface and sets a semantic material through
|
||||
`ferese-effects-v1`. Then implement capture, dual Kawase blur, tint, saturation,
|
||||
noise, caching, and invalidation.
|
||||
|
||||
Acceptance: the probe blurs only content behind its surface; backdrop changes
|
||||
invalidate correctly; the effects global is visible only to a client with the
|
||||
`effects` capability; a public Wayland client cannot bind it; the demo stays
|
||||
smooth on the reference integrated GPU.
|
||||
|
||||
### M6: IPC and CLI
|
||||
|
||||
Implement framing, authorization, events, and `feresectl`.
|
||||
|
||||
Acceptance: `feresectl focus left`, `feresectl workspace 2`, and
|
||||
`feresectl get-workspaces` work reliably. Every request receives a response or
|
||||
bounded-time error; malformed clients do not affect availability.
|
||||
|
||||
### M7: Settings
|
||||
|
||||
Build Appearance, Tiling, Shortcuts, Input, Workspaces, Displays, and About.
|
||||
|
||||
Acceptance: controls preview live; invalid changes do not replace active config;
|
||||
committed changes survive restart; shortcut editing uses the canonical binding
|
||||
schema and detects conflicts; the v0 Displays page accurately reports automatic
|
||||
mode, scale, transform, and placement state but MAY be read-only; when spawned
|
||||
as a trusted component, Settings receives only the private Wayland capabilities
|
||||
it requires.
|
||||
`effects` capability; a public client cannot bind it; the demo meets its frame
|
||||
budget on the reference integrated GPU.
|
||||
|
||||
### M8: Overview and shell
|
||||
|
||||
Implement compositor overview scene mode, `ferese-shell-v1`, launcher, workspace
|
||||
strip, OSD, and the standard desktop notifications D-Bus service.
|
||||
First spike GPUI layer-surface creation, output discovery, focus, configure, and
|
||||
shutdown behavior. If the spike fails its lifecycle tests, use a thin native
|
||||
Wayland shell adapter or record a toolkit decision before proceeding. Implement
|
||||
the compositor overview scene, minimal `ferese-shell-v1` overview control,
|
||||
launcher UI, workspace strip, OSD, and the standard notifications D-Bus service.
|
||||
|
||||
Acceptance: `Super+Tab` controls overview; managed windows remain compositor-
|
||||
owned live scene nodes rather than copied shell thumbnails; selection follows
|
||||
the transformed visual geometry; applications launch without shell parsing or
|
||||
privileged-descriptor inheritance; notification replacement and actions work;
|
||||
shell restart does not disrupt windows; each trusted UI process receives only
|
||||
its assigned capabilities.
|
||||
Acceptance: normal shell windows use layer-shell; `Super+Tab` controls overview;
|
||||
managed windows remain compositor-owned live scene nodes; selection follows
|
||||
visual geometry; notification replacement/actions work; shell restart does not
|
||||
disrupt windows; each trusted process receives only its assigned capabilities.
|
||||
|
||||
### M9: Hardware session
|
||||
### M9: Settings and portals
|
||||
|
||||
Implement libseat lifecycle, DRM, GBM, devices, hotplug, and VT/session state.
|
||||
Build Appearance, Tiling, Shortcuts, Input, Workspaces, Displays, and About.
|
||||
Implement the portal backend and PipeWire integration for screenshots and screen
|
||||
sharing.
|
||||
|
||||
Acceptance: Ferese starts from a TTY; deactivation releases resources correctly;
|
||||
output removal migrates workspaces deterministically.
|
||||
Acceptance: controls preview live; invalid changes do not replace active config;
|
||||
changes survive restart; shortcut editing can replace and unbind defaults; the
|
||||
Displays page represents hotplug and return behavior; portal requests require an
|
||||
interactive authorization path and produce working screenshots/streams.
|
||||
|
||||
### M10: XWayland and stabilization
|
||||
### M10: X11 compatibility and desktop stabilization
|
||||
|
||||
Implement XWayland startup, mapping, hints, focus, selection bridging, and
|
||||
stacking. Complete crash, soak, and performance testing.
|
||||
Integrate `xwayland-satellite` on demand and complete desktop-tier crash, soak,
|
||||
compatibility, and performance testing. Replacing the satellite with an embedded
|
||||
X11 window manager requires the architectural decision from Section 8.3.
|
||||
|
||||
Acceptance: representative X11 applications tile and float; clipboard works both
|
||||
ways between X11 and Wayland; a 24-hour mixed-client soak has no compositor crash
|
||||
or unbounded resource growth; all Section 3.1 requirements pass.
|
||||
ways; menus, dialogs, games, and absolute-position requests have documented test
|
||||
results; a 24-hour mixed-client soak has no compositor crash or unbounded
|
||||
resource growth; all Section 3.2 desktop-tier requirements pass.
|
||||
|
||||
## 19. First implementation slice
|
||||
|
||||
@@ -989,35 +1203,38 @@ nested Smithay compositor
|
||||
-> deterministic two-window tiling
|
||||
-> logical/visual/client geometry separation
|
||||
-> spring reflow with coalesced final configure
|
||||
-> rounded clipping
|
||||
-> one capability-scoped trusted glass panel
|
||||
```
|
||||
|
||||
The slice succeeds when A and B tile automatically; closing B immediately updates
|
||||
the logical layout while A expands visually; A receives no per-frame configure
|
||||
flood; pointer input remains aligned through inverse transforms; a private client
|
||||
with only the `effects` capability can display a panel that blurs A; a public
|
||||
client cannot bind that protocol; terminal changes refresh the backdrop; and all
|
||||
interaction remains responsive and damage-driven.
|
||||
flood; pointer input remains aligned through inverse transforms; shared edges
|
||||
round identically; terminal changes damage the correct regions; and all
|
||||
interaction remains responsive.
|
||||
|
||||
Settings, XWayland, hardware multi-output, notifications, and theming MUST NOT
|
||||
delay this slice.
|
||||
M4 follows this nested slice immediately so frame pacing is validated on real
|
||||
hardware. Glass, GPUI, Settings, XWayland, notifications, portals, and theming
|
||||
MUST NOT delay it or the v0 core.
|
||||
|
||||
## 20. Definition of v0
|
||||
|
||||
Ferese v0 is complete when a user can:
|
||||
|
||||
1. start a direct Ferese session;
|
||||
2. run ordinary Wayland and XWayland applications;
|
||||
2. run ordinary native Wayland applications and layer-shell utilities;
|
||||
3. copy, paste, drag, and use application popups;
|
||||
4. tile, focus, move, resize, float, fullscreen, and close windows;
|
||||
5. use multiple workspaces and outputs;
|
||||
6. configure gaps, materials, corners, borders, shadows, and animations live;
|
||||
7. use overview, launcher, OSD, and basic notifications;
|
||||
8. control permitted behavior through `feresectl`;
|
||||
9. recover from shell or settings crashes without losing client sessions; and
|
||||
10. perform routine programming work without regular compositor restarts.
|
||||
6. configure input, bindings, rules, gaps, corners, borders, shadows, and
|
||||
animations through validated live reload;
|
||||
7. launch configured applications directly;
|
||||
8. use an IME, inhibit shortcuts where allowed, take an authorized screenshot,
|
||||
and resume after output removal or session switching;
|
||||
9. control permitted behavior through `feresectl`; and
|
||||
10. perform routine native-Wayland programming work without regular compositor
|
||||
restarts.
|
||||
|
||||
The intended result is a low-latency tiling environment with a restrained,
|
||||
coherent system shell. Visual effects support hierarchy and usability; they do
|
||||
not replace correctness, responsiveness, or security.
|
||||
The intended v0 result is a low-latency, independently usable tiling compositor.
|
||||
The desktop tier adds a coherent Ferese shell, glass, graphical settings,
|
||||
portals, and X11 compatibility without redefining core correctness. Visual
|
||||
effects support hierarchy and usability; they do not replace correctness,
|
||||
responsiveness, or security.
|
||||
Reference in new issue
Block a user