我的键盘产生虚假事件

ris*_*kio 7 keyboard

我在使用终端时遇到了一个烦人的问题,我无法在 Google 上寻找解决方案,因为我不知道如何措辞。

当我在终端上加载大量文本时(例如在 dmesg 之后)并且我尝试向上滚动以查找我感兴趣的文本位,在随机时间后终端会自动向下滚动光标所在的位置。

另外,我注意到当 xscreensaver 运行时,登录 gui 会在没有任何键盘输入的情况下出现。您是否知道在 xscreensaver 中有一个“流逝时间”栏,可以在您开始输入时为您提供更多时间(栏增加)?好吧,它在没有我任何输入的情况下增加一次......

我以为我有一些来自键盘的随机输入,但是如何解决这个烦人的问题?

我一直在尝试追踪由 xev 生成的事件,但这非常困难。

在终端上,我通过取消勾选“在键盘按下时滚动”暂时解决了这个问题,但这不是一个合理的永久解决方案。正如 xscreensaver 确认的那样,整个系统都会受到影响。

它是 Acer Aspire e1-571g 笔记本电脑。我最近安装了 Funtoo。我仍在完成对我的硬件的每一块进行临时配置。

在安装 Funtoo 之前,我有 Arch Linux 并且一切正常,所以我假设硬件没有问题,只是当前配置有问题。

cpu:                                                            
                   Intel(R) Core(TM) i5-3230M CPU @ 2.60GHz, 1383 MHz
                   Intel(R) Core(TM) i5-3230M CPU @ 2.60GHz, 1400 MHz
                   Intel(R) Core(TM) i5-3230M CPU @ 2.60GHz, 1350 MHz
                   Intel(R) Core(TM) i5-3230M CPU @ 2.60GHz, 1472 MHz
keyboard:
  /dev/input/event4    AT Translated Set 2 keyboard
mouse:
  /dev/input/mice      SynPS/2 Synaptics TouchPad
graphics card:
                       Intel 3rd Gen Core processor Graphics Controller
                       nVidia VGA compatible controller
sound:
                       Intel 7 Series/C210 Series Chipset Family High Definition Audio Controller
storage:
                       Intel 7 Series Chipset Family 6-port SATA Controller [AHCI mode]
network:
  eth0                 Broadcom NetLink BCM57785 Gigabit Ethernet PCIe
  wlan0                Intel Centrino Wireless-N 105 BGN
network interface:
  wlan0                WLAN network interface
  lo                   Loopback network interface
  eth0                 Ethernet network interface
  sit0                 Network Interface
disk:
  /dev/sda             KINGSTON SH103S3
partition:
  /dev/sda1            Partition
  /dev/sda2            Partition
  /dev/sda3            Partition
  /dev/sda4            Partition
cdrom:
  /dev/sr0             HL-DT-ST DVDRAM GT51N
usb controller:
                       Intel 7 Series/C210 Series Chipset Family USB xHCI Host Controller
                       Intel 7 Series/C210 Series Chipset Family USB Enhanced Host Controller #2
                       Intel 7 Series/C210 Series Chipset Family USB Enhanced Host Controller #1
bios:
                       BIOS
bridge:
                       Intel 3rd Gen Core processor DRAM Controller
                       Intel Xeon E3-1200 v2/3rd Gen Core processor PCI Express Root Port
                       Intel 7 Series/C210 Series Chipset Family PCI Express Root Port 1
                       Intel 7 Series/C210 Series Chipset Family PCI Express Root Port 2
                       Intel HM77 Express Chipset LPC Controller
hub:
                       Linux 4.3.0-gentoo ehci_hcd EHCI Host Controller
                       Hub
                       Linux 4.3.0-gentoo ehci_hcd EHCI Host Controller
                       Hub
                       Linux 4.3.0-gentoo xhci-hcd xHCI Host Controller
                       Linux 4.3.0-gentoo xhci-hcd xHCI Host Controller
memory:
                       Main Memory
unknown:
                       FPU
                       DMA controller
                       PIC
                       Keyboard controller
                       PS/2 Controller
                       Intel 7 Series/C210 Series Chipset Family MEI Controller #1
                       Intel 7 Series/C210 Series Chipset Family SMBus Controller
                       Broadcom NetXtreme BCM57765 Memory Card Reader
                       Broadcom System peripheral
                       Broadcom System peripheral
                       Chicony Electronics HD WebCam
Run Code Online (Sandbox Code Playgroud)

任何想法/解决方案?

更新:感谢 Stéphane,我发现产生虚假事件的设备是 id=5。

? Virtual core keyboard                     id=3    [master keyboard (2)]
    ? Virtual core XTEST keyboard               id=5    [slave  keyboard (3)]
Run Code Online (Sandbox Code Playgroud)

...并确认我也做了:

xinput test-xi2 --root 5
Run Code Online (Sandbox Code Playgroud)

输出是:

EVENT type 13 (RawKeyPress)
    device: 5 (5)
    detail: 255
    valuators:

EVENT type 14 (RawKeyRelease)
    device: 5 (5)
    detail: 255
    valuators:
Run Code Online (Sandbox Code Playgroud)

……还是不知道怎么解决。我也尝试禁用它,但出现错误。

Sté*_*las 6

这不是真正的键盘的问题,而是由xfce4-power-manager.

xfce4-power-manager伪造虚拟(键码 255,未分配)键盘事件(按键后跟键释放,根据来源每 20 秒一次)以确保屏幕保护程序在演示模式下(通常是在您看电影时)不会启动或发表演讲)。

该行为是在 1.5.2(截至 2015-01-06 的最新版本)中添加的,以修复此错误以在演示模式下禁用所有可能类型的屏幕保护程序。

这具有您受到影响的副作用,并且在那个 bug 中已经注意到

因此,您希望离开该演示模式以避免出现此问题。该问题可能应该作为针对 xfce4-power-manager 的错误提出,以便恢复更改,或者找到对 #11083 的更好修复。


与问题的解释一样有趣的是我们最终是如何找到罪魁祸首的:

xinput test-xi2 --root
Run Code Online (Sandbox Code Playgroud)

报告所有 X 输入事件,告诉我们它们的来源和性质。这导致:

EVENT type 13 (RawKeyPress)
    device: 5 (5)
    detail: 255
    valuators:

EVENT type 14 (RawKeyRelease)
    device: 5 (5)
    detail: 255
    valuators:
Run Code Online (Sandbox Code Playgroud)

这是一个按键按下,然后是来自设备 5 的键码 255 的按键释放事件。

xinput list 让我们识别输入设备:

? Virtual core keyboard                      id=3    [master keyboard (2)]
 ? Virtual core XTEST keyboard               id=5    [slave  keyboard (3)]
Run Code Online (Sandbox Code Playgroud)

该 id=5 设备是一个虚拟设备,它充当软件生成事件的源,例如您可以使用以下方式生成:

xdotool key x
Run Code Online (Sandbox Code Playgroud)

或者

xte 'key x'
Run Code Online (Sandbox Code Playgroud)

如果您xte在 下运行该命令ltrace,您会注意到它确实如此:

XStringToKeysym(0x7ffed76983e0, 0x7ffed76983e0, 0, 0x7f34e491deb0) = 120
XKeysymToKeycode(0x23abfe0, 120, 120, 0x7f34e4ce7139)              = 53
XTestFakeKeyEvent(0x23abfe0, 53, 1, 0)                             = 1
Run Code Online (Sandbox Code Playgroud)

XTestFakeKeyEvent 是发送这些按键事件的标准 X API。

现在,我们想知道是什么发送了这 255 个按键事件。我们可以尝试找出当前运行的应用程序中哪些使用了该 API。

sudo lsof -Fn -nPd txt | sed -n '/proc/!s/^n//p' | sort -u | xargs grep -l XTestFakeKeyEvent
Run Code Online (Sandbox Code Playgroud)

或者它更强大的等价物:

sudo lsof -Fn -nPd txt | sed -n '/^n\/proc/!s/^n//p' |
  sort -u | xargs -d '\n' grep -l XTestFakeKeyEvent
Run Code Online (Sandbox Code Playgroud)

列出当前打开并作为可执行文件 ( txt)映射到任何进程(包括库和可执行文件)和其中的 XTestFakeKeyEvent 的 grep 的文件。

这返回了 xfce4-power-manager。

剩下要做的就是查看源代码,了解为什么该过程会执行这些 XTestFakeKeyEvent。