Post Page Advertisement [Top]

0.17.0coolpolybartopxmonad.hs

新しいxmonad 0.17 で、お洒落にpolybarする

2021年の秋に、xmonadとxmonad-contribのバージョンが0.17に上がりました。 そして、このバージョンアップで大きく変わった点の一つが、ステータスバーとの連携の仕方です。 このノートでは、新しいxmonadでおしゃれにpolybarするためのサンプルを紹介します。


Polybar

まずは、polybarを用意してしまいます。 polybarを使ったことがない場合は、はじめに、polybar自体をインストールしましょう。 Archlinuxの場合、polybarのパッケージがAURにあるので、以下のコマンドでインストールします。


$ yay -S polybar


polybarについての概略やxmonadとのxmonad0.15等の古いものとの連携が気になる場合、 「polybarとxmonadをおしゃれに連携させる」も参考にしてみてください。


Polybarのおしゃれテーマをインストール

次に、このノートで使うpolybarのテーマをインストールします。 これは、「adi1090x/polybar-themes」をフォークして、 自分用に使いやすくしているもので、このノートでの説明はこのフォークしたテーマ「nekolinuxblog/polybar-themes」を前提に行います。 このテーマは、自分のホームディレクトリの適当は場所にクローンした後、その中にあるsetup.shを実行して~/.config/polybarディレクトリに必要ファイルをインストールして使います。 この際、アイコンフォントも一緒にインストールされます(フォーク元で最低限必要なフォントが一緒に配布されている)。


では、まず適当な所でnekolinuxblog/polybar-themesリポジトリをクローンします。


$ git clone --depth=1 https://github.com/nekolinuxblog/polybar-themes.git


polybar-themesディレクトリに入ります。


$ cd polybar-themes


setup.shを実行します。


$ ./setup.sh 


選択肢が表示されるので「simple」を選択するため「1」を入力します。


~/.config/polybarディレクトリに必要ファイルがインストールされますが、 既に、~/.config/polybarディレクトリが存在する場合は、従前のものが簡易にバックアップされます(setup.shのスクリプトを確認してください)。


自分で使う追加フォントのインストール

うちで追加して使っているフォント「Ra Bali」を紹介しておきます。 いわゆる「フリーフォント」で、あちこちで配布されているので、google等で検索すれば ダウンロードできると思いますが、例えば、以下のURLからダウンロードできます。



フォントファイルは~/.fonts/ディレクトリや、上記で、作成されている~/.local/share/fonts/ディレクトリに入れてあげると、使えるようになります。


pacman-contribのインストール

polybarには、archlinuxでの残存アップデートパッケージの数を表示させるモジュールがあり、 このモジュールは内部で、pacman-contribパッケージに含まれるcheckupdatesコマンドを実行しています。 ですから、忘れずにpacman-contribパッケージをインストールしておきましょう。


$ sudo pacman -S pacman-contrib


polybar起動のテスト

ここで使っているテーマでは、基本的に以下のスクリプト呼び出しでpolybarを起動します。 まずは、以下のコマンドで、launch.shが引数として受け取れるテーマを確認してください。


$ ~/.config/polybar/launch.sh --help


ここで、引数に"--blocks"を渡して、起動のテストをします。 何もしないと、自動的に設定ファイルの読み直しがなされないので、 ウィンドウフォーカスの遷移等、画面が変化するきっかけを与えましょう。


$ ~/.config/polybar/launch.sh --blocks


また、引数に"--shapes"を渡して、起動のテストをします。


$ ~/.config/polybar/launch.sh --shapes


polybar自体を終了させたい場合は、killallコマンドを使って以下のようにします。


$ killall polybar


さて、ここで、バッテリーやWiFi、CPU温度等の情報収集でエラーが出る場合、 設定のデバイスファイル名が異なっています。 polybarはこれらを自動的にはやってくれないので、 モジュールファイルの該当部分にそれらの対処方法がかいてあるので、 自分の環境に合うように書き換えましょう。


Xプロパティ読み込みスクリプトxmonadpropread.hsを入手する

Xプロパティ読み込みスクリプトであるxmonadpropread.hsというファイルが、xmonbad-contribで公開されています。 そこで、このスクリプトファイルxmonadpropread.hsを入手して利用します。 まずは、xmonad-contribを適当な場所にクローンします。


$ git clone --depth=1 https://github.com/xmonad/xmonad-contrib.git


scripts/xmonadpropread.hsをホームディレクトリ内のPATHを通してあるディレクトリ例えば~/bin/にコピーしましょう。


$ cp xmonad-contrib/scripts/xmonadpropread.hs ~/bin/


次にインストールしたpolybarテーマの中にあるmodules.iniファイルで xmonadモジュールを定義している部分があります。(今は、blocksとshapesのみ) そこの「exec」行に、自分の環境に合わせてxmonadpropread.hsの場所を書き換えます。 念の為、絶対パスで指定するのが無難です。 例えば、うちの環境では、shapes/modules.iniのxmonadモジュール定義は以下のようになっています。


...
[module/xmonad]
type = custom/script
exec = /home/neko/bin/xmonadpropread.hs
format-foreground = ${color.foreground}
format-background = ${color.shade2}
format-padding = 2
tail = true
format-font = 2
...


以上で、polybarの設定は終わりです。


xmonad.hsの書き方

polybarと連携した基本の書き方は次のとおりです。




もちろん、上記のコードはそれ単独で動くxmonad.hsです。


しかし、これを参考に、自分のxmonad.hsに組み込む場合には、以下の手順を参考にしてください。 ます、importされているモジュール部分をコピペします。 次に、上述xmonad.hsの中のpolybar setting以下の部分を 自分のxmonad.hsの中にコピペしてしまいます。


以下、調整すべきところを一つづつ見ていきます。


ステータスバーを連携させるwithSB関数

新しいxmonadでステータスバーを連携させるために利用するのは、withSB関数です(上述コードの21行目)。


この関数は、第一引数にステータスバーのための設定を行ったStatusBarConfig型のデータを渡すと、 XConfig l型データを受け取って、XConfig l型データを返す関数になります。 そして、ステータスバーのための設定を行ったStatusBarConfig型のデータは、 上述のコードの33行目からのmyPolybarConfで定義しています。


ですから、あなたのxmonad.hsの中のXConfig l型データをxmonad関数へ渡す途中の何処かで


withSB myPolybarConf


を使って、XConfig l型データを加工して使います。 サンプルのコードを参考に、自分のXConfig l型データ(具体的にはxmonad関数に渡しているdef、若しくは、その加工物)を加工しましょう。


polybar起動コマンドをStatusBarConfig型のデータに設定する

先に述べたとおり、polybarの設定はmyPolybarConfの定義で行うのですが、 この中で具体的にpolybarの起動のさせ方を設定することができます。 サンプルコードの37行目に注目してください。


...
  , sbStartupHook = spawn "~/.config/polybar/launch.sh --blocks"
...


spawn関数は、シェルでプログラムを実行させるアクションを作成する関数です。 例のようにシェルで実行したい文字列を設定します。 つまり、ここにpolybarの起動コマンドを書けばOKです。 このノートでのpolybarテーマを使っている場合、起動スクリプトのパスは上記の通りのはずなので書き換える必要はありません。 しかし、例の"--blocks"となっている部分を"--shapes"に変更したりすることでテーマを変更することが出来ます。 (blocksとshapes以外は、今の所、フォーク元のデフォルトのままなので上手く連携しません)


ステータスバーとしての挙動をさせるための設定

サンプルコードの22行目、23行目にみられる「ewmh」関数、「docks」関数は、いずれもXConfig l型データをとって、加工したXConfig l型データを返す関数です。 「ewmh」関数を入れることで、polybarにウィンドウの「タイトル」を表示させることができるようになります。 また、「docks」関数を入れることで、polybarをステータスバーとして扱えるようになります(docks関数をいれていないと、polybar自体通常のウィンドウとしてタイリング配置されます)。 polybarを使う場合、この2つの関数を忘れずに入れるようにしましょう。


上記2つの関数以外に、サンプルコードの26行目にみられるようにlayoutHookに定義する値をavoidStruts関数で加工する必要があります。 これは、従前からのxmonadでのレイアウトと同じで、この処理を行わないと、polybarにウィンドウが重なって表示されます。 通常は、Full系以外のTallやそのミラーにこの処理を行い、Fullの時だけ画面全体になるように定義します。 サンプルでは全体に適用しているので、Fullの時にもステータスバーがみえるようになっています。


xmonad.hsの設定では、xmonad関数に渡すXConfig l型データを加工する関数がよく出てきます。 そして、それらの処理の仕方の書式はパターン化されています。 xmonadを使い始めたばかりで、このあたりのことがよくわからない場合、 「巷で見かけるxmonad.hsのお洒落な書き方」も参照してみてください。


xmonad情報をどんな風に表示させるかを設定する

正確には、サンプルコードの34行目にある、sbLogHookが、 xmonad情報を何処へどの様に出力するかの設定を定義する場所なのですが、 この部分は、コピペの通りでOKです。 実際に、自分で設定してカスタマイズする部分は、サンプルコードの41行目で定義している polybarPPdefに相当する部分です。


この部分は、デフォルトのデータをレコード構文を使ってカスタマイズしましょう。 まず、polybarPPdefは、PP型であり、そのリファレンスを見ておきましょう。


https://hackage.haskell.org/package/xmonad-contrib-0.17.0/docs/XMonad-Hooks-StatusBar-PP.html#v:PP


基本的に、各要素の文字列を受け取って、文字列を返す関数を登録するようになっています。 サンプルの42行目「ppCurrent」には、現在のワークスペースの文字列を受け取ったときに、どのようにして加工するかの関数を定義しています。 wrap関数は、第1,第2引数で渡した文字列で第3引数で渡された文字列を囲んで返す関数です。 すなわち、現在のワークスペース名が1なら「[1]」となるわけです。


更に、サンプルではwrap関数はpolybarFgColor関数と合成されています。 polybarFgColor関数はその下で定義してあるとおり、polybar上での表示色を変更するためのコードを埋め込む処理をしています。 使い方は関数に色コードを渡せば、自動的に埋め込む色コード処理をしてくれます。


また、サンプルコードでは44行目で定義している通り、titleをLog内では記述しない設定にしています。 titleは、ewmhを通じて、polybar側の一般的なモジュールで受け取れるように設定しています。


X.H.StatusBar

xmonad0.17になって、「Xmonad.Hook.StatusBar」モジュールがステータスバー制御の中心モジュールになりました。 従前、ステータスバーの起動等や情報のやり取りについてユーザーが独自に面倒を見ていたい部分を、 モジュール側で形式を決めて扱えるようなったので、できることは同じであっても、コードが洗練された感じがします。


さて、新しい形式では、このノートで紹介した「withSB」関数か、ステータスバー周りの定形処理(docksやavoidstruts)を組み込んだ「withEasySB」関数に 設定データであるStatusBarConfig型データを渡して、Xconfig l型データを加工してくれる関数を作成して、これを利用するという流れになります。 そして、このノートでは直接StatusBarConfig型データのデフォルト値をレコード構文で書き換えましたが、 モジュールにはこのデータを作成してくれる関数がいくつか用意されています。 その中でも一番かんたんに使えるのは、statusBarProp関数です。


...
main = xmonad
       $ withSB myXmobar 
       $ docks
       $ ewmh
       $ def {
...
myXmobar = statusBarProp "xmobar" (pure xmobarPP)
...


実は、StatusBarConfig型データは、ステータスバーの起動処理と、「終了処理」を定義できます。 そして、statusBarProp関数を使うと、起動と終了の処理についてPID等を利用した自動で賢い処理をしてくれるので、 本当はこの関数を使えばよいのですが、polybarの場合、終了処理が上手く行かなかったので、 今回のノートのように自前で定義する処理になっています。


そして、ステータスバーとの情報やり取りについて、Xプロパティが使えるようになりましたが、 実は、標準入出力でもできますし、更には別の方法であっても、 「どうやってやりとりするか」自体をStatusBarConfig型データの中で定義できるようになっています。 デフォルトではXプロパティというだけです。 しかし、xmonad-contribでXプロパティを流れてくる情報を受け取るスクリプトを配布してくれていますし、 xmobarでもXプロパティを流れてくる情報を受け取るオプションが付け加えられているので、 あえて、ここをカスタマイズする必要はなくなりました。


ちなみにxmonadが情報をやり取りする、Xプロパティは、"_XMONAD_LOG"となっていて、 このノートで入手しているxmonadpropread.hsスクリプトをコンソールで実行すると実際に、 "_XMONAD_LOG"に流れているログを見るので試してみてください。


というわけで、コードの書き方がかわったので一見、設定が小難しくなったようにも感じるかもしれませんが、 polybarについては、従前のdbusで通信してたときよりも格段にコード記述がスッキリしました。 そして、ほぼ定形の形で全ては動くので、実際にカスタマイズのために触る部分は「PP」しかありません。 ですからステータスバーの設定はPP以外の部分について動けばコピペで十分です。 このノートを適当に活用しましょう。


0 件のコメント:

コメントを投稿

Bottom Ad [Post Page]