首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在将USB插入膝上型计算机(并获得确定性行为)时自动更改kbd配置?

如何在将USB插入膝上型计算机(并获得确定性行为)时自动更改kbd配置?
EN

Unix & Linux用户
提问于 2020-09-04 10:56:01
回答 1查看 154关注 0票数 1

udev的规定让我很紧张..。有时他们工作,有时他们不工作..。

再说一次,今天它们不起作用了。

我总是在网上复制东西,然后调整它,最后得到一个工作配置,几周/几个月后,它们就停止工作了。

一劳永逸,我真的很想得到一个确定性的解决方案.

  • 我想要的是:当我把kdb插入我的笔记本电脑时,外部USB键盘配置会自动改变(交换帽&ctrl+ lwin组合)。
  • 我所做的:

( a)获得了我的USB键盘设备信息:

代码语言:javascript
运行
复制
# lsusb |grep Dell
Bus 001 Device 045: ID 413c:2107 Dell Computer Corp. 

( b)在我的/etc/udev/rules.d es.d/90-键盘_swapcaps.Rule中,我添加了:

代码语言:javascript
运行
复制
## DEBUG
ACTION=="change", ATTRS{idVendor}=="413c", ATTRS{idProduct}=="2107", RUN+="/bin/sh -c 'echo == >> /tmp/udev-env.txt; env >> /tmp/udev-env.txt'"
# ACTUAL
ACTION=="change", ATTRS{idVendor}=="413c", ATTRS{idProduct}=="2107", ENV{XKBLAYOUT}="fr", ENV{XKBOPTIONS}+="ctrl:swapcaps", ENV{XKBOPTIONS}+="compose:lwin"

然后我跑了:

代码语言:javascript
运行
复制
# udevadm control --reload-rules && udevadm trigger
  • 我得到的是:

( a) kbd配置中没有任何更改。

b)监测

代码语言:javascript
运行
复制
# udevadm monitor -u
...
UDEV  [10555.979594] add      /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.2/1-1.2:1.0/0003:413C:2107.001E/input/input55 (input)
UDEV  [10555.989903] add      /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.2/1-1.2:1.0/0003:413C:2107.001E/input/input55/input55::numlock (leds)
UDEV  [10555.992442] add      /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.1/1-1.1:1.0/0003:046D:C077.001D/input/input54 (input)
UDEV  [10555.994812] add      /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.2/1-1.2:1.0/0003:413C:2107.001E/input/input55/input55::scrolllock (leds)
UDEV  [10556.001225] add      /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.2/1-1.2:1.0/0003:413C:2107.001E/hidraw/hidraw1 (hidraw)
UDEV  [10556.003513] add      /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.1/1-1.1:1.0/0003:046D:C077.001D/input/input54/mouse1 (input)
UDEV  [10556.005834] add      /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.1/1-1.1:1.0/0003:046D:C077.001D/hidraw/hidraw0 (hidraw)
UDEV  [10556.010005] add      /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.2/1-1.2:1.0/0003:413C:2107.001E/input/input55/input55::capslock (leds)
UDEV  [10556.019614] change   /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.2/1-1.2:1.0/0003:413C:2107.001E/input/input55/input55::numlock (leds)
UDEV  [10556.021307] change   /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.2/1-1.2:1.0/0003:413C:2107.001E/input/input55/input55::scrolllock (leds)
UDEV  [10556.022045] add      /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.2/1-1.2:1.0/0003:413C:2107.001E/input/input55/event20 (input)
UDEV  [10556.024438] change   /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.2/1-1.2:1.0/0003:413C:2107.001E/input/input55/input55::capslock (leds)
UDEV  [10556.026259] bind     /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.2/1-1.2:1.0/0003:413C:2107.001E (hid)

这表明这个设备被检测到了&是正确的吗?

( c)在/tmp/udev-env.txt中,许多行类似于:

代码语言:javascript
运行
复制
...
==
ID_FOR_SEAT=leds-pci-0000_00_14_0-usb-0_1_2_1_0
ACTION=change
TRIGGER=kbd-scrolllock
SEQNUM=17431
USEC_INITIALIZED=10059229961
TAGS=:seat:
XKBLAYOUT=fr
XKBOPTIONS=ctrl:swapcaps compose:lwin
DEVPATH=/devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.2/1-1.2:1.0/0003:413C:2107.001C/input/input53/input53::scrolllock
SUBSYSTEM=leds
ID_PATH=pci-0000:00:14.0-usb-0:1.2:1.0
ID_PATH_TAG=pci-0000_00_14_0-usb-0_1_2_1_0
PWD=/

这就告诉我规则是匹配的&是适用的。

那么,我到底做了什么不改变我的kbd配置?

如果我在LinuxMint 20下面。

谢谢你的帮助!

EN

回答 1

Unix & Linux用户

发布于 2020-09-04 13:22:10

环境变量只从父进程传播到子进程,而不是从子进程传播到父进程。从udev规则运行的任何内容通常都无法访问GUI会话的环境。

在您的示例中,由udev规则的RUN+=部分启动的shell进程当然设置了XKBLAYOUTXKBOPTIONS环境变量所需的方式。但是一旦RUN+=...中的命令完成,这个shell就会退出.而这些修改后的环境变量也会随之消亡,而不会对任何事情产生任何影响。

只有当这些环境变量中的信息传递给setxkbmap命令或类似的信息时,这些环境变量才会生效。在您的发行版中,它可能会作为X11会话设置的一个标准部分发生。仅仅设置变量本身,而不以某种方式将它们的值传递给X11服务器,对键盘布局没有任何影响。

由于X11会话设置通常来源于/etc/profile和类似的shell启动文件,以便为GUI应用程序提供一个合理的环境,因此,可能仅仅在/etc/profile.d/*.sh或类似的设置中设置这些变量就能工作。但是实际的魔力不是在变量中,而是在X11会话设置过程中,它将根据这些变量的值执行setxkbmap -layout $XKBLAYOUT ...或等效的操作。这是你在udev规则中根本没有提供的部分。

udev规则的执行上下文与GUI会话的执行上下文完全无关。因此,即使添加了使用这些变量将更改传递给X11服务器的setxkbmap命令,由udev规则启动的shell也不会有引用GUI会话的DISPLAYXAUTHORITY变量,因此命令只会发出Cannot open display错误消息。

( DISPLAY变量和X会话cookie文件,无论是在~/.Xauthority还是在XAUTHORITY环境变量指向的自定义位置,都是成为X11 GUI会话的一部分或以任何方式向该会话发送命令所必需的。)

令人沮丧的是,几乎有一个功能可以巧妙地解决这个问题。您可以创建一个名为/etc/udev/hwdb.d/70-keyboard.hwdb的文件,其内容如下:

代码语言:javascript
运行
复制
evdev:input:b????v413Cp2107e*
  XKB_FIXED_LAYOUT="fr"
  # XKB_FIXED_OPTIONS="ctrl:swapcaps compose:lwin" # Unfortunately this part has not been implemented yet!

据我所知,这将只允许为特定键盘指定X11键盘布局,即使系统有其他带有其他布局的键盘。不幸的是,允许指定XKB键盘布局规范中的选项部分(我猜这部分对您来说很重要)的部分没有实现。

票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/607822

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档