ショートカットを機能/マルチメディアキーにバインドする際の問題


8

バッチスクリプトをショートカットに接続したい。[システム設定]> [キーボード]> [ショートカット]でバインドすると、外付けのAppleキーボードの輝度キーを除くすべてのキーで機能します。

明るさキーは、キーコード224および225の showkeyで認識されます。

xev出力:

FocusOut event, serial 41, synthetic NO, window 0x4000001,
mode NotifyGrab, detail NotifyAncestor

FocusIn event, serial 41, synthetic NO, window 0x4000001,
    mode NotifyUngrab, detail NotifyAncestor

KeymapNotify event, serial 41, synthetic NO, window 0x0,
    keys:  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   0 

私にできることはありますか?

回答:


6

halevtを使用したソリューション

manページによると、halevtHALイベントの汎用ハンドラーがあります。これは非推奨で、に置き換えられてudevいますが、十分な知識がないudevため、halevt解決策を提供します。

編集:いくつかの深刻な汗の後、私はなんとかこれを行うことができましたudev私の他の答えをください。

vimファイルの編集に使用しますが、わからないvim場合は、nanoまたはに置き換えることができますgedit

halevtのインストール

sudo apt-get update && sudo apt-get install halevt

スクリプトにバインドするイベントを決定するすでに実行されているデーモンを
停止しhalevtます。

sudo /etc/init.d/halevt stop

halevtが使用したいキーのイベントを認識できるかどうかを確認し、リスナーを起動します。

sudo -u halevt halevt -fig:plugdev

次に、スクリプトをバインドするキーボードのファンクションキーを押します。OPが明るさキーを機能させたいと思っているので、それを続けましょう。輝度キーの出力は次のようになります。

Condition: /org/freedesktop/Hal/devices/platform_i8042_i8042_KBD_port_logicaldev_input,ButtonPressed (brightness-down)
Condition: /org/freedesktop/Hal/devices/platform_i8042_i8042_KBD_port_logicaldev_input,ButtonPressed (brightness-up)

brightness-downbrightness-upイベントが送信されていることがわかります。

イベントをスクリプトにバインドする
ファイルを編集します/etc/halevt/halevt.xml

sudo vim /etc/halevt/halevt.xml

そして、次の行を追加します(私は一番下の直前にそれを行いました</halevt:Configuration>):

<halevt:Device match="hal.info.category = input">

    <halevt:Condition name="ButtonPressed" value="brightness-up" exec="sudo /home/user/brightness-script.sh up"/>

    <halevt:Condition name="ButtonPressed" value="brightness-down" exec="sudo /home/user/brightness-script.sh down"/>

</halevt:Device>

もちろんvalue、リスナーから取得したイベントに変更し、exec実行するコマンドによって変更する必要があります。

コマンドまたはスクリプトを実行するためのhalevtユーザー権限を付与するデーモンはユーザーとして実行される
ため、で指定したことを実行するための権限を付与する必要があります。halevthalevtexec

実行(vim選択したエディターで置き換えることを忘れないでください)

sudo EDITOR=vim visudo

下部に次の行を追加します

halevt ALL=(root) NOPASSWD: /home/user/brightness-script.sh 

保存して終了します。

スクリプトが実行可能であることを確認してください

sudo chmod +x /home/user/brightness-script.sh

halevtデーモンを再起動します

sudo /etc/init.d/halevt start

そしてそれはうまくいくはずです!


完璧に働いた。正確な回答をありがとうございました。
2013年

どういたしまして。を使用した私の新しい回答もご覧くださいudev。しかし、他の解決策を自由に使用してください。重要なことは、それが機能しているということです;)
Gerhard Burger

E: Unable to locate package halevt14.04に。
umpirsky 2014年

Ubuntuの13.10ためhalevtはもはや含まれていない(packages.ubuntu.com/search?keywords=halevt
ゲルハルトバーガー

11

udevを使用したソリューション

HALは非推奨になり、udev現在使用されているので、このアプローチは他の回答よりも優先されます(ただし、HALを使用したソリューションの方が簡単だと思います)。

ただし、多くのファンクションキーでは、[システム設定]> [キーボード]> [ショートカット]を使用してスクリプトをバインドできます。まずこれを試してください。それはあなたに多くのトラブルを救います。たとえば、明るさのキーはこれでは機能しません(理由がわかりません)。たとえば、明るさのキーの動作を変更する方法を知りたい場合は、このまま読み進めてください。

:Samsungノートブックを実行している場合はsamsung-toolshttp: //www.voria.org/forum/からパッケージをインストールすることにより、すべての(モデルに応じて)ファンクションキーを修正できます

このハウツーは、ターミナルの使い方を知っていることを前提としており、vimエディタを使用しています。わからない場合vimは、コマンドでgeditまたはに置き換えてくださいnano


キーボードを決定する

/lib/udev/findkeyboards

私の場合、コンピュータに接続されているキーボードを印刷する必要があります

USB keyboard: input/event9
USB keyboard: input/event7
AT keyboard: input/event4

現在、2つのオプションがあります。

  • USBキーボードUSBキーボード
    を再マップする場合は、実行してそれらを検査します

    udevadm info --export-db | awk '/event9/' RS="" | grep -P 'ID_(VENDOR|MODEL)(?!_ENC)'
    

    awkステートメントの9を正しい番号に置き換える必要があります。出力は次のようになります

    E: ID_MODEL=USB_Receiver
    E: ID_MODEL_ID=c52b
    E: ID_VENDOR=Logitech
    E: ID_VENDOR_ID=046d
    

    これは、私のキーボードがLogitech USBレシーバーを介して処理されていることを正しく示しています(input / event7は、いくつかのプログラム可能なボタンを持つLogitech G9マウスであることが判明しました)。

  • ラップトップのキーボードラップトップのキーボード
    を再マップするAT keyboard場合、私の場合は4の番号を覚えておく必要があります。ラップトップのdmi情報も取得します。

    cat /sys/class/dmi/id/sys_vendor
    

    私の場合は

    SAMSUNG ELECTRONICS CO., LTD.
    

    そして

    cat /sys/class/dmi/id/product_name
    

    私の場合は

    305U1A
    

ファンクションキーの現在のマッピングを確認する

これで、キーボードを聞いて現在のキーマッピングを判別できます(正しい番号を挿入)

sudo /lib/udev/keymap -i input/event4

このコマンドEscは、キーボードのCtrl+ またはc別のキーボードの+ を使用して終了できます。

画面が激しく下にスクロールし始めた場合は、+ を数回押してEscCtrlc

sudo /lib/udev/keymap -i input/event4 2> /dev/null

または、まだスクロールの問題がある場合

sudo /lib/udev/keymap -i input/event4 > ~/keymap.log

最後のケースでは、引き続きスクロールしますが、ファンクションキーを押すと、~/keymap.log後で読むことができる場所に移動するはずです。

これで、ファンクションキーを押して現在のマッピングを確認できます。これにより、(これが私のFn+ F1からFn+のような)リストが表示されますF12

scan code: 0xCE   key code: kpplusminus
scan code: 0x89   key code: brightnessdown
scan code: 0x88   key code: brightnessup
scan code: 0x82   key code: switchvideomode
scan code: 0xF9   key code: f23
scan code: 0xA0   key code: mute
scan code: 0xAE   key code: volumedown
scan code: 0xB0   key code: volumeup
scan code: 0x43   key code: f9
scan code: 0x44   key code: f10
scan code: 0xB3   key code: prog3
scan code: 0x86   key code: wlan

次に、動作を変更するスキャンコードを書き留めます。


スキャンコードのキーコードを変更する

あなたは、キーコードが表示された場合、明らかにキーを行うことを期待するものカバーしていない、あなたはで見ることができ/usr/include/linux/input.h下のキーやボタンより良い試合は、あなたが実際に起こるしたいというキーコードがあるかどうかを確認します。そこにあるキーコードはフォーマットでKEY_KEYCODEありKEY_、小文字で後の部分を書き留める必要があります。これを変更するだけで問題を解決できる場合があります。

ただし、輝度キーには多くの場合、適切なキーコードが関連付けられており、これによりそれらを再マッピングできません。したがって、これらを他のキーコードに変更する必要があります。私たちは、使用するprog1prog2、これらは私のコンピュータ上で使用されていないので、しかし、あなたが使用することもでき、この例f13を通じてf24、またはf20を通じてf24あなたが持っているアップルのキーボードがあればF1を通じてF19キーを。

  1. カスタムキーマップの
    作成:/lib/udev/keymaps適切な名前でディレクトリにキーマップファイルを作成しますls /lib/udev/keymaps。適切な名前を確認するには、の出力を確認してください。私はcustom-brightnessこの質問のために行きます。

    sudo vim /lib/udev/keymaps/custom-brightness
    

    変更するキーのスキャンコードを入力し、続けてキーに設定するスキャンコードを入力します。私custom-brightnessはこのように見えます:

    # /lib/udev/keymaps/custom-brightness
    
    0x89 prog1
    0x88 prog2
    
  2. カスタムキーリリースファイルを作成します。 ノートパソコンのキーボードを交換している場合のみ
    キーリリースイベントが正しく送信されず、コンピューターがハングすることがあります。これを回避するために、カスタムキーリリースファイルも作成します

    sudo vim /lib/udev/keymaps/force-release/custom-brightness
    

    このファイルには同じスキャンコードが含まれている必要があります。

    # /lib/udev/keymaps/force-release/custom-brightness
    
    0x89
    0x88
    

新しいマッピングがルールファイルに読み込まれていることを確認する次に、マッピングが読み込まれて
いることを確認する必要があります。編集してこれを行うことができる/lib/udev/rules.d/95-keymap.rulesので、バックアップを作成するのが賢明です

ここでも2つのオプションがあります。

  • USBキーボードUSBキーボード
    を使用しているため、下にエントリを追加しLABEL="keyboard_usbcheck"、キーボードメーカーの他のエントリを過ぎている必要があります。これは私のキーボードが

    E: ID_MODEL=USB_Receiver
    E: ID_MODEL_ID=c52b
    E: ID_VENDOR=Logitech
    E: ID_VENDOR_ID=046d
    

    すでにルールの1つに一致していますが、それ以外の場合は上書きされます。
    次のルールを追加します。ここで、ID_VENDOR_IDおよびID_MODEL_IDキーマップの名前を適切に変更する必要があります

    ENV{ID_VENDOR_ID}=="046d", ENV{ID_MODEL_ID}=="c52b", RUN+="keymap $name custom-brightness"
    
  • ノートパソコンのキーボード
    IFが/lib/udev/findkeyboards通り、ノートパソコンのキーボードを報告しAT keyboard、あなたのルールが下に行く必要がありLABEL="keyboard_vendorcheck"そうでない場合は下に置きます、LABEL="keyboard_modulecheck"。もう一度、ラップトップメーカーのその他のエントリの下に配置します。次のルールを追加します(SAMSUNG ELECTRONICS CO., LTD.少し長いのでワイルドカードを使用しました)

    ENV{DMI_VENDOR}=="SAMSUNG*", ATTR{[dmi/id]product_name}=="305U1A", RUN+="keymap $name custom_brightness"
    

    /lib/udev/rules.d/95-keyboard-force-release.rulesバックアップした後、ルールも追加します

    sudo cp /lib/udev/rules.d/95-keyboard-force-release.rules /lib/udev/rules.d/95-keyboard-force-release.rules.bak
    sudo vim /lib/udev/rules.d/95-keyboard-force-release.rules
    

    もう一度、メーカーの他のエントリの下に追加します

    ENV{DMI_VENDOR}=="SAMSUNG*", ATTR{[dmi/id]product_name}=="305U1A", RUN+="keyboard-force-release.sh $devpath custom_test"
    

udevが新しいルール
をロードすることを確認してください。

sudo adevadm trigger

注:(udevadm control --reload-rulesまだ多くのWebサイトで説明されています)は機能しません。

次に、ルールが正常に適用されたかどうかを確認します

sudo /lib/udev/keymap -i input/event4

明るさのキーについて報告するはずです

scan code: 0x89   key code: prog1
scan code: 0x88   key code: prog2

システム設定でキーを再マッピングする
最後のステップで正しいキーコードが報告された場合、どちらかのキーが自動的に機能し始めます(最初に間違ったキーコードがあった場合)。

明るさのために、キーをscripにバインドする必要があります。これは、システム設定>キーボード>ショートカットを使用して可能になりました。

楽しい



  • キーに間違ったキーコードがあり、この方法で修正された/usr/share/doc/udev/README.keymap.txt.gz場合は、の手順に従って(を使用して抽出せずにこれを開くことができzlessます)、そこに記載されているメールアドレスを結果に送信してください。変更は次のリリースに含めることができます。多くのユーザーにメリットがあります!

  • Vaidas Jablonskisによるこの役立つ投稿に感謝します。


1
$ /lib/udev/findkeyboards bash: /lib/udev/findkeyboards: No such file or directoryまた$ /lib/udev/findkeyboards bash: /lib/udev/findkeyboards: No such file or directory
umpirsky 2014年

コメントありがとうございます。調べましたところ、udevはsystemdにマージされ、キーマップ設定はhwdbで管理されるようです。bbs.archlinux.org/viewtopic.php?id=168720によれば、古いバージョンのsystemdからfindkeyboardsを抽出することは可能ですが、残りの答えがまだ当てはまるとは思いません...
Gerhard Burger
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.