dwmパッチを読解してグループ分けする

はじめに

久しぶりの投稿でまたdwmの話題。 dwmって何な人はこの辺をどうぞ。(宣伝)
タイル型ウィンドウマネージャー dwm を導入 - fuhaのゲームとかLinuxとか色々

勉強のために公開されているパッチを色々調べたので、 せっかくなので資料として残したいと思う。 使用中も不使用もとりあえず調べたものは列挙していくので、 一部不正確かもしれない点は注意。

ついでに現在使用中のパッチを公開する。

GitHub

GitHub - fuha-htrshooter/dwm: 自分カスタマイズdwm

※4/6更新:一部パッチが取得できない状態だったので修正。

おすすめ

全部使用中。

  • awesomebar 【ステータス表示変更】
    タイトルバーに、現在開いている全てのウィンドウを一覧表示する。 また、ウィンドウをクリックで選択可能にする。
    インストール時にまず入れるパッチの一つ。

    • しかし、マルチモニタでの使用時にバグ?があったので追加パッチを自作した。
      ->awesomebar-multimons
    • あと最近公開された最新版20200907は、頻出操作の C-h(ウィンドウ境界を左に移動)を上書きするので、 キーコンフィグ変更推奨。
  • extrabar 【ステータス表示変更】
    画面下部に追加のステータスバーを表示する。 ステータスバーの途中にセミコロンを入れるとそれ以降が追加部分に表示される。
    awesomebarを使う場合、メインのステータスバーが狭いと見辛くなってしまうため、 このパッチと組み合わせると領域が広くとれて丁度いい。

  • statusallmons 【ステータス表示変更】
    マルチモニター使用時、通常選択中のモニターしかステータスバーは更新されないが、 その制限を撤廃して全モニター一斉に更新するようにする。
    なお、extrabarには適用されないので自分で追加変更した。

  • gridmode 【レイアウト追加】
    全ての画面を同じサイズにして、2x2、3x3、4x4といった格子状のレイアウトにする。 数が合わない場合、右下が空き領域になる。
    全画面を一覧できるので、WindowsにおけるWin+Tabのように 必要な画面を探す時に使える。

自作

  • awesomebar-multimons 【ステータス表示変更】
    拙作1。 awesomebarをマルチモニターで使う時用の追加パッチ。

    • 非選択モニターのウィンドウが選択スタイルのままだった所、 非選択スタイルにするよう修正
    • 選択モニターがウィンドウ無しの場合非選択スタイルのままだった所、 選択スタイルにするよう修正
  • statusmonbutton 【動作変更】
    拙作2。 ステータスバーの区切り文字を認識し、領域毎に別コマンドを実行できるようにする。
    押したい場所がextrabar領域だったので、extrabarパッチに依存。 音量表示部分を左右クリックで音量調整するために使っている。

    参考:statuscmd

レイアウト追加系

■基本知識
dwmは基本的に各ウィンドウのサイズを個別に操作しない(できない)。
なので、好きなウィンドウ構成にするにはレイアウトパッチを入れるのがよい。

dwmのウィンドウ管理の基礎として「マスター領域&スタック領域」という考え方がある。
ウィンドウは基本的にそのどちらかに割り当てられる。
- マスターはメインの作業領域、デフォルトだと左半分。
- スタックはそれ以外のウィンドウ、デフォルトだと右半分。
(※ただし例外もある)
  • columns
    適用したが未使用。
    メイン領域に複数ウィンドウを置いた時、デフォルトだと横に割る所を縦に割るようになる。
    しかし、スタックを含めると最低でも3分割となるので、 ウルトラワイドモニタ等でないと今一つ?

  • deck
    適用したが未使用。
    スタック領域を一枚レイアウトにする。
    山札(deck)のようにスタックトップだけが見えるようになるからこの名前らしい。

  • rmaster
    マスターとスタックを左右逆にする関数を追加する。 なので厳密にはレイアウト追加ではない。

  • leftstack
    マスターとスタックの左右を逆にするパッチその2。
    こちらはデフォルトのtileレイアウトを上書きするため不可逆だが、 差分2行と圧倒的にパッチ内容が少ない。

  • bottomstack
    マスターを上、スタックを下にしたレイアウトを追加する。
    デフォルトを90度横向きにした感じ。

  • centeredmaster
    マスターを中央、スタックを左右に置く。
    columns同様横に広いウィンドウを使っている人向け。

  • fibonacci
    全画面を渦巻き状にレイアウトする。
    サイズ比率はフィボナッチ数を一辺にした正方形となる。
    ...どこに使うんだこれ。

  • tatami
    スタック領域のレイアウトを畳敷きにする。
    非常に複雑な式で計算されている、どこに使うんだこれ2。

  • nmaster
    マスターを分割可能にする。メインリポジトリに取り込まれておりパッチ不要っぽい?

フォーカス変更系

ウィンドウを追加する時の追加位置および追加後のフォーカス遷移を変える。

  • (デフォルト)
    フォーカス位置に限らず、新しいウィンドウが常に一番上のマスターになる。

  • attachbelow
    使用中

    • 現在フォーカスしているウィンドウ(以下現在位置)の直後にウィンドウを 追加する
    • 現在位置がマスターの末尾である場合、 追加されたウィンドウはマスターに残り、他はスタックに入る
    • 現在位置がマスターかつ末尾以外の場合、 追加されたウィンドウの分マスター末尾のウィンドウが スタックに押し出される。
  • attachabove
    現在位置の上にウィンドウを追加する。
    元々はこれが大本で、他のパッチはこのパッチの派生らしい。

  • attachtop
    現在位置にかかわらずスタックの一番上に新規ウィンドウを積む。
    デフォルトに近いがマスターは動かしたくない人向け。

  • attachbottom
    現在位置にかかわらずスタックの一番下に新規ウィンドウを積む。
    他のウィンドウ順序を一切変えたくない人向け。

  • attachdirection
    上記全てを合体して切り替えできるようにしたもの。
    各パッチの実装は同じ。

ステータス表示変更

  • alpha
    ステータスバーを半透明にする。

  • dualstatus
    extrabarと同様に追加バーを表示するパッチだが、 個別に表示切り替えができるなど機能的な違いあり。

動作変更

  • cursorwarp
    使用中。
    ウィンドウ変更時にマウスカーソルをウィンドウ中央まで自動移動させる。 常に移動、モニタ変更時のみ移動、モニタ変更しない時のみ移動の3種類存在。
    モニタ変更時、カーソル位置が分からないので、 とりあえずマウスをガーっと動かすみたいな人、 おすすめ。

  • center
    自動でフローティングウィンドウにするconfig.hルールに、 「センタリング」設定を追加する。
    小さなウィンドウを表示してすぐ消すような用途のソフトで便利?

  • alwayscenter
    上記と違い、フローティング化したタイミングでセンタリングする。
    その後の移動は自由。

  • dwmc
    WMの外からdwm関数を呼べるようになるパッチ。 ステータスバーと同じ、xsetrootを使用してコマンドを送る。
    xsetrootにヘッダを付けることでステータスバーの更新と区別し、 送信内容を先取りしている模様。

  • dwmfifo
    dwmcと似ているが、こちらは一時ファイルを使用してコマンドを送る。
    反映にラグがあるのか、連続送信には要スリープとのこと。

  • ipc
    同じく外部コマンド系で、UNIXソケットを使用するもの。 送るだけでなく中の状態を取得することもできるなど高機能。
    追加行だけで2000行オーバーという中々インパクトのあるパッチだが、 その実態の殆どは別コマンドなので適用難易度はそうでもない、はず。

既に使えないもの

  • historical
    他のリンクと見分けが付かないが、実はこのリンクに全て纏められている。
    そのため、逆に言えばここにあるもの以外は使える(?)はず。

おわりに

色々パッチを当ててみた感想。

  • メソッド追加するだけの簡単なパッチは基本的にconfig.def.hくらいしか干渉箇所がないので、 そこだけ消せば入る場合が多い。(レイアウト追加系とか)

  • フォーカス変更は、デフォルトが一般的なタブ形式に慣れた人には 結構違和感を感じる動作なので、 とりあえず入れてみると印象がかなり変わる。

  • メインリポジトリをちょっと追ってみたが、 ソース変更は基本的に無造作でリファクタリングも全く容赦なく行われている。 こわい。

  • ただ逆に干渉しても変数変わってるだけとかよくあるので諦めないで。

喧伝の通り構造は簡単なので、アイデアさえ決まれば自作もそう難しくはない。
…が、長く使えるかは保証できないって感じなので、正直あまり良い所とは言い辛い。
使い勝手が気にいっているので使い続けるけど。