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:
@@ -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();
|
||||
}
|
||||
@@ -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(())
|
||||
|
||||
Reference in New Issue
Block a user