Cinnamon-Extension automatisch aktivieren; README: Desktop-Integration explizit

- Neu cinnamon.rs: erweitert org.cinnamon enabled-extensions idempotent um
  ai-control-popup@local; Aufruf im SNI-Zweig von init_tray (is_cinnamon).
- README: GNOME-/Cinnamon-Extension und KWin-Script mit Pfad und Aufgabe
  benannt, Auto-Aktivierung dokumentiert (inkl. GNOME-Randfall nach
  Erstinstallation); Cinnamon-X11-Aussage korrigiert (Initial-Fokus).
This commit is contained in:
marcus hinz
2026-07-22 11:17:23 +02:00
parent f13186e667
commit 257b2ca2ef
3 changed files with 53 additions and 2 deletions
+37
View File
@@ -0,0 +1,37 @@
//! Cinnamon-Extension pro Benutzer aktivieren — analog zu
//! `gnome-extensions enable`. Systemweit liegt sie aus dem Paket; Cinnamon
//! lädt sie sofort, sobald die UUID in enabled-extensions auftaucht.
use std::process::Command;
const UUID: &str = "ai-control-popup@local";
pub(super) fn enable_extension() {
let Ok(out) = Command::new("gsettings")
.args(["get", "org.cinnamon", "enabled-extensions"])
.output()
else {
return;
};
let list = String::from_utf8_lossy(&out.stdout);
if list.contains(UUID) {
return;
}
// GVariant-Liste erweitern: "['a']" → "['a', 'ai-control-popup@local']",
// leer ("[]" bzw. typannotiert "@as []") → "['ai-control-popup@local']".
let inner = list
.trim()
.trim_start_matches("@as")
.trim()
.trim_start_matches('[')
.trim_end_matches(']')
.trim();
let new = if inner.is_empty() {
format!("['{UUID}']")
} else {
format!("[{inner}, '{UUID}']")
};
let _ = Command::new("gsettings")
.args(["set", "org.cinnamon", "enabled-extensions", &new])
.status();
}
+12
View File
@@ -2,6 +2,7 @@
//! Der Klick-Weg unterscheidet sich je Desktop (GNOME-Extension vs.
//! StatusNotifierItem), das Ergebnis ist überall dasselbe Popup-Fenster.
mod cinnamon;
mod desktop;
mod gnome;
mod kwin;
@@ -67,6 +68,13 @@ fn is_kde() -> bool {
.unwrap_or(false)
}
/// Cinnamon meldet sich je nach Session als „X-Cinnamon" oder „Cinnamon".
fn is_cinnamon() -> bool {
std::env::var("XDG_CURRENT_DESKTOP")
.map(|d| d.to_uppercase().contains("CINNAMON"))
.unwrap_or(false)
}
// ---------- Secrets ----------
/// apiKeyHelper-Kommando eines apikey-Pools: liest den Key aus dem Keyring
@@ -108,6 +116,10 @@ pub(crate) fn init_tray(app: &tauri::AppHandle, cb: TrayCallbacks) -> Result<(),
// KDE-Wayland: das Popup-Positionieren übernimmt das KWin-Script.
if is_kde() {
kwin::enable_script();
} else if is_cinnamon() {
// Wayland-Platzierung + X11-Fokus kommen aus der Cinnamon-Extension;
// sie liegt systemweit aus dem Paket, aktiviert wird pro Benutzer.
cinnamon::enable_extension();
}
}
Ok(())