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


10

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

ボタンは実際には(特定のデバイスのようなタッチパッドではなく)キーボードによって読み取られることがわかりました/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

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

回答:


7

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

この問題を抱えている他の人、または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

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

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


1
それを良い方法で永続化する方法は?(すなわち、リセット/起動後)
vak

4

外観から見ると、デバイスはキーボード(「コア」キーボードとは別のソフトウェアとして認識されています)ですが、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

答えてくれてありがとう。残念ながらこれはうまくいきませんでした。私はそれをうまく動かしたので、私自身の答えを見てください!:)
Hosh Sadiq
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.