web-dev-qa-db-ja.com

スクロールロックをホーム行のマウスキーに切り替えます

これは私が欲しいものです:

  1. キーボードのScrollLockを押します。
  2. キーボードのScrollLockLEDが点灯します。
  3. 右側のホーム行の周りのキーがマウスポインタを制御するようになりました(通常のキーパッドのマウスキーのように、移動、クリック、右クリック、ドラッグなど)。
  4. 残りのキーは、以前と同じように何もしません。
  5. もう一度ScrollLockを押します。
  6. Scroll LockLEDがオフになります。
  7. マウスキーはありません。

Trisquel で動作する必要があります。

以前にいくつかのキーを再マップするために xkb を使用したことがあるので、おそらくxkbでこれを実行できると思いました。そしてそれはそれができるように見えます:

  • 使用できるマウス関連のkeysymはたくさんあります:Pointer_LeftPointer_DownRightPointer_Button_DfltPointer_Drag_Dfltなど。
  • ISO_Level5_Lockなどのロックキーがあります。
  • マウスキーを有効にするために設定する特定のものがいくつかあります: https://wiki.archlinux.org/index.php/X_KeyBoard_extension#Mouse_control
  • インジケーターを制御することは可能であるようです: http://www.charvolant.org/~doug/xkb/html/node5.html 。 (そのページで「インジケーター」を検索してください。何度か言及されています。)

しかし、私はLinuxとxkbの両方に不慣れです。 xkbを使用して非常に単純なキーの再マッピングを行うことができましたが、残念ながら、上記のすべてをまとめる方法と、それをどのファイルに入れるかがわかりません。 xkbを含まないソリューションも、部分的なソリューションと同様に問題ありません。

2
lydell

以前は、Pointer_Left keysymをいくつかのキーに割り当て、Pointer_EnableKeysをスクロールロックに割り当ててみました。ただし、それではマウスポインタは左に移動しませんでした。代わりに、それはまったく何もしませんでした。

キーにkeysymを割り当てるだけでは不十分であることがわかりました。キーシムも解釈する必要があります。これは「compat」ファイルで行われます。私のシステムでは、それらは/ usr/share/X11/xkb/compatにあります。

この優れたガイドに従って、独自のキーボードレイアウトを作成しました: http://hack.org/mc/writings/xkb.html 。これは、「teck.xkb」ファイルがあることを意味します(レイアウトを「teck」と呼びます)。そのファイルには次の行が含まれています。

xkb_compat    { include "complete"  };

/ usr/share/X11/xkb/compat/completeを見ると、そのファイルの同じフォルダーに「mousekeys」というファイルが含まれていることがわかります。ビンゴ。

Mousekeysファイルには、マウスを制御するためのkeysymsの解釈が含まれています。 私の質問のリンクの1つ に記載されているPointer_EnableKeysの必要な解釈が含まれています。ただし、Pointer_Left(およびPointer_Rightなど)の解釈は含まれていません。だから、以前はうまくいきませんでした。代わりに、多くのKP_*キーシムが解釈されます。結局のところ、標準はキーパッドにマウスキーを置くことです。

幸い、mousekeysファイルの最後には、マウスキーのインジケーターを設定するためのコードがあります。完璧!

そこで、mousekeysファイルをteck.xkbファイルの横にある「compat」という新しいフォルダーにコピーし、名前を「teck_mousekeys」に変更しました。それに応じてteck.xkbファイルを更新しました。

xkb_compat    { include "teck_mousekeys+complete"   };

次に、teck_mousekeysファイルの編集を開始しました。 KP_* keyymsを使用する代わりに、必要なもの(右側のホーム行の周りのキー)を使用しました。結果は次のとおりです。

default partial xkb_compatibility "mousekeys" {

    interpret.repeat= True;



    interpret m {
        action = MovePtr(x=-1,y=+1);
    };

    interpret comma {
        action = MovePtr(x=+0,y=+1);
    };

    interpret period {
        action = MovePtr(x=+1,y=+1);
    };

    interpret j {
        action = MovePtr(x=-1,y=+0);
    };

    interpret l {
        action = MovePtr(x=+1,y=+0);
    };

    interpret u {
        action = MovePtr(x=-1,y=-1);
    };

    interpret i {
        action = MovePtr(x=+0,y=-1);
    };

    interpret o {
        action = MovePtr(x=+1,y=-1);
    };



    interpret k {
        action = PointerButton(button=default);
    };

    interpret semicolon {
        action = PointerButton(button=3);
    };

    interpret space {
        action = PointerButton(button=default,count=2);
    };

    interpret y {
        action = SetPtrDflt(affect=defaultButton,button=3);
    };

    interpret h {
        action = SetPtrDflt(affect=defaultButton,button=2);
    };

    interpret n {
        action = SetPtrDflt(affect=defaultButton,button=1);
    };

    interpret p {
        action = LockPointerButton(button=default,affect=lock);
    };

    interpret apostrophe {
        action = LockPointerButton(button=default,affect=unlock);
    };



    indicator "Scroll Lock" {
        indicatorDrivesKeyboard;
        controls= MouseKeys;
    };

};

(上記はQWERTYレイアウトを想定しています。)

カスタムキーボードレイアウトでは、マウスキーを切り替えるためのスクロールロックを定義しています。

key <SCLK> {[Pointer_EnableKeys]};
6
lydell

Xkbについてはよくわかりませんが、 xevdevserver ソース、/ dev/input/eventXデバイスからLinuxevdevイベントを読み取り、それらを使用してXサーバーに挿入するプログラムに基づいて何かを作成しました。 XTEST拡張。あなたはここでコードを見つけることができます:

https://bitbucket.org/brmtron/mouseemu/

主な欠点は、Sudoを使用して何かを実行できる必要があることですが、そうではない場合があります。

0
brm