パソコンなど

パソコンの話をします。

自作ウィンドウマネージャとほげWM

私のデスクトップ環境(左上側にFHD、右側に4Kモニタ)

  • Linuxを快適に使うために、X上のウィンドウマネージャを自作した。
  • 生のX、または自作ウィンドウマネージャに関する日本語の情報はほとんどないので、これを書こうと思う。

1. ウィンドウマネージャとHOGEWM

1.1. ウィンドウマネージャとは

 広く用いられているGUIデスクトップ環境は、ソフトウェアが一定の画面領域、ウィンドウを操作することで成り立っている。そのウィンドウの位置や大きさを変更したり、入力するウィンドウを選択したりするのがウィンドウマネージャである。

1.2. WMを自作すべきな理由

  • 自分で設計したキーバインドで、自分で設計した動作をさせることができるため、非常に快適に操作でき、生産性が高まる。
  • パソコンがより好きになる。

1.3. HOGEWMとは

1.3.1. リポジトリ

1.3.2. 主な特徴

  • ほぼ全てのウィンドウ操作をキーボードのみを用いて行える。
  • マルチモニタ環境での使用を前提とした設計。

1.3.3. 主な機能

私の環境ではMod1はAltキー

バインド 動作
Ctrl-Mod1-i ウィンドウの選択
Ctrl-Mod1-n 選択したウィンドウを隣のモニターに移動
Ctrl-Mod1-s 全てのウィンドウをモニターごとに入れ替え
Ctrl-Mod1-m 選択したウィンドウを最大化
Ctrl-Mod1-h,j,k,l 左下上右寄せで選択したウィンドウを半分にする
Ctrl-Mod1-1 urxvtを起動(ソースコードから変更可)
Ctrl-Mod1-2 emacsを起動(ソースコードから変更可)
Ctrl-Mod1-3 google-chromeを起動(ソースコードから変更可)
Ctrl-Mod1-t 全てのウィンドウをタイル配置
Mod1-1,2,3,4 バーチャルスクリーン1-4に切り替え
Ctrl-Mod1-a,d 隣のバーチャルスクリーンに選択したウィンドウを移動
Ctrl-Mod1-r 選択したウィンドウを最前面に配置
Print 画面全体のSSを$HOME/screenshots/に保存
Ctrl-Print 選択したウィンドウのSSを$HOME/screenshots/に保存
Mod1-leftdrag ウィンドウの移動
Mod1-rightdrag ウィンドウのリサイズ

2. 開発に入る前に

  • 開発に入る前に、開発環境とその使い方を知る必要がある。

2.1. 使用している主なソフトウェア

2.2. Xが起動するざっくりとした流れ

  1. startxを実行
  2. $HOME/.xinitrcに書かれたコマンドが順に呼び出されるので、そこにWMやターミナルエミュレータを入れておく。
  3. 最後に実行するものは、処理が戻らないように末尾に&をつけない。
  4. 以下の.xinitrcでは、urxvtが最後に起動する。そのため、urxvtをexitなどで終了するとXorgが落ちる。
#!/bin/sh

xset +fp $HOME/.local/share/fonts/
xrdb $HOME/.Xdefaults
xmodmap $HOME/.Xmodmap

xset r rate 200 40
setxkbmap -option ctrl:nocaps -option terminate:ctrl_alt_bksp

$HOME/hogewm/hogewm 2> /dev/null &
emacs &
urxvt -geometry 80x35-64-0

2.3. WMを起動する

  • 私の環境では、上記の.xinitrcの下から3行目でWMを起動している。あなたが作っているWMを起動するコマンドをこれと置き換えればhogewmの代わりにそれが起動する。

  • ただし、WMを2つ以上同時に起動すべきではない。なぜならキーバインドが衝突して後から起動した方が動かなくなるからである。

  • WMを.xinitrcの末尾に置くべきではない。末尾においた場合、WMを終了したときにXサーバーが終了してしまう。
    • 開発初期のWMというのは不安定で頻繁にクラッシュするし、開発中はWMを幾度となく再起動するだろう。これでは都合が悪い。

3. 自作する上でのTIPS

  • ここまでで、WMを実行することまではできるようになった。

3.1. 他のWMを動かして、読もう

  • 自分が書こうとしている言語で書かれたWMの動作を観察して、ソースコードを読むのは必須に近い。
  • GitHubでは言語を指定した検索もできるので、window managerとかで調べれば良いプロジェクトがたくさん見つかる。
  • 推奨する(私が使った)WM
    • tinywm: 50行程度の非常にプリミティブなウィンドウマネージャ、C版とPython版がある。
    • xpywm: 1000行程度のWM、Python
    • hogewm: xpywmをベースとしたWMで850行程度、Python

3.2. Xlibの仕様を読もう

  • Xのラッパーライブラリを操作してWMを作ることになる。その仕様書を読むこともまた、必須に近い。
  • もとはC言語用のライブラリで、仕様書は英語だが、幸い日本語の翻訳が存在する。
  • ウィンドウマネージャを作るときに重要となる項は、ウィンドウ情報関数、イベント、イベント処理関数などだと思う。
  • また、Arch Linux WikiとForum、Stack Overflowなどの技術系掲示板がたまに役に立つ。

3.3. 他のWMを使おう

  • 開発中もX上でコードを書いたり、それを実行したり、ブラウザで音楽を聴いたりすることもできる。
  • しかし、ウィンドウマネージャなしでそれらを制御するのは不可能ではないが非常に難しい。
  • そのため、開発初期は他人が作ったWMをを使うべきだ。
  • 上記のWMを使うのが手っ取り早い。

3.4. 一つのウィンドウで開発しよう

  • 開発初期のWMは、入力フォーカスを切り替えることすらままならない。
  • そのため、一つのウィンドウで全ての開発に必要な操作が完結するほうが良い。
  • 同じウィンドウ上でターミナルエミュレータが使えるテキストエディタを使うと良い。
  • 私はEmacsを使ったが、まともなエディタならたやすくできるだろう。

3.5. ログを出そう

  • 標準エラー出力(Xのエラーや例外も標準エラー出力に出てくるため)に常にログを出して動作を監視しよう。
  • 普段使いするときも、ファイルにログをリダイレクトしておくことで、バグを発見したときの再現が容易になることがある。(上記の.xinitrcでは捨てているが。)
  • (少なくとも私の)WMのそれぞれの処理はイベントの送出から開始される。そのため、少なくとも各イベントハンドラの呼び出し時にはログを出すのが望ましい。