diff options
| author | Daniel Schadt <kingdread@gmx.de> | 2016-08-22 23:06:24 +0200 | 
|---|---|---|
| committer | Daniel Schadt <kingdread@gmx.de> | 2016-08-22 23:06:24 +0200 | 
| commit | ea50a8561ef706526952d0a6109ae2dcd7bb6f37 (patch) | |
| tree | 3779e6a0ff29207bc23c69a34b7ffb72116cac09 /herbstluftwm | |
| download | dotfiles-ea50a8561ef706526952d0a6109ae2dcd7bb6f37.tar.gz dotfiles-ea50a8561ef706526952d0a6109ae2dcd7bb6f37.tar.bz2 dotfiles-ea50a8561ef706526952d0a6109ae2dcd7bb6f37.zip | |
add basic dotfiles
Dotfiles for zsh, vim and herbstluftwm!
Diffstat (limited to 'herbstluftwm')
| -rwxr-xr-x | herbstluftwm/.config/herbstluftwm/autostart | 186 | ||||
| -rwxr-xr-x | herbstluftwm/.config/herbstluftwm/panel.sh | 204 | 
2 files changed, 390 insertions, 0 deletions
| diff --git a/herbstluftwm/.config/herbstluftwm/autostart b/herbstluftwm/.config/herbstluftwm/autostart new file mode 100755 index 0000000..0d67429 --- /dev/null +++ b/herbstluftwm/.config/herbstluftwm/autostart @@ -0,0 +1,186 @@ +#!/bin/bash + +DMENU='dmenu_run -l 8 -fn "inconsolata-8"' + +hc() { +    herbstclient "$@" +} + +hc emit_hook reload + +xsetroot -solid '#5A8E3A' +xset -b +setxkbmap -option grp:alt_space_toggle "de(nodeadkeys),ru" + +# remove all existing keybindings +hc keyunbind --all + + +#feh --no-fehbg --bg-center ~/Pictures/Death_note_l_1366x768.jpg +#feh --no-fehbg --bg-fill ~/Pictures/Music\ Wallpapers/defeater.jpg +#feh --no-fehbg --bg-fill ~/Pictures/house-m.d.-wallpaper-17.jpg +feh --no-fehbg --bg-fill ~/Pictures/NmigJ3H.jpg + +# keybindings +# if you have a super key you will be much happier with Mod set to Mod4 +#Mod=Mod1    # Use alt as the main modifier +Mod=Mod4     # Use the super key as the main modifier + +hc keybind $Mod-Escape spawn setxkbmap de nodeadkeys +hc keybind $Mod-Shift-q quit +hc keybind $Mod-Shift-r reload +hc keybind $Mod-Shift-c close +hc keybind $Mod-Return spawn urxvt +hc keybind $Mod-d spawn $DMENU +hc keybind $Mod-Shift-d spawn ~/Code/pappymenu/pappymenu.py +hc keybind $Mod-q close_or_remove + +# volume management +hc keybind XF86AudioLowerVolume spawn amixer set Master,0 1%- +hc keybind XF86AudioRaiseVolume spawn amixer set Master,0 1%+ +hc keybind $Mod-XF86AudioLowerVolume spawn amixer set Master,0 5%- +hc keybind $Mod-XF86AudioRaiseVolume spawn amixer set Master,0 5%+ + +# basic movement +# focusing clients +hc keybind $Mod-Left  focus left +hc keybind $Mod-Down  focus down +hc keybind $Mod-Up    focus up +hc keybind $Mod-Right focus right +hc keybind $Mod-h     focus left +hc keybind $Mod-j     focus down +hc keybind $Mod-k     focus up +hc keybind $Mod-l     focus right + +# moving clients +hc keybind $Mod-Shift-Left  shift left +hc keybind $Mod-Shift-Down  shift down +hc keybind $Mod-Shift-Up    shift up +hc keybind $Mod-Shift-Right shift right +hc keybind $Mod-Shift-h     shift left +hc keybind $Mod-Shift-j     shift down +hc keybind $Mod-Shift-k     shift up +hc keybind $Mod-Shift-l     shift right + +# splitting frames +# create an empty frame at the specified direction +hc keybind $Mod-u       split   bottom  0.5 +hc keybind $Mod-o       split   right   0.5 +# let the current frame explode into subframes +hc keybind $Mod-Control-space split explode + +# resizing frames +resizestep=0.05 +hc keybind $Mod-Control-h       resize left +$resizestep +hc keybind $Mod-Control-j       resize down +$resizestep +hc keybind $Mod-Control-k       resize up +$resizestep +hc keybind $Mod-Control-l       resize right +$resizestep +hc keybind $Mod-Control-Left    resize left +$resizestep +hc keybind $Mod-Control-Down    resize down +$resizestep +hc keybind $Mod-Control-Up      resize up +$resizestep +hc keybind $Mod-Control-Right   resize right +$resizestep + +# tags +tag_names=( {1..9} ) +tag_keys=( {1..9} 0 ) + +hc rename default "${tag_names[0]}" || true +for i in ${!tag_names[@]} ; do +    hc add "${tag_names[$i]}" +    key="${tag_keys[$i]}" +    if ! [ -z "$key" ] ; then +        hc keybind "$Mod-$key" use_index "$i" +        hc keybind "$Mod-Shift-$key" move_index "$i" +    fi +done + +# cycle through tags +hc keybind $Mod-period use_index +1 --skip-visible +hc keybind $Mod-comma  use_index -1 --skip-visible + +# layouting +hc keybind $Mod-r remove +hc keybind $Mod-space cycle_layout 1 +hc keybind $Mod-s floating toggle +hc keybind $Mod-f fullscreen toggle +hc keybind $Mod-p pseudotile toggle + +# mouse +hc mouseunbind --all +hc mousebind $Mod-Button1 move +hc mousebind $Mod-Button2 zoom +hc mousebind $Mod-Button3 resize + +# focus +hc keybind $Mod-BackSpace   cycle_monitor +hc keybind $Mod-Tab         cycle_all +1 +hc keybind $Mod-Shift-Tab   cycle_all -1 +hc keybind $Mod-c cycle +hc keybind $Mod-y spawn rofi -show window +hc keybind $Mod-i jumpto urgent + +# theme +hc attr theme.tiling.reset 1 +hc attr theme.floating.reset 1 +hc set frame_border_active_color '#222222' +hc set frame_border_normal_color '#101010' +hc set frame_bg_normal_color '#565656' +hc set frame_bg_active_color '#345F0C' +hc set frame_border_width 1 +hc set always_show_frame 1 +hc set frame_bg_transparent 1 +hc set frame_transparent_width 5 +hc set frame_gap 4 + +hc attr theme.active.color '#9fbc00' +hc attr theme.normal.color '#454545' +hc attr theme.urgent.color orange +hc attr theme.inner_width 1 +hc attr theme.inner_color black +hc attr theme.border_width 3 +hc attr theme.floating.border_width 4 +hc attr theme.floating.outer_width 1 +hc attr theme.floating.outer_color black +hc attr theme.active.inner_color '#3E4A00' +hc attr theme.active.outer_color '#3E4A00' +hc attr theme.background_color '#141414' + +hc set window_gap 0 +hc set frame_padding 0 +hc set smart_window_surroundings 0 +hc set smart_frame_surroundings 1 +hc set mouse_recenter_gap 0 + +# rules +hc unrule -F +#hc rule class=XTerm tag=3 # move all xterms to tag 3 +hc rule focus=on # normally focus new clients +#hc rule focus=off # normally do not focus new clients +# give focus to most common terminals +#hc rule class~'(.*[Rr]xvt.*|.*[Tt]erm|Konsole)' focus=on +hc rule windowtype~'_NET_WM_WINDOW_TYPE_(DIALOG|UTILITY|SPLASH)' pseudotile=on +hc rule windowtype='_NET_WM_WINDOW_TYPE_DIALOG' focus=on +hc rule windowtype~'_NET_WM_WINDOW_TYPE_(NOTIFICATION|DOCK|DESKTOP)' manage=off + +# unlock, just to be sure +hc unlock + +herbstclient set tree_style '╾│ ├└╼─┐' + +# do multi monitor setup here, e.g.: +# hc set_monitors 1280x1024+0+0 1280x1024+1280+0 +# or simply: +# hc detect_monitors + +# find the panel +panel=~/.config/herbstluftwm/panel.sh +[ -x "$panel" ] || panel=/etc/xdg/herbstluftwm/panel.sh +for monitor in $(herbstclient list_monitors | cut -d: -f1) ; do +    # start it on each monitor +    "$panel" $monitor & +done + +[[ -z "$(pidof nm-applet)" ]] && nm-applet & +[[ -z "$(pidof pasystray)" ]] && pasystray >/dev/null 2>&1 & +pgrep -f /usr/bin/udiskie >/dev/null || udiskie -ans & + diff --git a/herbstluftwm/.config/herbstluftwm/panel.sh b/herbstluftwm/.config/herbstluftwm/panel.sh new file mode 100755 index 0000000..57a95b1 --- /dev/null +++ b/herbstluftwm/.config/herbstluftwm/panel.sh @@ -0,0 +1,204 @@ +#!/bin/bash + +hc() { "${herbstclient_command[@]:-herbstclient}" "$@" ;} +monitor=${1:-0} +geometry=( $(herbstclient monitor_rect "$monitor") ) +if [ -z "$geometry" ] ;then +    echo "Invalid monitor $monitor" +    exit 1 +fi +# geometry has the format W H X Y +x=${geometry[0]} +y=${geometry[1]} +tray_width=200 +panel_width=$(( ${geometry[2]} - $tray_width )) +panel_height=16 +font="-*-fixed-medium-*-*-*-12-*-*-*-*-*-*-*" +bgcolor=$(hc get frame_border_normal_color) +selbg=$(hc get window_border_active_color) +selfg='#101010' + +#### +# Try to find textwidth binary. +# In e.g. Ubuntu, this is named dzen2-textwidth. +if which textwidth &> /dev/null ; then +    textwidth="textwidth"; +elif which dzen2-textwidth &> /dev/null ; then +    textwidth="dzen2-textwidth"; +else +    echo "This script requires the textwidth tool of the dzen2 project." +    exit 1 +fi +#### +# true if we are using the svn version of dzen2 +# depending on version/distribution, this seems to have version strings like +# "dzen-" or "dzen-x.x.x-svn" +if dzen2 -v 2>&1 | head -n 1 | grep -q '^dzen-\([^,]*-svn\|\),'; then +    dzen2_svn="true" +else +    dzen2_svn="" +fi + +if awk -Wv 2>/dev/null | head -1 | grep -q '^mawk'; then +    # mawk needs "-W interactive" to line-buffer stdout correctly +    # http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=593504 +    uniq_linebuffered() { +      awk -W interactive '$0 != l { print ; l=$0 ; fflush(); }' "$@" +    } +else +    # other awk versions (e.g. gawk) issue a warning with "-W interactive", so +    # we don't want to use it there. +    uniq_linebuffered() { +      awk '$0 != l { print ; l=$0 ; fflush(); }' "$@" +    } +fi + +hc pad $monitor $panel_height + +{ +    ### Event generator ### +    # based on different input data (mpc, date, hlwm hooks, ...) this generates events, formed like this: +    #   <eventname>\t<data> [...] +    # e.g. +    #   date    ^fg(#efefef)18:33^fg(#909090), 2013-10-^fg(#efefef)29 + +    #mpc idleloop player & +    while true ; do +        # "date" output is checked once a second, but an event is only +        # generated if the output changed compared to the previous run. +        echo -e "addinfo\t^fg(#ff2200)$USER^fg()@^fg(#22ff00)$(hostname)^fg() -"\ +            "Vol: ^fg(#66FF30)$(volume.sh)^fg() - Bat: ^fg(#66FF30)$(battery.sh)" +        # date +$'date\t^fg(#efefef)%H:%M^fg(#909090), %Y-%m-^fg(#efefef)%d' +        date +$'date\t^fg(#efefef)%H:%M:%S^fg(#909090), %Y-%m-^fg(#efefef)%d' +        sleep 0.5 || break +    done > >(uniq_linebuffered) & +    childpid=$! +    hc --idle +    kill $childpid +} 2> /dev/null | { +    IFS=$'\t' read -ra tags <<< "$(hc tag_status $monitor)" +    visible=true +    date="" +    windowtitle="" +    addinfo="" +    while true ; do + +        ### Output ### +        # This part prints dzen data based on the _previous_ data handling run, +        # and then waits for the next event to happen. +        #echo -n "^bg(#505050)^ca(1,~/Code/pappymenu/pappymenu.py) Apps ^ca()^bg()" +        #echo -n "$separator" +        bordercolor="#26221C" +        separator="^bg()^fg($selbg)|" +        # draw tags +        for i in "${tags[@]}" ; do +            case ${i:0:1} in +                '#') +                    echo -n "^bg($selbg)^fg($selfg)" +                    ;; +                '+') +                    echo -n "^bg(#9CA668)^fg(#141414)" +                    ;; +                ':') +                    echo -n "^bg()^fg(#ffffff)" +                    ;; +                '!') +                    echo -n "^bg(#FF0675)^fg(#141414)" +                    ;; +                *) +                    echo -n "^bg()^fg(#ababab)" +                    ;; +            esac +            if [ ! -z "$dzen2_svn" ] ; then +                # clickable tags if using SVN dzen +                echo -n "^ca(1,\"${herbstclient_command[@]:-herbstclient}\" " +                echo -n "focus_monitor \"$monitor\" && " +                echo -n "\"${herbstclient_command[@]:-herbstclient}\" " +                echo -n "use \"${i:1}\") ${i:1} ^ca()" +            else +                # non-clickable tags if using older dzen +                echo -n " ${i:1} " +            fi +        done +        echo -n "$separator" +        echo -n "^bg()^fg() ${windowtitle//^/^^}" +        # small adjustments +        right="$separator $addinfo $separator^bg() $date $separator" +        right_text_only=$(echo -n "$right" | sed 's.\^[^(]*([^)]*)..g') +        # get width of right aligned text.. and add some space.. +        width=$($textwidth "$font" "$right_text_only    ") +        echo -n "^pa($(($panel_width - $width)))$right" +        echo + +        ### Data handling ### +        # This part handles the events generated in the event loop, and sets +        # internal variables based on them. The event and its arguments are +        # read into the array cmd, then action is taken depending on the event +        # name. +        # "Special" events (quit_panel/togglehidepanel/reload) are also handled +        # here. + +        # wait for next event +        IFS=$'\t' read -ra cmd || break +        # find out event origin +        case "${cmd[0]}" in +            tag*) +                #echo "resetting tags" >&2 +                IFS=$'\t' read -ra tags <<< "$(hc tag_status $monitor)" +                ;; +            date) +                #echo "resetting date" >&2 +                date="${cmd[@]:1}" +                ;; +            addinfo) +                #echo "resetting info" >&2 +                addinfo="${cmd[@]:1}" +                ;; +            quit_panel) +                exit +                ;; +            togglehidepanel) +                currentmonidx=$(hc list_monitors | sed -n '/\[FOCUS\]$/s/:.*//p') +                if [ "${cmd[1]}" -ne "$monitor" ] ; then +                    continue +                fi +                if [ "${cmd[1]}" = "current" ] && [ "$currentmonidx" -ne "$monitor" ] ; then +                    continue +                fi +                echo "^togglehide()" +                if $visible ; then +                    visible=false +                    hc pad $monitor 0 +                else +                    visible=true +                    hc pad $monitor $panel_height +                fi +                ;; +            reload) +                exit +                ;; +            focus_changed|window_title_changed) +                windowtitle="${cmd[@]:2}" +                ;; +            #player) +            #    ;; +        esac +    done + +    ### dzen2 ### +    # After the data is gathered and processed, the output of the previous block +    # gets piped to dzen2. + +} 2> /dev/null | dzen2 -w $panel_width -x $x -y $y -fn "$font" -h $panel_height \ +    -e 'button3=;button4=exec:herbstclient use_index -1;button5=exec:herbstclient use_index +1' \ +    -ta l -bg "$bgcolor" -fg '#efefef' & + +pids+=($!) + +trayer --edge top --align right --widthtype pixel --width $tray_width --heighttype pixel --height 16 \ +    --tint "0xff${bgcolor:1}" --transparent true --alpha 0 & + +pids+=($!) + +herbstclient --wait '^(quit|reload).*' +kill -TERM "${pids[@]}" >/dev/null 2>&1 | 
