perf(coordinator): 可选热键 supervisor 注册成功即退出,彻底消除稳态轮询 (#671)
issue #470:combo/translation/action 三类可选热键 supervisor 原本注册成功后不退出,稳态 每 5s 醒来读 prefs,多线程常驻空转。改为对齐主 hotkey_supervisor_loop 的 exit-on-success 模式——到达「已安装」或「已主动停用」稳态即 return 退出,零轮询。 安全前提(已逐函数确认):用户启用/改/停这些热键时,set_*_hotkey 命令与 persist_settings diff 都会调 update_*_hotkey_binding,其覆盖「monitor 为 None → 从零 start+spawn」安装路径, 故退出后启停改键无需重启即时生效;ComboHotkeyMonitor 注册后驻留、无运行中自注销,monitor 不会自己死,无需 supervisor 守护。失败重试 sleep(3s)/recv_timeout(5s)/app未就绪 sleep(1s) 等有界路径全部保留。 Co-authored-by: 吕柏青 <lubaiqing9@gmail.com>
This commit is contained in:
1 parent
16e0f27685
commit
2d783ce337
1 file changed
+18
-18
@@ -2142,22 +2142,22 @@ fn combo_hotkey_supervisor_loop(inner: Arc<Inner>) {
|
||||
// 读当前 prefs
|
||||
let prefs = inner.prefs.get();
|
||||
if crate::shortcut_binding::legacy_modifier_trigger(&prefs.dictation_hotkey).is_some() {
|
||||
// 不是 Custom → 睡着等 prefs 改动
|
||||
// 不是 Custom → 卸载后退出守护
|
||||
take_combo_hotkey_on_main_thread(&inner);
|
||||
std::thread::sleep(std::time::Duration::from_secs(5));
|
||||
continue;
|
||||
// 对齐主 supervisor 的 exit-on-success:装/卸交给 update_combo_hotkey_binding 主动路径,issue #470
|
||||
return;
|
||||
}
|
||||
|
||||
let binding = prefs.dictation_hotkey.clone();
|
||||
if is_unconfigured_shortcut(&binding) {
|
||||
take_combo_hotkey_on_main_thread(&inner);
|
||||
std::thread::sleep(std::time::Duration::from_secs(5));
|
||||
continue;
|
||||
// 对齐主 supervisor 的 exit-on-success:装/卸交给 update_combo_hotkey_binding 主动路径,issue #470
|
||||
return;
|
||||
}
|
||||
|
||||
if inner.combo_hotkey.lock().is_some() {
|
||||
std::thread::sleep(std::time::Duration::from_secs(5));
|
||||
continue;
|
||||
// 对齐主 supervisor 的 exit-on-success:装/卸交给 update_combo_hotkey_binding 主动路径,issue #470
|
||||
return;
|
||||
}
|
||||
|
||||
let app = inner.app.lock().clone();
|
||||
@@ -2255,13 +2255,13 @@ fn translation_hotkey_supervisor_loop(inner: Arc<Inner>) {
|
||||
let (qa_trigger, translation_trigger) = modifier_shortcut_triggers(&inner);
|
||||
monitor.update_modifier_shortcuts(qa_trigger, translation_trigger);
|
||||
}
|
||||
std::thread::sleep(std::time::Duration::from_secs(5));
|
||||
continue;
|
||||
// 对齐主 supervisor 的 exit-on-success:装/卸交给 try_update_translation_hotkey_binding 主动路径,issue #470
|
||||
return;
|
||||
}
|
||||
|
||||
if inner.translation_hotkey.lock().is_some() {
|
||||
std::thread::sleep(std::time::Duration::from_secs(5));
|
||||
continue;
|
||||
// 对齐主 supervisor 的 exit-on-success:装/卸交给 try_update_translation_hotkey_binding 主动路径,issue #470
|
||||
return;
|
||||
}
|
||||
|
||||
let app = match inner.app.lock().clone() {
|
||||
@@ -2348,21 +2348,21 @@ fn action_hotkey_supervisor_loop(inner: Arc<Inner>, kind: ActionHotkeyKind) {
|
||||
if inner.shutdown.load(Ordering::SeqCst) {
|
||||
return;
|
||||
}
|
||||
// None = 用户主动停用:反注册并睡着等 prefs 改动(由 update 路径唤醒)。
|
||||
// None = 用户主动停用:反注册后退出守护(由 update_action_hotkey_binding 主动路径重装)。
|
||||
let Some(binding) = action_hotkey_binding(&inner, kind) else {
|
||||
take_action_hotkey_on_main_thread(&inner, kind);
|
||||
std::thread::sleep(std::time::Duration::from_secs(5));
|
||||
continue;
|
||||
// 对齐主 supervisor 的 exit-on-success:装/卸交给 update_action_hotkey_binding 主动路径,issue #470
|
||||
return;
|
||||
};
|
||||
if is_modifier_only_shortcut(&binding) {
|
||||
take_action_hotkey_on_main_thread(&inner, kind);
|
||||
std::thread::sleep(std::time::Duration::from_secs(5));
|
||||
continue;
|
||||
// 对齐主 supervisor 的 exit-on-success:装/卸交给 update_action_hotkey_binding 主动路径,issue #470
|
||||
return;
|
||||
}
|
||||
|
||||
if action_hotkey_slot(&inner, kind).lock().is_some() {
|
||||
std::thread::sleep(std::time::Duration::from_secs(5));
|
||||
continue;
|
||||
// 对齐主 supervisor 的 exit-on-success:装/卸交给 update_action_hotkey_binding 主动路径,issue #470
|
||||
return;
|
||||
}
|
||||
|
||||
let app = match inner.app.lock().clone() {
|
||||
|
||||
Reference in new issue
Block a user