Files
andrew 2f59d3c115 Add Nebula.Windows with Sway IPC backend
Introduces a new `core/windows` module (`Nebula.Windows`) with `WindowService`, window/workspace models, and a Sway IPC backend for live window tracking and control (focus, close, move/resize, snap, maximize/restore, minimize, workspace switch). The desktop shell now links this module, uses compositor focus for top-bar active app text, and adds an Open Windows section in the launcher with focus/close actions.

Also updates application metadata handling to parse `StartupWMClass` and map window `app_id`/class to friendly names and icons, and revises Sway config/docs for the new floating-first Desktop 0.2 behavior with temporary compositor-provided decorations.
2026-08-26 18:20:56 +12:00

108 lines
3.7 KiB
Markdown

# Compositor
Sway is the **temporary** Wayland compositor while Nebula Desktop is developed. Configuration lives in `sway/nebula-sway.conf`.
Sway currently provides:
- Wayland compositor
- floating-first application window management
- temporary title bars and borders on normal application windows
- XWayland
- input and the pointer cursor
- output handling
Nebula provides the visible shell (Qt Quick/QML via LayerShellQt) and logical window management through `WindowService` (`core/windows`). The Sway config must not enable a Sway bar.
A custom Nebula compositor is a later milestone. Do not treat this Sway setup as the final architecture. QML must not call `swaymsg`; the Sway IPC backend is the only Sway-specific code, and it is isolated so it can be replaced.
```text
Ubuntu/Linux
Wayland
Sway now
Nebula compositor later
Nebula Shell
Qt Quick/QML
```
## Floating-first session
Ordinary application windows open as floating windows, sized to about **70% of the current workspace** (the usable output area below the 40px Nebula top bar) and centred. Sway workspace geometry already excludes the top-bar exclusive zone, so placement stays on-screen at any resolution.
Rules match only normal application views:
- Wayland: `shell="xdg_shell"` (`app_id`)
- XWayland: `shell="xwayland"` (`class`)
Layer-shell surfaces (Nebula desktop, top bar, launcher, overlays) are a different shell and are not matched. They stay on BACKGROUND / TOP / OVERLAY.
Sway draws a restrained title bar and border on those application windows so they can be identified, dragged, and resized with the mouse. This is **temporary**. Custom Nebula decorations, CSD, and wrapping Wayland clients inside QML are out of scope.
## Development session
From the NebulaOS repository root:
```bash
sway -c compositor/sway/nebula-sway.conf
```
Recommended on the Ubuntu VMware VM (repo-root `cd`, cursor environment, software cursors):
```bash
sh compositor/sway/dev/run-sway-vm.sh
```
Sway then autostarts Nebula Desktop through `scripts/run-nebula-vm.sh`.
Skip shell autostart:
```bash
NEBULA_SHELL_AUTOSTART=0 sh compositor/sway/dev/run-sway-vm.sh
```
### Output / resolution
The development config uses scale `1` and does not pin a resolution. Sway uses the output's preferred mode, which follows the current display size (including VMware Autofit Guest). Window sizes use workspace-relative percentages, not hard-coded pixel dimensions.
```bash
swaymsg -t get_outputs
swaymsg output <name> scale 1
```
### Cursor
```text
seat * xcursor_theme Adwaita 24
XCURSOR_THEME=Adwaita
XCURSOR_SIZE=24
```
Requires `adwaita-icon-theme`. A Nebula-branded cursor theme is a later task.
`WLR_NO_HARDWARE_CURSORS=1` is VMware-specific and is set by `run-sway-vm.sh`, not by production session files.
### Emergency / development shortcuts
Normal launching, focusing, and closing is done from the Nebula GUI. These remain compositor fallbacks:
| Shortcut | Action |
|----------|--------|
| Super+Enter | open Foot |
| Super+Left Mouse | move the floating window under the pointer |
| Super+Right Mouse | resize the floating window under the pointer |
| Super+Left | snap to left half of the usable area |
| Super+Right | snap to right half of the usable area |
| Super+Up | maximise to the usable area (below the top bar) |
| Super+Down | restore to the default ~70% centred size |
| Super+Shift+Q | close the focused window |
| Super+Shift+E | exit Sway |
| Super+Shift+C | reload Sway config |
Title-bar drag and border resize should be the normal mouse path. Super+mouse is an emergency convenience.
### Rendering
`scripts/run-nebula-vm.sh` sets `QT_QUICK_BACKEND=software` for the VMware guest GPU. Production `nebula-shell` must not set that variable.