mirror of
https://github.com/mofeng-git/One-KVM.git
synced 2026-09-12 10:34:24 +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]
|
#[typeshare]
|
||||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
pub struct MsdConfig {
|
pub struct MsdConfig {
|
||||||
pub enabled: bool,
|
pub enabled: bool,
|
||||||
|
|||||||
@@ -365,6 +365,10 @@ pub async fn apply_usb_config(
|
|||||||
let transitioning_away_from_otg =
|
let transitioning_away_from_otg =
|
||||||
old_config.hid.backend == HidBackend::Otg && new_config.hid.backend != HidBackend::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 {
|
if transitioning_away_from_otg {
|
||||||
apply_hid_config(
|
apply_hid_config(
|
||||||
state,
|
state,
|
||||||
@@ -394,6 +398,19 @@ pub async fn apply_usb_config(
|
|||||||
.await?;
|
.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(
|
apply_msd_config(
|
||||||
state,
|
state,
|
||||||
&old_config.msd,
|
&old_config.msd,
|
||||||
|
|||||||
Reference in New Issue
Block a user