mirror of
https://github.com/mofeng-git/One-KVM.git
synced 2026-09-12 18:44:25 +08:00
fix: 修复OTG gadget重建后HID后端未重载导致键鼠失效
当MSD或OTG网络配置变更导致gadget被重建时,新的/dev/hidg*设备 被创建但HID后端因'配置未变'跳过了reload,导致仍持有已删除设备 的旧文件描述符,键鼠操作无效。 修复: 在apply_usb_config中检测gadget是否因MSD/网络变更被重建, 若是且HID后端为OTG,强制reload HID以打开新的/dev/hidg*设备。 同时为MsdConfig添加PartialEq derive以支持变更检测。
This commit is contained in:
@@ -44,7 +44,7 @@ impl Default for VideoConfig {
|
||||
}
|
||||
|
||||
#[typeshare]
|
||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
|
||||
#[serde(default)]
|
||||
pub struct MsdConfig {
|
||||
pub enabled: bool,
|
||||
|
||||
@@ -365,6 +365,10 @@ pub async fn apply_usb_config(
|
||||
let transitioning_away_from_otg =
|
||||
old_config.hid.backend == HidBackend::Otg && new_config.hid.backend != HidBackend::Otg;
|
||||
|
||||
let hid_unchanged = old_config.hid == new_config.hid;
|
||||
let otg_gadget_rebuilt =
|
||||
old_config.msd != new_config.msd || old_config.otg_network != new_config.otg_network;
|
||||
|
||||
if transitioning_away_from_otg {
|
||||
apply_hid_config(
|
||||
state,
|
||||
@@ -394,6 +398,19 @@ pub async fn apply_usb_config(
|
||||
.await?;
|
||||
}
|
||||
|
||||
// When the OTG gadget was rebuilt due to MSD or network config changes
|
||||
// while HID config stayed the same, the /dev/hidg* devices are new and
|
||||
// the HID backend must be reloaded to reopen them.
|
||||
if hid_unchanged && otg_gadget_rebuilt && new_config.hid.backend == HidBackend::Otg {
|
||||
tracing::info!("OTG gadget rebuilt, reloading HID backend for new devices");
|
||||
let hid_backend = hid_backend_type(&new_config.hid);
|
||||
state
|
||||
.hid
|
||||
.reload(hid_backend)
|
||||
.await
|
||||
.map_err(|e| AppError::Config(format!("HID reload after gadget rebuild failed: {}", e)))?;
|
||||
}
|
||||
|
||||
apply_msd_config(
|
||||
state,
|
||||
&old_config.msd,
|
||||
|
||||
Reference in New Issue
Block a user