我的键盘生成虚假事件

我的键盘生成虚假事件

我在使用终端时遇到了一个恼人的问题,我无法在 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

有什么想法/解决方案吗?

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

⎣ Virtual core keyboard                     id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard               id=5    [slave  keyboard (3)]

...并确认我也这样做了:

xinput test-xi2 --root 5

输出是:

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

EVENT type 14 (RawKeyRelease)
    device: 5 (5)
    detail: 255
    valuators:

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

答案1

这不是真正的键盘的问题,而是由 发送的假按键事件的问题xfce4-power-manager

xfce4-power-manager是假装的假的(键码 255,未分配)键盘事件(按键后释放键,根据源代码,每 20 秒一次),以确保屏幕保护程序在演示模式下不会启动(通常是在您观看电影或进行演示时)推介会)。

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

这会产生你所受影响的副作用已经注意到那个错误

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


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

xinput test-xi2 --root

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

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

EVENT type 14 (RawKeyRelease)
    device: 5 (5)
    detail: 255
    valuators:

这是来自设备 5 的按键代码 255 的按键释放事件。

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

⎣ Virtual core keyboard                      id=3    [master keyboard (2)]
 ↳ Virtual core XTEST keyboard               id=5    [slave  keyboard (3)]

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

xdotool key x

或者

xte 'key x'

如果您xte在 下运行该命令ltrace,您会发现它确实如此:

XStringToKeysym(0x7ffed76983e0, 0x7ffed76983e0, 0, 0x7f34e491deb0) = 120
XKeysymToKeycode(0x23abfe0, 120, 120, 0x7f34e4ce7139)              = 53
XTestFakeKeyEvent(0x23abfe0, 53, 1, 0)                             = 1

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

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

sudo lsof -Fn -nPd txt | sed -n '/proc/!s/^n//p' | sort -u | xargs grep -l XTestFakeKeyEvent

或者它更强大的等价物:

sudo lsof -Fn -nPd txt | sed -n '/^n\/proc/!s/^n//p' |
  sort -u | xargs -d '\n' grep -l XTestFakeKeyEvent

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

返回 xfce4-power-manager。

剩下要做的就是在源代码中查找该进程执行这些 XTestFakeKeyEvent 的原因。

相关内容