Skip to content

feat(scratchpad): multi-slot named scratchpads, directional drawer physics, and layout tiling - #47

Open
rebizzz wants to merge 5 commits into
noctalia-dev:mainfrom
rebizzz:feat/special-workspaces-parity
Open

feat(scratchpad): multi-slot named scratchpads, directional drawer physics, and layout tiling#47
rebizzz wants to merge 5 commits into
noctalia-dev:mainfrom
rebizzz:feat/special-workspaces-parity

Conversation

@rebizzz

@rebizzz rebizzz commented Aug 27, 2026

Copy link
Copy Markdown
Contributor

Summary

Adds multi-slot named scratchpads with directional slide physics, nested layout tiling, and process-aware auto-spawning to Umbriel.

Motivation

Allows users to configure and toggle arbitrary persistent or dynamic scratchpad slots (e.g., dropdown terminals, music players, system monitors, notes, or web browsers) with customized slide directions, spring physics, scaling factors, and nested layout engines without cluttering regular workspaces.

Type of Change

  • Bug fix
  • New feature
  • Breaking change
  • Refactoring
  • Build / packaging
  • Documentation

Details

  • Named scratchpad slots: Configure arbitrary slots via [[scratchpad]] blocks or address them on the fly with scratchpad-toggle:<name> and window-move-to-scratchpad:<name>.
  • Directional drawer physics: Slots slide in/out along configurable edges (top, bottom, left, right) with customizable duration, easing curves, and backdrop dim/blur.
  • Nested layout tiling: Windows inside a scratchpad tile using Master, Dwindle, or Scrolling layouts within the drawer bounding box.
  • Process ancestor tracking for on_empty: Tracks child process trees up to 16 parent levels to guarantee only the application launched by on_empty is claimed by the slot.
  • Frame-0 geometry configure: Configures window geometry on initial_commit before surface map, preventing main workspace flicker or unscaled flash.
  • Window rule routing: [[window_rule]] scratchpad = "<slot>" routes matching windows directly into scratchpad slots on launch.
  • Safe client suspension: Dispatches xdg_toplevel.set_suspended(true) to hidden scratchpad clients (protocol version >= 6) to reduce idle background power.
  • Mutual exclusion: Opening a scratchpad slot automatically dismisses any other open slot on that output.
  • Touchpad gestures: 4-finger vertical swipe down reveals the default scratchpad slot; swipe up dismisses it.

Testing

  • meson test -C build-debug: All 25/25 unit tests pass (including slot config parsing and window rule routing tests).
  • umbriel validate -c examples/config.toml: Config validation passes with 0 errors.
  • clang-format / just format: 0 formatting issues.
  • clang-tidy: 0 warnings / 0 errors across all modified files.

Manual Coverage

  • Tested in a nested Umbriel session
  • Tested in a native Umbriel session
  • Tested with multiple monitors
  • Tested with a scaled output
  • Tested with native Wayland applications
  • Tested with X11 applications through xwayland-satellite
  • Tested with the scrolling layout
  • Tested with the dwindle layout

Screenshots / Videos

Description Screenshot
01: Base Workspace 01 Base Workspace
02: Top Drawer (web) 02 Top Drawer
03: Multi-Window Tiling 03 Multi-Window Tiling
04: Terminal Dropdown 04 Terminal Dropdown
05: Bottom Notes Drawer 05 Bottom Notes Drawer
06: Right System Telemetry 06 Right System Telemetry
07: Left Music Player 07 Left Music Player
08: Unscaled Floating Mode 08 Unscaled Floating Mode
09: Overview Integration 09 Overview Integration

Checklist

  • This PR is ready for review, or it is marked as Draft.
  • I read and followed the relevant guidance in CONTRIBUTING.md.
  • I initialized and updated the SceneFX submodule where required.
  • I ran just format, or this PR has no C++ changes.
  • I ran the relevant build, test, lint, or verification commands, or explained why they were not run.
  • I functionally verified compositor behavior where automated checks are insufficient.
  • I self-reviewed the changes.
  • I checked for new warnings or errors.
  • I updated docs/ and examples/config.toml, or this PR does not change user-facing configuration or behavior.
  • I used canonical names for config keys, IPC actions, paths, and identifiers.

@rebizzz
rebizzz marked this pull request as draft August 27, 2026 21:35
@rebizzz
rebizzz marked this pull request as ready for review August 27, 2026 21:45
@rebizzz

rebizzz commented Aug 27, 2026

Copy link
Copy Markdown
Contributor Author

Heads up on the latest commits here (popin and slidefade transition styles for scratchpad slots): everything checked out fine in my own testing, but that was all on a single output. I have not been able to test how these hold up on a multi-monitor setup, things like a slot moving between outputs mid-animation, an output getting added or removed while a slot is open, or per-output scale factors. If anyone with multiple monitors can give this a try before it merges, that would help a lot.

@rebizzz
rebizzz force-pushed the feat/special-workspaces-parity branch from aca365a to 432c875 Compare August 30, 2026 10:58
@rebizzz
rebizzz force-pushed the feat/special-workspaces-parity branch from 432c875 to db19554 Compare August 30, 2026 17:50
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant