commit 32218dfb990f54120addaf31e4e52ca06b9a6a79 Author: Gardouille Date: Thu Oct 13 19:07:18 2016 +0200 First commit of this new repo diff --git a/autostart b/autostart new file mode 100755 index 0000000..1884d8a --- /dev/null +++ b/autostart @@ -0,0 +1,271 @@ +#!/usr/bin/env bash + +source ~/.config/herbstluftwm/common_config +#source /home/jegardai/.config/herbstluftwm/common_config + +hc() { + herbstclient "$@" +} + +hc emit_hook reload + +xsetroot -solid '#5A8E3A' + +TERMINAL=terminator + +################### +### Keybindings ### +################### + +# remove all existing keybindings +hc keyunbind --all + +# change var +# Mod1: Alt_L +# Mod4: Super_L +Mod=Mod1 +s=Shift +c=Control +a=Mod1 +h=Mod4 + +# hl management +hc keybind $Mod-Shift-q quit +hc keybind $h-r reload +hc keybind $Mod-Shift-y spawn zsh -c 'sleep 1; xset dpms force off' # turn off the screen +hc keybind $Mod-Shift-x spawn ~/bin/veille.sh # screen locker +hc keybind $h-F1 spawn ~/bin/ecran off # switch between +hc keybind $h-F2 spawn ~/bin/ecran work # different +hc keybind $h-F3 spawn ~/bin/ecran lug # monitor +hc keybind $h-F4 spawn ~/bin/ecran vga # configurations + +# window management +hc keybind $Mod-x close + +# basic movement +# focusing frame +hc keybind $h-Left or , focus left , focus_edge right +hc keybind $h-Down or , focus down , focus_edge up +hc keybind $h-Up or , focus up , focus_edge down +hc keybind $h-Right or , focus right , focus_edge left +hc keybind $Mod-c or , focus left , focus_edge right +hc keybind $Mod-t or , focus down , focus_edge up +hc keybind $Mod-s or , focus up , focus_edge down +hc keybind $Mod-r or , focus right , focus_edge left + +# moving clients +hc keybind $h-Shift-Left or , shift left , shift_edge right +hc keybind $h-Shift-Down or , shift down , shift_edge up +hc keybind $h-Shift-Up or , shift up , shift_edge down +hc keybind $h-Shift-Right or , shift right , shift_edge left +hc keybind $Mod-Shift-c or , shift left , shift_edge right +hc keybind $Mod-Shift-t or , shift down , shift_edge up +hc keybind $Mod-Shift-s or , shift up , shift_edge down +hc keybind $Mod-Shift-r or , shift right , shift_edge left + +# splitting frames +# create an empty frame at the specified direction +hc keybind $Mod-space and , split bottom 0.5 , focus down +hc keybind $Mod-Shift-space and , split top 0.5 , focus up +hc keybind $Mod-Return and , split right 0.5 , focus right +hc keybind $Mod-Shift-Return and , split left 0.5 , focus left +# let the current frame explode into subframes +hc keybind $Mod-Control-space split explode + +# resizing frames +resizestep=0.05 +hc keybind $Mod-Control-c resize left +$resizestep +hc keybind $Mod-Control-t resize down +$resizestep +hc keybind $Mod-Control-s resize up +$resizestep +hc keybind $Mod-Control-r resize right +$resizestep +hc keybind $h-Control-Left resize left +$resizestep +hc keybind $h-Control-Down resize down +$resizestep +hc keybind $h-Control-Up resize up +$resizestep +hc keybind $h-Control-Right resize right +$resizestep + +# tags +#tag_names=( {1..9} ) +#tag_keys=( {1..9} 0 ) +tag_names=(term web msg oth art 6 7 8 ) +tag_keys=(a u i e b eacute p o) + +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-comma use_index +1 --skip-visible +hc keybind $Mod-k use_index -1 --skip-visible +hc keybind $Mod-Right use_index +1 --skip-visible +hc keybind $Mod-Left use_index -1 --skip-visible +hc keybind $Mod-apostrophe use_previous + +# layouting +hc keybind $Mod-d remove +hc keybind $Mod-Shift-s floating toggle +hc keybind $Mod-f fullscreen toggle +hc keybind $Mod-Shift-p pseudotile toggle +# The following cycles through the available layouts within a frame, but skips +# layouts, if the layout change wouldn't affect the actual window positions. +# I.e. if there are two windows within a frame, the grid layout is skipped. +hc keybind $Mod-period \ + or , and . compare tags.focus.curframe_wcount = 2 \ + . cycle_layout +1 vertical horizontal max vertical grid \ + , cycle_layout +1 + +# mouse +hc mouseunbind --all +hc mousebind $Mod-Button1 move +hc mousebind $Mod-Button2 zoom +hc mousebind $Mod-Button3 resize + +# focus +hc keybind $h-Tab cycle_monitor +hc keybind $Mod-Tab cycle_all +1 +hc keybind $Mod-Shift-Tab cycle_all -1 +hc keybind $Mod-agrave cycle +hc keybind $Mod-Shift-i jumpto urgent + +# apps +hc keybind $Mod-BackSpace spawn ${TERMINAL:-xterm} # use your $TERMINAL with xterm as fallback +hc keybind $Mod-dead_circumflex spawn ~/.dmenu +hc keybind XF86HomePage spawn firefox +hc keybind XF86Mail spawn icedove +hc keybind XF86Calculator spawn gnome-calculator +hc keybind Print spawn ~/bin/printscreen +hc keybind $Mod-XF86AudioPlay spawn rhythmbox +hc keybind $Mod-v spawn vlc +hc keybind $Mod-Escape spawn ~/bin/bepo_azerty.sh + +# sound +hc keybind XF86AudioRaiseVolume spawn amixer -q -c 0 set Master 2+ unmute +hc keybind XF86AudioLowerVolume spawn amixer -q -c 0 set Master 2- unmute +hc keybind XF86AudioMute spawn amixer -q set Master toggle + +# brightness +hc keybind XF86MonBrightnessUp spawn xbacklight +10 +hc keybind XF86MonBrightnessDown spawn xbacklight -10 + +################### +### theme ### +################### + +hc attr theme.tiling.reset 1 +hc attr theme.floating.reset 1 +#hc set frame_border_active_color '#222222' +hc set frame_border_active_color ${darkgrey} +#hc set frame_border_normal_color '#101010' +hc set frame_border_normal_color ${lightblack} +hc set frame_bg_normal_color ${darkgrey} +#hc set frame_bg_active_color '#345F0C' +hc set frame_bg_active_color ${debianred} +hc set frame_border_width 1 +hc set always_show_frame 1 +#hc set frame_bg_transparent 1 +hc set frame_bg_transparent 0 +hc set frame_transparent_width 5 +hc set frame_gap 4 +hc set window_border_normal_color ${darkgrey} +hc set window_border_active_color ${debianred} + +hc attr theme.active.color ${debianred} +hc attr theme.normal.color ${grey} +hc attr theme.urgent.color orange +hc attr theme.inner_width 1 +hc attr theme.inner_color ${grey} +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 ${debianred} +hc attr theme.active.outer_color ${debianred} +hc attr theme.background_color ${debianred} + +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 focus=on # normally 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 + +# tag: web +hc rule class=Firefox tag=web +hc rule class=qutebrowser tag=web +hc rule class=Midori tag=oth + +# msg +hc load msg ' + (split vertical:0.960000:0 + (clients vertical:0) + (clients vertical:0))) +' +hc rule class=Icedove tag=msg focus=on index=01 +hc rule class=Icedove windowrole=Msgcompose focus=on index=01 +# OpenPGP passphrase +hc rule class=Gcr-prompter tag=msg focus=on index=10 +hc rule class=Icedove windowrole=AlarmWindow tag=msg focus=off index=10 + +# oth +hc load oth ' +(split horizontal:0.450000:0 + (clients vertical:0) + (split vertical:0.550000:1 + (clients vertical:0) + (clients vertical:0))) +' +hc rule class~'.ibre.ffice.*' tag=oth index=00 focus=off +hc rule class=Rhythmbox tag=oth index=10 focus=on +hc rule class=Vlc tag=oth index=11 focus=on + +# art (for GIMP) +hc load art ' +(split horizontal:0.850000:0 + (split horizontal:0.200000:1 + (clients vertical:0) + (clients grid:0)) + (clients vertical:0)) +' # load predefined layout +# center all other gimp windows on gimp tag +hc rule class=Gimp tag=art index=01 pseudotile=on +hc rule class=Gimp windowrole~'gimp-(image-window|toolbox|dock)' \ + pseudotile=off +hc rule class=Gimp windowrole=gimp-toolbox focus=off index=00 +hc rule class=Gimp windowrole=gimp-dock focus=off index=1 + +# tag: 8 +hc rule class=KeePass2 tag=8 + +# 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 diff --git a/common_config b/common_config new file mode 100644 index 0000000..56af967 --- /dev/null +++ b/common_config @@ -0,0 +1,47 @@ + +################### +### Colors {{{ +################### +black="#000000" +lightblack="#151515" +blue="#0094cc" +grey="#909090" +darkgrey="#26221c" +green="#345f0c" +lightgreen="#9fbc00" +pink="#b00a44" +lightpink="#FF0675" +red="#ff0000" +darkred="#8f0000" +debianred="#D70A53" +white="#efefef" + +### }}} + +################### +### Foreground {{{ +################### +fgclear="^fg()" +fgblack="^fg(${black})" +fglightblack="^fg(${lightblack})" +fgblue="^fg(${blue})" +fggrey="^fg(${grey})" +fglightgreen="^fg(${lightgreen})" +fggreen="^fg(${green})" +fgpink="^fg(${pink})" +fgred="^fg(${red})" +fgdarkred="^fg(${darkred})" +fgdebianred="^fg(${debianred})" +fgwhite="^fg(${white})" +# }}} + +################### +### Background {{{ +################### +bgclear="^bg()" +bggreen="^bg(${green})" +bglightpink="^bg(${lightpink})" +bgdarkred="^bg(${darkred})" +bgdebianred="^bg(${debianred})" +# }}} + diff --git a/panel.sh b/panel.sh new file mode 100755 index 0000000..acba46a --- /dev/null +++ b/panel.sh @@ -0,0 +1,227 @@ +#!/usr/bin/env bash + +source ~/.config/herbstluftwm/common_config + +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=${geometry[2]} +panel_height=16 +font="-*-fixed-medium-*-*-*-12-*-*-*-*-*-*-*" +bgcolor=$(hc get frame_border_normal_color) +selbg=$(hc get window_border_active_color) +selfg='#101010' + +################### +### Task {{{ +################### +task() { + local taskpath="$HOME/.pomodoro/current.task" + task_icon="pacman" + task_color="${debianred}" + if [[ -f ${taskpath} ]]; then + taskname=$(sed '1!d' ${taskpath}) + tasktime=$(sed '2!d' ${taskpath}) + #echo -n "$(icon ${task_icon} ${task_color}) ${fgdebianred}${fgwhite}${taskname}: ${fgdebianred}${tasktime}" + echo -n "${fgdebianred}${fgwhite}${taskname}: ${fgdebianred}${tasktime}" + fi +} +# }}} + +################### +### Volume {{{ +################### +volume() { + local stat=$(amixer sget Master | awk '/\[on\]/{print $4}' | uniq) + vol_color="${debianred}" + fg_vol_color="${fgdebianred}" + vol_icon="spkr_01" + + # If mute + if [ -z $stat ]; then + local stat="$(amixer sget Master | awk '/\[off\]/{print $4}' | uniq)" + vol_color="${darkred}" + fg_vol_color=${fggrey} + vol_icon="spkr_02" + fi + + #echo -n "$(icon ${vol_icon} ${vol_color}) ${fg_vol_color}${stat}" + echo -n "${fg_vol_color}${stat}" +} +# }}} + +#### +# 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: + # \t [...] + # 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^fg(#efefef)%H:%M^fg(#909090), %Y-%m-^fg(#efefef)%d' + 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. + + 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^bg() $(task) $separator $date $separator $(volume)" + 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}" + ;; + 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' + + diff --git a/restartpanels.sh b/restartpanels.sh new file mode 100755 index 0000000..774208d --- /dev/null +++ b/restartpanels.sh @@ -0,0 +1,16 @@ +#!/usr/bin/env bash + +installdir=/ + +XDG_CONFIG_HOME="${XDG_CONFIG_HOME:-$HOME/.config}" +defaultpanel="$XDG_CONFIG_HOME/herbstluftwm/panel.sh" + +[ -x "$defaultpanel" ] || defaultpanel="$installdir/etc/xdg/herbstluftwm/panel.sh" + +panelcmd="${1:-$defaultpanel}" + +herbstclient emit_hook quit_panel + +for i in $(herbstclient list_monitors | cut -d':' -f1) ; do + "$panelcmd" $i & +done