bspwm 平铺式窗口管理器配置


bspwm is a tiling window manager that represents windows as the leaves of a full binary tree. It has support for EWMH and multiple monitors, and is configured and controlled through messages. —From archlinux wiki.


bspwm 和i3wm,openbox 以及其他众多平铺式窗口管理器一样都是比较简洁易配置的窗口管理器。比较适合强迫症和有洁癖的人使用,当然有的人觉得这样的linux才是真正的沉侵式体验。


  • 折腾了下i3和bspwm 这两个都是比较容易配置的窗口管理器(如果有人折腾了openbox或者其他的wm欢迎补充,下面上个bspwm+lemonbar的图,并贴下大概的配置)。
    我的bspwm

  • 贴下配置
  • lemonbar,我分成了三个文件,另外因为我是台式机,所以我把电池去掉了。需要的话自己搜索折腾下
  • 1.panel文件
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    #!/bin/bash
    source ~/.config/bspwm/lemonbar/setup


    while true; do
    # echo $! > pid
    echo "%{U#FCFCFC}%{B$COLOR_HIGHLIGHT F$COLOR_TEXT_HIGHLIGHT}$(power)%{B- F-}$(workspace)$(title)%{r}$(volume)$(network)%{B$COLOR_HIGHLIGHT F$COLOR_TEXT_HIGHLIGHT}$(clock)%{B- F-}"
    sleep 5s
    done |


    lemonbar -p\
    -g x$PANEL_HEIGHT\
    -B "$COLOR_BACKGROUND"\
    -F "$COLOR_FOREGROUND"\
    -u 4\
    -U "#FCFCFC"\
    -f "$PANEL_FONT_FAMILY"\
    -f "$ICON_FONT" | bash

  • 2.setup文件
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    #!/bin/bash


    PANEL_FIFO=/tmp/panel-fifo
    PANEL_HEIGHT=28
    # PANEL_FONT_FAMILY="CamingoCode:size=9"
    PANEL_FONT_FAMILY="hack:size=8"
    #ICON_FONT2="typicons:size=11"
    ICON_FONT="MaterialIcons:size=8"
    COLOR_BACKGROUND="#0F0F0F"
    COLOR_FOREGROUND="#FCFCFC"
    COLOR_HIGHLIGHT="#0F0F0F"
    COLOR_TEXT_HIGHLIGHT="#FFFFFF"
    UPDATE="~/.config/bspwm/lemonbar/update"


    if [ $(pgrep -cx panel) -gt 2 ] ; then
    printf "%s\n" "The panel is already running." >&2
    exit 1
    fi


    trap 'trap - TERM; kill 0' INT TERM QUIT EXIT




    # Power button
    power(){
    echo -e '%{A:oblogout:} \uE8AC %{A}'
    }


    # Clock
    clock(){
    TIME=$(date "+%a %d %b %H:%M")
    echo -e '\uE924' $TIME ' '
    }




    # Networking
    network(){
    NETSTATUS=$(ping -c 1 111.13.101.208 >/dev/null 2>&1 && echo "UP" || echo "DOWN")
    if [ $NETSTATUS = 'UP' ]; then
    icon='\ue1b9'
    ssid=''
    else
    icon='\ue1cf'
    ssid=''
    fi
    echo -e $icon $ssid ' '
    }


    # Volume
    volume(){
    vol=$(amixer get Master | grep % | sed -n 1p | awk -F '[' '{print $2}' | awk -F ']' '{print $1}' | sed s/%//)
    if [ $vol = 0 ]; then
    icon='\uE04F'
    elif [ $vol -lt 33 ]; then
    icon='\uE04E'
    elif [ $vol -lt 66 ]; then
    icon='\uE04D'
    else
    icon='\uE050'
    fi


    echo -e "%{A4:amixer -q set Master 5%+ && ${UPDATE}:}%{A5:amixer -q set Master 5%- && ${UPDATE}:} " $icon $vol'%' ' %{A}%{A}'
    }


    # Workspace
    workspace() {
    wslist=$(\
    wmctrl -d \
    | awk '/ / {print $2 $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20}' ORS=''\
    | sed -e 's/\s* //g' \
    -e 's/\*[ 0-9A-Za-z]*[^ -~]*/\\uE3FA /g' \
    -e 's/\-[ 0-9A-Za-z]*[^ -~]*/%{A:i3-msg workspace & \&\& \~\/.config\/lemonbar\/update:}\\uE836 %{A}/g' \
    -e 's/\*//g' \
    -e 's/ -/ /g' \
    )


    if (( $(wmctrl -d | wc -l) == 10)); then
    new=""
    else
    new=$(\
    wmctrl -d\
    | rev\
    | cut -c 1\
    | awk -v RS='\\s+' '{ a[$1] } END { for(i = 1; i in a; ++i); print i }'\
    )
    new="%{A:i3-msg workspace $new && ${UPDATE}:}\uE3BA%{A}"
    fi


    echo -n -e " $wslist$new"
    }


    title(){
    title=$(xdotool getactivewindow getwindowname)
    echo " [$title]" | cut -c 1-70
    }

  • 3.update文件(如果不kill的话panel或直接僵死掉,目前也并不是完美的,依然有几率会出现panel僵死,求解决办法)

    1
    2
    3
    4
    #!/bin/bash

    # TODO: make this less hacky.
    pkill -f "sleep 5s"
  • 更多配置请参考 google+