自作ウィンドウマネージャとほげWM
- Linuxを快適に使うために、X上のウィンドウマネージャを自作した。
- 生のX、または自作ウィンドウマネージャに関する日本語の情報はほとんどないので、これを書こうと思う。
1. ウィンドウマネージャとHOGEWM
1.1. ウィンドウマネージャとは
広く用いられているGUIデスクトップ環境は、ソフトウェアが一定の画面領域、ウィンドウを操作することで成り立っている。そのウィンドウの位置や大きさを変更したり、入力するウィンドウを選択したりするのがウィンドウマネージャである。
1.2. WMを自作すべきな理由
- 自分で設計したキーバインドで、自分で設計した動作をさせることができるため、非常に快適に操作でき、生産性が高まる。
- パソコンがより好きになる。
1.3. HOGEWMとは
1.3.1. リポジトリ
- https://github.com/void-hoge/hogewm
- 詳細な機能やインストールの方法はREADME.mdを参照
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 | 選択したウィンドウを最前面に配置 |
画面全体のSSを$HOME/screenshots/に保存 | |
Ctrl-Print | 選択したウィンドウのSSを$HOME/screenshots/に保存 |
Mod1-leftdrag | ウィンドウの移動 |
Mod1-rightdrag | ウィンドウのリサイズ |
2. 開発に入る前に
- 開発に入る前に、開発環境とその使い方を知る必要がある。
2.1. 使用している主なソフトウェア
- OS: Debian GNU/Linux 11.3 bullseye(no desktop environment)
- X: 1:7.7+22
- テキストエディタ: Emacs, Atom
- ウェブブラウザ: Google-Chrome
- ターミナルエミュレータ: rxvt-unicode
- Python 3.9.2 (GCC 10.2.1)
2.2. Xが起動するざっくりとした流れ
startx
を実行$HOME/.xinitrc
に書かれたコマンドが順に呼び出されるので、そこにWMやターミナルエミュレータを入れておく。- 最後に実行するものは、処理が戻らないように末尾に&をつけない。
- 以下の
.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
3.2. Xlibの仕様を読もう
- Xのラッパーライブラリを操作してWMを作ることになる。その仕様書を読むこともまた、必須に近い。
- もとはC言語用のライブラリで、仕様書は英語だが、幸い日本語の翻訳が存在する。
- ウィンドウマネージャを作るときに重要となる項は、ウィンドウ情報関数、イベント、イベント処理関数などだと思う。
- また、Arch Linux WikiとForum、Stack Overflowなどの技術系掲示板がたまに役に立つ。
3.3. 他のWMを使おう
- 開発中もX上でコードを書いたり、それを実行したり、ブラウザで音楽を聴いたりすることもできる。
- しかし、ウィンドウマネージャなしでそれらを制御するのは不可能ではないが非常に難しい。
- そのため、開発初期は他人が作ったWMをを使うべきだ。
- 上記のWMを使うのが手っ取り早い。
3.4. 一つのウィンドウで開発しよう
- 開発初期のWMは、入力フォーカスを切り替えることすらままならない。
- そのため、一つのウィンドウで全ての開発に必要な操作が完結するほうが良い。
- 同じウィンドウ上でターミナルエミュレータが使えるテキストエディタを使うと良い。
- 私はEmacsを使ったが、まともなエディタならたやすくできるだろう。