SIGUSR1 to trigger fcitx layout change

This commit is contained in:
galister
2025-12-15 16:13:45 +09:00
parent 12e5749bda
commit 1077d2606d
9 changed files with 656 additions and 121 deletions

View File

@@ -36,7 +36,10 @@ use std::{
sync::atomic::{AtomicBool, AtomicUsize, Ordering},
};
use anyhow::Context;
use clap::Parser;
use libc::{SIGINT, SIGTERM, SIGUSR1};
use signal_hook::iterator::Signals;
use sysinfo::Pid;
use tracing::level_filters::LevelFilter;
use tracing_subscriber::{EnvFilter, layer::SubscriberExt, util::SubscriberInitExt};
@@ -45,6 +48,7 @@ use crate::subsystem::dbus::DbusConnector;
pub static FRAME_COUNTER: AtomicUsize = AtomicUsize::new(0);
pub static RUNNING: AtomicBool = AtomicBool::new(true);
pub static KEYMAP_CHANGE: AtomicBool = AtomicBool::new(false);
/// The lightweight desktop overlay for OpenVR and OpenXR
#[derive(Default, Parser, Debug)]
@@ -114,11 +118,7 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
return Ok(());
}
let _ = ctrlc::set_handler({
|| {
RUNNING.store(false, Ordering::Relaxed);
}
});
setup_signal_hooks()?;
auto_run(args);
@@ -200,6 +200,27 @@ const fn args_get_openxr(args: &Args) -> bool {
ret
}
fn setup_signal_hooks() -> anyhow::Result<()> {
let mut signals = Signals::new([SIGINT, SIGTERM, SIGUSR1])?;
std::thread::spawn(move || {
for signal in signals.forever() {
match signal {
SIGUSR1 => {
log::info!("SIGUSR1 received (keymap changed)");
KEYMAP_CHANGE.store(true, Ordering::Relaxed);
continue;
}
_ => {
RUNNING.store(false, Ordering::Relaxed);
break;
}
}
}
});
Ok(())
}
fn logging_init(args: &mut Args) {
let log_file_path = args
.log_to