Post Page Advertisement [Top]

configpolybarxmonad

polybarとxmonadをおしゃれに連携させる

xmonadには、他のウィンドウマネージャーが普通持っている様なステータスバーが付属しておらず、 ステータスバーを使いたい時には、別途、ステータスバープログラムを用意しなければなりません。 このxmonadに追加する単独のステータスバープログラムとしては、「xmobar」と「dzen」が定番です。 うちのサイトでも、「xmobarをおしゃれに設置する」でxmobarの紹介をしています。 また、少し古いですが「xmonadとHaskell(その10:ManageDocks)」で、 dzenでステータスバーを作ることについてのメモが有ります。


しかし、昨今では、 「xmobarの設定ってややこしいから(dzenは話題にも出ない)、 ワイはこの前、polybarに変えたったわ! インストールは簡単やし、しかも、めちゃお洒落なんやでー」 などという噂が囁かれています。


おしゃれとxmonadに目がない私としては、 そんな噂のPolybarをほおっておくわけには行きません。 そこで、今回は、xmonadとPolybarをおしゃれに連携させていきます。


尚、xmonadを最新版の0.17にアップグレードしている場合は「新しいxmonad 0.17 で、お洒落にpolybarする」も併せて参考にしてください。


Polybar


開発元のgithubとそのWikiは次の通り。



また、Polybarがどれくらいお洒落なのかが、 ひと目でわかる様なPolybarの設定実例(テーマ)を紹介しているページを幾つか以下に紹介します。



polybarのインストールと設定ファイルの準備

archlinuxの場合は、AURにパッケージがあるので、yay等を使って簡単にインストールできます。


$ yay polybar


polybarは、~/.config/polybar/configに設定ファイルを準備し、 その設定ファイルで定義したテーマをコマンドpolybarに渡してを実行することで、画面にステータスバーが出現します。 設定ファイルのサンプルは、archlinuxの場合、/usr/share/doc/polybar/configにあるので、 これを持ってきましょう。


$ cd ~/.config
$ mkdir polybar
$ cd polybar
$ cp /usr/share/doc/polybar/config .


既存のメニューバーを外す

今まで、xmobarやdzenを利用していた場合は、それらが実行されないようにします。 xmonad.hsを書き換える際の注意は、xmobar等を実行している部分を外すだけでなく、 xmonadに渡すXConfig l型データのlogHook項目にxmobar等のファイルハンドルを渡すコードを書き込んでいる場合には、 その部分も忘れずに外しておくことです。(わからなくても、レコード構文でlogHookの項目を削除するだけで初期設定に出来ます)


フォントのインストール

 polybarでは、色んな図形を表現するために色んなアイコンフォントを使うことが出来るようになっています。 逆を言えば、必要としているフォントがシステムに無い場合、見た目がお洒落になりません。 polybarのテーマを公開しているサイトには、 それぞれのテーマで、どんなフォントが必要なのかについての説明がわざわざ書かれていることが多いです。 ですから、指定をみつけたら、それに従ってちゃんとフォントをインストールしましょう。


archlinuxの場合、必要とされるフォントは、大体AURにあります。 以下で実行するサンプルの設定ファイルテーマでも幾つかのフォントを必要としています。 yayで「ttf-unifont」と「siji」を検索して、「aur/ttf-unifont」と「aur/siji」をここでインストールしておいて下さい。


polybarをサンプル設定で起動する

まず、polybarを起動する前に、パソコンを再起動(または、Xセッションの再起動だけでも)をして、 xmobar等のステータスバープログラムが実行されていないxmonadの状態にします。 それから、x上でターミナルを開いて、次のコマンドを実行してpolybarを起動します。


$ polybar example


あなたのシステムでmpd(music player daemon)が動いていない場合、 ターミナル上には、エラーがどんどん出力されていっているはずです。 しかし、そのエラーの出力の勢いに気を取られることなく、画面の一番上をしっかり見て下さい。 そこに、polybarが現れれているはずです。


polybarの初めての起動が確認できたら、一度、polybarを終了しましょう。 ターミナルで「Ctrl + C」すれば、polybarを終了することが出来ます。


polybarを止めたら、ターミナルの出力を見てみましょう。 色んなエラー(行頭がerror:で始まっている)が出ているはずです。 mpd(Music Player Daemon )に関するものがあったり、 xmonadの場合、i3やbspwmmについてのエラーも見つかると思います。 また、PCモニターの明るさや、サウンドシステム、ネットワークに関するエラーがあるかもしれません。


基本的に、polybarの設定ファイルは初期設定でもだいたい動きますが、 各個人ごとの環境の設定までを全て自動で調べてやってくれるわけではありません。 また、polybar自体が立ち上がっているので、特に問題がなく稼働しているのだろうと思っていたとしても、 実際には、エラーが出ていて本来は表示されるべきものが上手く表示されていない場合も有ります。 また逆に自分のシステムでは対応していないものや、そもそも、あなたにとって必要なものと必要でないものがあると思います。 そこで、まずは、エラーの内容をきちんと確認して、修正できるものは修正し、また、不必要なものを省いて設定し直すのが、 polybarでの設定の第一歩になります。


polybarの設定の基本

では、設定ファイル~/.config/polybar/configをエディタで開きましょう。 設定ファイルの詳細な文法は、本家の説明に委ねるとし、ここでは、特に設定の肝となる部分のみを紹介します。


基本となるbar項目

まず、先のpolybarの起動を行う場合に、引数としてexampleとうワードを与えていました。 このワードは、このconfigファイルの中にある[bar/example]の部分の、exampleに対応しています。 つまり、別に[bar/mytheme]という項目が定義してあれば、 polybarに渡す引数はmythemeになるということです。


次に、bar項目を下にずっと見ていくと、[module/xwindow]と書かれた部分が現れますが、 barの項目は、このxwindow項目の前までということになります。 つまり、この設定ファイルの中では、[hoge/fuga]で括られた部分からその項目が始まり、別の[hage/hoyo]で括られた別の項目の前で終わります。 尚、設定ファイル中で、「;」文字は、これを含めたその後ろがコメントになります。


さて、この[bar/example]の中には、 modules-leftmodules-midlemodules-right から始まる行があります。


[bar/example]
...
modules-left = bspwm i3
modules-center = mpd
modules-right = filesystem xbacklight alsa pulseaudio xkeyboard memory cpu wlan eth battery temperature date powermenu
...


この項目は、それぞれ、polybarの左、真ん中、右に何を表示するのかを指定するための項目です。 そして、ここに当てはめる単語を追加したり、削除したり、入れ替えることで、polybarに表示される内容がそれに対応して変化します。 ここで指定するために用いられている単語、即ち、bspwmやi3やmpdやfilesystem達は、polybarでは「モジュール」と呼ばれています。 これらモジュールは、それぞれが情報を表示するための小さなプログラムのようなもので、 この設定ファイルの中の[module/bspwm]のような「module/」で始まる項目で定義されています。


ここで、実際に自分のpolybarを起動して、 先の3行のモジュール配置の定義と見比べててみましょう。


設定ファイルによれば、左端に表示されるはずのbspwmとi3モジュールの表示が無いはずです。 bspwmとi3モジュールは、それぞれbspwmとi3というウィンドマネージャのためのモジュールであるため、 xmonad上では上手く働いてくれません。このことは、エラー出力でも確認することが出来ます。 次に、中央に表示されるはずのmpdの表示もmpdサービスを使っていない人は表示されていないはずです。 また、mpdに接続できない旨のエラーがたくさん出ているはずです。 まずは、これらを設定から外してしまいましょう。


右側に表示するための項目には沢山のモジュールが定義されています。 実際の表示と、polybar上の表示を見比べて、動いているものと、動いていないものを上手に見極めましょう。


この右側のモジュールで最低限やっておきたい事は、alsaとpulseaudioの選択です。 両方書いてあると、ボリュームバーが2つ表示されたり、両方の挙動がおかしくなったりします。 よくわからない時はとりあえず、plusaudioを消して、alsaだけにしてみて下さい。


[bar/example]
...
modules-left =
modules-center =
modules-right = alsa xkeyboard memory cpu date powermenu
...


モジュール配置の定義を上記のようにシンプルにすると、エラーなく表示できると思います。 なお、実際のメニューバーには、設定ファイルのモジュール配置の一番右である「powermenu」の更に右側に、システムトレイが表示されます。 そこには、ibus等の状態が表示されます。


バッテリーやネットワーク系のモジュールからエラーが出ている場合は、 各モジュールの設定でそれらの情報を示している適切なデバイスファイル名を指定してあげれば上手く動くようになります。 それっぽいものに変えてみるか、ググってみましょう。(polybarのWikiにあるものもある) ただ、頑張っても上手く行かないものもあるので、ほどほどにしましょう。


xmonadでpolybarを使うための準備

polybarにはi3やbspwmウィンドマネージャのためのモジュールは用意されているのですが、 xmonadのためのモジュールは付属していません。 そこで、xmonadの情報をpolybarで受け取るための設定は自前で用意する必要があります。


xmonadとxmobarは、それぞれの標準入出力をパイプで繋いで情報伝達していますが、 それ以外にもアプリ間の情報伝達の方法は色々と有ります。 特にウィンドマネージャとウィンドウの情報共有については、EMWHという規格があります。 xmonadとpolybarもこれを使えるようなのですが、うちで試したところ上手く行きませんでした。 そこで、もうひとつのアプリケーション間の情報伝達手段としてよく使われる「dbus」を利用して、 xmonadの情報をpolybarに渡す設定を作っていきます。


まずは、そのための事前準備がいくつか必要になります。 archlinuxの場合、システム上でdbus自体は稼働しているはずなので、dbus自体の準備は必要ありません。 実際に必要となるのは次の2つの項目のインストールです。


xmonad-logのインストール

必要となる1つ目は、xmonad-logというプログラムです。



archlinuxの場合、aurにパッケージ「aur/xmonad-log」が有ります。yay等でインストールしましょう。 xmonad-logというプログラムは実行すると、xmonadのログに紐付けられたdbusを流れてくる情報を標準出力に表示します。


haskellのdbusライブラリのインストール

haskellのdbusライブラリが必要です。 haskellのライブラリのインストールの仕方は環境により異なるでしょうが、 archlinuxのパッケージを使っている場合、「community/haskell-dbus」パッケージをpacmanでインストールすればOKです。


xmonadとpolybarを連携する

ここで行う連携の概要は、まず、xmonadのワークスペースやレイアウト 連携作業の設定は、情報の送り主であるxmonad側と情報の受け手であるpolybar側の両方に行う必要が有ります。


xmonad側の設定

設定ファイルである~/.xmonad/xmonad.hsをエディタで開き、 以下のようにコードを追加していきます。


まずは、必要なライブラリのインポートです。 自分の設定ファイルに以下のもので無いものがあれば、追加します。



次に、dbusに情報を出力するためのアクションを作る関数と、 出力する書式や出力先に関する情報のデータ(PP:pritty print)を定義します。 これらを行う以下のコードをxmonad.hsの何処かにコピペしましょう。



最後は、xmonad.hsのmain部分を書き換えます。 doや<<=の記号、haskellのアクションについて、イマイチ自身のない方は、 「haskellのアクションと記号演算子<<=をおしゃれに理解しよう」をまず参照してみて下さい。 レコード構文の事がさっぱりわからないという方は、「haskellのお洒落なレコード構文について」も参照しましょう。


ここでは、do構文を使ったmainの定義で、xmonadを実行する前に、まず、dbusを得るコードを入れます。 そして、それから、 logHookを出力先がdbusとして設定した新しいPPをもつログフック(myPolybarPPに基づくもの)で定義しなおしたXConfig l型データを引数にしてxmonadを実行します。



最後は、xmonadに渡す、XConfig l型データのlogHook部分を定義します。


 logHook = dynamicLogWithPP (myPolybarHook dbus)


上記のコードをコピペする場合には、実際には先頭等に",(カンマ)"があるはずなので注意しましょう。


細切れのコードだけでは、わかりにくいので、最後に、dbus接続に必要な部分だけで構成されるxmonad.hsを以下に示します。 実際のあなたのxmonad.hsには、色んなカスタマイズがされていると思いますので、 上記の説明と、以下の簡単な構造を把握し、あなたのxmonad.hsに上手に書き入れて下さい。



xmonad.hsの書き換えがおわったら、忘れずに「M + q」で設定を再読込しましょう。


polybar側の設定

polybar側の設定では、~/.config/polybar/configに次の2つの設定を行います。 ここでは、configファイルは、とりあえず、先から使っているサンプルのものを利用しましょう。 まず、[module/xmonad]項目を定義します。[bar/example]の後ろ([module/xwindow]の前)に次のコードを入れて下さい。


[module/xmonad]
type = custom/script
exec = xmonad-log
tail = true


次は、[bar/example]の中の、modules-leftにxmonadモジュールを追加しましょう。


[bar/example]
...
modules-left = xmonad
modules-center =
modules-right = alsa xkeyboard memory cpu date powermenu
...


これでpolybar側の設定は終わりです。

xmonadとpolybarの連携開始

では、ターミナルからpolybarを実行しましょう。


$ polybar example


どうですか、ちょっとひ弱な感じですが、左側にxmonadの情報が表示されたはずです。


polybarの起動の仕方

polybarは、~/.xprofile等で、xのセッションが始まってxmonadが呼ばれる前に起動しておけばOKです。


# a part of ~/.xprofile
...
polybar example &
...


お洒落なテーマへ

実は、polybarが「簡単でおしゃれ」と言われているのは、polybarをおしゃれにカスタマイズしたテーマが流通しているからです。 今回は、まず、xmonadとpolybarの「おしゃれな連携」にフォーカスしたノートになっており、まだまだお洒落なpolybarそのものには到達していません。 polybarを実際におしゃれに使いこなすためには「xmonadでもpolybarをおしゃれに使いこなす」を参照しましょう。


logHook出力への愛

さて、僕が気に入ってxmonadを使っている理由の一つが、トピックスーペースなどと呼ばれる、ワークスペース毎に色んなものを紐づけて好きなカスタマイズができる機能があるところなのです。 普段、ネットサーフィンをしいたい場合、ブラウザを立ち上げると思います。 しかし、うちでは、webと名付けられたワークスペースに移動します。すると、そのワークスペースを開いた瞬間、ブラウザが自動的に立ち上がります。 また、xmonadと名付けられたワークスペースに移動すると、xmonadのホームページを開いたブラウザと.xmonad.hsを開いたnvimが自動的に立ち上がります。 ワークスペース移動は、dmenuの様なもので名前を書いて(もちろん補完機能使います)移動します。 そして、ワークスペースは、そもそも動的であり、いくらでもな名前をつけて作ることが出来るようになっています。 ですから、うちでは、ワークスペース名の表示は重要であり、順番とかがそもそも無いので、幾何学的な記号でおしゃれに抽象化してしまうことは選択できないのです。 そこで、polybarであっても、xmonadから発信するワークスペース名の情報がちゃんと取れるように連携させる必要があるのでした。


まぁ、それよりなにより、やっぱりxmonadは、この出力があってこそのxmonadだとおもいませんか?!


0 件のコメント:

コメントを投稿

Bottom Ad [Post Page]