advance shell integration and session support

This commit is contained in:
Samuel Onoja committed 2026-09-25 09:15:07 +01:00
1 parent 0420242350
commit e85fc1e032
27 files changed
+1165 -201

No files matched your search

+4 -4
View File
@@ -240,10 +240,10 @@ base_unit = 8.0
window_radius = 14.0
top_bar_height = 32.0
top_bar_height = 38.0
top_bar_margin_top = 4.0
top_bar_margin_horizontal = 10.0
top_bar_radius = 16.0
top_bar_radius = 19.0
launcher_width = 560.0
launcher_radius = 20.0
@@ -724,8 +724,8 @@ noise = 0.012
[theme.geometry]
window_radius = 14.0
top_bar_height = 32.0
top_bar_radius = 16.0
top_bar_height = 38.0
top_bar_radius = 19.0
launcher_width = 560.0
launcher_radius = 20.0
+1 -1
View File
@@ -1127,7 +1127,7 @@ mass = 1.0
[layout]
mode = "scrolling"
inner_gap = 10.0
outer_gap = 10.0
outer_gap = 4.0
smart_gaps = false
[scrolling]
+53
View File
@@ -0,0 +1,53 @@
# Fedora / SDDM installation
Build and test in the checkout:
```sh
cargo test -p ferese -p feresectl -p ferese-animation -p ferese-core -p ferese-layout -p ferese-shell --locked
cargo build --release --locked -p ferese -p ferese-shell -p feresectl
sudo bash scripts/install-session.sh YOUR_RELEASE_ID
```
The installer adds **Ferese** to SDDM without changing Plasma or
the default session. It installs immutable, versioned directories in
`/usr/local/lib/ferese/releases/` and launchers in `/usr/local/bin/`.
`current` selects the installed build; `previous` records the prior selection
on upgrades. Installation refuses to replace unmanaged launchers/session files.
Keep your existing `~/.config/ferese/config.toml`. For a new configuration, copy
`/usr/local/lib/ferese/current/config.example.toml` there. The existing compositor
defaults handle connected monitors automatically; add output profiles only after
checking `feresectl get-outputs` on the actual DRM session.
Use `ferese-session --nested` for an installed-build preview. Log out of Plasma
and select Ferese in SDDM for real hardware use. `ferese-session` can also run
from a spare logged-in TTY. It must run as your normal user, never as root.
Foot and `dbus-run-session` must be installed.
Session logs are written under `${XDG_STATE_HOME:-~/.local/state}/ferese/`.
The launcher sets Wayland desktop variables, starts D-Bus if none is available,
and grants shell capabilities only to the compositor-launched shell process.
It does not enable public screencopy, privileged input methods, or shortcut
inhibition by default.
## Logout and recovery
Save your work, then press **Super+Shift+E** or run `feresectl exit` to log out.
Ferese stops its event loop and terminates its shell child during shutdown.
This is immediate logout, without a save-confirmation dialog.
If the compositor becomes unresponsive, switch to another TTY using
Ctrl+Alt+F1–F12 and terminate that specific Ferese process. Select Plasma on the
next login. Do not restart SDDM while a desktop contains unsaved work.
For a binary rollback, inspect `/usr/local/lib/ferese/previous` and select that
release with the `current` symlink while Ferese is stopped. Existing releases
are retained. To hide the login option, move
`/usr/share/wayland-sessions/ferese.desktop` out of that directory.
## First hardware session
Verify terminal/editor/browser, clipboard, fullscreen, fractional scaling,
monitor disconnect/reconnect, VT switching away/back, and logout. Suspend/resume
and session locking are not certified by the nested smoke test. Keep Plasma
available until real development sessions and these checks pass.
+61
View File
@@ -0,0 +1,61 @@
# Nested live-resize regression check
The shell enables libcosmic's `wgpu` feature. Without it, iced uses tiny-skia
to resample and rasterize the wallpaper on the CPU. In an unoptimized build,
this blocks the UI/render thread shared with the top bar for seconds. Prompt
layer configures, buffer stretching, and compositor vsync cannot fix that
client-side bottleneck. Software rendering remains available as a fallback.
## Reproduce and compare
```sh
cargo build --locked -p ferese -p ferese-shell
WAYLAND_DEBUG=1 FERESE_TRACE_PERFORMANCE=1 \
target/debug/ferese --backend nested --grant-effects --grant-shell-control -- \
target/debug/ferese-shell 2>/tmp/ferese-resize.log
```
Use a configured wallpaper. Drag the host window's edges in both directions,
then maximize/restore it repeatedly. Check that the wallpaper and bar follow
the window, including at fractional host scaling. Repeat with
`ICED_BACKEND=wgpu` to require GPU rendering (rather than silently accepting
fallback), and with `ICED_BACKEND=tiny-skia` to compare software rendering.
Use a release build if software fallback is needed for regular use.
Trace the chain, not just the compositor's frame rate:
1. Host `xdg_toplevel.configure` becomes Winit `Resized`.
2. Ferese updates the output, arranges layers, and sends
`zwlr_layer_surface_v1.configure` for the new logical dimensions.
3. The shell acknowledges configure and eventually attaches/commits a new
buffer. A fast acknowledgement does **not** imply a finished render.
4. Committed buffers change surface damage; Ferese renders the damaged output
and submits through EGL to the host compositor.
`FERESE_TRACE_PERFORMANCE` measures Ferese's rendering/submission, not shell
rasterization. Wayland traces distinguish software SHM buffers from GPU
buffers (Mesa Vulkan on the tested system).
## Measured validation (KDE Wayland, 175% scale)
With temporary instrumentation, 24 host maximize/restore requests spaced
250 ms apart generated 26 Winit resize events including initialization. The
same debug binaries were tested with each renderer forced:
| Measurement | tiny-skia | wgpu |
| --- | ---: | ---: |
| Median configure acknowledgement | 1.35 ms | 2.27 ms |
| Median Ferese render + submit | 0.82 ms | 1.10 ms |
| Wallpaper buffer interval | 5919 ms (only two buffers) | 9.85 ms median |
| Bar buffers observed | 1 | 996 |
The CPU capture ran for 14 seconds and the GPU capture for 18 seconds;
counts are diagnostic, not equal-duration throughput benchmarks. GPU maximum
buffer intervals were about 200 ms for wallpaper and 158 ms for the bar, so
the median does not imply every frame met a refresh deadline. These figures
include protocol tracing overhead. The temporary resize/timing hooks were
removed after testing; no synthetic resizing runs in production.
The fix does not alter output coordinates, layer exclusion, damage tracking,
frame scheduling, or EGL swap settings. It also applies to the same shell
running under DRM, though this validation used the nested backend.