From 050f68a030636e33b08ace970eb1ca1b55f3da74 Mon Sep 17 00:00:00 2001 From: Daniel Date: Tue, 20 Oct 2026 02:20:21 +0200 Subject: [PATCH] fix(linux): enable font-free Wayland window controls --- Cargo.lock | 12 +++++++ NOTICE | 31 +++++++++++++++++++ apps/vectorcraft/Cargo.toml | 3 ++ docs/development.md | 2 ++ .../flatpak/ai.storyteller.vectorcraft.yml | 1 + packaging/linux/package.sh | 2 ++ 6 files changed, 51 insertions(+) mode change 100755 => 100644 packaging/linux/package.sh diff --git a/Cargo.lock b/Cargo.lock index 159ea55a8..d7dbb5d80 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3676,6 +3676,17 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +[[package]] +name = "sctk-adwaita" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6277f0217056f77f1d8f49f2950ac6c278c0d607c45f5ee99328d792ede24ec" +dependencies = [ + "log", + "smithay-client-toolkit 0.19.2", + "tiny-skia", +] + [[package]] name = "self_cell" version = "1.3.0" @@ -5948,6 +5959,7 @@ dependencies = [ "raw-window-handle", "redox_syscall 0.4.1", "rustix 0.38.44", + "sctk-adwaita", "smithay-client-toolkit 0.19.2", "smol_str", "tracing", diff --git a/NOTICE b/NOTICE index bcd3055b9..5cf3c8952 100644 --- a/NOTICE +++ b/NOTICE @@ -92,3 +92,34 @@ Assets already bundled through Hayro's default features retain their licences: non-visual character-mapping data; see licenses/pdf-backend/hayro-cmap/LICENSE.txt. Adobe and contributor names do not endorse or promote this product. Per-file hashes and sources are recorded in ASSETS.md. + +Linux Wayland window decorations +------------------------------- +sctk-adwaita 0.10.1 (https://github.com/PolyMeilex/sctk-adwaita, +commit d5f343c45c04d4a026db57f76760819b7325db00) is used by winit on Linux +for vector window controls. Its title-font features are disabled: no Cantarell +font is embedded by this dependency and no font file is added to this repo. + +sctk-adwaita's MIT licence: + +MIT License + +Copyright (c) 2022 Bartłomiej Maryńczak + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/apps/vectorcraft/Cargo.toml b/apps/vectorcraft/Cargo.toml index 28ccdaced..345968911 100644 --- a/apps/vectorcraft/Cargo.toml +++ b/apps/vectorcraft/Cargo.toml @@ -72,6 +72,9 @@ objc2-core-text = { version = "0.3", default-features = false, features = ["std" pollster = "1" [target.'cfg(target_os = "linux")'.dependencies] +# GNOME/Wayland needs client-side window controls without a bundled title font. +winit = { version = "0.30", default-features = false, features = ["wayland-csd-adwaita-notitle"] } + # Asks the Wayland compositor which GPU it draws with (linux-dmabuf feedback, src/compositor_gpu.rs), # so Automatic draws on that one. Both are already in the build through winit. wayland-client = "0.31" diff --git a/docs/development.md b/docs/development.md index e7858a8a0..55ccbead1 100644 --- a/docs/development.md +++ b/docs/development.md @@ -104,6 +104,8 @@ On macOS the menus live in the system menu bar, not in the window's app bar (whi ## Linux: Wayland and X11 +On GNOME/Wayland, enable **Preferences › User Interface › System Title Bar** and restart to use winit's font-free Adwaita window controls (`wayland-csd-adwaita-notitle`); the existing custom title bar remains the Linux default. + The window runs natively on Wayland (eframe's `wayland` feature) and on X11. On machines with two GPUs it renders on the one the desktop runs on unless Preferences say otherwise; see [Desktop graphics processor](#desktop-graphics-processor) (#502). The system clipboard (`apps/vectorcraft/src/clipboard.rs`) is arboard with its `wayland-data-control` feature: - **Clipboard:** under Wayland arboard talks to the compositor through the data-control protocol (wlroots compositors such as Sway and Hyprland, KDE Plasma), so bitmaps (`image/png`), SVG markup and text copied in any app paste (#398). Where the compositor lacks the protocol (GNOME's Mutter, [arboard#223](https://github.com/1Password/arboard/issues/223)), arboard falls back to the X11 clipboard through XWayland, which only holds what X11 apps copied. egui's own text paste into fields goes through smithay-clipboard and works either way. diff --git a/packaging/linux/flatpak/ai.storyteller.vectorcraft.yml b/packaging/linux/flatpak/ai.storyteller.vectorcraft.yml index cbee5b720..c2a00eab1 100644 --- a/packaging/linux/flatpak/ai.storyteller.vectorcraft.yml +++ b/packaging/linux/flatpak/ai.storyteller.vectorcraft.yml @@ -43,6 +43,7 @@ modules: build-commands: - cargo --offline build --release --locked -p vectorcraft - install -Dm755 target/release/vectorcraft /app/bin/vectorcraft + - install -Dm644 NOTICE /app/share/doc/vectorcraft/NOTICE - install -Dm644 packaging/linux/ai.storyteller.vectorcraft.desktop /app/share/applications/ai.storyteller.vectorcraft.desktop - install -Dm644 packaging/linux/ai.storyteller.vectorcraft.mime.xml /app/share/mime/packages/ai.storyteller.vectorcraft.xml - mkdir -p /app/share/icons && cp -R assets/app-icon/hicolor /app/share/icons/ diff --git a/packaging/linux/package.sh b/packaging/linux/package.sh old mode 100755 new mode 100644 index 7efbaf44e..65dd1e03a --- a/packaging/linux/package.sh +++ b/packaging/linux/package.sh @@ -106,6 +106,8 @@ if has appimage; then APPDIR="$WORK/VectorCraft.AppDir" cp -R "$STAGE" "$APPDIR" mv "$APPDIR/usr/share/doc" "$WORK/doc-unused" + # Keep the third-party runtime notice after dropping the full documentation tree. + install -Dm644 "$ROOT/NOTICE" "$APPDIR/usr/share/doc/vectorcraft/NOTICE" ln -s usr/bin/vectorcraft "$APPDIR/AppRun" cp "$HERE/$APP_ID.desktop" "$APPDIR/$APP_ID.desktop" cp "$ROOT/assets/app-icon/hicolor/256x256/apps/$APP_ID.png" "$APPDIR/$APP_ID.png"