Keyboard

我的鍵盤產生虛假事件

  • April 14, 2016

我在使用終端時遇到了一個煩人的問題,我無法在 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:

……還是不知道怎麼解決。我也嘗試禁用它,但出現錯誤。

這不是真正的鍵盤問題,而是由xfce4-power-manager.

xfce4-power-manager假裝虛擬(鍵碼 255,未分配)鍵盤事件(按鍵後按鍵釋放,根據來源每 20 秒),以確保螢幕保護程序在展示模式下不會啟動(通常是在你看電影時)或進行展示)。

該行為是在 1.5.2(截至 2015-01-06 的最新版本)中添加的,以修復此錯誤,以在展示模式下禁用所有可能類型的螢幕保護程序。

這具有您受到影響的副作用,並且已經在那個 bug 中註意到了這一點

因此,您希望離開該展示模式以避免該問題。該問題可能應該作為針對 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) 映射到任何程序(包括庫和執行檔)的文件,並對其中的 XTestFakeKeyEvent 進行 grep。

這返回了 xfce4-power-manager。

剩下要做的就是查看原始碼,了解為什麼該過程會執行那些 XTestFakeKeyEvent。

引用自:https://unix.stackexchange.com/questions/253184