bspwm
bspwm はウィンドウがフルバイナリツリーの葉となるタイル型ウィンドウマネージャです。EWMH やマルチモニターに対応しており、メッセージで設定したり制御することができます。
インストール
bspwm と sxhkd をインストールしてください。あるいは開発版も存在します: bspwm-gitAUR と sxhkd-gitAUR。Sxhkd はシンプルな X ホットキーデーモンで、bspc
で bspwm と対話したりアプリケーションを起動したりするのに使います。
スタート
xinit を使用して bspwm
を実行します。
設定
設定例は GitHub や /usr/share/doc/bspwm/examples/
にあります。
重要: $XDG_CONFIG_HOME 環境変数を設定しないと bspwmrc が認識されません。export XDG_CONFIG_HOME="$HOME/.config"
を ~/.profile
に追加してください。
~/.config/bspwm/
と ~/.config/sxhkd/
を作成して、/usr/share/doc/bspwm/examples/bspwmrc
を ~/.config/bspwm/
に、/usr/share/doc/bspwm/examples/sxhkdrc
を ~/.config/sxhkd/
にコピーしてください。そして chmod +x ~/.config/bspwm/bspwmrc
で bspwmrc に実行可能権限を付与してください。
ウィンドウマネージャの設定やキーバインドを設定するファイルは2つ存在します。bspwm/設定例に注釈付きのサンプルがあります。
bspwm のドキュメントは man bspwm
を実行することで確認できます。
sxhkd のドキュメントも man sxhkd
を実行すれば確認できます。
マルチモニターの設定
1つのモニターに10のデスクトップを設定する bspwmrc の例:
bspc monitor -d I II III IV V VI VII VIII IX X
上記の行を修正して、以下のようにモニターごとにデスクトップを追加してください:
bspc monitor DVI-I-1 -d I II III IV bspc monitor DVI-I-2 -d V VI VII bspc monitor DP-1 -d VIII IX X
`xrandr -q` や `bspc query -M` を使うことでモニターの名前を確認できます。
上記の例では、使用するデスクトップの合計は10なので、sxhkdrc で 'super + {1-9,0}' とそれぞれのデスクトップを指定することができます。
ルール
ウィンドウルールを設定する方法は2つあります (cd97a32)。
1番目の方法は組み込まれている rule コマンドを使う方法です。bspwmrc のサンプルでも使われています:
bspc rule -a Gimp desktop=^8 follow=on state=floating bspc rule -a Chromium desktop=^2 bspc rule -a mplayer2 state=floating bspc rule -a Kupfer.py focus=on bspc rule -a Screenkey manage=off
2番目の方法は外部の rule コマンドを使う方法です。こちらの方法は複雑ですが、複雑なウィンドウルールを作成することができます。ルールコマンドの例は こちらのサンプル を見て下さい。
特定のウィンドウが設定したルールのとおりに動かない場合、プログラムのクラス名を確認してください。xprop | grep WM_CLASS
を実行することでクラス名を確認することができます。
パネル
lemonbar を使用する
lemonbar-gitAUR のパネルのサンプルが GitHub ページの examples フォルダに存在します。Lemonbar の wiki ページで何か考えが得られるかもしれません。パネルは bspwmrc の panel &
を置き換えることで実行できます。bspwm パッケージの opt-depends を確認して、必要なパッケージをチェックしてください。
様々なシステムコールを使うことでステータスバーにシステム情報を表示することが可能です。以下の例では panel
を編集して BAR にボリュームの情報を表示します:
panel_volume() { volStatus=$(amixer get Master | tail -n 1 | cut -d '[' -f 4 | sed 's/].*//g') volLevel=$(amixer get Master | tail -n 1 | cut -d '[' -f 2 | sed 's/%.*//g') # is alsa muted or not muted? if [ "$volStatus" == "on" ] then echo "%{Fyellowgreen} $volLevel %{F-}" else # If it is muted, make the font red echo "%{Findianred} $volLevel %{F-}" fi }
次に、パネルを呼び出して $PANEL_FIFO
にパイプするようにしてください:
while true; do echo "S" "$(panel_volume) $(panel_clock)" > "$PANEL_FIFO" sleep 1s done &
yabar を使用する
lemonbar を使用してサンプルパネルを使用するには、環境 (.profile) を設定し、パネルスクリプトがパス上にあることを確認する必要があります。設定するファイルは、 yabarAUR で、設定ファイルは1つだけです。
polybar を使用する
Polybar を使用するには、bspwmrc 設定ファイルに polybar example &
を追加します。example
はバーの名前です。
スクラッチパッド
pid を使う
bspwm のウィンドウフラグを使うことで (i3 のスクラッチパッド機能でターミナルを表示したときのような) ドロップダウンターミナルを模す事ができます。bspwm の設定ファイルの末尾に以下を追加してください (使用しているターミナルエミュレータに置き換えてください):
bspc rule -a scratchpad sticky=on state=floating hidden=on # check scratchpad already running [ "$(ps -x | grep -c 'scratchpad')" -eq "1" ] && st -c scratchpad -e ~/bin/scratch &
スティッキーフラグによってウィンドウが常時デスクトップに表示されるようになります。そして ~/bin/scratch
は以下のようにします:
#!/usr/bin/sh # only add floating scratchpad window node id to /tmp/scratchid bspc query -N -n .floating | xargs -i sh -c 'bspc query --node {} -T | grep -q scratchpad && echo {} > /tmp/scratchid' exec $SHELL
スクラッチパッドを切り替えるホットキーは以下のように指定してください:
id=$(cat /tmp/scratchid);\ bspc node $id --flag hidden;bspc node -f $id
スクラッチパッドでは定義済みのルールがないどんなウィンドウタイプでも使うことができます。参照: [1]。
多数のターミナルに対応して、tmuxinator/tmux のセッションを任意で起動したり、ウィンドウを即座にスクラッチパッドに変えたり、モニターに合わせてスクラッチパッドのサイズを自動的に調整する、高性能なスクラッチパッドスクリプトを探している場合 tdrop-gitAUR を見て下さい。
クラス名を使う
この例では、ドロップダウン端末としてカスタムクラス名を持つ termite を使用します。 termite である必要はありません。
まず、次の内容のファイルをパスに作成し、実行可能にします。この例では、これを scratchpad.sh
と呼びます。
#!/usr/bin/bash if [ -z $1 ]; then echo "Usage: $0 <name of hidden scratchpad window>" exit 1 fi pids=$(xdotool search --class ${1}) for pid in $pids; do echo "Toggle $pid" bspc node $pid --flag hidden -f done
次に、これを bspwm の設定に追加します。
... bspc rule -a dropdown sticky=on state=floating hidden=on termite --class dropdown -e "zsh -i" & ...
ウィンドウを切り替えるには、 sxhkd のカスタムルールが必要です。パラメータとしてカスタムクラス名を指定します。
super + u scratchpad.sh dropdown
その他
事前定義されたルールなしで任意のウィンドウタイプを使用できるスクラッチパッドについては、 [2] を参照してください。
多くの端末を最初からサポートし、オプションで tmuxinator/tmux セッションを開始したり、任意のウィンドウをその場でスクラッチパッドにしたり、現在のモニタに合うように自動的にスクラッチパッドのサイズを変更したりするためのフラグを持つ、より洗練されたスクラッチパッドスクリプトについては、 tdrop-gitAUR を参照してください。
マシンごとにモニターの設定を変える
bspwmrc
はシェルスクリプトなので、以下のように設定することができます:
#! /bin/sh if [[ $(hostname) == 'myhost' ]]; then bspc monitor eDP1 -d I II III IV V VI VII VIII IX X elif [[ $(hostname) == 'otherhost' ]]; then bspc monitor VGA-0 -d I II III IV V bspc monitor VGA-1 -d VI VII VIII IX X elif [[ $(hostname) == 'yetanotherhost' ]]; then bspc monitor DVI-I-3 -d VI VII VIII IX X bspc monitor DVI-I-2 -d I II III IV V fi
全てのウィンドウがフロートするデスクトップの設定
以下はフリーティングウィンドウだけを表示するデスクトップ3を設定するスクリプトです。マルチウィンドウの GIMP などのアプリケーションで役に立ちます。
$PATH の通っているディレクトリに以下のスクリプトを配置して .xinitrc
などから呼び出してください (呼び出すときは末尾に & を付けます):
#!/bin/bash # change the desktop number here FLOATING_DESKTOP_ID=$(bspc query -D -d '^3') bspc subscribe node_manage | while read -a msg ; do desk_id=${msg[2]} wid=${msg[3]} [ "$FLOATING_DESKTOP_ID" = "$desk_id" ] && bspc node "$wid" -t floating done
(ソース)
キーボード
Bspwm はキーボード入力を一切扱わず、代わりに bspc プログラムをインタフェースとして提供します。
キーボードショートカットを使用するには、sxhkd (開発版は sxhkd-gitAUR) のようなホットキーデーモンを設定する必要があります。
トラブルシューティング
画面が表示されずキーバインドが機能しない
デバッグする方法はあまりありません。まず、画面が表示されないのは問題ありません。bspwm が動いているということだからです。
xinitrc が以下のようになっているか確認してください:
sxhkd & exec bspwm
アンパサンド (&) は重要です。次に、xinitrc でターミナルを実行して正しく位置取りがされるか確認してください。画面の"中心"に表示されるはずです。ターミナルを実行するには、.xinitrc
に以下を記述します:
sxhkd & urxvt & exec bspwm
何も表示されない場合、おそらく urxvt がインストールされていません。表示はされるが画面全体を覆ってしまう場合、BSPWM が正しく起動していません。chmod +x ~/.config/bspwm/bspwmrc
を実行したか確認してください。
次に、表示されたターミナルに pidof sxhkd
と入力してみてください。数字が返ってくるはずです。返ってこない場合、sxhd が動いていません。sxhkd -c ~/.config/sxhkd/sxhkdrc
で明示的に実行してみてください。sxhkdrc で Super キーを Alt キーなどに変更して何か変わらないかも確認してください。また、サンプルファイルから (物理的にファイルをコピーしないで) テキストをコピーしたときに何か問題があった可能性もあります。コードをコピーアンドペーストするとインデントに何か不具合が生じることがあり、sxhkd はそれによって上手く動作しなくなったのかもしれません。
カーソルテーマがデスクトップに適用されない
こちらを参照、 カーソルテーマ#形が X のデフォルトカーソルの変更
ウィンドウボックスがアプリケーションよりも大きく表示される
GTK3 アプリを使っている場合にダイアログボックスでこの問題が起こることがあります。gtk3 のテーマファイル (~/.config/gtk-3.0/gtk.css
) に以下を作成・追加することで解決できます:
.window-frame, .window-frame:backdrop { box-shadow: 0 0 0 black; border-style: none; margin: 0; border-radius: 0; } .titlebar { border-radius: 0; }
(ソース: Bspwm フォーラムスレッド)
Java アプリケーションの問題
Java アプリケーションのウィンドウがリサイズできない、メニューがクリックするとすぐ閉じてしまうなどの問題が起こる場合、Java を見て下さい。
fish を使用する場合のキーバインドの問題
fish を使うと、デスクトップが切り替えられなくなります。これは bspc が ^ 文字を使っており fish と互換性がないためです。コマンドを実行するときは bash を使うように sxhkd を設定することで解決できます:
$ set -U SXHKD_SHELL /usr/bin/bash
もしくは、sxhkdrc ファイルの ^ 文字をバックスラッシュでエスケープすることもできます。
fish を使用した時のパフォーマンスの問題
sxhkd は、SHELL 環境変数に設定されたシェルを使用してコマンドを実行します。fish は、設定ファイルが大きいか不適切に設定されているため、初期化に時間がかかる場合があります。そのため、すべての sxhkd コマンドは、他のシェルよりも実行に時間がかかる場合があります。デフォルトのシェルを変更せずにこれを修正するには、sxhkd に明示的に bash を使うように指示するか、別のより高速なシェルでコマンドを実行するように指示します (たとえば、sh)
$ set -U SXHKD_SHELL sh
起動時に "Could not grab key 43 with modfield 68" というエラーメッセージ
同じキーを二回使用としたか、sxhkd を二回起動しようとしています。bspwmrc や ~/.profile
、 ~/.bash_profile
などをチェックして sxhkd を二重に起動してないか確認してください。
右クリックすると Firefox のコンテキストメニューで最初のオプションが自動的に選択される
Firefox プロファイルの userChrome.css
ファイルに次の行を追加します。
#contentAreaContextMenu{ margin: 5px 0 0 5px }
ファイルは ~/.mozilla/firefox/something.default/chrome/
にあります (まだ作成していない場合は作成する必要があります) また、Firefox を起動して、 about:config
ページに移動し、オプション toolkit.legacyUserProfileCustomizations.stylesheets
を有効にする必要があります。そうしないと、 Firefox は userChrome.css ファイルを無視します。
参照
- メーリングリスト: bspwm at librelist.com.
#bspwm
- IRC チャンネル at irc.freenode.net- https://bbs.archlinux.org/viewtopic.php?id=149444 - Arch フォーラムスレッド
- https://github.com/baskerville/bspwm - GitHub プロジェクト
- https://github.com/windelicato/dotfiles/wiki/bspwm-for-dummies - earsplit's "bspwm for dummies"
- https://github.com/smlb/dotfiles/wiki/Bspwm - smlb の wiki