web-dev-qa-db-ja.com

イベントデバイスからのキー入力のキャプチャとマッピング(Toggle TouchPadキーはマッピングされていません)

Ubuntu 13.10がインストールされたLenovo IdeaPad Yoga 13を持っています。デバイスのキーボードに「Toggle TouchPad」ボタン(F5)。キーボードの F* ボタンが逆になっています F5、押す必要があります FnF5、および F5 実際にはトグルキーです)。

このボタンは、実際には/dev/input/event3にあるキーボード(特定のデバイスのようなタッチパッドではなく)によって読み取られることがわかりました。 Sudo input-events 3を使用すると、ボタンがスキャンコード190を送信することがわかりました。

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

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

input-eventsを除いて、他のプログラム(xevなど)はそれを読み取ることができないようです。このボタンをマップして私のラップトップのタッチパッドを切り替える方法はありますか?もしそうなら、どうすればできますか?

10
Hosh Sadiq

結局のところ、カーネルはそれを拾い上げましたが、認識されないと不平を言い続けました。

この問題が発生している他の人、またはOSによって読み取られないキーをマップする場合は、以下をお読みください。

ターミナルを開いてdmesg | grep -A 1 -i setkeycodesを実行します。これにより、次のような複数のエントリが得られます。

[    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.

私たちが興味を持っているのは、「setkeycodes」の後の16進値です。この場合、これはe03eです。これらが複数ある場合は、tail -f /var/log/kern.logを実行できます。それが終わったら、探しているボタンをタップできます。これにより、上記と同じ行が表示されます。ここでも、16進数の値だけが必要です。これを書き留めてください。

次に、xmodmap -pke | lessを実行して、適切なマッピングを見つけます。私の場合、これをマップしてタッチパッドを切り替える必要がありました。つまり、次の行に興味がありました。

keycode 199 = XF86TouchpadToggle NoSymbol XF86TouchpadToggle

興味のあるものが見つからない場合は、@ Gillesの回答も読んでください。カスタムマッピングも定義できるため、次に進んでください(カーネルがそれを読んだ場合は、xorg.confに追加する必要はありません。 d)

ここで、次のコマンドを実行しました:Sudo setkeycodes [hexadecimal] [keycode]、つまり私の場合はsetkeycodes e03e 199になりました。

これで、次の行を使用して、それが機能したかどうか、および/または正しいマッピングがあるかどうかをテストできます。

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

このコマンドを実行するときは、新しく開いたウィンドウ(xev)に焦点を当て、コンソール出力を確認する必要があります。私の場合は次のように読みます:

207 NoSymbol

キーコード199をリクエストしたため、これは明らかに間違っていたため、XF86TouchpadToggleにマッピングされました。 xmodmap -pkeをもう一度確認したところ、keycode 207が実際にNoSymbolにマッピングされていることに気付き、オフセットの差が8であることに気付いたので、setkeycodesを試しましたコマンドを再度実行しますが、キーはkeycode 191にマップされます。

Sudo setkeycodes e03e 191

これは完全に機能しました。

編集-起動時に作業するために私が提供したソリューションはしていません。明日これを理解し、この答えを更新します。今のところ、起動時に手動で実行できると思います。

7
Hosh Sadiq

外観から見ると、デバイスはキーボード(「コア」キーボードとは別のソフトウェアとして認識されます)ですが、Xサーバーはそれをリッスンしていません。

/etc/X11/xorg.conf.d の下に入力セクションを追加してみてください。つまり、ディレクトリ/etc/X11/xorg.conf.dが存在しない場合は作成し、そのディレクトリにextra-keyboard-buttonsを含むファイルを作成します。

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

MatchProduct行についてはわかりません。機能しない場合は、 MatchXXXディレクティブ を試してみてください。

このファイルが正しく設定されると、Xサーバーを起動すると、このキーボードからのイベントが処理され、xevなどにイベントが表示されます。キーコードに注意してください(この場合、X11キーコードがハードウェアキーコードと同じかどうかはわかりません)。それにキーシムを関連付けます。あなたのホームディレクトリにある.Xmodmapと呼ばれるファイルを介してそれを行うことができます

keycode 190 = XF86_Launch5

これらのキーを使用して キーボードショートカットを定義 できるようになりました。

タッチパッドを切り替えるには、コマンド xinput を使用します。 xinput listを実行して、使用可能な入力デバイスを確認し、タッチパッドの名前をメモします(以下ではTouchpadと呼びます)。 xinput list-props Touchpadを実行して、そのプロパティを一覧表示します。それらの1つは「デバイス有効」と呼ばれ、その隣に番号が付いています(例:135)。次のスクリプトは、タッチパッドを切り替えます。

#!/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"

これをファイル~/bin/toggle-touchpadに保存し、実行可能にします(chmod +x ~/bin/toggle-touchpad)。これをキーにバインドするには、 xbindkeys をインストールし、~/.xbindkeysrcに次の行を挿入してスクリプトを実行するように設定します。

"toggle-touchpad"
  XF86_Launch5