From 02065d23bcf6b72a7b284efe9c8373eec4ada370 Mon Sep 17 00:00:00 2001 From: Mollusk Date: Fri, 12 Jun 2026 19:58:04 -0400 Subject: [PATCH] feat: app icon + Arch package (PKGBUILD + .desktop) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add a desktop/taskbar identity and a system package for PeerSpeak. - assets/icons/peerspeak.svg: master app icon — the in-app mic glyph over a P2P mesh of peer nodes, Catppuccin Mocha palette. Rendered to the hicolor raster sizes (16..512) committed alongside it. - Window/taskbar icon: embed a 128x128 straight-RGBA blob and load it via iced from_rgba (keeps us off iced's heavy `image` feature). Set the Wayland/X11 app_id to "peerspeak" so compositors match the window to the .desktop launcher and show the icon natively. - packaging/peerspeak.desktop: launcher (StartupWMClass=peerspeak). - packaging/PKGBUILD: peerspeak-git VCS package — cargo --frozen build, --lib check, installs the binary, .desktop, and hicolor icons. Co-Authored-By: Claude Opus 4.8 --- assets/icons/peerspeak-128.png | Bin 0 -> 5125 bytes assets/icons/peerspeak-128.rgba | Bin 0 -> 65536 bytes assets/icons/peerspeak-16.png | Bin 0 -> 606 bytes assets/icons/peerspeak-24.png | Bin 0 -> 994 bytes assets/icons/peerspeak-256.png | Bin 0 -> 10273 bytes assets/icons/peerspeak-32.png | Bin 0 -> 1366 bytes assets/icons/peerspeak-48.png | Bin 0 -> 2042 bytes assets/icons/peerspeak-512.png | Bin 0 -> 21232 bytes assets/icons/peerspeak-64.png | Bin 0 -> 2593 bytes assets/icons/peerspeak.svg | 41 +++++++++++++++++++ packaging/PKGBUILD | 68 ++++++++++++++++++++++++++++++++ packaging/peerspeak.desktop | 11 ++++++ src/app/mod.rs | 17 ++++++++ 13 files changed, 137 insertions(+) create mode 100644 assets/icons/peerspeak-128.png create mode 100644 assets/icons/peerspeak-128.rgba create mode 100644 assets/icons/peerspeak-16.png create mode 100644 assets/icons/peerspeak-24.png create mode 100644 assets/icons/peerspeak-256.png create mode 100644 assets/icons/peerspeak-32.png create mode 100644 assets/icons/peerspeak-48.png create mode 100644 assets/icons/peerspeak-512.png create mode 100644 assets/icons/peerspeak-64.png create mode 100644 assets/icons/peerspeak.svg create mode 100644 packaging/PKGBUILD create mode 100644 packaging/peerspeak.desktop diff --git a/assets/icons/peerspeak-128.png b/assets/icons/peerspeak-128.png new file mode 100644 index 0000000000000000000000000000000000000000..ffb3e59ef206d5bf6c9cb1e4679fb50536d55930 GIT binary patch literal 5125 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 literal 0 HcmV?d00001 diff --git a/assets/icons/peerspeak-128.rgba b/assets/icons/peerspeak-128.rgba new file mode 100644 index 0000000000000000000000000000000000000000..9222d402933fe29f428fabe5b8cbf6f62a21a40e GIT binary patch literal 65536 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 literal 0 HcmV?d00001 diff --git a/assets/icons/peerspeak-16.png b/assets/icons/peerspeak-16.png new file mode 100644 index 0000000000000000000000000000000000000000..97609c29a6c906cb5eb5caf5e9da47b06dee7977 GIT binary patch literal 606 zcmV-k0-^nhP)znS-(7cL49 zeDCLc=bZapE*ID*nEerpb)_xK%m5++Fo$ajS8NQ z4w6P{rKe$nT@;q{IGgH6sW^|%GZUDdd4|p6JQArs6qfS%8=8D@PKgfbYYO2<;TxKd zgyqIiT3HqDE2lz1c$fdENkyUV4x@DO#eiiZZ z;SD-9fhSeSjYm*&6m2j21P%?^?sy8r+H07*qoM6N<$f_xSnFaQ7m literal 0 HcmV?d00001 diff --git a/assets/icons/peerspeak-24.png b/assets/icons/peerspeak-24.png new file mode 100644 index 0000000000000000000000000000000000000000..f39d021724915b674581aad56cc4e8f090e518fb GIT binary patch literal 994 zcmV<810DQ{P)h=zcc5JY2u1bx6nW1=RS_#*MiA6~4IB36jF5R7( zd*_mSrd_Mut~JGzoXy>H@AIzqT>r400WfoOWbn3WkA_-ddk zL34A*lR|i1uIse|!jN*FyCf9GEi3YaXrY<eD2hE#y()g!ypQ7)J zcWAtK|NE$2l*FNZ+rYU;F(Cp|x@--AL8?I40|o?;Qj!M&$3*TrZWnS8LZE5gW;C}y z1+SPVS42%~AEmj;LXOs|oauap6=F_R@J~~T$6o1F2ZomR9cb@72;ZGV_eV#lV;go<;OD=e`x#f@Jj_aPwYYF!Z#4S zFee5{Bm~Ok&GZ#5o2fM}_jkiEP3VkKRcd^>|7&QPhWplcRLoVF|5`y!VhR5IEsM$g z1X#pIW8?Cv%4|&La~QjtMLfB*8pKS3+1Iwe`(vcdQ(&eAW7kXA*m*ciidY!Qevhkz zJ>b6ToVl-j)d~XP!xKIX?xN?z187(iN;dlC+we;Hs)sv^Ak?nH0>i-4)V=sMdjZ2k z;kQf*9}V|3VQlOgxL=*5>eo_%ry3eDI(m(E`^e50$yFPV{xO17su6}+RfNhCsZQy7 z^%E3}dAxgaFQQfyW+Dzdo}~G@`UYy#iHUK%aNs>eV{y7Sint)RyC#8nts>STWhj@F8etN)`f;2s&W#(_`-I@- ziWoEL$_pV7iPj)io1|`1CVUsgd=6geHf=zG3*pa{)~~Cp-;hq9O_$$;l`C7%7mJ05 zaTmOV literal 0 HcmV?d00001 diff --git a/assets/icons/peerspeak-256.png b/assets/icons/peerspeak-256.png new file mode 100644 index 0000000000000000000000000000000000000000..50ac6a661ea6f4235692a8e106cc9246c9203c1a GIT binary patch literal 10273 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 YKR1G7DMSW*yZ`_I07*qoM6N<$f;Q2W^8f$< literal 0 HcmV?d00001 diff --git a/assets/icons/peerspeak-48.png b/assets/icons/peerspeak-48.png new file mode 100644 index 0000000000000000000000000000000000000000..b163bf447d30ec1010cd92a91b5775ebe244465c GIT binary patch literal 2042 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 literal 0 HcmV?d00001 diff --git a/assets/icons/peerspeak-64.png b/assets/icons/peerspeak-64.png new file mode 100644 index 0000000000000000000000000000000000000000..05b7a44b18eb85bbcda8e3b303a876d15e4c6172 GIT binary patch literal 2593 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packaging/PKGBUILD b/packaging/PKGBUILD new file mode 100644 index 0000000..932feea --- /dev/null +++ b/packaging/PKGBUILD @@ -0,0 +1,68 @@ +# Maintainer: mollusk +pkgname=peerspeak-git +_pkgname=peerspeak +pkgver=0.1.0 +pkgrel=1 +pkgdesc="Decentralized peer-to-peer voice chat (Rust/iroh/PipeWire/Opus/iced)" +arch=('x86_64') +url="https://gitbutter.xyz/mollusk/peerspeak" +license=('custom') +depends=('pipewire' 'opus') +makedepends=('git' 'cargo' 'pkgconf') +optdepends=('pixelpass: screen sharing inside a room' + 'mpv: screen-share viewer (vlc is used as a fallback)') +provides=('peerspeak') +conflicts=('peerspeak') +options=('!lto' '!debug') +source=("$_pkgname::git+ssh://git@gitbutter.xyz/mollusk/peerspeak.git") +sha256sums=('SKIP') + +pkgver() { + cd "$srcdir/$_pkgname" + # 0.1.0.r.g — sorts monotonically across rebuilds. + printf '%s.r%s.g%s' \ + "$(awk -F'\"' '/^version =/{print $2; exit}' Cargo.toml)" \ + "$(git rev-list --count HEAD)" \ + "$(git rev-parse --short HEAD)" +} + +prepare() { + cd "$srcdir/$_pkgname" + # Vendor deps up front so build() can run --frozen (no surprise network). + export CARGO_HOME="$srcdir/cargo-home" + cargo fetch --locked --target "$(rustc -vV | sed -n 's/host: //p')" +} + +build() { + cd "$srcdir/$_pkgname" + export CARGO_HOME="$srcdir/cargo-home" + export RUSTUP_TOOLCHAIN=stable + export CARGO_TARGET_DIR=target + cargo build --frozen --release --bin "$_pkgname" +} + +check() { + cd "$srcdir/$_pkgname" + export CARGO_HOME="$srcdir/cargo-home" + export RUSTUP_TOOLCHAIN=stable + # Library unit tests only — the integration suites bind real iroh/QUIC + # endpoints and fail in a sandboxed/offline build environment. + cargo test --frozen --release --lib +} + +package() { + cd "$srcdir/$_pkgname" + + install -Dm755 "target/release/$_pkgname" "$pkgdir/usr/bin/$_pkgname" + install -Dm644 "packaging/$_pkgname.desktop" \ + "$pkgdir/usr/share/applications/$_pkgname.desktop" + + # Hicolor icon theme (scalable SVG + the rendered raster sizes). + install -Dm644 "assets/icons/$_pkgname.svg" \ + "$pkgdir/usr/share/icons/hicolor/scalable/apps/$_pkgname.svg" + local s + for s in 16 24 32 48 64 128 256 512; do + install -Dm644 "assets/icons/$_pkgname-$s.png" \ + "$pkgdir/usr/share/icons/hicolor/${s}x${s}/apps/$_pkgname.png" + done +} diff --git a/packaging/peerspeak.desktop b/packaging/peerspeak.desktop new file mode 100644 index 0000000..2f3694b --- /dev/null +++ b/packaging/peerspeak.desktop @@ -0,0 +1,11 @@ +[Desktop Entry] +Type=Application +Name=PeerSpeak +GenericName=P2P Voice Chat +Comment=Decentralized peer-to-peer voice chat +Exec=peerspeak +Icon=peerspeak +Terminal=false +Categories=Network;Telephony;Chat; +Keywords=voice;chat;voip;p2p;peer; +StartupWMClass=peerspeak diff --git a/src/app/mod.rs b/src/app/mod.rs index d55c044..7765b7f 100644 --- a/src/app/mod.rs +++ b/src/app/mod.rs @@ -336,6 +336,15 @@ pub fn run_gui() -> iced::Result { // dock doesn't squeeze the controls column). Layout is responsive. size: init_size, position: iced::window::Position::Centered, + // App/taskbar icon (mainly used on X11/XWayland; native Wayland takes + // the icon from the .desktop file matched by app_id instead). + icon: window_icon(), + // app_id must match the .desktop basename so Wayland compositors + // (e.g. KWin) attach our launcher icon to the window. + platform_specific: iced::window::settings::PlatformSpecific { + application_id: "peerspeak".to_string(), + ..Default::default() + }, // We save the final size ourselves on CloseRequested, then exit. exit_on_close_request: false, ..Default::default() @@ -343,6 +352,14 @@ pub fn run_gui() -> iced::Result { .run() } +/// Build the window icon from an embedded 128×128 straight-RGBA blob rendered +/// from `assets/icons/peerspeak.svg`. Using `from_rgba` (always available) keeps +/// us off iced's heavy `image` feature — the blob is raw pixels, no decoder. +fn window_icon() -> Option { + const RGBA: &[u8] = include_bytes!("../../assets/icons/peerspeak-128.rgba"); + iced::window::icon::from_rgba(RGBA.to_vec(), 128, 128).ok() +} + fn subscription(_state: &AppState) -> Subscription { let core_sub = Subscription::run(core_subscription).map(AppMessage::UiEventReceived); let event_sub = iced::event::listen().map(AppMessage::EventOccurred);