Post Page Advertisement [Top]

0.17.0newstopwindowswallowing

xmonadの0.17.0へおしゃれにバージョンアップ

2021年10月27日、約3年ぶりにxmonadの新しいバージョン0.17.0がリリースされました!!


これにともなって、「The Xmonad Logo Contest」が開催中。 締切は、2022年1月31日で、その後投票があるみたいです。賞金も100ドル出るみたいですよー! 詳しくは上のリンクを辿ってください。 僕は絵心とかないけれど、新しい、楽しいxmonadのロゴが沢山出てくるといいなーと思ってウオッチ中。まだ、誰も応募してません。


archlinuxでxmonad0.17を使う

さて、2021年11月5日現在、archlinuxの公式パッケージはまだxmonad0.15のままですが、 AURのxmonad-gitとxmonad-contrib-gitをインストールすれば、0.17にバージョンアップできます。 もう早速、xmonadを新しくしちゃいましょう!!


$ yay -S xmonad-git xmonad-contrib-git


現時点では、aurでのパッケージのバージョン名がまだ0.15や0.16ですが、gitのリポジトリはすでに0.17なので0.17がインストールされます。 公式のxmonadパッケージxonad-contribパッケージとはコンフリクトするので、 今まで公式パッケージを使っている場合、指示に従って公式側を消し、git側に入れ替えましょう。


さてここで、AURのxmonad-gitとxmonad-contrib-gitを初めて使う場合、注意が必要です。


haskellライブラリアップグレードの際、AURのxmonad-git等の再インストールを忘れない

archlinuxのパッケージでxmonadを使っている場合、haskell関連のプログラムファイルは動的ライブラリになっています。 ですから、普段からxmonadを使っている人たちは、haskellの関連するライブラリが更新されると、 xmonad.hs自体も再コンパイルするのが習慣になっていると思います。 そして、これは、公式リポジトリのxmonadパッケージは、 関連ライブラリのアップグレードとともに、 xmonad自身も再コンパイルした新しいパッケージが公式リポジトリにリリースされているので、 xmonad.hsだけを自分で再コンパイルすればよいようになっています。 しかし、公式リポジトリのxmonadではなく、 AURのxmonad-gitを使う場合、新しい関連ライブラリのもとでビルドされた新しいxmonadはアップデートで自動的に降ってこないので、 xmonadの再コンパイルを自分でしなければならなくたります。


だからといって、なにか難しいことをしないといけないわけではなく、 単に、yay等で、もう一度、xmonad-git、xmonad-contrib-gitを上書きインストールするだけです。 まぁ、コンパイルにちょっとだけ時間がかかる(数分)ので、のんびりやりましょう。


もちろん、その後に、xmonad.hsを「M-q」で再コンパイルするのも忘れずに!!


非推奨を無視してコンパイルする

バージョンアップによって関数等の書き方が変わり、もともとの書き方が「Deprecated(非推奨)」に指定されているものがあります。 そこで、今まで使っていたxmonad.hsのコードの中に非推奨のものが含まれるとエラーとなって、リコンパイルができないことがあります。 この場合、エラーメッセージで新しく推奨される書き方の指示がされるので、 そのとおりに、訂正すればコンパイルが通るようになります。


しかし、とりあえず、非推奨でもそのまま使いたい場合には、GHCへ次のオプションを渡すことで、非推奨を無視してコンパイルすることが出来ます。 xmonad.hsの一番はじめの行に以下の一行を加えてみましょう。


{-# OPTIONS_GHC -Wno-deprecations #-}


XMonad.Hooks.WindowSwallowingを試す

さて、せっかくなので、xmonad-contribの0.17になって新しく加わったモジュールの一つを紹介します。


XMonad.Hooks.WindowSwallowing というモジュールで、twitterでもはじめに話題になっていていました。 どんな機能なのかというと、、、


ターミナルからchromiumを呼ぼうとおもったとき


普段使っているレイアウトTallの場合、 呼び出したターミナルは、右側のペインに移り、ワークスペースの右側は、ウィンドウサイズがそれぞれ小さくなっています。 しかも、呼び出したターミナルはGUIからのエラー出力等を見ない限り、実質的には使わないウィンドウにります。そのくせ、かさばって実は邪魔な存在だったりします。


しかし、WindowSwallowingを使うと、


呼び出されたGUIが もとにあった、ターミナルを飲み込んで(swallow)くれるのです。 つまりは、必要なくなったターミナルアプリがワークスペースから隠れることで、ワークスペースを広く使うことが出来るのです。


隠れたターミナルは、呼び出されたGUIアプリを終了すると、吐き出されるようにワークスペースへ戻ってきます。


どうですか?なかなか、かゆいところに手が届くxmonadらしいユーザー目線の機能でしょ??


WindowSwallowingを使う

まずは、モジュールのインポートです。


import XMonad.Hooks.WindowSwallowing


次に、swallowEventHook関数で、イベントフックを作成します。 以下のコードは、kittyとalacrittyとxtermからGUIが呼ばれたときに、飲み込まれるようにするイベントフックを作成する例です。


myHandleEventHook 
  = swallowEventHook ( className =? "Alacritty" 
                  <||> className =? "kitty"
                  <||> className =? "XTerm") (return True)


クラス名の文字列でターミナルを判定します。他のターミナルを設定したいときは、 xpropコマンドを利用して、クラス名を調べ、"kitty"のような文字列部分を書き換えたり、 「または」を意味する「<||>」演算子を追加して、新たな条件を追加して調整しましょう。 また、2つ目の引数で、上記の例では常にTrueを返すアクションを定義して渡していますが、 第一引数と同じように、 条件設定をすることでターミナルを飲み込むGUIを限定することも出来ます。


このmyHandleEventHookの定義ができたら、xmonad関数に渡すXConfig l型のdefの「handleEventHook」にこのmyHandleEventHookを追加しましょう。


...他の設定
  handleEventHook = myHandleEventHook <+> handleEventHook def
...他の設定


注意としては、今の所、レイアウトでスマートボーダーやノーボーダーを利用している場合、 GUI終了時に飲み込まれたターミナルが行方不明になるバグがあるようなので、 うまく行かない場合には、それらのレイアウトを外してみてください。


もともと、スマートボーダー機能と相性が悪いバグがありましたが、既に修正済みです。


0.17.0版のxmonad.hsの例

0.17.0用に書き換えたうちのxmonad.hsです。 特にステータスバー周りは、別途、ステータスバープログラムを立ち上げるコードを自分で書く必要がなくなり、 また、データのやり取りにXのプロパティを利用するようになったので、 色々と刷新されています。


特にxmobarの場合、新しいモジュールの関数を使えば、1関数で、簡単に管理できるようになっています。 但し、実際にやってみると、xmobar側でXのプロパティーで情報のやり取りをする設定をしないと、xmobar自体が立ち上がってくれないかもしれません (うちでは、その設定をしないとうまくいかなかった)。 一方、polybarについては、自作しないといけないところがあるので、その辺を適当にやっています。 新しいモジュールで、自分の好きなステータスバーを管理するための関数等を自作する場合の参考にして下さい。


0 件のコメント:

コメントを投稿

Bottom Ad [Post Page]