2017-10-14

XFCE4: 1つのデスクトップを2人で操作する

XI2という機能によって, 2個以上のキーボード・マウスペアを別々に使用することができるようになった (らしい).
色々と設定を試してみたが, かなり使いにくい. ウィンドウのフォーカス周りが何かと思い通りに動いてくれない.
私が使用しているWMはXFCE4で, 他は試していない. 以下では, XFCE4での振る舞いを元に, 設定例を示す.

概要

マスターと呼ばれるディバイスがあり, キーボード・マウスのペアが提供される.
フォーカスの移動の振る舞いが難解だが, Focus follows mouseに設定している場合, たぶん以下のような振る舞いだ.
  • あるマウスカーソルが1個も乗っていないウィンドウにマウスカーソルを移動させると, そのウィンドウにフォーカスが当たる.
  • フォーカスが当たると, どのマスターに属するマウスかによらず, 1個目のマスターのフォーカス当たるする.
  • あるマスターに属するマウスがあるウィンドウ上でクリックすると, すべてのキーボードのフォーカスが当たる場合と, そのマスターに属するキーボードのフォーカスだけが当たる場合がある.
  • 2番目以降のマスターに属するマウスがあるウィンドウ上でクリックすると, そのマスターに属するキーボードのフォーカスが当たる.
  • IBUSを使用できるのは, 1番目だけ.
  • ウィンドウのやサイズ変更ができるのは1番目のマスターだけ.

    用意するもの

    キーボード・マウスそれぞれ2個.
    以下では, Thinkpadのキーボード・マウスと, USB接続のマウス・キーボードを設定する例を示しながら説明する.

    設定方法

    2個のマスターを作成する. (名前は何でも良いが, ThinkPadのtpxと, USB接続のusbにした.)
    $ xinput --create-master tpx
    $ xinput --create-master usb
    
    Thinkpadのキーボード・マウスをマスターtpxに割り当てる.
    $ xinput --reattach 'AT Translated Set 2 keyboard' 'tpx keyboard'
    $ xinput --reattach 'TPPS/2 IBM TrackPoint' 'tpx pointer'
    
    これで, 2個のポインターが出てくる.

    上記の設定で, 構成は以下のようになる.

    $ xinput
    ⎡ Virtual core pointer                         id=2 [master pointer  (3)]
    ⎜   ↳ Virtual core XTEST pointer               id=4 [slave  pointer  (2)]
    ⎜   ↳ Microsoft Microsoft® Nano Transceiver v1.0 id=14 [slave  pointer  (2)]
    ⎜   ↳ Microsoft Microsoft® Nano Transceiver v1.0 id=16 [slave  pointer  (21)]
    ⎣ 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)]
        ↳ ThinkPad Extra Buttons                   id=11 [slave  keyboard (3)]
        ↳ Topre Corporation HHKB Professional      id=13 [slave  keyboard (22)]
        ↳ Microsoft Microsoft® Nano Transceiver v1.0 id=15 [slave  keyboard (3)]
    ⎡ tpx pointer                                  id=17 [master pointer  (18)]
    ⎜   ↳ TPPS/2 IBM TrackPoint                    id=10 [slave  pointer  (17)]
    ⎜   ↳ tpx XTEST pointer                        id=19 [slave  pointer  (17)]
    ⎣ tpx keyboard                                 id=18 [master keyboard (17)]
        ↳ AT Translated Set 2 keyboard             id=9 [slave  keyboard (18)]
        ↳ tpx XTEST keyboard                       id=20 [slave  keyboard (18)]
    
    Virtual core pointerに属するマウスでウィンドウの移動などを行える. 他のマスターで, ウィンドウをクリックしてフォーカスするウィンドウを選び, キーボード・マウスでそのウィンドウの操作ができる.
  • 特定のキーボードだけキー配列を変更する

    私はノートパソコンにUSB接続のHHKBを接続しているのだが, ときどきノートパソコン上のキーボードを使用することがある. このとき, Controlキーやバックスペースの違いにとまどうことがある. この回避策として, ノートパソコンのキーボードだけキーコードを変更する方法をメモする.
    使用しているOSは, Fedora release 25である.

    キーコードの変更手順

    キーの入れ替えには, setxkbmap を使用する. このコマンドは, どのディバイスに対して適用するかを指定できる.

    まず, キーを入れ替えるための設定ファイルを用意する.

    $ cat /usr/share/X11/xkb/keycodes/swapctrlcaps
    default
    xkb_keycodes "swapctrlcaps" {
            <LCTL> = 66;
            <CAPS> = 37;
    };
    
    $ cat /usr/share/X11/xkb/keycodes/swapbacks
    default
    xkb_keycodes "swapbacks" {
            <BKSL> = 22;
            <BKSP> = 51;
    };
    
    これで, 以下のコマンドにより, qwerty配列に対して上記のキー入れ替えができる.
    $ setxkbmap -keycodes 'evdev+aliases(qwerty)+swapbacks+swapctrlcaps'
    

    次に, xinput を使用して, 接続されたディバイスの一覧を取得する. (空白などを改変した)

    $ xinput
    Virtual core pointer                   id=2  [master pointer  (3)]
      Virtual core XTEST pointer           id=4  [slave  pointer  (2)]
      TPPS/2 IBM TrackPoint                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=9  [slave  keyboard (3)]
      ThinkPad Extra Buttons               id=11 [slave  keyboard (3)]
      Topre Corporation HHKB Professional  id=13 [slave  keyboard (3)]
    
    このうち, AT Translated Set 2 keyboard だけに, キーコードの変更を行う.
    setxkbmap -device 9 -keycodes 'evdev+aliases(qwerty)+swapbacks+swapctrlcaps'
    
    これをスクリプトにすると, 以下のようになる.
    for id in $(xinput | awk '/AT Translated Set.*id=[1-9]/{print gensub(/.*id=([0-9]*).*/,"\\1",1)}'); do
            setxkbmap -device $id -keycodes 'evdev+aliases(qwerty)+swapbacks+swapctrlcaps'
    done
    

    補足: キーマップの異なるキーボードが混在する環境の設定

    もし, 日本語キーボード・英語キーボード混在の場合は, シンボルを設定するオプション -symbols を使用する. 以下の例では, id=9 に日本語, id=13 に英語の配列を割り当てる.
    setxkbmap -device  9 -symbols 'pc+jp+inet(evdev)'
    setxkbmap -device 13 -symbols 'pc+us+inet(evdev)'