我的鍵盤產生虛假事件
我在使用終端時遇到了一個煩人的問題,我無法在 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。