Linuxで特定のキーボードのキーのみを再マップする方法


17

最近、右AltキーとWindowsキーが交換されたUnicompキーボードを購入しました。キーボードは、lsusbで次のように識別します。

Bus 003 Device 002: ID 17f6:0822 Unicomp, Inc 

カーネル(xmodmapベースではない)が右AltキーとWindowsキーを交換して、生のキーボード入力を取得しても、すべてのアプリケーションがそれらをスワップされた場所で見るようにする方法はありますか?この1つのキーボードだけにそれを持たせる方法はありますか?


キーボードのシリアル番号を照合し、再マッピングを行うスクリプトを呼び出すことにより、udevでこれを行うことができると思います。デバイスを元に戻すには、デタッチ時に同様のスクリプトを呼び出す必要があります。
ジャム

1
@jamこれは、接続されているすべてのキーボードを再マッピングしますか?Linuxの柔軟性があまりにも低く、すべての接続された(USB)キーボードに対して1つのマッピングテーブルしか管理できないとは想像できません。
FUZxxl

@jamさらに、実際のスワッピングを行う方法を説明できれば、本当に助けてくれるでしょう。私はこれについて有用なものを見つけることができませんでした。xmodmapのもののみ(私は使いたくありません)。
FUZxxl

xmodmapを使用したくない場合、あなたが尋ねていることは、私の知識があなたを残念にさせるにはあまりにも具体的すぎるようです。私が提案した方法は、xmodmapを使用して、特定のキーボードが接続されている間、すべてのデバイスのキーのキーコードを交換し、それを元に戻します。複数のキーボードを同時に使用する予定ですか?
ジャム14年

@jam Xmodmapを使用した場合、Xサーバーはクライアントに未翻訳のキーコードも送信するため、Xプログラムは依然として間違ったキーコードを認識します。これは、たとえばビデオゲームの場合に重要です。カーネルには、スキャンコードを読み取るアプリケーションで私の人生をより複雑にしない解決策があるはずです。
FUZxxl

回答:


27

はい、XKBを使用して可能です。xmodmapとは異なり、XKBは個々のデバイスのキーを再マップできます。

注:xkbcomp> 1.2.0があることを確認してください

最初にデバイスをリストします:

xinput list

次のようなものが得られます。

⎡ Virtual core pointer                      id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ Wacom Bamboo Pen Pen stylus               id=11   [slave  pointer  (2)]
⎜   ↳ Wacom Bamboo Pen Finger touch             id=12   [slave  pointer  (2)]
⎜   ↳ Logitech USB-PS/2 Optical Mouse           id=13   [slave  pointer  (2)]
⎜   ↳ Wacom Bamboo Pen Pen eraser               id=14   [slave  pointer  (2)]
⎜   ↳ Wacom Bamboo Pen Finger pad               id=15   [slave  pointer  (2)]
⎜   ↳ GASIA USB KB V11                          id=17   [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)]
    ↳ Power Button                              id=7    [slave  keyboard (3)]
    ↳ G19 Gaming Keyboard                       id=8    [slave  keyboard (3)]
    ↳ G19 Gaming Keyboard                       id=9    [slave  keyboard (3)]
    ↳ Logitech G19 Gaming Keyboard              id=10   [slave  keyboard (3)]
    ↳ GASIA USB KB V11                          id=16   [slave  keyboard (3)]

デバイスの文字列を特定し、次のシェルスクリプトを編集して、sed行をデバイス名に合ったものに変更します。次に、再マップが必要なキーを変更します。

例:xev再マップするキーをロードして押します。キーコード84を見つけたとします。https: //gist.github.com/zoqaeski/3880640のルックアップ84 。そこにキー名があり<KP5>ます。次に、置き換えたいキーを検索し(同じリンクで、さらに下にあります)、括弧内にあるものをコピーします。必要なすべてのキーに対してこのプロセスを繰り返します。

remote_id=$(
    xinput list |
    sed -n 's/.*GASIA.*id=\([0-9]*\).*keyboard.*/\1/p'
)
[ "$remote_id" ] || exit

# remap the following keys, only for my custom vintage atari joystick connected
# through an old USB keyboard:
#
# keypad 5 -> keypad 6
# . -> keypad 2
# [ -> keypad 8
# left shift -> left control

mkdir -p /tmp/xkb/symbols
# This is a name for the file, it could be anything you
# want. For us, we'll name it "custom". This is important
# later.
#
# The KP_* come from /usr/include/X11/keysymdef.h
# Also note the name, "remote" is there in the stanza
# definition.
cat >/tmp/xkb/symbols/custom <<\EOF

xkb_symbols "remote" {
    key <KP5>  { [ KP_Right, KP_6, U2192, U21D2 ]       };
    key <I129> { [ KP_Down, KP_2, U2193, U21D3 ]       };
    key <AD12> { [ KP_Up, KP_8, U2191, U21D1 ]  };
    key <LFSH> { [ Control_L ]        };
};
EOF

# (1) We list our current definition
# (2) Modify it to have a keyboard mapping using the name
#     we used above, in this case it's the "remote" definition
#     described in the file named "custom" which we specify in
#     this world as "custom(remote)".
# (3) Now we take that as input back into our definition of the
#     keyboard. This includes the file we just made, read in last,
#     so as to override any prior definitions.  Importantly we 
#     need to include the directory of the place we placed the file
#     to be considered when reading things in.
#
# Also notice that we aren't including exactly the 
# directory we specified above. In this case, it will be looking
# for a directory structure similar to /usr/share/X11/xkb
# 
# What we provided was a "symbols" file. That's why above we put
# the file into a "symbols" directory, which is not being included
# below.
setxkbmap -device $remote_id -print \
 | sed 's/\(xkb_symbols.*\)"/\1+custom(remote)"/' \
 | xkbcomp -I/tmp/xkb -i $remote_id -synch - $DISPLAY 2>/dev/null

次に、ソースを作成します(.xinitrcに追加できます)。全部できた!ここで、キーを押すと、指定したデバイスに対してのみ、目的の出力が生成されます。

編集:最近、何らかの理由で、新しい構成がすぐに適用されないことに気付きました。最初に他のキーボードのキーを押してから、変更したキーボードで構成されたキーをテストする必要があります。これが起こる理由はわかりませんが、おそらく何らかのキャッシュです。


このキーボードを使用するコンピューターに戻ったら、月曜日にこれを試してみましょう。
-FUZxxl

1
a) sed -n 's/.*G19 Gaming Keyboard.*id=\([0-9]*\).*keyboard.*/\1/p' c)はい、必ず最初に$remote_idID番号に置き換えてテストする必要があります。そこには2つの参照が$remote_idありますが、両方を変更しましたか?
ワトコム

1
ああ、ハードコーディングされたをテストするときは、まだ$remote_idコメントアウトし[ "$remote_id" ] || exitていない場合はコメントアウトしてください。
ワトコム

1
@ stats-hb $9は機能しません9
ワトコム

1
私にとってこの作品はlampjs.wordpress.com/2015/06/26/...
USIL

6

Googleからここに来て、質問者が当初望んでいたことともっと一致した回答を望んでいる他の人のevdevために、すべてのアプリケーションに変更が適用されるように、レベルでイベントを再マッピングする2つの方法を知っています:

  1. udevは、スキャンコードとキーコード間のマッピングを制御するハードウェアデータベースエントリを変更するためのAPIを提供します。このArchiWikiページ明示的に、命令が含まれ、それはX11とコンソール入力の両方のために働くだろうと述べています。

    要点は/etc/udev/hwdb.d/、デバイス一致パターンとスキャンコードからキーコードへの再マッピング定義で構成されるカスタムエントリを作成し、再起動せずにsystemd-hwdb updateデータベースを再構築してudevadm trigger適用することです。

  2. WaylandはX11のキーボードサブシステムを使用せず、GNOME ShellやWestonなどの主要なWaylandコンポジターはlibinputの関連する側面を設定するためのUIを実装していないため、誰かがLogitechのG15Daemonユーザースペースドライバーと同様に問題を解決するevdevremapkeysという名前のデーモンを作成しましたG15ゲーミングキーボード。

    (再マップする予定のイベントを飲み込むため、デバイスでリッスンしている他のユーザーはそれらを見ることができず、uinputユーザースペースからカーネルレベルの入力デバイスを作成するためのAPIを介して修正されたイベントを発行します。)


私はDuckDuckGoからここに来ていますが、とにかく答えてくれてありがとう(:
sm4rk0

0

@Watcomオプションで成功しなかった人のために、次のような新しいマッピングファイルを置くだけです。

xkb_symbols "remote" {
    key <KP5>  { [ KP_Right, KP_6, U2192, U21D2 ]       };
    key <I129> { [ KP_Down, KP_2, U2193, U21D3 ]       };
    key <AD12> { [ KP_Up, KP_8, U2191, U21D1 ]  };
    key <LFSH> { [ Control_L ]        };
};

/ usr / share / X11 / xkb / symbols /にルート(ubuntu、distribによって異なる場合があります)として、ファイル「custom」を呼び出します。現在のレイアウト文字列を要求してsetxkbmap -device <device id> -print | grep xkb_symbols追加+customします。再マッピングされたキーで新しいレイアウトを設定し、レイアウト文字列を変更します。

setxkbmap -device <device id> -layout "us+ru:2+us:3+inet(evdev)+capslock(grouplock)+custom"

効果は永続的ではなく、残念ながら他のキーボードが接続されるとリセットされますが、まだ修正方法がわかりませんでした。.bashrcただし、上記のコマンドを追加して、必要に応じて再起動時にキーを交換できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.