xinput test
สามารถรายงานเหตุการณ์แป้นพิมพ์ทั้งหมดไปยังเซิร์ฟเวอร์ X ในระบบ GNU:
xinput list |
grep -Po 'id=\K\d+(?=.*slave\s*keyboard)' |
xargs -P0 -n1 xinput test
หากคุณต้องการรับชื่อคีย์จากรหัสคีย์คุณสามารถ post-process ที่เอาต์พุตด้วย:
awk 'BEGIN{while (("xmodmap -pke" | getline) > 0) k[$2]=$4}
{print $0 "[" k[$NF] "]"}'
เพิ่ม> file.log
ไปเก็บในไฟล์บันทึก หรือ| tee file.log
เพื่อบันทึกและดู
xinput
เคียวรี XinputExtension ของเซิร์ฟเวอร์ X นั่นใกล้เคียงกับที่คุณจะได้รับเป็นมาตรฐาน (ฉันไม่ทราบมาตรฐานใด ๆ ที่ครอบคลุมยูทิลิตี้ X) หรือคำสั่งทั่วไปในการทำเช่นนั้น ซึ่งไม่ต้องการสิทธิ์รูท
หากเซิร์ฟเวอร์ X และ xinput รองรับรุ่น 2 ของ XinputExtension คุณสามารถใช้test-xi2
แทนtest
ซึ่งจะให้ข้อมูลเพิ่มเติมโดยเฉพาะสถานะของตัวดัดแปลง (shift, ctrl, alt ... ) ตัวอย่าง:
$ xinput test-xi2 --root
EVENT type 2 (KeyPress)
device: 11 (11)
detail: 54
flags:
root: 846.80/451.83
event: 846.80/451.83
buttons:
modifiers: locked 0 latched 0 base 0x4 effective: 0x4
group: locked 0 latched 0 base 0 effective: 0
valuators:
windows: root 0x26c event 0x26c child 0x10006e6
คุณสามารถแปล keycode (ในdetail
) เพื่อ keysym ด้วยความช่วยเหลือของที่xmodmap -pke
อีกครั้งและeffective
bitmask xmodmap -pm
ปรับปรุงบางสิ่งบางอย่างที่เป็นประโยชน์มากขึ้นด้วยความช่วยเหลือของ ตัวอย่างเช่น
xinput test-xi2 --root | perl -lne '
BEGIN{$"=",";
open X, "-|", "xmodmap -pke";
while (<X>) {$k{$1}=$2 if /^keycode\s+(\d+) = (\w+)/}
open X, "-|", "xmodmap -pm"; <X>;<X>;
while (<X>) {if (/^(\w+)\s+(\w*)/){($k=$2)=~s/_[LR]$//;$m[$i++]=$k||$1}}
close X;
}
if (/^EVENT type.*\((.*)\)/) {$e = $1}
elsif (/detail: (\d+)/) {$d=$1}
elsif (/modifiers:.*effective: (.*)/) {
$m=$1;
if ($e =~ /^Key/){
my @mods;
for (0..$#m) {push @mods, $m[$_] if (hex($m) & (1<<$_))}
print "$e $d [$k{$d}] $m [@mods]"
}
}'
จะส่งออก:
KeyPress 24 [q] 0x19 [Shift,Alt,Num_Lock]
เมื่อฉันกด Shift + Alt + q เมื่อ num-lock เปิดอยู่
โปรดทราบว่าคุณไม่จำเป็นต้องมีสิทธิ์พิเศษสำหรับผู้ใช้ในการติดตั้งโปรแกรม หากคุณมีสิทธิ์เขียนเพื่อเข้าถึงบางส่วนในระบบไฟล์ที่ได้รับอนุญาตให้ดำเนินการ (โฮมไดเร็กตอรี่ของคุณ/tmp
, /var/tmp
... ) จากนั้นคุณสามารถคัดลอกxinput
คำสั่งจากระบบที่เข้ากันได้ที่นั่นและดำเนินการนั้น