From d4d455fa0829e51ce9750b95cc70b37bc66149d4 Mon Sep 17 00:00:00 2001 From: marcus hinz Date: Fri, 17 Jul 2026 19:37:05 +0200 Subject: [PATCH] Popup-Fokus auf SNI-X11-Desktops: present() nach jedem Map MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Muffin (Cinnamon) mappt das Popup ohne Fokus — das set_focus aus show_popup läuft vor dem Map und fällt der Focus-Stealing-Prevention zum Opfer; ohne initialen Fokus greift das Blur-Schließen nie. Ein map-event-Handler ruft present(), GTK besorgt sich unter X11 dabei den echten Server-Timestamp. Registriert nur unter X11 außerhalb von GNOME: auf GNOME/Wayland zeigt die Extension das Popup, dort brach das Fokus-Grab den Klick-Weg (Ubuntu/Kubuntu). Bestätigt auf Mint/Cinnamon, Ubuntu und Kubuntu. --- src-tauri/Cargo.lock | 1 + src-tauri/Cargo.toml | 1 + src-tauri/src/app.rs | 19 +++++++++++++++++++ 3 files changed, 21 insertions(+) diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 81f255e..48337f8 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -34,6 +34,7 @@ version = "0.2.0" dependencies = [ "base64 0.22.1", "glib", + "gtk", "keyring", "ksni", "log", diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 8222b35..18dcf36 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -38,6 +38,7 @@ keyring = { version = "3", features = ["apple-native", "sync-secret-service", "w [target.'cfg(target_os = "linux")'.dependencies] zbus = "5" glib = "0.18" +gtk = "0.18" rfd = { version = "0.15", default-features = false, features = ["gtk3"] } ksni = "0.1" diff --git a/src-tauri/src/app.rs b/src-tauri/src/app.rs index d67bef4..a370345 100644 --- a/src-tauri/src/app.rs +++ b/src-tauri/src/app.rs @@ -169,6 +169,25 @@ pub(crate) fn main_builder() -> tauri::Builder { app.manage(PopupBlurGuard(std::sync::Arc::new( std::sync::atomic::AtomicBool::new(false), ))); + + // Muffin (Cinnamon) mappt das Popup ohne Fokus: das set_focus aus + // show_popup läuft, bevor der WM das Fenster gemappt hat, und wird + // von der Focus-Stealing-Prevention verworfen — ohne initialen Fokus + // greift das Blur-Schließen nie. Deshalb nach jedem Map erneut + // präsentieren: present() besorgt sich unter X11 den echten + // Server-Timestamp, damit gewährt der WM den Fokus. Nur für den + // SNI-Pfad unter X11 — auf GNOME zeigt die Extension das Popup, dort + // hat das present() beim Map den Klick-Weg gebrochen (Ubuntu 17.07). + use gtk::prelude::*; + let gtk_win = app.get_webview_window("popup").unwrap().gtk_window()?; + if gtk_win.display().type_().name().starts_with("GdkX11") + && !crate::platform::is_gnome() + { + gtk_win.connect_map_event(|w, _| { + w.present(); + glib::Propagation::Proceed + }); + } } // Der gesamte Tray-Kontrakt: Icon zeigen, Klick als Anchor melden —