picomでWindowの透過を無効にする

picomでWindowの透過を無効にする

以前からCompositorとしてpicomを使用してWindowsの透過設定をしている. 今回,VS Code Insidersを導入したのだが,エディタが透過するのは個人的に何も嬉しくないので透過しないように調整をしたいと考えた. こういった修正は頻繁にやらないので,透過率を割り当てるためのアプリケーションのWindow Manager Classを調べるのに少し余計な時間を使ってしまった.次回以降の時間節約のために,備忘として記事に残すことにした.

Tags: linux picom
Takafumi Asano · 4 minute read

導入

私はコンポジット型ウィンドウマネージャであるpicomを使用し,WindowsにinactiveOpacityを設定している.

タイル型ウィンドウマネージャであるXMonadを使うようになってから,ウィンドウの重なりを意識する機会はかなり減ったのだが,ウィンドウが非アクティブのときに透過が強く設定されていると便利なことがあるからだ.

一方,エディタやブラウザなどは非アクティブ状態であっても文字がくっきり読めないと困る.

そこで,選択的にOpacityを無効にするためにpicomにopecity-ruleを設定している.picomでopecity-ruleを適用するためには,その適用する対象となるウィンドウプロパティを指定する必要がある.

この設定は一度すると,普段から頻繁にいじるものじゃないため,私はよくアプリケーションのウィンドウプロパティの調査方法を忘れてしまう.

過去にも何度か同じことを検索して時間を無駄に使ったような気がするので,備忘のために記事として残しておくことにした.

VS Code Insidersが透過しないようにする

WM_CLASSの調査

前述の通り,picomのopacity-ruleaを適用するためには,対象を識別するためにWindow Propertyを必要とする.

WM_CLASSプロパティは__インスタンスを示す文字列__と__クラスを示す文字列__を__カンマ区切りで保持する文字列__である.

同一のアプリケーションから起動されたウィンドウであれば,WM_CLASSプロパティに同じ値が入っていることを期待できるため,あるアプリケーションが保持するウィンドウすべてにルールを適用したい場合に便利である.

私は毎回この

  • WM_CLASSプロパティのクラスを使用してアプリケーションが開くウィンドウを識別する
  • WM_CLASSプロパティのクラスを取得する方法

を忘れるてしまう.

閑話休題.

さて,展開しているWindowからWindow Propertyを調べるにはxpropコマンドを使う.

これは実行後,最初にマウスポインタでクリックしたWindow Propertyを出力してくれる.

ウィンドウプロパティは複数有るわけだが,今回確認したいのはWM_CLASSだけなのでgrepしておこう.

$ xprop | grep WM_CLASS

コマンドの実行後,プロンプトは待機状態となる.その状態でWM_CLASSを知りたいウィンドウをクリックすると,ターミナルにプロパティが出力される.今回は起動しているVS Code Insidersのウィンドウをアクティブにした.

$ xprop | grep WM_CLASS                                                   
WM_CLASS(STRING) = "code - insiders", "Code - Insiders

このプロパティは,前述の通りインスタンス名とクラス名をカンマ区切りで保持している.今回使用するのはクラス名なので,後者をつかってopacity-ruleを書く.

picomの設定

クラス名がわかったので,設定をつくる.

opacity-rule = [ 
  "100:class_g = 'Code - Insiders' && focused",
  "100:class_g = 'Code - Insiders'
];

これを~/.config/picom/picom.confに追加して,picom.serviceを再起動する.

無事にVS Code Insidersが透過しなくなった.