私は多くの場合、複数のキーボードが取り付けられたペアリングステーションで作業します。setxkbmap
withを使用して-device <ID>
特定のキーボードのレイアウトを設定できます。身分証明書:xinput
)、しかし一般的に私が使用しているキーボードでは明確ではありません。 2つのキーボードの間を行き来しないでください。したがって、このためのクイックツールを作成したかったのですsetxkbmap
。一般的なユースケースは次のとおりです。
$ setxkbmap -device "$(get-keyboard-id)" -layout gb
Press Enter to detect keyboard ID
Linuxのどのインタフェースがこの情報を提供しますか?理想的にはXなしで動作する必要がありますが、これは必須ではありません(Xなしでそれをサポートするツールはあまりありません)。
現在までの調査結果:
- Linux〜しなければならない同時に、複数のキーボードのさまざまなレイアウトをサポートするためにどのキーボードを入力しているかを確認します。
xinput
→list.c→→list_xi2
利用XIQueryDevice
可能なデバイスIDを提供しますsetxkbmap
。showkey
そしてxev
キーボードIDは印刷されません。xinput list-props $ID
キーボードイベントが送信される場所を表示します。。しかし他の回答のコードデバイスがキーボードを認識するために何も印刷しないようです。最も可能な解決策の1つは、各キーボードIDに対して実行し、
xinput --test <ID> &
どのキーボードIDが最初に何かを返すことを確認することです。問題は、どの「キーボード」が何であるかを把握することです。実際に鍵:$ xinput | grep keyboard ⎣ 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)] ↳ WebCam SC-13HDL10931N id=10 [slave keyboard (3)] ↳ AT Translated Set 2 keyboard id=11 [slave keyboard (3)]
答え1
デバイスの無効化
どのキーボードがどのキーボードであるかを識別するアイデアは次のとおりです。次のコマンドを使用できます。x入力デバイスを有効または無効にします。
はい
$ xinput list
⎡ Virtual core pointer id=2 [master pointer (3)]
⎜ ↳ Virtual core XTEST pointer id=4 [slave pointer (2)]
⎜ ↳ SynPS/2 Synaptics TouchPad id=12 [slave pointer (2)]
⎜ ↳ TPPS/2 IBM TrackPoint id=13 [slave pointer (2)]
⎜ ↳ Logitech USB Receiver id=9 [slave pointer (2)]
⎜ ↳ Logitech USB Receiver id=10 [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)]
↳ Sleep Button id=8 [slave keyboard (3)]
↳ AT Translated Set 2 keyboard id=11 [slave keyboard (3)]
↳ ThinkPad Extra Buttons id=14 [slave keyboard (3)]
上記の出力は私のThinkpadノートブックのさまざまなデバイスを示しています。キーボードは1つだけ接続されています。このキーボードは次のとおりです。
↳ AT Translated Set 2 keyboard id=11 [slave keyboard (3)]
次に、このデバイスで利用可能なプロパティを見てください。
$ xinput list-props "AT Translated Set 2 keyboard"
Device 'AT Translated Set 2 keyboard':
Device Enabled (124): 1
Coordinate Transformation Matrix (126): 1.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.
上記で有効になっていることがわかりますので、無効にしてみましょう。
$ xinput set-prop "AT Translated Set 2 keyboard" "Device Enabled" 0
有効にするには:
$ xinput set-prop "AT Translated Set 2 keyboard" "Device Enabled" 1
このアイデア?
このコマンドを使用すると、キーボードのいずれかを有効または無効にして、どのキーボードを使用しているかを確認できます。
引用する
答え2
追加発掘地が判明別のソリューション汎用 Bash と一般ユーザーアカウントを使用します。スクリプト:
#!/usr/bin/env bash
set -o errexit -o nounset -o noclobber -o pipefail
# Remove leftover files and processes on exit
trap 'rm --recursive -- "$dir"; kill -- -$$' EXIT
dir="$(mktemp --directory)"
cd "$dir"
# Log key presses to file
xinput --list --id-only | while read id
do
# Only check devices linked to an event source
if xinput --list-props "$id" | grep --quiet --extended-regexp '^\s+Device Node.*/dev/input/event'
then
xinput test "$id" > "$id" &
fi
done
# Check for key presses
while sleep 0.1
do
for file in *
do
if [[ -s "$file" ]]
then
echo "$file"
exit
fi
done
done
答え3
この質問はXツールを参照していますが、「理想的にはXなしで動作する必要がある」ソリューションが必要なため、少し矛盾して聞こえます。
4番目の発見について:
xinput
手紙を差し上げます
$ xinput list-props 11
Device 'AT Translated Set 2 keyboard':
Device Enabled (145): 1
Coordinate Transformation Matrix (147): 1.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 1.000000
Device Product ID (266): 1, 1
Device Node (267): "/dev/input/event0"
少なくとも次のバージョンがあります。
$ xinput --version
xinput version 1.6.1
XI version on server: 2.3
ステップ1:Cでキーボードイベントデバイスを検出する---
#include <stdio.h>
//#include <unistd.h>
#include <fcntl.h>
#include <linux/input.h>
// typical use : sudo ./a.out /dev/input/event*
int main (int argc, char *argv[])
{
struct input_event ev[64];
int fd[argc],rd,idev,value, size = sizeof (struct input_event);
char name[256] = "Unknown";
if(argc==1) return -1;
int ndev=1;
while(ndev<argc && (fd[ndev] = open (argv[ndev], O_RDONLY|O_NONBLOCK)) != -1){
ndev++;
}
fprintf (stderr,"Found %i devices.\n", ndev);
if(ndev==1) return -1;
while (1){
for(idev=1; idev<argc; idev++){
if( (rd=read (fd[idev], ev, size * 64)) >= size){
value = ev[0].value;
if (value != ' ' && ev[1].value == 1 && ev[1].type == 1){
ioctl (fd[idev], EVIOCGNAME (sizeof (name)), name);
printf ("%s\n", name);
return idev;
}
}
}
// sleep(1);
}
return -1;
}
非常にありがとうこのページ。明確にするために、借りたコードからほとんどの安全チェックを削除しました。実際のコードでは必要な場合があります。
キーを押すとエコーが発生するため、実際にユーザーに代わりにセカンダリキー(Shift、Control...)を押すように要求する必要があります。どのキー。
ステップ2:xinputを使用してデバイス名からX IDを取得する
上記のCソースコードをコンパイルし、次のように使用します。
xinput list --id-only "keyboard:$(sudo ./a.out /dev/input/event*)"