Desktop components#
carrot ships no bar, launcher, or locker of its own; it implements all the protocols that let you bring your favorites.
Panels, bars, and launchers#
zwlr_layer_shell_v1 (version 5) places surfaces in four layers from background to overlay. Panels that claim an exclusive zone shrink the area windows tile into, and two bars on the same edge stack instead of overlapping. Wallpaper tools target the background layer; notification daemons the overlay. A layer rule can hand a bar the blurred backdrop, masked by the bar's own alpha so only its solid parts frost.
Keyboard handling covers the whole spec: exclusive interactivity locks typing to the surface (top and overlay layers, for lock-style UIs), and on-demand grabs focus when a launcher maps and returns it on unmap. Popups from layer surfaces (a bar's calendar, a launcher's menu) get real xdg popup positioning.
Launchers hand focus over properly too: xdg_activation_v1 mints single-use, short-lived tokens, and a valid activate focuses the new window and follows it to its workspace, so "open browser" lands you on the browser instead of a flashing taskbar entry.
Status bars and widgets#
A bar has three ways to get its data, and each of them pushes events instead of making you poll:
burrow subscribestreams workspace, window, focus, and fullscreen events as ndjson; see burrow & IPC.zwlr_foreign_toplevel_management_v1(v3) lists windows with titles and app ids for taskbars, with activate support. Minimize and maximize requests are accepted as polite no-ops, since the tiling layout owns geometry.ext_foreign_toplevel_list_v1provides stable window identifiers that cannot alias across compositor restarts.
Widget keyboards and launchers that inject input (wtype-style tools, remote desks) use the EIS server at LIBEI_SOCKET.
Lock screens#
ext_session_lock_v1 locks the whole session: every output shows the locker's surface, input is confined to it, and the locked event is sent only after every output has actually presented a locked frame, so nothing leaks in a screenshot between lock and blank.
If the locker crashes, the session stays locked. A replacement locker can take over the lock, which is the escape hatch. During lock, only binds marked allow-when-locked fire, and unlocking wakes any DPMS-blanked outputs.
Idle#
ext_idle_notifier_v1 drives lockers and dimmers with idle timers; any input resets them. zwp_idle_inhibit_manager_v1 lets media players hold the screen awake, with one carrot twist: an inhibitor only holds while its window is actually visible. A video parked on another workspace, or buried under a fullscreen window, stops inhibiting until you can see it again.
Clipboard managers#
zwlr_data_control_v1 (v2) serves clipboard managers that need the selection without focus. Regular clipboard, primary selection, drag and drop, and the X11 bridge all flow through one selection engine, so managers see everything.
Screenshots and recording#
zwlr_screencopy_v1 (v3) serves screenshot and recording tools against shm buffers, reporting full-frame damage each capture: grim works, and grim -g "$(slurp)" for regions. The newer ext_image_copy_capture_v1 adds long-lived capture sessions with per-output and per-window sources for recorders; continuous sessions pace themselves at roughly 60 Hz so a recorder never taxes the frame loop. Windows marked no-capture by a window rule appear as black boxes in every one of these paths. For full screen sharing with portals, see Screen sharing.