Files
Nebula-OS/core/windows
andrew 08e67845a5 Add focused window controls to top bar
Introduces a new `WindowControls` component in the desktop top bar with minimize, maximize/restore, and close actions for the focused window. `WindowService` now exposes focused-window presence/maximized state plus focused-window convenience actions to support this UI.

Also extends Nebula UI with a reusable `NebulaToolTip`, keyboard/pressed-state support in `NebulaIconButton`, new window-control glyphs in `NebulaIcon`, and theme tokens for pressed/danger hover states, with CMake and README updates to register/document the new components.
2026-08-26 22:26:29 +12:00
..

Nebula Windows

Shared C++ window-management service. Desktop, the future Bigscreen shell, and a future Nebula compositor backend should all talk to this library rather than to a compositor directly.

Nebula QML
    ↓
WindowService
    ↓
generic WindowBackend
    ↓
Sway IPC          now
Nebula compositor later

QML must not run swaymsg. Sway-specific protocol, socket handling, and tree parsing stay in backends/sway/.

Behaviour

  • Connects to the compositor IPC socket from SWAYSOCK. The path is never hard-coded.
  • If IPC is missing or fails, the shell keeps running and WindowService stays empty. A development warning is logged.
  • Subscribes to window, workspace, and output events instead of polling.
  • Exposes WindowModel (QAbstractListModel) and WorkspaceModel.
  • Tracks the focused normal application window. Layer-shell chrome (desktop, top bar, launcher) is not treated as the active app.
  • Resolves a user-facing name via ApplicationService when possible, then a small identifier humanizer (footclient → Foot, org.mozilla.firefox → Firefox).

QML module URI: Nebula.Windows.

Operations

focusWindow, closeWindow, maximizeWindow, restoreWindow, setWindowFloating, plus moveWindow / resizeWindow / snapWindow / switchWorkspace.

closeWindow asks the compositor to close the client. It does not kill the process.

Maximise fills the current workspace usable area (below the Nebula exclusive zone) using compositor-relative sizing. Restore returns the previous floating geometry when WindowService saved it.

Minimise is implemented for the Sway backend using scratchpad semantics, but the UI must not mention scratchpad. The user-facing idea is only hide / show.

Snap edges (SnapLeft, SnapRight, SnapMaximize) are prepared for a later Snap Layouts UI.

See shells/desktop/README.md and compositor/README.md for session behaviour.