Accept beta's WindowChrome/global.css/FloatingShell changes for Linux
surface treatment, re-apply AudioCueListener component on top.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- AudioCueListener is a new component rendered in FloatingShellBody
that listens to capsule:state on the main window, so the record
start cue works on Linux where the capsule window is hidden.
- Coordinator now emits capsule:state to both "capsule" and "main"
windows so the listener receives state changes.
- Remove duplicate audio cue logic from Capsule.tsx to avoid
double-triggering on macOS/Windows where capsules are shown.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Add upload step for libopenless.so + openless.conf as a separate
artifact (openless-fcitx5-plugin-linux-x64) for AppImage users
and manual installation
- Include plugin files in GitHub Release assets alongside existing
deb/rpm/AppImage bundles
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The useEffect that invokes is_no_compositing_mode was removed along
with StartupShell, but it is the sole trigger for #553/#570's CSS
frost fallback on Linux. Without it, WEBKIT_DISABLE_COMPOSITING_MODE=1
users never get the fallback and see broken frosted glass.
Also fix the dead ternary: isTauri ? 'ready' : 'ready' → 'ready'.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- ensure_plugin_installed: check ~/.local/ XDG paths in addition to system
paths; warn when both user and system plugins coexist (old user version
takes priority over newly installed system version)
- App.tsx: remove StartupShell loading screen and 'checking' gate state,
app renders FloatingShell immediately
- i18n: "切换上一次风格" → "切换到上一个风格" (zh-CN/zh-TW)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Restore std::path::Path, std::sync::Arc, parking_lot::Mutex, anyhow::Result,
std::time::{Duration, Instant} imports in cache.rs, PhysicalPosition/PhysicalSize
in lib.rs, and std::time::Duration in selection.rs. These were removed by
cargo fix --broken-code because they appear unused on Linux but are needed
on macOS and Windows.
Add unused_imports to cfg_attr allow lists so future cargo fix runs on
Linux won't strip cross-platform imports again.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Restore handle_pressed/handle_released imports and window/show_capsule/
visible/audio_timeout/duration_ms variable names that cargo fix renamed
with _ prefix. These are used on macOS/Windows but the _ prefix broke
the builds. Add platform-gated import for model_dir in test_run.rs.
Expand cfg_attr allow lists to cover unused_imports and unused_variables
where needed.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Add #[cfg_attr(target_os = "linux", allow(dead_code, unused_variables))]
to 20+ source files where Linux builds see platform-specific dead code
(Windows IME, macOS permissions, Sherpa ASR, clipboard restore, etc.).
Also manually fix 3 real warnings: unused imports in coordinator.rs,
unreachable expression in insertion.rs.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
On Linux, hide the clipboard/paste/capsule settings group and move
the streaming insert toggle directly into the recording input card.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- coordinator.rs: terminal state (Done/Error/Cancelled) auto-clears after 3s;
fix RETRY_GEN comparison (fetch_add returns old value, use latest_gen > gen+1);
remove broken 300ms retry
- HotkeySettingsContext.tsx: fix queueSetSettings never calling setSettings()
(latestPrefsRef was already updated to the new object before microtask ran)
- openless.cpp: add PostInputMethod event hook to restore auxDown after
fcitx5 processes key events
- RecordingInputSection.tsx: hide clipboard/paste/capsule settings on Linux;
streaming insert shown as standalone card instead of inside clipboard group
- ShortcutsSection.tsx: hide "capsule confirm" shortcut hint on Linux
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
exit 0 on rpmrebuild failure produced a broken RPM silently.
Use exit 1 and print to stderr so the CI pipeline catches it.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- AppImage cannot work for fcitx5 plugin injection: fcitx5 runs on the
host system and loads addons from host paths (/usr/lib/.../fcitx5).
Files placed inside the AppImage mount are invisible to fcitx5.
- For Debian, use dpkg-architecture to detect the multiarch triplet
(x86_64-linux-gnu, aarch64-linux-gnu, etc.) instead of hardcoding.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Debian uses /usr/lib/x86_64-linux-gnu/fcitx5, RPM uses /usr/lib64/fcitx5,
and some distros use /usr/lib/fcitx5. Check all three to avoid false
alarms on non-Debian systems.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- RPM: use /usr/lib64/fcitx5/ (RPM 64-bit standard) instead of
Debian multiarch path
- AppImage: only support AppDir directory input, remove .AppImage file
extraction which couldn't repack and would lose changes
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Remove `resources` from tauri.linux.conf.json — the .so/.conf files
don't exist on CI (plugin is built separately), causing cargo check
to fail with "resource path doesn't exist"
- Simplify ensure_plugin_installed to just check system paths exist,
no bundled comparison needed
- Remove prebuild script and copy-plugin.mjs (no longer needed)
- Remove plugin entries from .gitignore
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The prebuild script used bash syntax (mkdir, for, [ -f ]) which fails on
Windows. Replace with a Node.js script that checks platform() and skips
non-Linux, keeping the plugin copy logic only where it's needed.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
避免快速状态切换 (Done→Idle→Recording) 时旧 clear 跑到新 set 后面把新文字清掉。
NameOwnerChanged Stale Sync 是已知低概率场景,注释保留。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Accept upstream's show_capsule_window_for_recording wrapper + CapsuleShowStrategy
(our Linux fallback logic is subsumed by the upstream strategy pattern)
- Keep Linux on NoActivate strategy; show_capsule_window_no_activate returns true
on Linux to suppress capsule window (no popup on Wayland/fcitx5)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Fn key does not generate a standard X11 keysym on Linux. The previous
mapping to Super_L (0xffeb) was incorrect and would bind the
Windows/Super key instead. Map to RightControl (0xffe4) to match the
existing fallback convention used on Windows (VK_RCONTROL) and in the
coordinator's hotkey matching logic.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
setHotkey/setHotkeyRaw now clear hasCustomDictationKey_ to prevent stale custom
combo from persisting after switching to a preset modifier. setCustomDictationTrigger
now persists TriggerRawSym=TriggerRawStates=0 to raw config so the old raw
trigger doesn't reload after fcitx5 restart.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Map Debian multiarch addon dir to /usr/lib64 for RPM packages.
Uses FCITX_RPM_ADDON_DIR derived from cmake output instead of
hardcoded paths.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Add SetCustomDictationTrigger(s) to plugin for custom key combos
- Add fcitx5 availability check before hotkey install, surface error
- Sync custom dictation combo to fcitx5 plugin from coordinator
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Extend the fcitx5 plugin with SetQaHotkeyRaw/SetTranslationHotkeyRaw
DBus methods and corresponding signals, so that QA panel toggle and
translation modifier hotkeys work on Linux (not just the main dictation
hotkey). Built-in Shift key translation modifier also handled by the
plugin. Document DBus security model in plugin header.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Remove 290 lines of unused rdev listener code from the Linux hotkey
platform module, drop the rdev dependency from Cargo.toml, and clean up
capsule_window_visible init leftover. Update doc comments and frontend
i18n to reflect the unified fcitx5-only path.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
ic->connect(ic->destroyed, ...) is invalid — InputContext has no two-arg
connect overload. Use ic->destroyed.connect(callback) directly, which
calls Signal<void()>::connect. Also simplified ScopedConnection storage
from unique_ptr to direct member (ScopedConnection is move-assignable).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Prevents savedIc_ from becoming a dangling pointer by connecting to the
InputContext::destroyed signal when the IC is saved. On destruction the
pointer is cleared automatically, and commitText falls through to
foreachFocused for the current focused IC.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
FCITX_INSTALL_ADDONDIR varies by distro (multiarch Ubuntu →
/usr/lib/x86_64-linux-gnu/fcitx5/; Fedora → /usr/lib64/fcitx5/;
Arch → /usr/lib/fcitx5/). Extract from cmake cache at build time
via GITHUB_ENV instead of hardcoding.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
When ensure_modifier_hotkey_monitor finds an existing monitor and
updates the rdev/CGEventTap binding, it must also sync the new binding
to the fcitx5 plugin on Wayland. Previously the early return skipped
this, leaving plugin and coordinator out of sync after a hotkey change.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Add "Build fcitx5 plugin" step to release-tauri.yml: compiles
the C++ plugin via cmake, copies .so + .conf to
src-tauri/linux-fcitx5-plugin/ for the Tauri bundler.
- Override tauri build --config to include deb.files / rpm.files
that place the plugin at /usr/lib/fcitx5/ so it's auto-detected
after install.
- Add fcitx5, fcitx5-module-dbus as deb/rpm dependencies.
- Local builds unaffected (config is CI-only via --config flag).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Add #[cfg(target_os = "linux")] to mod linux_fcitx to fix macOS/Windows
CI compilation (dbus crate is Linux-only).
- Wayland: skip capsule window show/hide entirely in emit_capsule so the
target app never loses keyboard focus. Text is committed via fcitx5
plugin commit_string — no window means the compositor forwards the
commit to the right app.
- X11 keeps existing behavior (show capsule window once per session).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- fcitx5 C++ plugin (scripts/linux-fcitx5-plugin/) with DBus interface:
CommitText, SetHotkey/SetHotkeyRaw, DictationKeyEvent signal
- linux_fcitx.rs: DBus client to call plugin from Rust
- coordinator/dictation.rs: Wayland insertion via fcitx5 commit_text,
streaming insert enabled on Wayland
- insertion.rs: fcitx5 commit_text on Linux with clipboard fallback
- unicode_keystroke.rs: Linux path uses fcitx5 commit_text
- Capsule window show-once on Linux to avoid stealing focus
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>