パッチとは何か?
パッチとは、より大きな作品に挿入することができる小さなコードの断片のことです。これは、大きなソフトウェアプロジェクトで共同作業をするときに便利で、 プログラマは他の人が行った変更をすぐに確認することができます。
パッチ! パッチは、バグを修正するための小さなワンライナーの変更のような単純なものから、新しい機能を導入するための大規模なマルチファイルの変更のようなものまであります。dwm のソースコードにパッチを適用する方法
ソースコードにパッチを導入する方法は複数あります。最も一般的な方法は、gitコマンドで行う方法です。例えば、git リポジトリにパッチを導入するには、次のようにタイプします。
git apply -3 パス/to/the/patch.diff と入力します。
git apply -3 path/to/the/patch.diff ``` * apply
関数は、指定されたソースファイルにパッチファイルの内容を挿入しようと試みます。
-3
オプションは不整合を修正しようとし、ユーザーがパッチ適用時の間違いを修正できるようにします。
一方、バージョン管理なしでソースコードを編集している場合、GNUパッチプログラムを使うことができます。それを使ってパッチを挿入するには、次のようにタイプしてください。
patch -p1 < パス/to/the/patch.diff
- p1` オプションはパッチプログラムが挿入するパッチファイルが正しくラベル付け されるようにするためのものです。
しかし、dwmにパッチをあてるとき、これらのプログラムは、パッチをあてる ソースコードが基本的なdwmのインストールと同様であると仮定しているので、失敗 することがあります。
つまり、パッチをインストールすればするほど、パッチプログラムが そのパッチを挿入するのが難しくなるのです。このため、私たち自身が手動でパッチをインストールできるように、 パッチファイルがどのように機能するかを理解することが重要です。パッチファイルの読み方
パッチファイルは3つのものから構成されています。
パッチファイルは以下の3つから成っています: * どのファイルにコードを挿入すべきかを示すヘッダー- どの行番号や関数を挿入すべきかを示す小見出し。
- コードそのもの
上述したように、1つのパッチファイルには、複数のファイルに挿入することを意図した複数のコードのスニペットを含めることができます。このフォーマットでは、すべてのソースファイルに対して1つのパッチファイルを用意するのではなく、1つのファイルを配布することができます。
これによって、パッチファイルを読むには、そのヘッダの構文を理解する必要があるだけです。それさえ分かれば、実際のパッチはコードをコピーして貼り付けるだけです。パッチヘッダの構文
パッチのヘッダには、ソースファイルがどこにあるかという重要な情報が含まれています。例えば、これは dwm autoresize パッチのヘッダです。
diff --git a/dwm.c b/dwm.c
インデックス 0362114..e4e8514 100644
--- a/dwm.c
+++ b/dwm.c
1行目、3行目、4行目は、これがdwm.cファイルの2つのバージョン間の差分であることを示しています。これは、これから修正するファイルが “dwm.c “ファイルであることを告げています。
しかし、何を編集すればいいのかがわかっただけでは、ソースファイルにパッチをあてる助けにはなりません。ファイルのどこにコードを挿入すればいいのかを知る必要があるのです。ここで、パッチファイルの小見出しを利用することができます。 例えば、これは上で説明したのと同じオートリサイズパッチの一部分です。@@ -92,7 +92,7 @@ struct Client { (構造体)
int basew, baseh, incw, inch, maxw, maxh, minw, minh;
int bw, oldbw;
unsigned int tags;
- int isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen.+ int isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen;
+ int isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen, needresize; int isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen, needresize;
Client \*next;
Client \*snext; Client
モニター ⇦mon;
これは大変なコードのように見えるかもしれませんが、ここで見るべきことは3つだけです。
- 最初の行は、コードのスニペットを挿入する必要がある行番号を示しています。この例では、92行目に挿入する必要があります。
- 最初の行の2番目の引数
struct Client {
は、編集しなければならない特定の関数を示しています。これは、ソースファイルにすでに大きなパッチが当てられていて、左側の行番号がもう並んでいない場合に便利です。 - 最後に見るべきは、コードブロックの
+
と-
の記号です。マイナス記号は削除する行、プラス記号は追加する行であることを示します。
以上で、ソースファイルにパッチを適用する方法についての基本的な理解ができました。次に、dwmに有用な5つのパッチについて説明します。
1. シストレ
他のデスクトップ環境と異なり、dwmにはデフォルトでシステムトレイが付属してい ません。システムトレイはデスクトップの一部で、いくつかのアプリケーションは、 バックグラウンドで動作しているプログラムと素早く対話するために、そのアプリ ケーションの機能を示すアイコンを残すことができます。
このパッチはその機能を dwm に導入するものです。一度インストールすると、systrayパッチはdwmバーの右端を現在のシステムトレイプログラムに割り当てる。また、マルチモニタセットアップをサポートし、トレイは常に現在マウスポインタを置いているモニタに表示されます。2. Xresources
Xresourcesパッチは、xrdbプログラムがdwmのグラフィカルな設定を行うことを 可能にします。これにより、プログラムを再コンパイルすることなく、.Xresources ファイルを使って色やフォントを変更することができるようになります。これは、すでに端末の配色にその同じファイルを使っているユーザーには特に便利なものです。
さらに、xrdbにdwmの外観を指示させることで、複数のテーマを使用することができます。.Xresourcesファイルを好きな配色に変更し、dwmをリロードしてそれを有効にすることで、それが可能になります。3. タタミ
Tatamiはdwmの代替ウィンドウレイアウトです。これは画面内のウィンドウを、伝統的な日本のフローリングに並べられたタイルのように 表現します。この方法は、従来のマスターとスタックのレイアウトとは異なり、 マスター以外のウィンドウが縦に細くなっていくため、スタック内の各ウィンドウが読めなくなります。
畳レイアウトは、4~5個のウィンドウを同時に扱う場合に特に有効で、各ウィンドウにユーザが読みやすい十分なスクリーンスペースが与えられます。4. フォーカスマスター
dwmがウィンドウを配置する方法は、ブロックを積み重ねるのに似ています。新しいウィンドウはそれぞれ前のウィンドウの上に配置されます。これにより、ウィンドウ間に直線的な順序が生まれ、どのウィンドウが先に来たか を知ることができるようになります。
しかし、この設計の限界として、スタックからマスターウィンドウを自由に選択することができません。マスターを選択するためには、一番高いブロックに到達するまで、ひとつひとつのウィンドウを選択する必要があります。このパッチはこの動作を変更し、スタック内の任意の場所から現在のマスターウィンドウを選択できるようにします。 このパッチは、複数のウィンドウを扱う場合に特に有用で、ウィンドウスタックに存在する各ウィンドウを巡回するのではなく、自動的にマスターを選択することができるようになります。5. dwmc
dwmのどの部分を変更するにしても、 変更を適用するたびにプログラムのリコンパイルが必要です。これには、特に、配色やデフォルトの動作が含まれます。
dwmcは、クライアントプログラムを通してdwmの動作を変更することができる簡単なパッチです。この方法は、bspwmがbspcを使ってbspwmの設定を変更する方法と似ています。dwmcはbspcよりはるかに単純ですが、それでも私たちが使ったり変更したりできる便利な設定がたくさんあります。 例えば、dwmcで使用できる関数の1つにtogglebarがあります。dwmc togglebarを実行すると、dwmバーを動的に有効/無効にすることができます。このため、dwmcはカスタムウィンドウの動作を行うスクリプトを作成するときに便利です。 おめでとうございます。これで、コードパッチがどのように機能するかについての基本的な理解と、 dwm のインストールに適用する 5 つの便利なパッチを手に入れました。もし、ブラウザで同様の最小限の体験をしたいのであれば、このチュートリアルをチェックしてみて下さい。よくある質問
1. dwmパッチは使っても安全ですか?
はい! はい! 多くのメンテナが suckless ウェブサイトに存在するパッチをチェックしています。これにより、ウェブサイトにあるすべてのパッチが、そのパッチが書かれた dwm のバージョンで動作することが保証されます。
2. 2. git apply を使っていますが、私のパッチは失敗し、dwm はコンパイルされ ません。どうしたらいいでしょうか?
これは多くのことが原因で起こる可能性があります。最も一般的な理由は、ソースファイル中のgitヘッダが削除されていないことです。これは比較的簡単に直すことができます。自分たちでヘッダを削除して、パッチを手動で適用する必要があります。
ソースファイルを開くと、HEAD
と書かれた行があるのがわかると思います。これは修正の開始点を示しています。その後に、修正する必要がある関数が続きます。この行を削除して、手動でパッチを適用する必要があります。ここでは、コードの左側に +
と -
の記号があり、何を変更すればよいかを示しています。
3. 3. パッチをうまく適用できたのに、dwm がコンパイルを嫌がって、変数や宣言が 不足していると聞いてくる場合はどうすればいいのでしょうか?
パッチプログラムが config.h ファイルにパッチを当てなかったのです。デフォルトでは、パッチは config.def.h ファイルを編集して、現在の設定との衝突を避けるようになっています。
しかし、それは config.h ファイルがその特定のパッチのための正しい設定値でロードされないことを意味します。これを解決するには、config.def.h ファイルの変更点を config.h ファイルに導入する必要があります。