commit ed3d2e04b92fd6c90b76a58e465480019f16f029 Author: Thomas Ruoff Date: Tue Apr 3 23:17:34 2018 +0200 "initial" commit :D diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3c3629e --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +node_modules diff --git a/autostart b/autostart new file mode 100755 index 0000000..c9bb3f5 --- /dev/null +++ b/autostart @@ -0,0 +1,41 @@ +#!/bin/sh +hc=herbstclient + +CFGDIR=$HOME/.config/herbstluftwm + +# kill old instances, perhaps I should do this with pids? +pkill dzen2 +pkill lemonbar +pkill stalonetray +pkill conky +pkill urxvtd +pkill udiskie + +hc emit_hook reload + +${CFGDIR}/bindings.sh +${CFGDIR}/rules.sh +${CFGDIR}/styling.sh + +$hc set tree_style '╾│ ├└╼─┐' +$hc unlock +$hc detect_monitors + +panel_height=20 +statusbar_height=20 + +for monitor in $(herbstclient list_monitors | cut -d: -f1) ; do + # start it on each monitor + $hc pad $monitor $panel_height 0 $statusbar_height 0 + ${CFGDIR}/panel.sh $monitor & + ${CFGDIR}/statusbar.sh $monitor & +done + +${CFGDIR}/tray.sh & + +urxvtd & +udiskie --tray & +systemctl --user restart sxhkd +systemctl --user restart xautolock + +wmname LG3D diff --git a/bindings.sh b/bindings.sh new file mode 100755 index 0000000..8970d1d --- /dev/null +++ b/bindings.sh @@ -0,0 +1,80 @@ +#!/bin/sh + +hc=herbstclient + +$hc keyunbind --all + +# keybindings +Mod=Mod4 +$hc keybind $Mod-Control-q quit +$hc keybind $Mod-Shift-q close +$hc keybind $Mod-Shift-r reload + +# tags +TAG_NAMES=( {1..9} 0 ) +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 +$hc keybind $Mod-Right use_index +1 --skip-visible +$hc keybind $Mod-Left use_index -1 --skip-visible +$hc keybind $Mod-minus use_previous + +# layouting +$hc keybind $Mod-r remove + +$hc keybind $Mod-space cycle_layout 1 + +$hc keybind $Mod-e split explode + +$hc keybind $Mod-u split vertical 0.5 +$hc keybind $Mod-Shift-u split vertical 0.66 + +$hc keybind $Mod-o split horizontal 0.5 +$hc keybind $Mod-Shift-o split horizontal 0.666 + +$hc keybind $Mod-s floating toggle +$hc keybind $Mod-f fullscreen toggle +$hc keybind $Mod-p pseudotile toggle + +# resizing +RESIZESTEP=0.02 +$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 + +# mouse in floating mode +$hc mouseunbind --all +$hc mousebind $Mod-Button1 move +$hc mousebind $Mod-Button2 zoom +$hc mousebind $Mod-Button3 resize + +# focus +$hc set focus_follows_mouse 1 +$hc rule focus=on +$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-h focus left +$hc keybind $Mod-j focus down +$hc keybind $Mod-k focus up +$hc keybind $Mod-l focus right +$hc keybind $Mod-i jumpto urgent +$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 + diff --git a/conky-bat/index.js b/conky-bat/index.js new file mode 100755 index 0000000..93e2b44 --- /dev/null +++ b/conky-bat/index.js @@ -0,0 +1,15 @@ +#!/usr/bin/env node +'use strict'; + +var linuxBattery = require('linux-battery'); + +linuxBattery().then(batteries => { + batteries.forEach(battery => { + var color = battery.warningLevel !== 'none' ? '#ff0000' : '#eee8d5'; + var stateSymbol = battery.state === 'charging' ? '↑' : '↓'; + var timeLeft = battery.timeToFull || battery.timeToEmpty || ''; + + var text = `%{F${color}}${battery.percentage} ${stateSymbol} ${timeLeft}%{F-}`; + console.log(text); + }); +}); diff --git a/conky-bat/package.json b/conky-bat/package.json new file mode 100644 index 0000000..90fa251 --- /dev/null +++ b/conky-bat/package.json @@ -0,0 +1,15 @@ +{ + "name": "conky-bat", + "version": "0.0.0", + "description": "battery status for conky", + "main": "index.js", + "dependencies": { + "linux-battery": "^3.0.1" + }, + "devDependencies": {}, + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "Thomas Ruoff", + "license": "MIT" +} diff --git a/conkyrc b/conkyrc new file mode 100644 index 0000000..405b21b --- /dev/null +++ b/conkyrc @@ -0,0 +1,36 @@ +## output to X +out_to_x no + +## Create own window to draw +own_window no + +## Print everything to console? +out_to_console yes + +## Use double buffering (reduces flicker, not needed for console output) +double_buffer no + +## Set to yes if you want Conky to be forked in the background +background no + +## Update interval in seconds +update_interval 1.0 + +## This is the number of times Conky will update before quitting. +## Set to zero to run forever. +total_run_times 0 + +## How strict should if_up be when testing an interface for being up? +## The value is one of up, link or address, to check for the interface +## being solely up, being up and having link or being up, having link +## and an assigned IP address. +if_up_strictness address + + +## Force UTF8? note that UTF8 support required XFT +override_utf8_locale yes + +use_spacer left + +TEXT +%{c} load: ${loadavg 1} ${loadavg 2} ${loadavg 3} | ram: ${memperc}% | swap: ${swapperc} | processes: ${processes} | ${if_up wlp3s0} wlan:${wireless_link_qual_perc wlp3s0}% ${wireless_essid wlp3s0} ↓${downspeed wlp3s0} ↑${upspeed wlp3s0} |$endif ${if_up enp0s25:} lan: ↓${downspeed wlp3s0} ↑${upspeed wlp3s0} |$endif bat ${exec $HOME/.config/herbstluftwm/conky-bat/index.js} diff --git a/panel.sh b/panel.sh new file mode 100755 index 0000000..c5c1f53 --- /dev/null +++ b/panel.sh @@ -0,0 +1,162 @@ +#!/bin/bash + +source ~/.config/herbstluftwm/settings.sh + +# disable path name expansion or * will be expanded in the line +# cmd=( $line ) +set -f + +monitor=${1:-0} +monGeomitry=( $(herbstclient monitor_rect "$monitor") ) +if [ -z "$monGeomitry" ] ;then + echo "Invalid monitor $monitor" + exit 1 +fi + +# monGeomitry has the format: WxH+X+Y +x=${monGeomitry[0]} +y=${monGeomitry[1]} +panel_width=$((${monGeomitry[2]})) +panel_height=20 + +# reserve space for tray on first monitor +if [ $monitor -eq 0 ] ; then + panel_width=$(($panel_width - 100)) +fi + +panelGeometry=${panel_width}x${panel_height}+${x}+${y} + +textellipsis() { + awk -v len=100 '{ if (length($0) > len) print substr($0, 1, len-3) "..."; else print; }' +} + +volume() { + LEVEL=$(amixer get Master | tail -1 | sed 's/.*\[\([0-9]*\)%\].*/\1/') + if [ "$LEVEL" -gt "49" ] ; then + echo -en '\uf028'; + elif [ "$LEVEL" -gt "0" ] ; then + echo -en '\uf027'; + else + echo -en '\uf026'; + fi + echo " ${LEVEL}%" +} + +# events +{ + # now playing + mpc idleloop player | cat & + mpc_pid=$! + + # volume + while true ; do + echo -e "vol " $(volume) + sleep 1 || break + done > >(uniq_linebuffered) & + vol_pid=$! + + # date + while true ; do + date +'date_min %Y-%m-%d %H:%M' + sleep 1 || break + done > >(uniq_linebuffered) & + date_pid=$! + + # herbstluftwm + herbstclient --idle + + # exiting; kill stray event-emitting processes + kill $mpc_pid $vol_pid $date_pid +} 2> /dev/null | { + TAGS=( $(herbstclient tag_status $monitor) ) + unset TAGS[${#TAGS[@]}] + time="" + song="" + windowtitle="" + visible=true + + while true ; do + echo -n "%{l}%{F-}" + for i in "${TAGS[@]}" ; do + case ${i:0:1} in + '#') # current tag + echo -n "%{U$active}%{+u}" + ;; + '+') # active on other monitor + echo -n "%{U$activeOnMontior}%{+u}" + ;; + ':') + echo -n "%{F$notempty}" + ;; + '!') # urgent tag + echo -n "%{U$urgent}%{+u}" + ;; + *) + echo -n "%{F$notused}" + ;; + esac + echo -n "%{A:select_tag ${i:1}:}" + echo -n " ${i:1} " + echo -n "%{A}" + echo -n "%{-u}%{F-}%{B-}" + done + + # center window title + echo -n "%{c}$(echo ${windowtitle//^/^^} | textellipsis) " + + # align right + echo -n "%{r}" + if [ -n "$song" ] ; then + echo -n "$song" "$song2" + fi + echo -en " $volume " + echo -en "\uf133 $date" + echo " " + + # wait for next event + read line || break + cmd=( $line ) + # find out event origin + case "${cmd[0]}" in + tag*) + TAGS=( $(herbstclient tag_status $monitor) ) + unset TAGS[${#TAGS[@]}] + ;; + mpd_player|player) + song="$(mpc -f %artist% current)" + song2="$(mpc -f %title% current)" + ;; + vol) + volume="${cmd[@]:1}" + ;; + date_min) + date="${cmd[@]:1}" + ;; + focus_changed|window_title_changed) + windowtitle="${cmd[@]:2}" + ;; + quit_panel) + exit + ;; + reload) + exit + ;; + esac + done +} 2> /dev/null \ + | lemonbar \ + -g $panelGeometry \ + -f "$font" \ + -B "$bgcolor" -F "$fgcolor" \ + -u 2 \ + | while read line; do + set $line + case "$1" in + select_tag ) + # make sure the current monitor is focused + herbstclient focus_monitor $monitor + herbstclient use $2 + ;; + esac + done + diff --git a/rules.sh b/rules.sh new file mode 100755 index 0000000..473d44e --- /dev/null +++ b/rules.sh @@ -0,0 +1,13 @@ +#!/bin/sh + +alias hc=herbstclient + +# rules +hc unrule -F +#hc rule class=XTerm tag=3 # move all xterms to tag 3 +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)' manage=off diff --git a/settings.sh b/settings.sh new file mode 100755 index 0000000..4893e1b --- /dev/null +++ b/settings.sh @@ -0,0 +1,19 @@ +#!/bin/bash + +#font="-*-fixed-medium-*-*-*-12-*-*-*-*-*-*-*" +font="DejaVu Sans Mono for Powerline:pixelsize=11" + +# default +fgcolor="#eee8d5" +bgcolor="#002b36" + +active="#b58900" +activeOnMontior="2aa198" +notempty="#fdf6e3" +notused="#657b83" +urgent="#dc322f" + +function uniq_linebuffered() { + awk -W interactive '$0 != l { print ; l=$0 ; fflush(); }' "$@" +} + diff --git a/statusbar.sh b/statusbar.sh new file mode 100755 index 0000000..66b6c0b --- /dev/null +++ b/statusbar.sh @@ -0,0 +1,51 @@ +#!/bin/bash +source ~/.config/herbstluftwm/settings.sh + +# disable path name expansion or * will be expanded in the line +# cmd=( $line ) +set -f + +statusbar_height=20 +monitor=${1:-0} +geometry=( $(herbstclient monitor_rect "$monitor") ) +if [ -z "$geometry" ] ;then + echo "Invalid monitor $monitor" + exit 1 +fi +# geometry has the format: WxH+X+Y +x=${geometry[0]} +y=$((${geometry[3]} - $statusbar_height)) +screen_width=${geometry[2]} +panelGeometry=${geometry[2]}x${statusbar_height}+${x}+${y} +{ + conky -c /home/idon/.config/herbstluftwm/conkyrc | while read -r; do + echo -e "$REPLY"; + done > >(uniq_linebuffered) & + childpid=$! + herbstclient --idle + kill $childpid +} 2> /dev/null | { + while true ; do + read line || break + cmd=( $line ) + # find out event origin + case "${cmd[0]}" in + focus_changed|window_title_changed|tag_changed|tag_flags) + ;; + quit_panel) + exit + ;; + reload) + exit + ;; + *) + echo $line + ;; + esac + done +} 2> /dev/null \ + | lemonbar \ + -g $panelGeometry \ + -f "$font" \ + -B $bgcolor -F $fgcolor \ + -u 2 diff --git a/styling.sh b/styling.sh new file mode 100755 index 0000000..e59bba1 --- /dev/null +++ b/styling.sh @@ -0,0 +1,30 @@ +#!/bin/sh +hc=herbstclient + +CFGDIR=$HOME/.config/herbstluftwm + +$CFGDIR/wallpaper.sh + +# frame/window styling + +$hc set frame_border_active_color '#eee8d5' +$hc set frame_border_normal_color '#475152' +$hc set frame_bg_transparent 1 +$hc set frame_border_width 1 +$hc set frame_active_opacity 80 +$hc set frame_normal_opacity 80 +$hc set frame_gap 4 +$hc set frame_padding 0 +$hc set always_show_frame 1 +$hc set smart_frame_surroundings 1 + +$hc set window_border_width 2 +$hc set window_border_inner_width 0 +$hc set window_border_normal_color '#0a1b22' +$hc set window_border_active_color '#d9e5e7' +$hc set window_gap 0 +$hc set smart_window_surroundings 1 + + +$hc set mouse_recenter_gap 0 + diff --git a/tray.sh b/tray.sh new file mode 100755 index 0000000..ce9e69b --- /dev/null +++ b/tray.sh @@ -0,0 +1,13 @@ +#!/bin/bash + +source ~/.config/herbstluftwm/settings.sh + +set $(herbstclient monitor_rect 0) + +TRAY_GEOMETRY=5x1+$(($3 - 100))+0 +stalonetray \ + --background "#002b36" \ + --geometry $TRAY_GEOMETRY \ + --icon-size 20 \ + --kludges force_icons_size \ + 2>&1 > /dev/null & diff --git a/wallpaper.sh b/wallpaper.sh new file mode 100755 index 0000000..59c70ea --- /dev/null +++ b/wallpaper.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash + +# xsetroot -solid '#eee8d5' + +# random wallpaper +WALLPAPERDIR=$(dirname "$0")/wallpapers +WALLPAPER=`find $WALLPAPERDIR -type f | sort -R | head -n 1` +feh --bg-scale $WALLPAPER diff --git a/wallpapers/nerves.png b/wallpapers/nerves.png new file mode 100644 index 0000000..c8b083e Binary files /dev/null and b/wallpapers/nerves.png differ diff --git a/wallpapers/solarized.png b/wallpapers/solarized.png new file mode 100644 index 0000000..91400e3 Binary files /dev/null and b/wallpapers/solarized.png differ