web-dev-qa-db-ja.com

i3:別の入力デバイスに表示されるメディアキーを使用するにはどうすればよいですか?

UbuntuのGNOMEデスクトップと一緒にi3ウィンドウマネージャーをインストールしました-GNOME16.04。ロジクールG610キーボードでメディアキーを機能させるのに問題があります。

~/.config/i3/configファイルに次のものがあります。

bindsym XF86AudioRaiseVolume exec --no-startup-id pactl set-sink-volume @DEFAULT_SINK@ +5%
bindsym XF86AudioLowerVolume exec --no-startup-id pactl set-sink-volume @DEFAULT_SINK@ -5%
bindsym XF86AudioMute exec --no-startup-id pactl set-sink-mute 0 toggle

これらのコマンドがターミナルで機能することを確認しました。私が見ている問題は、XF86AudioRaiseVolumeなどのキー押下イベントが登録されていないことです。

xev -event keyboardを使用してキーコードを表示しようとすると、マルチメディアキーを押すと、次のようになります。

MappingNotify event, serial 30, synthetic NO, window 0x0,
    request MappingKeyboard, first_keycode 8, count 248

KeymapNotify event, serial 31, synthetic NO, window 0x0,
    keys:  1   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   
           0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0

他のキーのようにキーコードは報告されません。ただし、Sudo showkey -kを使用すると、期待値は次のようになります。

keycode 113 press
keycode 113 release
keycode 115 press
keycode 115 release
keycode 114 press
keycode 114 release

xinputを実行すると、次のように表示されます

⎡ Virtual core pointer                      id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ Logitech MX Master                        id=12   [slave  pointer  (2)]
⎜   ↳ AlpsPS/2 ALPS DualPoint TouchPad          id=15   [slave  pointer  (2)]
⎜   ↳ AlpsPS/2 ALPS DualPoint Stick             id=16   [slave  pointer  (2)]
⎣ Virtual core keyboard                     id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard               id=5    [slave  keyboard (3)]
    ↳ Power Button                              id=6    [slave  keyboard (3)]
    ↳ Video Bus                                 id=7    [slave  keyboard (3)]
    ↳ Power Button                              id=8    [slave  keyboard (3)]
    ↳ Sleep Button                              id=9    [slave  keyboard (3)]
    ↳ Logitech Gaming Keyboard G610             id=10   [slave  keyboard (3)]
    ↳ Logitech Gaming Keyboard G610             id=11   [slave  keyboard (3)]
    ↳ Dell WMI hotkeys                          id=13   [slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard              id=14   [slave  keyboard (3)]
    ↳ Dell Wireless hotkeys                     id=17   [slave  keyboard (3)]

logitechキーボードは2つのデバイスとして表示されます。 xinput list-props 10xinput list-props 11を実行すると、最初のリストは/dev/input/event8にマップされ、2番目のリストは/dev/input/event9にマップされます。

xinput test 10を実行すると、キーボードの最初のリストがすべての通常のキーボードキーに応答しますが、メディアキーには応答しませんが、xinput test 11はメディアキーにのみ応答します。

key press   121 
key release 121 
key press   123 
key release 123 
key press   122 
key release 122

(これらはshowkey出力から8ずれていますが、明らかにそれは予想されます。また、これらの値はxmodmap -pkeによるマッピング出力、つまりkeycode 121 = XF86AudioMute NoSymbol XF86AudioMuteと一致します)。 Sudo evtest /dev/input/event8Sudo evtest /dev/input/event9を実行すると同様の結果が得られます。

したがって、キー押下と処理の間のプロセスについての私の理解はかなりあいまいですが、通常のキーとメディアキーが異なる入力デバイス上にあるという事実が、メディアキー押下イベントがXセッションに到達するのを妨げているようです(証明されているように) xev?)に表示されないため、i3に到達しませんか?これはGNOMEデスクトップでは正常に機能しますが、i3で機能させるために構成する必要があるものはありますか?ここから先に進む方法がわからないので、助けていただければ幸いです。

[〜#〜]編集[〜#〜]

もともと~/.config/i3/configファイルのコマンドを引用符で囲んでいましたが、それは機能しません。私はそれを正しくするために上で編集しました、しかしそれは問題の根本ではありませんでした。

1
dpkoch

前の回答 で提供された情報に基づいて、psを実行し、起動後にGNOMEデスクトップにログインせず、i3にのみログインしたにもかかわらず、gnome-sessionが実行されていることに気付きました。私の疑いは、gnomeセッションがイベントを盗んでいたということでしたが、gnome設定でそれらのキーボードショートカットのマッピングを解除しても何も変わらなかったようです。

私の解決策は、指示に従ってttyセッションを直接起動することでした ここgnome-sessionが開始しないようにします。単一行~/.xinitrcを含むファイルexec i3を作成し、起動後にttyターミナルにログインし、startxを実行してi3を起動します。この方法では、gnomeが実行されておらず、メディアキーが機能するようになりました。

1
dpkoch

部分的な答え:

キーボードが2つのデバイスとして表示されることは問題ではありません。両方のデバイスが仮想コアキーボードに割り当てられているため、両方のデバイスが適切なキーコアイベントを生成する必要があります。

MappingNotifyイベントは、一部のアプリケーションがメディアキーに反応していることを示している可能性があります。特に、表示しなかったFocusOutおよびFocusInイベントが発生した場合は、他のアプリケーションが確実にそれらに作用しています。

これは、構成済みのキーを持つi3ウィンドウマネージャーである場合もあれば、別のものである場合もあります。したがって、最初にテストすることは、i3バインディングを削除またはコメントアウトし、再度テストして、Mapping/Focusイベントがまだ発生するかどうかを確認することです。

はいの場合、次のステップは、どのアプリケーションがそれを盗んでいるかを把握することです。 psxlsclientsなどを使用して絞り込みます。 1つの方法は、アプリケーションが盗まれなくなるまで、アプリケーションを強制終了/無効にすることです。

0
dirkt