Mengambil input tombol dari perangkat acara dan memetakannya (mengganti tombol Panel Sentuh tidak dipetakan)

10

Saya memiliki Lenovo IdeaPad Yoga 13 dengan Ubuntu 13.10 Terinstal. Perangkat ini memiliki tombol "Toggle TouchPad" pada keyboard ( F5). F*Tombol-tombol keyboard dibalik (jadi untuk mendapatkan F5, saya perlu menekan Fn+ F5, dan F5sebenarnya adalah tombol sakelar).

Saya telah menemukan bahwa tombol tersebut sebenarnya dibaca oleh keyboard (daripada TouchPad seperti perangkat tertentu), yang di /dev/input/event3. Jadi menggunakan sudo input-events 3saya bisa mengetahui bahwa tombol mengirimkan kode pindaian 190:

Output dari sudo lsinput:

/dev/input/event3
   bustype : BUS_I8042
   vendor  : 0x1
   product : 0x1
   version : 43907
   name    : "AT Translated Set 2 keyboard"
   phys    : "isa0060/serio0/input0"
   bits ev : EV_SYN EV_KEY EV_MSC EV_LED EV_REP

Output dari sudo input-events 3:

23:13:03.849392: EV_MSC MSC_SCAN 190
23:13:03.849392: EV_SYN code=0 value=0
23:13:03.855413: EV_MSC MSC_SCAN 190
23:13:03.855413: EV_SYN code=0 value=0

Tidak ada program lain (seperti xev) yang dapat membacanya kecuali untuk input-events. Apakah ada cara untuk memetakan tombol ini untuk membuatnya beralih TouchPad di laptop saya? Jika demikian, bagaimana saya bisa melakukannya?

Hosh Sadiq
sumber

Jawaban:

7

Ternyata kernel memang mengambilnya, tetapi terus mengeluh bahwa itu tidak dikenali.

Untuk siapa pun yang memiliki masalah ini, atau ingin memetakan kunci yang tidak dibaca oleh OS, baca terus.

Buka terminal dan jalankan dmesg | grep -A 1 -i setkeycodes. Ini akan memberi Anda beberapa entri seperti ini:

[    9.307463] atkbd serio0: Unknown key pressed (translated set 2, code 0xbe on isa0060/serio0).
[    9.307476] atkbd serio0: Use 'setkeycodes e03e <keycode>' to make it known.

Yang kami minati adalah nilai heksadesimal setelah "setkeycodes", dalam hal ini adalah e03e. Jika Anda memiliki banyak dari ini, Anda dapat menjalankan tail -f /var/log/kern.log. Setelah melakukannya, Anda dapat mengetuk tombol yang Anda cari, dan ini akan memberi Anda garis yang sama seperti di atas, dan sekali lagi, kami hanya perlu nilai heksadesimal. Catat ini.

Sekarang jalankan xmodmap -pke | lessdan temukan pemetaan yang sesuai. Dalam kasus saya, saya perlu memetakan ini untuk mengganti panel sentuh saya, yang berarti saya tertarik pada baris berikut:

keycode 199 = XF86TouchpadToggle NoSymbol XF86TouchpadToggle

Jika Anda tidak dapat menemukan apa pun yang Anda minati, baca juga jawaban @Gilles, karena Anda juga dapat menentukan pemetaan khusus, lalu baca terus (jika kernel membacanya, Anda tidak perlu menambahkannya ke xorg.conf. d)

Sekarang saya menjalankan perintah berikut: sudo setkeycodes [hexadecimal] [keycode], sehingga dalam kasus saya yang menjadi: setkeycodes e03e 199.

Sekarang Anda dapat menggunakan baris berikut untuk menguji apakah itu berhasil dan / atau Anda memiliki pemetaan yang benar:

xev | grep -A2 --line-buffered '^KeyRelease' | sed -n '/keycode /s/^.*keycode \([0-9]*\).* (.*, \(.*\)).*$/\1 \2/p'

Ketika Anda menjalankan perintah ini, Anda harus fokus pada jendela yang baru dibuka ( xev) dan memeriksa output konsol. Dalam kasus saya ini berbunyi sebagai berikut:

207 NoSymbol

Ini jelas salah, seperti yang saya minta kode kunci 199, jadi dipetakan ke XF86TouchpadToggle. Saya memeriksa xmodmap -pkelagi, dan memperhatikan bahwa keycode 207sebenarnya dipetakan ke NoSymbol, dan saya perhatikan bahwa ada perbedaan offset 8, jadi saya mencoba setkeycodesperintah itu lagi, tetapi kuncinya dipetakan ke keycode 191.

sudo setkeycodes e03e 191

Ini bekerja dengan sempurna.

EDIT - solusi yang saya berikan harus bekerja pada start up tidak. Saya akan memikirkan hal ini besok dan memperbarui jawaban ini. Untuk saat ini saya kira Anda dapat menjalankan ini saat memulai secara manual.

Hosh Sadiq
sumber
1
bagaimana membuatnya permanen dengan cara yang baik? (yaitu setelah reset / boot-up)
vak
4

Dari tampilannya, perangkat ini adalah keyboard (diakui dalam perangkat lunak sebagai terpisah dari keyboard "inti") tetapi server X tidak mendengarkannya.

Coba tambahkan bagian Input di bawah/etc/X11/xorg.conf.d . Artinya, buat direktori /etc/X11/xorg.conf.djika belum ada, dan buat file extra-keyboard-buttonsdi direktori yang berisi

Section "InputClass"
    Identifier "extra-keyboard-buttons"
    Driver "kbd"
    MatchProduct "AT Translated Set 2 keyboard"
EndSection

Saya tidak yakin tentang MatchProductgaris itu; jika tidak berhasil, cobalah mengutak-atik MatchXXXarahan .

Setelah file ini diatur dengan benar, ketika Anda memulai X server, itu harus memproses acara dari keyboard ini, dan Anda akan melihat acara di xevdan di tempat lain. Catat kode kunci (saya tidak yakin apakah kode kunci X11 akan sama dengan kode kunci perangkat keras dalam kasus ini) dan kaitkan dengan kunci tombol untuk kode kunci itu. Anda dapat melakukannya melalui file yang disebut .Xmodmapdi direktori home Anda yang berisi

keycode 190 = XF86_Launch5

Anda sekarang dapat menentukan pintasan keyboard menggunakan tombol-tombol ini.

Untuk mengganti panel sentuh, gunakan perintah xinput. Jalankan xinput listuntuk melihat perangkat input apa yang tersedia dan catat nama touchpad Anda (saya akan menyebutnya di Touchpadbawah). Jalankan xinput list-props Touchpaduntuk mendaftar propertinya; salah satunya harus disebut "Perangkat Diaktifkan" dengan nomor di sebelahnya (mis. 135). Script berikut akan mengaktifkan panel sentuh:

#!/bin/sh
device_name='Touchpad'
property=135
flipped_state=$(xinput list-props "$device_name" |
                awk "/\\($property\\)/ {print 1 - \$NF}")
xinput set-prop "$device_name" "$property" "$flipped_state"

Simpan ini dalam file ~/bin/toggle-touchpaddan buat itu bisa dieksekusi ( chmod +x ~/bin/toggle-touchpad). Untuk mengikatnya pada kunci, instal xbindkeys dan konfigurasikan untuk menjalankan skrip Anda dengan memasukkan baris-baris berikut ~/.xbindkeysrc:

"toggle-touchpad"
  XF86_Launch5
Gilles 'SANGAT berhenti menjadi jahat'
sumber
Terima kasih atas jawabannya. Sayangnya ini tidak berhasil. Saya membuatnya bekerja, jadi merasa bebas untuk melihat jawaban saya sendiri! :)
Hosh Sadiq