# Manifest Flatpak/Flathub pour Xeneon Dashboard (port Rust, xeneon-dashboard-rs/). # # Points 1-4 (permissions, voir la mémoire du projet) tous clos. Point 5 # (ce fichier maintenant) : vendoring cargo + extension SDK rust-stable + # module de build réel. # # runtime-version '49' (pas '47', qui n'était qu'un plancher minimum pour # la feature `gnome_47` de relm4) : choisi pour matcher ce qui est # réellement installé sur la machine de dev (org.gnome.Platform/Sdk 49), # et l'extension rust-stable branche '25.08' confirmée compatible en # lisant les vraies métadonnées du SDK (`flatpak remote-info # --show-metadata flathub org.gnome.Sdk/x86_64/49`, section # `[Extension org.freedesktop.Sdk.Extension]` -> `version = 25.08`), pas # la dernière branche dispo (`26.08`, qui aurait été incompatible). app-id: com.n3tlab.XeneonDashboardRust runtime: org.gnome.Platform runtime-version: '49' sdk: org.gnome.Sdk command: xeneon-app sdk-extensions: - org.freedesktop.Sdk.Extension.rust-stable build-options: # Les extensions SDK se montent sous /usr/lib/sdk/ (confirmé via les métadonnées du SDK, section # `directory = lib/sdk`) - rustc/cargo n'est pas sur PATH sans ça. append-path: /usr/lib/sdk/rust-stable/bin env: # cargo-sources.json (généré par flatpak-cargo-generator.py, voir la # mémoire du projet) écrit lui-même son propre fichier de config # pointant vers les crates vendorisées, à l'intérieur de ce dossier - # CARGO_HOME doit donc pointer dessus pour que cargo le trouve. # /run/build// est le chemin de build réel que # flatpak-builder utilise pour ce module. CARGO_HOME: /run/build/xeneon-dashboard-rust/cargo finish-args: # --- Affichage --- - --socket=wayland - --socket=fallback-x11 # repli X11 seulement si le compositeur ne fait pas Wayland - --device=dri # accélération GPU (GTK4 + webkit6 pour le widget YouTube) # --- Réseau --- # weather.rs (Open-Meteo), hue_bridge.rs (CLIP v2 local + repli cloud # discovery.meethue.com), youtube.rs (webkit6 vers youtube.com). - --share=network # --- D-Bus session : noms précis uniquement, jamais --socket=session-bus --- - --talk-name=org.mpris.MediaPlayer2.* # audio.rs : contrôle de n'importe quel lecteur MPRIS # agenda.rs, D-Bus brut (gio::DBusConnection::call_sync, pas de binding # libedataserver/libecal - voir la mémoire du projet). Sources5/Calendar8 # sont les noms de bus fixes ; OpenCalendar renvoie en plus un bus_name # DYNAMIQUE par source (sous-processus backend EDS, un par calendrier # connecté) - confirmé en lisant agenda.rs - d'où le wildcard en plus des # deux noms fixes. Noms versionnés (Sources5, Calendar8) à revérifier si # jamais la version d'evolution-data-server du runtime cible change de # soname. - --talk-name=org.gnome.evolution.dataserver.Sources5 - --talk-name=org.gnome.evolution.dataserver.Calendar8 - --talk-name=org.gnome.evolution.dataserver.Subprocess.Backend.* # tray.rs (crate ksni) : enregistrement StatusNotifierItem. Pas de # --own-name nécessaire - tray.rs appelle `disable_dbus_name(true)` # (ksni s'enregistre avec le nom de connexion unique plutôt que de # posséder org.kde.StatusNotifierItem--, suivant la doc du crate # lui-même qui documente ce besoin précis pour Flatpak). - --talk-name=org.kde.StatusNotifierWatcher # --- D-Bus système (pas session) --- # hue_bridge.rs::discover_avahi : découverte mDNS locale du bridge Hue via # org.freedesktop.Avahi.Server, qui tourne sur le bus SYSTÈME (avahi-daemon # est un service système, pas une session utilisateur) - d'où # --system-talk-name et non --talk-name. Repli sur la découverte cloud # (discovery.meethue.com, couverte par --share=network) si indisponible, # donc aucune permission supplémentaire n'est strictement bloquante pour # la fonctionnalité, juste pour la découverte locale. - --system-talk-name=org.freedesktop.Avahi # --- Système de fichiers, lecture seule, chemins précis uniquement --- - --filesystem=/sys/class/hwmon:ro # cpu_temp.rs, temp_gauge.rs : lecture directe des capteurs hwmon, pas de portail pour ça - --filesystem=/sys/class/net:ro # network.rs : lit .../wireless et .../phy80211 pour choisir l'icône Wi-Fi/Ethernet modules: - name: xeneon-dashboard-rust buildsystem: simple build-commands: - cargo --offline build --release - install -Dm755 target/release/xeneon-app /app/bin/xeneon-app - install -Dm644 xeneon-app/resources/com.n3tlab.XeneonDashboardRust.desktop /app/share/applications/com.n3tlab.XeneonDashboardRust.desktop - install -Dm644 xeneon-app/resources/icons/hicolor/scalable/apps/com.n3tlab.XeneonDashboardRust.svg /app/share/icons/hicolor/scalable/apps/com.n3tlab.XeneonDashboardRust.svg - install -Dm644 xeneon-app/resources/icons/hicolor/symbolic/apps/com.n3tlab.XeneonDashboardRust-symbolic.svg /app/share/icons/hicolor/symbolic/apps/com.n3tlab.XeneonDashboardRust-symbolic.svg # Copie séparée sous le préfixe propre à l'appli (pas le thème # d'icônes système ci-dessus) : c'est ce que `resource_path()` # (xeneon-app/src/resource_path.rs) va chercher à l'exécution pour # les locales, les icônes des widgets et le fond d'écran par défaut. - mkdir -p /app/share/xeneon-dashboard-rust - cp -r xeneon-app/locales /app/share/xeneon-dashboard-rust/locales - cp -r xeneon-app/assets /app/share/xeneon-dashboard-rust/assets - cp -r xeneon-app/resources /app/share/xeneon-dashboard-rust/resources sources: # "type: dir" ne sert qu'aux builds locaux de dev avec # flatpak-builder - à remplacer par "type: git" (dépôt public, # épinglé sur un tag/commit précis) pour une vraie soumission # Flathub. `skip: [target]` exclu explicitement : 13 Go d'artefacts # de build locaux, inutiles et énormes à copier dans le bac à sable # de build. - type: dir path: xeneon-dashboard-rs skip: - target # Plain string = flatpak-builder lit ce fichier et insère son # contenu (un array de sources) ici - voir flatpak-manifest(5), # section Sources. Généré par flatpak-cargo-generator.py à partir de # Cargo.lock (471 entrées / ~235 crates au 2026-10-01) - jamais écrit # à la main. - xeneon-dashboard-rs/cargo-sources.json # À faire avant une vraie soumission Flathub (pas bloquant pour un premier # build local) : metainfo.xml AppStream (absent pour l'instant), vérifier # la propriété du domaine n3tlab.com pour l'app-id, remplacer la source # "dir" par "git".