Linuxの2番目のキーボードでマクロとショートカットを実行できますか?

Linuxの2番目のキーボードでマクロとショートカットを実行できますか?

通常のキーボードの横にマクロとショートカットを実行するために使用する小さな数字パッドがあります。このキーにマクロとショートカットを添付できます(たとえば、テンキー1はアクティブウィンドウを最小化します。)が、私のデフォルトのキーボードの数字キーパッドもショートカットを有効にします。

セカンダリキーボードを完全に独立して実行し、ショートカットキーを接続する方法が必要です。

これが私が得た結果ですxinput

⎡ Virtual core pointer                      id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ LVT Recon gaming mouse                    id=10   [slave  pointer  (2)]
⎜   ↳ LVT Recon gaming mouse                    id=11   [slave  pointer  (2)]
⎜   ↳ Corsair Corsair K30A Gaming Keyboard      id=13   [slave  pointer  (2)]
⎜   ↳ SIGMACHIP USB Keyboard                    id=18   [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)]
    ↳ Corsair Corsair K30A Gaming Keyboard      id=12   [slave  keyboard (3)]
    ↳ Corsair Corsair K30A Gaming Keyboard      id=14   [slave  keyboard (3)]
    ↳ LVT Recon gaming mouse                    id=15   [slave  keyboard (3)]
    ↳ Corsair Corsair K30A Gaming Keyboard      id=16   [slave  keyboard (3)]
    ↳ SIGMACHIP USB Keyboard                    id=17   [slave  keyboard (3)]
    ↳ SIGMACHIP USB Keyboard                    id=19   [slave  keyboard (3)]

答え1

しかし、私の他の答えおそらくほとんどのLinuxで実行されます。古いものですが、SystemDとudevは実際に作業を簡単にします。

  • lsusb追加のキーボードのベンダーと製品コードを見つけるために使用されます。 (私の場合はSupply 145F、Product 0177です。必ず大文字で入力してください。)

  • /etc/udev/hwdb.d/90-extra-keyboard.hwdb次のような内容でファイルを作成します。

evdev:input:b0003v145Fp0177*
 KEYBOARD_KEY_7005b=stopcd

最初の行はデバイスを識別します。 v次の4文字はベンダー・コードであり、pの後には前のステップの製品コードが続きます。各行はスキャンコードをシンボル名にマップします。スキャンコードを取得するにはevtest

Event: time 1553711252.888538, -------------- SYN_REPORT ------------
Event: time 1553711257.656558, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70059
Event: time 1553711257.656558, type 1 (EV_KEY), code 79 (KEY_KP1), value 1

シンボル名の目的を理解するには、#define KEY_…次の行のリストを見てください/usr/include/linux/input-event-codes.h

#define KEY_PLAYPAUSE           164
#define KEY_PREVIOUSSONG        165
#define KEY_STOPCD              166
#define KEY_RECORD              167
  • 以下を実行して、内部データベースを再構築してロードします。systemd-hwdb update; udevadm trigger

  • evtest新しい設定をやり直すか、設定からショートカットを割り当てて、新しい設定が機能していることを確認してください。

アプリケーションがこれを試みるときにデスクトップ環境がすでにショートカットを使用している場合、アプリケーションはキーを押しても認識しないことに注意してください。

答え2

原則としてそうです。私が最後にいつ2012年にこんなことをした行く方法は、2番目のキーボードがkeypressなどをXF86VolumeUp送信するときに実際に何を意味するのかをLinuxに伝えることです。Num 1幸いなことに、標準キーボードには存在しないこの方法で使用できるキーコードがたくさんあります。

単一のキーに対してこれを実行しましょう。

  • 追加のキーボードでキーを見つけるために使用されるxev | grep -i keyキーコード。たとえば、keypap 9ここではキーコード81を使用します。 (注:私の追加のキーボードには「00」とマークされたキーがありますが、「0」を2回送信するので、どのように処理するのかわかりません。)
      KeyPress event, serial 38, synthetic NO, window 0x4400001,
        state 0x10, keycode 81 (keysym 0xffb9, KP_9), same_screen YES,
      KeyRelease event, serial 39, synthetic NO, window 0x4400001,
        state 0x10, keycode 81 (keysym 0xffb9, KP_9), same_screen YES,
        request MappingKeyboard, first_keycode 8, count 248
  • setxkbmap -query(メイン)キーボードの規則を確認してください。このレイアウトでは、余分なキーボードを12個のメディアキーに変更しようとします。私にとってはそうです。
rules:      evdev
model:      pc105
layout:     de
variant:    nodeadkeys
  • で十分な項目が見つかりました/usr/share/X11/xkb/symbols/inet。右側にはShiftキー修飾子などを使用してアプリケーションに表示される内容があり、左側にはスキャンコードがあります。私のキーボードには「計算機」キーがないので、これを選択します。
key <I148>   {      [ XF86Calculator        ]       };
  • /usr/share/X11/xkb/keycodes/スキャンコードをキーコードにマッピングするファイルを作成します(手順1)。はい、逆さまのようです。私のファイルはtrustkeypadと呼ばれ、次のようになります。
default xkb_keycodes "trustkeypad" {
    minimum= 8;
    maximum= 255;

    // keypad 9
    <I148> = 81;
};
  • このファイルをコンパイルxkbcomp -xkb trustkeypad

  • 試してみてくださいsetxkbmap -v -v -device 17 -keycodes (filename)。 (17はあなたのIDですxinput。)私の結果は次のとおりです。

Warning! Multiple definitions of keycodes
         Using command line, ignoring rules file
Applied rules from evdev:
rules:      evdev
model:      pc105
layout:     de
variant:    nodeadkeys
Trying to build keymap using the following components:
keycodes:   trustkeypad
types:      complete
compat:     complete
symbols:    pc+de(nodeadkeys)+inet(evdev)
geometry:   pc(pc105)

特にキーコード行がよさそうです。今すぐ実行すると、xev新しいシンボルが生成されることがわかります。ああ、今私は半分の勝利を収めています。

KeyPress event, serial 39, synthetic NO, window 0x4600001,
    root 0x168, subw 0x0, time 24043275, (1666,897), root:(1670,950),
    state 0x10, keycode 81 (keysym 0x1008ff1d, XF86Calculator), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyRelease event, serial 39, synthetic NO, window 0x4600001,
    root 0x168, subw 0x0, time 24043403, (1666,897), root:(1670,950),
    state 0x10, keycode 81 (keysym 0x1008ff1d, XF86Calculator), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyPress event, serial 39, synthetic NO, window 0x4600001,
    root 0x168, subw 0x0, time 24043403, (1666,897), root:(1670,950),
    state 0x10, keycode 77 (keysym 0x0, NoSymbol), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyRelease event, serial 39, synthetic NO, window 0x4600001,
    root 0x168, subw 0x0, time 24043411, (1666,897), root:(1670,950),
    state 0x10, keycode 77 (keysym 0x0, NoSymbol), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

しかし、誤ってXを数回クラッシュさせた後(キーコードファイルで最小値を高く設定すると役に立つとは思わないでください)、この問題は消えました。この時点で、簡単な再起動が役立ちます。成功すると、次のような結果が得られます。

KeyPress event, serial 38, synthetic NO, window 0x3e00001,
    root 0x168, subw 0x0, time 26443862, (930,972), root:(934,1025),
    state 0x10, keycode 81 (keysym 0x1008ff1d, XF86Calculator), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyRelease event, serial 39, synthetic NO, window 0x3e00001,
    root 0x168, subw 0x0, time 26444022, (930,972), root:(934,1025),
    state 0x10, keycode 81 (keysym 0x1008ff1d, XF86Calculator), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

[ユーザー設定]で、そのキーにショートカットキーを割り当てることができ、電卓キーに割り当てられたというメッセージが表示されていることを確認できます。

ここでまだ欠けているもの:標準設定にする方法と再起動時の方法を見つけることです。これにはudevを見ることが含まれます。https://help.ubuntu.com/community/Custom%20keyboard%20layout%20definitions2014年から「旧式」というラベルがついていますが、役に立つかもしれません。

答え3

私はLinuxの専門家ではなく、単なるユーザーであると仮定します。しかし、私は私のニーズに応じてこの問題に対する解決策を共有したいと思います。これは、実際に他のユーザーが提案したソリューションと同じソリューションではなく、問題を解決する方法に近いです。私はこのソフトウェアを見つけました入力リマッパーこれにより、2つのキーボードマッピングを変更できます。それぞれ、デバイスメニューから選択してください。

入力リマッパーGUIスクリーンショット

プログラムはトリガー構文を提供しますキーの組み合わせオプションのカスタマイズがあるようです。マクロ言語

しかし、私は1行のコードも書くことができないので、マクロを次に割り当てただけです。キーの組み合わせ私のデフォルトのキーボードはまだ使用されていません。たとえば、Ubuntu 22.10では。

ここに画像の説明を入力してください。

その後、割り当てキーの組み合わせ入力リマッパーソフトウェアとkey_combination-sintaxを使用して2番目のキーボードのキー(画像KP_BEGIN)に:

ここに画像の説明を入力してください。

確かにエレガントなソリューションではありませんが、私のように端末に慣れていない人にとっては、実装が簡単になります。

答え4

説明されている修正方法hwdbは、接続されている複数のUSBキーボードでは機能しません。これは、同じボタンのスキャンコードが他のUSBキーボードで同じで、接続されているすべてのUSBキーボードのボタンを再マップするためです。

内蔵ノートパソコンのキーボードとUSBキーボードのスキャンコードのみが異なります。

私はこのPythonメソッドを試してみます(コメントで見つけてください)https://www.youtube.com/watch?v=Arn8ExQ2Gjg)

  1. Pythonとそのevdevモジュールのインストール(後で必要です)

  2. cd/dev/input/by-id/

  3. キーボードが接続されていない場合ls

  4. キーボードを接続してからls。 2つの新しいシンボリックリンクがあります。ファイルシステムの絶対位置を書き留めます(例:/dev/input/by-id/usb-0c45_USB_WIRED_KEYBOARD_event-kbd)

  5. 端末を終了します。 Pythonファイルを作成し、次の内容を入れてください。

    from evdev import InputDevice, categorize, ecodes
    dev = InputDevice('/absolute/position/of/device')
    dev.grab()
    
    
    for event in dev.read_loop():
         if event.type == ecodes.EV_KEY:
              key = categorize(event)
         if key.keystate == key.key_down:
              if key.keycode == 'KEY_ESC':
                   print("Hello, world!")
    
  6. 2番目のキーボードでEscキーを押すと、「Hello、world!」が印刷されます。

関連情報