v0.33.0: title bars drawn by LinTunes, in the window's grey

On Wayland Qt paints the title bar through its adwaita decoration plugin,
which hardcodes pure white in light mode and ignores the palette. Every
window now goes frameless and gets an app-drawn bar in the palette's Window
color, so it follows the Background setting. Buttons follow GNOME's
button-layout; moving, snapping and edge resizing still go through the
compositor. Windows grow by the bar's height so their contents keep the
size they had.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-02 00:55:01 -07:00
co-authored by Claude Opus 5.5
parent c662ec0c2b
commit 4c0aaae463
6 changed files with 663 additions and 7 deletions
+12 -1
View File
@@ -604,7 +604,18 @@ persistence) → GUI (Qt widgets that read the manager and connect to its signal
`QCursor.pos()` are unreliable during a drag — `gui/drag_ghost.py` paints its
own child-widget overlay instead. `QAudioOutput` must not be constructed before
a `QMainWindow` exists (Qt 6.10 deadlock). Some PyQt signal relays need explicit
types/lambdas.
types/lambdas. **Title bars are ours** (Round 72): Mutter draws none for
Wayland clients, and Qt's `adwaita` decoration plugin paints them pure white
from hardcoded constants, deaf to the palette. So on Wayland
`gui/titlebar.install` (an app event filter) makes every `Window`/`Dialog`
frameless at `Polish` and adds a `TitleBar` at its first `Show`, in the
palette's `Window` color, room made through the window's top contents
margin and the window grown by that much so its contents keep their size.
Buttons follow GNOME's `button-layout`; move/resize go through
`startSystemMove`/`startSystemResize`. A window with no layout must paint
into `contentsRect()` (`art_window.py`); one that needs the system frame
sets the `titlebar.OPT_OUT` property. The bar must never be an event filter
on its own window — that is called during the window's teardown and aborts.
- **Music files are only touched deliberately:** tag edits via `tagging.py`,
and — since Round 18 — artist/album_artist/album edits relocate the file
inside `LibraryManager.organize_root()` (`<music_folder>/Music`) to keep the