概述
Windows 桌面 (192.168.5.11) 与 Arch Linux 笔记本 (192.168.5.12, Niri compositor) 之间共享键盘鼠标、剪贴板、文件传输。
架构
蓝牙键盘 (IROK MG68AW BT2)
│ Super 键、Shift 键等
▼
Windows (192.168.5.11)
│ lan-mouse client 捕获输入并发送
│
▼ TCP port 4242
│
Linux / Niri (192.168.5.12)
│ wl-uinput-proxy 包装 lan-mouse daemon
│ Wayland 虚拟键盘 → uinput 内核设备
│
▼ uinput → libinput → Niri
│ Super 键 → Niri 快捷键 ✓
│ Shift 键 → fcitx5 中英文切换 ✓
│
▼
KDE Connect(剪贴板同步 + 文件传输)
UDP/TCP 1714-1764,局域网自动发现
核心原理:为什么必须用 wl-uinput-proxy
问题
Niri 存在已知 bug (#403/#631):通过 Wayland 虚拟键盘协议 (zwp_virtual_keyboard_v1) 进入的 modifier 事件(Super、Shift、Ctrl、Alt)不会走 compositor 的快捷键处理流程,只会被转发给当前焦点窗口。
键盘 Super 键 → lan-mouse 捕获发送 → Linux 收到
→ zwp_virtual_keyboard_v1 协议
→ Niri:modifier 事件只转发给窗口,不触发 compositor 快捷键
→ Super+T 无效 ✗, Shift 切换输入法无效 ✗
解决
wl-uinput-proxy 拦截 Wayland 虚拟键盘事件,转换为 Linux uinput 内核设备发出的真实 evdev 事件。libinput 和 Niri 无法区分它和物理键盘,modifier 键的所有处理流程恢复正常。
键盘 Super 键 → lan-mouse 捕获发送 → Linux 收到
→ wl-uinput-proxy 拦截虚拟键盘协议
→ 转换为 uinput 内核设备 (/dev/input/eventXX)
→ libinput 视为真实硬件键盘
→ Niri 正常处理 → Super 生效 ✓, Shift 生效 ✓
按键数据流
键盘通过蓝牙连接 Windows,Windows 端的 lan-mouse client 捕获按键后通过 TCP 发送到 Linux。Linux 端 wl-uinput-proxy 将虚拟键盘事件转为 uinput 内核事件,Niri 才能正确识别 modifier 键。
wl-uinput-proxy 必须运行,否则 Niri 的虚拟键盘 modifier 事件不会触发 compositor 快捷键,也不会被输入法处理。
开机自启动
所有服务已通过 ~/.config/niri/config.kdl 中的 spawn-at-startup 自动启动,开机无需手动操作。
| 服务 | Niri 配置行 |
|---|---|
| 键鼠共享 | spawn-at-startup "~/.local/bin/wl-uinput-proxy" "lan-mouse" "daemon" |
| 剪贴板 + 文件传输 | spawn-at-startup "kdeconnectd" |
| 输入法 | spawn-at-startup "fcitx5" |
wl-uinput-proxy 会自动拉起 lan-mouse daemon 作为子进程,无需单独启动。
验证
fish
pgrep -a "wl-uinput|lan-mouse|fcitx5|kdeconnectd"
故障排查
如 wl-uinput-proxy 未运行(通常是 lan-mouse 之前已独立启动导致冲突):
fish
pkill lan-mouse
sleep 1
nohup ~/.local/bin/wl-uinput-proxy lan-mouse daemon > /tmp/wl-up-lan.log 2>&1 &
KDE Connect 使用指南
剪贴板同步
配对后在两端开启 Clipboard sync 插件即可。双向自动同步,无需操作。
文件传输
Windows → Linux :右键文件 → "发送到设备" → 选 leli,文件存到 ~/Downloads/
Linux → Windows:
fish
kdeconnect-cli -d f8db019a1acb402daf300e5be3caf17c --share /path/to/file
常用命令
fish
kdeconnect-cli -l # 查看设备
kdeconnect-cli --refresh # 刷新设备列表
关键组件
| 组件 | 作用 | 路径 |
|---|---|---|
| wl-uinput-proxy | Wayland 虚拟输入 → uinput 内核设备 | ~/.local/bin/wl-uinput-proxy |
| lan-mouse 0.11.0 | 跨平台键鼠共享 | /usr/bin/lan-mouse |
| KDE Connect 26.04.3 | 剪贴板同步 + 文件传输 | /usr/bin/kdeconnectd |
wl-uinput-proxy
- 源码:https://github.com/pgaskin/wl-uinput-proxy
- uinput 虚拟键盘/指针设备在 Windows 鼠标首次移入 Linux 屏幕时创建
- 设备名:
wl-uinput-proxy virtual keyboard N/wl-uinput-proxy virtual pointer N
lan-mouse
- 后端:wlroots emulation
- 捕获方式:layer-shell
- 释放鼠标快捷键:LeftCtrl + LeftShift + LeftAlt
- 配置:
~/.config/lan-mouse/config.toml - Windows 屏幕位于 Linux 上方 (position = "top")
已修改的文件
| 文件 | 说明 |
|---|---|
~/.config/niri/config.kdl |
添加 kdeconnectd + wl-uinput-proxy 自启动 |
~/.config/lan-mouse/config.toml |
lan-mouse 配置 |
~/.config/xremap/config.yml |
已弃用,禁止使用 |
~/.config/systemd/user/xremap.service |
已禁用 |
~/.config/systemd/user/wl-uinput-lan-mouse.service |
已禁用 |
注意事项
- 所有服务已配置自启动,开机无需手动操作
- uinput 虚拟键盘设备在 Windows 鼠标首次移入 Linux 屏幕时创建
- IP 变化时更新
~/.config/lan-mouse/config.toml - 禁止使用 xremap:会抓取键盘设备导致 Niri 输入中断
- Niri 重启后自启动服务会自动重新运行
- KDE Connect 需要 Windows 端也在运行,两端在同一局域网
- 不要在 Niri 自启动之外单独运行 lan-mouse,会导致 wl-uinput-proxy 启动失败