Pertanyaan Bagaimana cara menerjemahkan X11 keycode kembali ke scancode atau menyembunyikan id penggunaan secara andal


Hampir sembuh sendiri.

Info latar belakang

keycode linux

Di bawah ini adalah dari: linux_xmodmap_tutorial

  • Scancode → nomor yang dikirimkan keyboard Anda ke komputer. Untuk USB keyboard, ini ditentukan oleh standar USB.

  • Keycode → nomor yang digunakan oleh kernel Linux untuk mewakili key (atau mouse tombol / roda). Kernel Linux menerjemahkan scancode keycode.

  • Keysym → nama untuk kunci. keyym diterima oleh aplikasi X11.

Saya bisa salah tapi apa sudo evtest cetakan tampak seperti scancode set 1 dan sejak itu /dev/input/event* hasilnya serupa, setidaknya dengan sistem saya scancodes dan keycodes linux sebagian besar sama.

X11 keycode

Perintah xev mencetak kode kunci dan keyym dan saya mengamati keycode tidak berubah terlepas dari layout keyboard yang saya gunakan, layout qwerty dan dvorak menghasilkan keyym berbeda tetapi keycode yang sama.
Namun demikian, ini bukan keycode linux atau menyembunyikan id penggunaan atau salah satu dari set scancode, set1 atau set2 atau set3.

bagaimana keycode linux dihasilkan?

Menurut arch wiki (saya tidak bisa memposting tautan):
/etc/udev/hwdb.bin menerjemahkan scancode keycode.

Yang jelas dengan ini adalah:

  1. wiki mengatakan ada file non-default * .hwdb yang bisa dikompilasi ke hwdb.bin
  2. hwdb.bin dapat mendeteksi keyboard yang berbeda dan dapat menerjemahkan scancode keycode berbeda.

Untuk ubuntu, satu-satunya file hwdb yang bisa saya temukan adalah: /etc/udev/hwdb.d/61-keyboard-local.hwdb dan itu hampir kosong. Jadi, secara default ubuntu mempertahankan scancodes default dan menggunakannya sebagai kode yang saya percaya.

Bagaimana keycode X11 dihasilkan

Beberapa peretas memberi kami petunjuk di sini:https://www.charvolant.org/doug/xkb/html/index.html
Scancode ke kode aturan pemetaan keycode (yang mana yang digunakan adalah pertanyaan) berada di bawah: /usr/share/X11/xkb/keycodes

setxkbmap -print -verbose 10 cetakan

Trying to load rules file ./rules/evdev...
Trying to load rules file /usr/share/X11/xkb/rules/evdev...

jadi, file-file di atas harus mengendalikan perilaku pemuatan untuk Xkb (Linux banyak berubah, jadi seharusnya tidak mengharapkan hal yang sama di masa depan sekalipun).

Contoh:
setxkbmap -print -verbose 10

Setting verbose level to 10
locale is C
Trying to load rules file ./rules/evdev...
Trying to load rules file /usr/share/X11/xkb/rules/evdev...
Success.
Applied rules from evdev:
rules:      evdev
model:      pc105
layout:     us,us
variant:    dvp,
Trying to build keymap using the following components:
keycodes:   evdev+aliases(qwerty)
types:      complete
compat:     complete
symbols:    pc+us(dvp)+us:2+inet(evdev)
geometry:   pc(pc105)
xkb_keymap {
    xkb_keycodes  { include "evdev+aliases(qwerty)" };
    xkb_types     { include "complete"  };
    xkb_compat    { include "complete"  };
    xkb_symbols   { include "pc+us(dvp)+us:2+inet(evdev)"   };
    xkb_geometry  { include "pc(pc105)" };

Satu bagian dalam /usr/share/X11/xkb/rules/evdev yang kemungkinan mengendalikan perilaku pemuatan file keycode:

! model         =       keycodes
  pc98          =       evdev(pc98)
  applealu_jis  =       evdev+macintosh(jisevdev)
  olpc          =       evdev+olpc(olpc)
  olpcm         =       evdev+olpc(olpcm)
  *             =       evdev

! layout[1]     =       keycodes
  $azerty       =       +aliases(azerty)
  $qwertz       =       +aliases(qwertz)
  *             =       +aliases(qwerty)

Tebakanku

XServer melihat id vendor vendor dan id perangkat dan menerapkan aturan yang berbeda untuk menerjemahkan scancode keycode.

Bisakah saya mendapatkan scancode dari X11 keycode?

xkb/keycodes/evdev tampaknya digunakan sebagai aturan terjemahan untuk kebanyakan keyboard, menggunakannya mungkin melakukan trik.

Apakah bisa diandalkan?

Tidak
X11 tradisional protokol inti tidak menyediakan id vendor atau id perangkat dari keyboard yang menghasilkan peristiwa keyboard.

Solusi potensial?

XI2 - Ekstensi Input X 2.x
https://www.x.org/releases/X11R7.7/doc/inputproto/XI2proto.txt

A RawEvent provides the information provided by the driver to the
client. RawEvent provides both the raw data as supplied by the driver and
transformed data as used in the server.   

Sekarang saya sudah mencoba RawKeyPress

Saya tidak dapat mengekstrak id atau scancode yang tersembunyi, meskipun mungkin saya hanya mengabaikannya.
Abadikan peristiwa XI2 RawKeyPress dan interpretasikan dengan python


5
2017-08-19 16:54


asal


Jawaban: