bspwm

提供: ArchWiki
ナビゲーションに移動 検索に移動

関連記事

bspwm はウィンドウがフルバイナリツリーの葉となるタイル型ウィンドウマネージャです。EWMH やマルチモニターに対応しており、メッセージで設定したり制御することができます。

インストール

bspwmsxhkdインストールしてください。あるいは開発版も存在します: bspwm-gitAURsxhkd-gitAUR Sxhkd はシンプルな X ホットキーデーモンで、bspc で bspwm と対話したりアプリケーションを起動したりするのに使います。

ノート: 2020年8月以降リリースはありません。問題が発生した場合、または不足している機能が必要な場合は、Git パッケージをインストールして下さい。

スタート

xinit を使用して bspwm を実行します。

設定

設定例は /usr/share/doc/bspwm/examples/ にあります。

そこから bspwmrc~/.config/bspwm/ にコピー/インストールし、sxhkdrc~/.config/sxhkd/ にコピー/インストールします。

ファイル bspwmrc に実行可能権限を付与して下さい。これは、デフォルトの例が単純にシェルスクリプトであるためです。 bspc コマンドを使用して bspwm を設定します。

$ install -Dm755 /usr/share/doc/bspwm/examples/bspwmrc ~/.config/bspwm/bspwmrc
$ install -Dm644 /usr/share/doc/bspwm/examples/sxhkdrc ~/.config/sxhkd/sxhkdrc

これら2つのファイルは、それぞれ wm 設定とキー割り当てを設定する場所です。

詳細なドキュメントについては、bspwm(1) および sxhkd(1) のマニュアルを参照してください。

マルチモニターの設定

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}' とそれぞれのデスクトップを指定することができます。

ルール

bspwmは、ICCM で指定された WM_CLASS プロパティ内の2番目の文字列(クラス名)に基づいてウィンドウにルールを適用できます。クラス名を確認するには、次の方法を使用できます:

  1. xorg-xpropインストール
  2. xprop | grep WM_CLASS を実行します。
  3. 対象のウィンドウをクリックして、それを xprop に指示します。
  4. コマンドの出力から "2番目" の文字列を記録します。

ウィンドウルールを設定する方法は2つあります (cd97a32)

1つ目は、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 コマンドを使う方法です。こちらの方法は複雑ですが、多様ななウィンドウルールを作成することができます。ルールコマンドの例は こちらのサンプル を見て下さい。

パネル

lemonbar を使用する

lemonbar-gitAUR 用のサンプルパネルは、GitHub ページの examples フォルダに用意されています。また、lemonbar の Wiki ページからも参考になる情報が得られるかもしれません。このパネルは、bspwmrc に panel & を配置することで実行されます。必要になる可能性がある依存関係については、bspwm パッケージの optdepends を確認してください。

ステータス バーにシステム情報を表示するには、さまざまなシステム コールを使用できます。この例では、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 &

polybar を使用する

Polybar を使用するには、bspwmrc 設定ファイルに polybar example & を追加します。example はバーの名前です。

スクラッチパッド

pid を使う

ドロップダウンターミナルをエミュレートできます。

まず、/usr/local/bin/scratch というファイルを作成します:

#!/bin/bash

name="$1"
filename=/tmp/"$1"

bspc_write_nodeid() {
    while true
    do
        flag=false
        for id in $(bspc query -d focused -N -n .floating.sticky.hidden)
        do
            bspc query --node $id -T | grep -q $name && { echo $id > $filename; flag=true; break; }
        done
        [[ "$flag" == "true" ]] && break
        sleep 0.1s
    done
}

hide_all_except_current(){
    for id in $(bspc query -d focused -N -n .floating.sticky.!hidden)
    do
        bspc query --node $id -T | grep -qv $name && bspc node $id --flag hidden=on
    done
}

toggle_hidden() {
    [ -e "$filename" ] || exit 1
    hide_all_except_current
    id=$(<$filename)
    bspc node $id --flag hidden -f
}

create_terminal(){
    alacritty --class="$name","$name" -e $1 &
}

if ! ps -ef | grep -q "[c]lass=$name"
then
    bspc rule -a "$name" --one-shot state=floating sticky=on hidden=on
    case "$name" in
        "htop")
            create_terminal htop
            ;;
        "neomutt")
            create_terminal neomutt
            ;;
        "newsboat")
            create_terminal newsboat
            ;;
        "ranger")
            create_terminal ranger
            ;;
        "terminal")
            create_terminal $SHELL
            ;;
        *)
            exit 1
    esac
    dunstify "Scratch: starting $name"
    bspc_write_nodeid
    toggle_hidden
else
    toggle_hidden
fi

ここでは、terminal アプリケーションは Alacritty を使っています。スクリプト内のクラス指定やコマンド実行を使用する他のターミナルに変更してください:

 
alacritty --class="$name","$name" -e $1 &

スクラッチパッドを切り替えるには、~/.config/sxhkd/sxhkdrc を変更します:

# scratchpads
super + alt + {b,g,i,space,t}
    scratch {newsboat,neomutt,ranger,terminal,htop}
Polybar を使用したスクラッチパッドのステータス

polybar の設定を次のように変更します:

 
modules-left = scratchpad

[module/scratchpad]
type = custom/script
interval = 0.1
exec = $XDG_CONFIG_HOME/polybar/scratchpads_status.sh

そして、次の内容でファイル $XDG_CONFIG_HOME/polybar/scratchpads_status.sh を作成します。

 
#!/bin/bash

names="
htop H
neomutt M
newsboat N
ranger R
terminal T
"
status=""
cmd=$(ps -ef)

check_scratchpad() {
    grep -q "[c]lass=$1" <<< "$cmd"
}

IFS=$'\n'
for name in $names
do
    status+=$(check_scratchpad ${name% *} && echo ${name#* })
done

if [ -n "$status" ]
then
    echo "[$status]"
else
    echo ""
fi

クラス名を使う

この例では、ドロップダウン端末としてカスタムクラス名を持つ 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

その他

事前定義されたルールなしで任意のウィンドウタイプを使用できるスクラッチパッドについては、 [1] を参照してください。

多くの端末を最初からサポートし、オプションで 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 を二重に起動してないか確認してください。

参照