Picom
Picom は軽量なスタンドアロン型のコンポジットマネージャです。コンポジット機能が含まれていない Xorg のウィンドウマネージャを使っている場合に向いています。Picom は compton のフォークであり、compton は xcompmgr-dana のフォークですが、xcompmgr-dana は xcompmgr のフォークです。
Picom は大量にあった先行者のバグを修正していることで特に有名で、信頼性があり安定しているということで人気があります。他にも、高速な GLX (OpenGL) バックエンド (デフォルトでは無効になっています) やデフォルトのアクティブ・インアクティブウィンドウの透過、ウィンドウの枠の透過、ウィンドウの背景のブラー、ウィンドウの色の反転、描画レートの調整、垂直同期、条件で分岐する細かい制御、設定ファイルの読み込み、D-Bus の制御など、多数の改善や設定オプションが実装されています。
目次
- 1 インストール
- 2 設定
- 3 使用方法
- 4 マルチディスプレイ
- 5 トラブルシューティング
- 5.1 Conky
- 5.2 dwm と dmenu
- 5.3 Firefox
- 5.4 Slock
- 5.5 ちらつき
- 5.6 フルスクリーン画面でティアリングが発生する
- 5.7 xft フォントを使用した場合にラグが発生する
- 5.8 AMD の Catalyst ドライバーを使ってる場合に画面に問題が発生する
- 5.9 タブ化したウィンドウ (影と透過)
- 5.10 xsetroot で背景色が変えられない
- 5.11 NVIDIA のプロプライエタリドライバーでちらつきが発生する
- 5.12 Nvidia のプロプライエタリドライバーと FullCompositionPipeline でラグが発生する
- 5.13 Nvidia のプロプライエタリドライバーで Xorg によって GPU のメモリリークが発生する
- 5.14 サスペンド後の Slock
- 6 参照
インストール
picom パッケージをインストールしてください。git 版を使う場合、picom-gitAUR をインストールしてください。また、Qt ベースの設定 GUI を compton-confAUR または compton-conf-gitAUR をインストールすることで使うことができます。
設定
デフォルトの設定は /etc/xdg/picom.conf
にあります。 ~/.config/picom.conf
や ~/.config/picom/picom.conf
、~/.picom.conf
にコピーしてカスタマイズできます。
picom でカスタム設定ファイルを使うには、次のコマンドを使用:
$ picom --config path/to/picom.conf
一部ウィンドウの影を無効化
picom が影を描画することによって、一部のアプリケーションでは見た目がおかしくなってしまうことがあります。shadow-exclude
オプションで picom の影を無効にできます。現在無効になっているウィンドウについては [1] を見てください。
メニューの影を無効化するには picom.conf
wintypes に以下を追加してください:
# menu = { shadow = false; }; dropdown_menu = { shadow = false; }; popup_menu = { shadow = false; }; utility = { shadow = false; };
透過
選択・非選択ウィンドウの透過率を設定するには、以下を picom.conf
に追加 (例: ターミナルエミュレータ):
opacity-rule = [ "90:class_g = 'URxvt' && focused", "60:class_g = 'URxvt' && !focused" ];
#タブ化したウィンドウ (影と透過)も見てください。
使用方法
Picom はいつでも手動で有効化・無効化することができます。また、バックグラウンドで自動起動 (デーモン) することも可能です。また、コンポジット効果を設定できる任意の引数もあります。引数の一部:
-b
: バックグラウンドプロセス (デーモン) で実行 (例: Openbox などのウィンドウマネージャで自動起動する場合)-c
: 影効果を有効化-C
: パネルとドックの影効果を無効化-G
: アプリケーションウィンドウとドラッグアンドドロップオブジェクトの影効果を無効化--config
: 指定した設定ファイルを使用
他にも、タイミングの設定や、管理するディスプレイ、メニューやウィンドウの縁、インアクティブアプリケーションメニューの透過度など多数のオプションが存在します。詳しくは picom(1) を見て下さい。
セッション中にデフォルトのコンポジット効果を手動で有効化するには、次のコマンドを使用:
$ picom
また、影効果を全て無効化するには、-C
と -G
引数を追加します:
$ picom -CG
バックグラウンドプロセス (デーモン) として picom を自動起動するには、-b
引数を使います:
$ picom -b
デーモンプロセスの影効果を全て無効化するには、-C
と -G
引数を追加:
$ picom -CGb
以下は引数を追加して必要な値を設定した例です:
$ picom -cCGfF -o 0.38 -O 200 -I 200 -t 0 -l 0 -r 3 -D2 -m 0.88
マルチディスプレイ
xinerama を使わずにマルチディスプレイの設定をしている場合 (複数のスクリーンで X サーバーを実行している場合)、デフォルトでは picom は一つのスクリーンでしか起動しません。DISPLAY
環境変数を使うことで全てのスクリーンで実行させることができます。
例えば、バックグラウンドで X スクリーン 0 で実行する場合:
DISPLAY=":0" picom -b
上記はすべてのモニタで動作するはずですが、動作しない場合は手動で各モニタを指定する古い方法を試してみてください。
seq 0 3 | xargs -l1 -I@ picom -b -d :0.@
トラブルシューティング
最近のバージョンの picom には DRI2 アクセラレーションに問題があり、DRI2 を使っているときにちらつきが発生していました (picom バグ, mesa バグ)。対処策によって問題は解決していますが、一部のユーザーにはまだ問題が残っているという報告があります。DRI3 にはこのような問題はありません。
他のアプリケーションやプログラムで正しい設定をしていない場合、コンポジット効果を有効にすることで外観がおかしくなる問題が発生することがあります。
Conky
Conky のウィンドウの影を無効化するには、~/.conkyrc
に以下を記述します:
own_window_class conky
dwm のステータスバーは picom の関数から検出されず、自動的にウィンドウマネージャのエレメントが除外されることはありません。また、dwm のステータスバーと dmenu のどちらもウィンドウ id は固定されていません。ステータスバーがウィンドウ透過しないようにしたい場合、ソースコードのウィンドウクラスにパッチをあてるか、他の属性を使って除外してください。dmenu と dwm のステータスバーを上部に表示している場合、位置によって指定することができます:
$ picom <any other arguments> --focus-exclude "x = 0 && y = 0 && override_redirect = true"
もしくは、設定ファイルを使う場合:
focus-exclude = "x = 0 && y = 0 && override_redirect = true";
上書きリダイレクトプロパティは大抵のウィンドウでは false になっています。それによって左下に配置された他のウィンドウが除外されることを防げます (例えば、dwm ステータスバーが非表示になった場合、x0 y0 は dwm のマスタースタックにある全てのウィンドウにマッチします)。
Firefox
#一部ウィンドウの影を無効化を見てください。
Firefox の部品の影を無効化するには picom.conf
の shadow-exclude に以下を追加します:
"class_g = 'firefox' && argb",
詳しくは [2] を参照。
Slock
インアクティブウィンドウの透過を有効にしている場合 (コマンドで実行している場合 -i
引数)、slock を使っているときに問題が発生します。透過度を 0.2
にすることで解決します。例えばコマンドで picom を実行する場合:
$ picom <any other arguments> -i 0.2
または、設定ファイルを使う場合:
inactive-dim = 0.2;
もしくは、slock のウィンドウ ID を使用して slock を除外したり、名前がないウィンドウを全て除外する方法もあります。
名前がないウィンドウを全て picom から除外するには:
$ picom <other arguments> --focus-exclude "! name~="
次のコマンドを実行することで slock のウィンドウ id を確認できます:
$ xwininfo & slock
画面の何処かを (slock が終了する前に) 素早くクリックして、パスワードを入力してロックを解除してください。以下のようにウィンドウ id が出力されます:
xwininfo: Window id: 0x1800001 (has no name)
取得できたウィンドウ id を使って picom から除外するには:
$ picom <any other arguments> --focus-exclude 'id = 0x1800001'
もしくは、設定ファイルを使う場合:
focus-exclude = "id = 0x1800001";
ちらつき
デフォルトの picom.conf
を使っているときに最大化されたウィンドウでちらつきが発生する場合、以下のオプションで解決できます:
unredir-if-possible = false;
詳しくは [3] を参照。
フルスクリーン画面でティアリングが発生する
フルスクリーンでビデオ再生するとティアリングが発生する場合、ちらつき を参照してください。
xft フォントを使用した場合にラグが発生する
xterm や urxvt などのアプリケーションで Xft フォントを使用した場合に酷いラグが発生する場合、以下のオプションを使ってみてください:
--xrender-sync --xrender-sync-fence
もしくは xrender バックエンドを使ってみてください。
詳しくは [4] を参照。
AMD の Catalyst ドライバーを使ってる場合に画面に問題が発生する
次の引数を付けて picom を起動するか:
--backend xrender
picom.conf
ファイルに以下を追加してください:
backend = "xrender";
詳しくは https://github.com/chjj/compton/issues/208 を参照。
タブ化したウィンドウ (影と透過)
透過されたウィンドウがタブ化されているとき、下のタブになっているウィンドウが見えてしまいます。タブ化されたウィンドウそれぞれが影を描画するため、影が重なります。
既存の shadow-exclude リスト に以下を追加することで重複する影の問題を解決できます:
"_NET_WM_STATE@:32a *= '_NET_WM_STATE_HIDDEN'"
また、picom.conf
に以下を追加することで下のタブになっているウィンドウを描画しないようにできます:
opacity-rule = [ "95:class_g = 'URxvt' && !_NET_WM_STATE@:32a", "0:_NET_WM_STATE@[0]:32a *= '_NET_WM_STATE_HIDDEN'", "0:_NET_WM_STATE@[1]:32a *= '_NET_WM_STATE_HIDDEN'", "0:_NET_WM_STATE@[2]:32a *= '_NET_WM_STATE_HIDDEN'", "0:_NET_WM_STATE@[3]:32a *= '_NET_WM_STATE_HIDDEN'", "0:_NET_WM_STATE@[4]:32a *= '_NET_WM_STATE_HIDDEN'" ];
URxvt
はあなたが使っているターミナルの Xorg クラスに置き換えてください。xprop WM_CLASS
コマンドを実行してからウィンドウをクリックすることでウィンドウのクラスを確認できます。
詳しくは [5] を参照。
xsetroot で背景色が変えられない
現在、picom は xsetroot
の -solid
オプションと互換性がありません。解決方法としては hsetroot を使って背景色を設定するようにしてください:
$ hsetroot -solid '#000000'
詳しくは https://github.com/chjj/compton/issues/162 を参照。
NVIDIA のプロプライエタリドライバーでちらつきが発生する
picom.conf
で以下のように設定してみてください:
vsync = true
Nvidia のプロプライエタリドライバーと FullCompositionPipeline でラグが発生する
#AMD の Catalyst ドライバーを使ってる場合に画面に問題が発生する を見てください。
Nvidia のプロプライエタリドライバーで Xorg によって GPU のメモリリークが発生する
#AMD の Catalyst ドライバーを使ってる場合に画面に問題が発生する を見てください。
サスペンド後の Slock
systemd サービスを使ってサスペンド・ハイバネート時に slock を起動している場合、復帰後に画面のロックが解除されてしまうことがあります。問題を解決するには、ウィンドウフェーディングを無効化してください:
$ picom --no-fading-openclose