commit d021a7a3910653de3f63a295c421af7155757805 parent 2d6eacfa59c6b04173fd41c8de255e2d1e24652d Author: dudley <pyratebeard@gmail.com> Date: Fri, 18 Nov 2016 12:10:45 +0000 new herbstluftwm config Diffstat:
A | herbstluftwm/.config/herbstluftwm/autostart | | | 185 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
A | herbstluftwm/.config/herbstluftwm/panel.sh | | | 196 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
A | herbstluftwm/.xinitrc | | | 75 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
A | herbstluftwm/.zprofile | | | 2 | ++ |
A | herbstluftwm/bin/calendar | | | 15 | +++++++++++++++ |
A | herbstluftwm/bin/herbstluftwm-add-gap | | | 12 | ++++++++++++ |
A | herbstluftwm/bin/herbstluftwm-remove-gap | | | 12 | ++++++++++++ |
7 files changed, 497 insertions(+), 0 deletions(-)
diff --git a/herbstluftwm/.config/herbstluftwm/autostart b/herbstluftwm/.config/herbstluftwm/autostart @@ -0,0 +1,185 @@ +#!/bin/sh +# +# ██ ██ ██ ██ ████ ██ +# ░██ ░██ ░██ ░██ ░██░ ░██ +# ░██ █████ ██████░██ ██████ ██████ ░██ ██ ██ ██████ ██████ +# ░██████ ██░░░██░░██░░█░██████ ██░░░░ ░░░██░ ░██░██ ░██░░░██░ ░░░██░ +# ░██░░░██░███████ ░██ ░ ░██░░░██░░█████ ░██ ░██░██ ░██ ░██ ░██ +# ░██ ░██░██░░░░ ░██ ░██ ░██ ░░░░░██ ░██ ░██░██ ░██ ░██ ░██ +# ░██ ░██░░██████░███ ░██████ ██████ ░░██ ███░░██████ ░██ ░░██ +# ░░ ░░ ░░░░░░ ░░░ ░░░░░ ░░░░░░ ░░ ░░░ ░░░░░░ ░░ ░░ + +hc() { + herbstclient "$@" +} + +hc emit_hook reload + +# remove all existing keybindings +hc keyunbind --all + +# close tray if reloading +killall stalonetray + +# gap counter +echo 35 > /tmp/herbstluftwm-gap + +# keybindings +Mod=Mod4 +Alt=Mod1 + +# run menu +hc keybind $Mod-w spawn interrobang +hc keybind $Mod-r spawn interrobang + +# toggle touchpad +hc keybind $Mod-m spawn bash $HOME/bin/toggle-touchpad + +# dynamic window gap +hc keybind $Mod-9 spawn bash $HOME/bin/herbstluftwm-remove-gap +hc keybind $Mod-0 spawn bash $HOME/bin/herbstluftwm-add-gap + +# generic actions +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 + +# 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 #row +hc keybind $Mod-o split right 0.5 #column +# 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=( 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 ) +tag_names=( {0..3} ) + +# set up normal tags +hc rename default "${tag_names[0]}" || true +for i in ${!tag_names[@]} ; do + hc add "${tag_names[$i]}" +done + +# cycle through tags +hc keybind $Mod-$Alt-Left use_index -1 --skip-visible +hc keybind $Mod-$Alt-Right use_index +1 --skip-visible + +# layouting +hc keybind $Mod-x remove +hc keybind $Mod-space cycle_layout 1 +hc keybind $Mod-Shift-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-n cycle +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 '#222222' +hc set frame_bg_normal_color '#222222' +hc set frame_bg_active_color '#000000' +hc set frame_border_width 0 +hc set always_show_frame 0 +hc set frame_bg_transparent 1 +hc set frame_transparent_width 0 +hc set frame_gap 8 + +hc attr theme.active.color '#000000' #6A8C8C +hc attr theme.normal.color '#222222' +hc attr theme.urgent.color '#000000' +hc attr theme.inner_width 0 +hc attr theme.inner_color black +hc attr theme.border_width 3 +hc attr theme.floating.border_width 3 +hc attr theme.floating.outer_width 1 +hc attr theme.floating.outer_color black +hc attr theme.active.inner_color '#222222' +hc attr theme.active.outer_color '#000000' +hc attr theme.background_color '#141414' + +hc set window_gap 35 +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/conkypanel +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 diff --git a/herbstluftwm/.config/herbstluftwm/panel.sh b/herbstluftwm/.config/herbstluftwm/panel.sh @@ -0,0 +1,196 @@ +#!/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]} +panel_width=268 +panel_height=16 +#font="-*-fixed-medium-*-*-*-12-*-*-*-*-*-*-*" +font="-Gohu-GohuFont-Medium-R-Normal--11-80-100-100-C-60-ISO10646-1" +#font2="-misc-stlarch-medium-r-normal--10-100-75-75-c-80-iso10646-1" + +bgcolor='#000000' +selbg='#6A8C8C' +selfg='#101010' + +# try to find textwidth binary. +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 + +# detect version +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 + 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. + date +$'date\t ^ca(1,~/bin/calendar)^fg(#d9d9d9)^i(/usr/share/icons/stlarch_icons/clock1.xbm) ^fg(#efefef)%H:%M^fg(#bcbcbc) %Y-%m-^fg(#efefef)%d^ca()' + sleep 1 || 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="" + 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($bgcolor)$date ^bg(#111111) " + # draw tags + for i in "${tags[@]}" + do + case ${i:0:1} in + '#') + echo -n "^bg(#5F8787)^fg(#222222)" + ;; + '+') + echo -n "^bg(#666666)^fg(#141414)" + ;; + ':') + echo -n "^bg(#3a3a3a)^fg(#bcbcbc)" + ;; + '!') + echo -n "^bg(#F92672)^fg(#141414)" + ;; + *) + echo -n "^bg(#222222)^fg(#bcbcbc)" + ;; + 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 " " + fi + if [ ${i:0:1 } == "#" ] + then + echo -n "use \"${i:1}\") ^i(/usr/share/icons/stlarch_icons/monocle2.xbm) ^ca()" + else + echo -n "use \"${i:1}\") ^i(/usr/share/icons/stlarch_icons/monocle.xbm) ^ca()" + fi + done + 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}" + ;; + 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, pipe the output 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' & + +#wait 2 seconds then load the stand alone tray +sleep 2 +stalonetray diff --git a/herbstluftwm/.xinitrc b/herbstluftwm/.xinitrc @@ -0,0 +1,75 @@ +#!/bin/sh +# +# ██ ██ ██ +# ░░ ░░ ░██ +# ██ ██ ██ ███████ ██ ██████ ██████ █████ +# ░░██ ██ ░██░░██░░░██░██░░░██░ ░░██░░█ ██░░░██ +# ░░███ ░██ ░██ ░██░██ ░██ ░██ ░ ░██ ░░ +# ██░██ ░██ ░██ ░██░██ ░██ ░██ ░██ ██ +# ██ ░░██░██ ███ ░██░██ ░░██ ░███ ░░█████ +# ░░ ░░ ░░ ░░░ ░░ ░░ ░░ ░░░ ░░░░░ +# +# ▓▓▓▓▓▓▓▓▓▓ +# ░▓ author ▓ xero <x@xero.nu> +# ░▓ code ▓ http://code.xero.nu/dotfiles +# ░▓ mirror ▓ http://git.io/.files +# ░▓▓▓▓▓▓▓▓▓▓ +# ░░░░░░░░░░ + +# merge custom x resources +xrdb -merge "${HOME}/.Xdefaults" & + +# custom keymappings ++xmodmap ~/.xmodmap + +# start the terminal emulator daemon +urxvtd -q -f -o & + +# wifi +/usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1 & +(sleep 2s && nm-applet --sm-disable) & + +# power management +(sleep 2s && xfce4-power-manager) & + +# sound mixer +(sleep 2s && pnmixer) & + +# volume keys daemon +(sleep 2s && xfce4-volumed) & + +# compositing manager +#compton -b --config ~/.config/compton.conf & + +# start thunar daemon +thunar --daemon & + +# wallpaper +nitrogen --restore & + +# configure touchpad +syndaemon -i 0.8 -d & +if egrep -iq 'touchpad' /proc/bus/input/devices; then + synclient VertEdgeScroll=0 & + synclient TapButton1=1 & + synclient HorizTwoFingerScroll=1 & +fi + +# clipboard manager +(sleep 3s && clipit) & + +# keyboard settings - 250 ms delay and 25 cps (characters per second) repeat rate. +xset r rate 250 25 & + +# disable system beep +xset b off & + +# start the rock +mpd & + +# setup fonts +xset +fp ~/.fonts & +xset fp rehash & + +# ░▒▓█ herbstluft █▓▒░ +exec herbstluftwm --locked diff --git a/herbstluftwm/.zprofile b/herbstluftwm/.zprofile @@ -0,0 +1,2 @@ +[ ! -s ~/.mpd/pid ] && mpd +[[ -z $DISPLAY && $XDG_VTNR -eq 1 ]] && startx diff --git a/herbstluftwm/bin/calendar b/herbstluftwm/bin/calendar @@ -0,0 +1,15 @@ +#!/bin/bash +# popup calendar for dzen +font="-Gohu-GohuFont-Medium-R-Normal--11-80-100-100-C-60-ISO10646-1" +TODAY=$(expr `date +'%d'` + 0) +MONTH=`date +'%m'` +YEAR=`date +'%Y'` +LINES=$(cal -m | wc -l) +LINES=$((LINES + 2)) + +( +date +'^bg(#111111) ' +date +'' +# current month, highlight header and today +cal -m | sed -r -e "1,2 s/.*/^fg(#d3d3d3)&^fg()/" -e "s/(^| )($TODAY)($| )/\1^bg(#6A8C8C)^fg(#111111)\2^fg()^bg()\3/") | dzen2 -x 0 -y 16 -w 146 -h 12 -l $LINES -sa c -p -e 'onstart=uncollapse,hide;button1=exit;' -fg "#d3d3d3" -tw 6 -fn "$font" +) diff --git a/herbstluftwm/bin/herbstluftwm-add-gap b/herbstluftwm/bin/herbstluftwm-add-gap @@ -0,0 +1,12 @@ +#!/bin/sh +filename="/tmp/herbstluftwm-gap" +while read -r line +do + gap=$line + if [ "$gap" -le 90 ] + then + gap=$((gap+7)) + herbstclient set window_gap $gap + echo $gap > $filename + fi +done < "$filename" diff --git a/herbstluftwm/bin/herbstluftwm-remove-gap b/herbstluftwm/bin/herbstluftwm-remove-gap @@ -0,0 +1,12 @@ +#!/bin/sh +filename="/tmp/herbstluftwm-gap" +while read -r line +do + gap=$line + if [ "$gap" -ge 7 ] + then + gap=$((gap-7)) + herbstclient set window_gap $gap + echo $gap > $filename + fi +done < "$filename"