我在使用终端时遇到了一个烦人的问题,我无法在 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)
……还是不知道怎么解决。我也尝试禁用它,但出现错误。
这不是真正的键盘的问题,而是由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。