diff --git a/CHANGELOG.md b/CHANGELOG.md index 31466d3..cd390e0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,14 @@ ### Active Window Detection (Flatpak fix) - **Native X11 `_NET_ACTIVE_WINDOW` query** via `dlopen("libX11.so.6")` — added as third fallback in `get_active_window_id()`. Works inside the Flatpak sandbox where `xdotool`/`xprop` are unavailable. No subprocess, no external dependencies. +### Default Mode +- **`start_enabled` now defaults to `true`** — Vietnamese mode is active immediately after launch. Press Ctrl+Space to toggle to English. + *(Existing users with a custom config.toml are unaffected — the explicit setting overrides the default.)* + +### Tray & Desktop Entry +- **No password prompt inside Flatpak** — `needs_root()` detects Flatpak sandbox (`FLATPAK_ID` or `/app/bin` presence) and skips sudo entirely; the sandbox already has device access via `--device=all`. +- **First-launch flag always written** — the `.first-launch-done` marker is created even when the password prompt is dismissed, preventing repeated prompts. +- **Desktop categories** widened to `Utility;TextTools;X-GNOME-Utilities;` for better visibility in Cinnamon/Mint app menu. - **Bundle**: `VietPlus-0.1.5.flatpak` (66 MB with tray, runtime `org.gnome.Platform//50`). Warning-free build. --- diff --git a/README.md b/README.md index 7b5cc11..5b30f81 100644 --- a/README.md +++ b/README.md @@ -314,7 +314,7 @@ Config file: `~/.config/vietc/config.toml` or `./vietc.toml` ```toml input_method = "vni" # "vni" or "telex" toggle_key = "space" # Ctrl+Space to toggle -start_enabled = false # English by default +start_enabled = true # Vietnamese by default grab = true # grab keyboard (evdev) [auto_restore] diff --git a/daemon/src/config.rs b/daemon/src/config.rs index 4679a90..f8dde81 100644 --- a/daemon/src/config.rs +++ b/daemon/src/config.rs @@ -86,7 +86,7 @@ fn default_toggle_key() -> String { "space".into() } fn default_start_enabled() -> bool { - false + true } fn default_true() -> bool { true @@ -262,7 +262,7 @@ vs = "với" let config: Config = toml::from_str(toml).unwrap(); assert_eq!(config.input_method, "vni"); assert_eq!(config.toggle_key, "shift"); - assert!(!config.start_enabled); + assert!(!config.start_enabled); // explicitly set to false in test toml assert!(!config.auto_restore.enabled); assert!(config.app_state.enabled); assert_eq!(config.app_state.english_apps, vec!["code", "vim"]); @@ -281,7 +281,7 @@ vs = "với" let config: Config = toml::from_str(toml).unwrap(); assert_eq!(config.input_method, "vni"); assert_eq!(config.toggle_key, "space"); - assert!(!config.start_enabled); + assert!(config.start_enabled); // default changed to true assert!(config.auto_restore.enabled); assert!(config.app_state.enabled); assert!(!config.app_state.english_apps.is_empty()); @@ -296,7 +296,7 @@ input_method = "vni" let config: Config = toml::from_str(toml).unwrap(); assert_eq!(config.input_method, "vni"); assert_eq!(config.toggle_key, "space"); // default - assert!(!config.start_enabled); // default + assert!(config.start_enabled); // default changed to true } #[test] diff --git a/packaging/flatpak/build-flatpak.sh b/packaging/flatpak/build-flatpak.sh index 94e6efa..0f7d821 100644 --- a/packaging/flatpak/build-flatpak.sh +++ b/packaging/flatpak/build-flatpak.sh @@ -52,7 +52,8 @@ Exec=/app/bin/vietc-tray Icon=io.github.vietc.VietPlus Terminal=false Type=Application -Categories=Utility; +StartupNotify=true +Categories=Utility;TextTools;X-GNOME-Utilities; END mkdir -p /app/share/metainfo diff --git a/ui/src/main.rs b/ui/src/main.rs index fd72976..5f73ef1 100644 --- a/ui/src/main.rs +++ b/ui/src/main.rs @@ -39,7 +39,16 @@ fn is_daemon_running() -> bool { check("vietc") || check("vietc-daemon") } +fn is_flatpak() -> bool { + std::env::var("FLATPAK_ID").is_ok() + || std::path::Path::new("/app/bin").exists() +} + fn needs_root() -> bool { + if is_flatpak() { + // Inside Flatpak the sandbox already has device access; sudo won't work. + return false; + } let cfg = config::Config::load(); cfg.grab } @@ -114,18 +123,14 @@ fn prompt_password() -> String { fn start_daemon() { let daemon_bin = find_sibling_binary("vietc"); - if needs_root() && !is_daemon_running() { - // Mark that we've attempted first launch - let flag_path = config_path().join(".first-launch-done"); - - if !flag_path.exists() { - let password = prompt_password(); - if password.is_empty() { - eprintln!("[vietc-tray] No password provided, starting daemon without root"); - let _ = std::process::Command::new(&daemon_bin).spawn(); - return; - } + let flag_path = config_path().join(".first-launch-done"); + if needs_root() && !is_daemon_running() && !flag_path.exists() { + let password = prompt_password(); + if password.is_empty() { + eprintln!("[vietc-tray] No password provided, starting daemon without root"); + let _ = std::process::Command::new(&daemon_bin).spawn(); + } else { // Start daemon with sudo let mut child = match std::process::Command::new("sudo") .args(["-S", &daemon_bin]) @@ -138,6 +143,7 @@ fn start_daemon() { Err(e) => { eprintln!("[vietc-tray] Failed to start daemon with sudo: {}", e); let _ = std::process::Command::new(&daemon_bin).spawn(); + let _ = std::fs::write(&flag_path, "1"); return; } }; @@ -147,11 +153,10 @@ fn start_daemon() { let _ = stdin.write_all(format!("{}\n", password).as_bytes()); } let _ = child.wait(); - - // Mark first launch as done - let _ = std::fs::write(&flag_path, "1"); - return; } + + let _ = std::fs::write(&flag_path, "1"); + return; } if !is_daemon_running() {