Advertisement
Guest User

Untitled

a guest
Jun 15th, 2017
229
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 13.06 KB | None | 0 0
  1. #!/usr/bin/env bash
  2.  
  3. hc() { "${herbstclient_command[@]:-herbstclient}" "$@" ;}
  4. monitor=${1:-0}
  5. geometry=( $(herbstclient monitor_rect "$monitor") )
  6. if [ -z "$geometry" ] ;then
  7.     echo "Invalid monitor $monitor"
  8.     exit 1
  9. fi
  10. # geometry has the format W H X Y
  11. x=${geometry[0]}
  12. y=${geometry[1]}
  13. #panel_width=$((${geometry[2]} - 49))
  14. panel_width=${geometry[2]}
  15. panel_height=16
  16. #font="-*-fixed-medium-*-*-*-12-*-*-*-*-*-*-*"
  17. font="-*-terminus-medium-*-normal-*-12-*-*-*-*-*-*-*"
  18. font2="-misc-fontawesome-medium-r-normal--0-0-0-12-p-iso10646-1"
  19. ##bgcolor=$(hc get frame_border_normal_color)
  20. ##selbg=$(hc get window_border_active_color)
  21. ##selfg='#101010'
  22.  
  23. #bgcolor='#2C2C2C'  # цвет панели
  24. #bgcolor2='#2C2C2B' # цвет панели
  25. bgcolor='#3C3C3C'   # цвет панели
  26. bgcolor2='#2C2C2B'  # цвет панели
  27. selbg='#707070'     # выделение
  28. selfg='#FFFFFF'     # цвет значка активного тега
  29. textfg01='#BFBFBF'
  30. textfg02='#BFBFBE'
  31.  
  32. level2='#AAFFFF'
  33. level3='#FFFF55'
  34. level4='#FF5555'
  35. ####
  36. # Try to find textwidth binary.
  37. # In e.g. Ubuntu, this is named dzen2-textwidth.
  38. if which textwidth &> /dev/null ; then
  39.     textwidth="textwidth";
  40. elif which dzen2-textwidth &> /dev/null ; then
  41.     textwidth="dzen2-textwidth";
  42. else
  43.     echo "This script requires the textwidth tool of the dzen2 project."
  44.     exit 1
  45. fi
  46.  
  47. #======~===~==============~===========~==
  48. # ICONS
  49. #==~==========~=========~=============~~=
  50. iconpath="/home/user/.config/icons"
  51.  
  52. function icon() {
  53.   echo -n "^fg($bgcolor)^ro(1x$height)^fg($bgcolor2)^ro(1x$height)^fg()^bg($bgcolor)^fg(${color[${2}]})^i(${iconpath}/${1}.xbm) ^fg($bgcolor2)^ro(1x$height)^fg()^bg()^fg($bgcolor)^ro(1x$height)^fg()"
  54. }
  55.  
  56. ####function volume() {
  57.         ####vol="$(amixer get Master | tail -n 1 | cut -d '[' -f 2 | sed 's/%.*//g' | sed -n 1p)"
  58.         ####echo -n "$(icon vol1)^fg($textfg02)${vol}%^fg "
  59. ##}
  60.  
  61. function volume() {
  62.         vol="$(amixer get Master | tail -n 1 | cut -d '[' -f 2 | sed 's/%.*//g' | sed -n 1p)"
  63.         if (($vol<=75))
  64.         then
  65.             echo -n "$(icon vol1)^fg($textfg02)${vol}%^fg"
  66.         elif (($vol>75 && $vol<=85))
  67.         then
  68.             echo -n "$(icon vol1)^fg($level2)${vol}%^fg"
  69.         elif (($vol>85 && $vol<=95))      
  70.         then
  71.             echo -n "$(icon vol1)^fg($level3)${vol}%^fg"
  72.         elif (($vol>96))
  73.         then
  74.             echo -n "$(icon vol1)^fg($level4)${vol}%^fg"
  75.         else
  76.             echo -n "$(icon vol1)^fg($textfg02)${vol}%^fg"
  77.         fi
  78. }
  79.  
  80. function layout() {
  81.         lay="$(xset -q|grep LED| awk '{ if (substr ($10,5,1) == 1) print " RUS "; else print " ENG "; }')"
  82.         echo -n "^fg(#FFFFFF)${lay}^fg"
  83. }
  84.  
  85. function memory() {
  86.         mem="$(free -m | grep Mem | awk '{s = $3/$2} END {a = s*100; printf "%.0f\n", a}')"
  87.         #echo -n "$(icon mem1)^fg($textfg02)${mem}%^fg "
  88.         if (($mem<=25))
  89.         then
  90.             echo -n "$(icon mem1)^fg($textfg02)${mem}%^fg"
  91.         elif (($mem>25 && $mem<=50))
  92.         then
  93.             echo -n "$(icon mem1)^fg($level2)${mem}%^fg"
  94.         elif (($mem>50 && $mem<=75))      
  95.         then
  96.             echo -n "$(icon mem1)^fg($level3)${mem}%^fg"
  97.         elif (($mem>76))
  98.         then
  99.             echo -n "$(icon mem1)^fg($level4)${mem}%^fg"
  100.         else
  101.             echo -n "$(icon mem1)^fg($textfg02)${mem}%^fg"
  102.         fi
  103. }
  104.  
  105. function cpuuse() {
  106.         cpu="$(ps aux | awk '{s += $3} END {a = s/2; printf "%.0f\n", a}' | awk '{print $1}')"
  107.         #echo -n "$(icon cpu5)^fg($textfg02)${cpu}%^fg "
  108.         if (($cpu<=25))
  109.         then
  110.             echo -n "$(icon cpu5)^fg($textfg02)${cpu}%^fg"
  111.         elif (($cpu>25 && $cpu<=50))
  112.         then
  113.             echo -n "$(icon cpu5)^fg($level2)${cpu}%^fg"
  114.         elif (($cpu>50 && $cpu<=75))      
  115.         then
  116.             echo -n "$(icon cpu5)^fg($level3)${cpu}%^fg"
  117.         elif (($cpu>76))
  118.         then
  119.             echo -n "$(icon cpu5)^fg($level4)${cpu}%^fg"
  120.         else
  121.             echo -n "$(icon cpu5)^fg($textfg02)${cpu}%^fg"
  122.         fi
  123. }
  124.  
  125. function battery() {
  126.         #bat="$(acpi -b | awk '{print $4}' | sed 's/%.*//g')"
  127.         bat="$(acpi -b | awk '{print $4}')"
  128.         ac_status="$(acpi -a | awk '{print $3}')"
  129.         if [ $ac_status == "off-line" ]; then
  130.                 ac_symbol=" "
  131.                 else
  132.                 ac_symbol="(AC on)"
  133.         fi
  134.         #echo -n "$(icon bat5)^fg($textfg02)${bat}%^fg "
  135.         if (($bat<=25))
  136.         then
  137.             echo -n "$(icon batt2empty)^fg($level4)${bat}^fg $ac_symbol"
  138.         elif (($bat>25 && $bat<=50))
  139.         then
  140.             echo -n "$(icon batt2half)^fg($level3)${bat}^fg $ac_symbol"
  141.         elif (($bat>50 && $bat<=75))      
  142.         then
  143.             echo -n "$(icon batt2half)^fg($level2)${bat}^fg $ac_symbol"
  144.         elif (($bat>76))
  145.         then
  146.             echo -n "$(icon batt2full)^fg($textfg02)${bat}^fg $ac_symbol"
  147.         else
  148.             echo -n "$(icon batt2full)^fg($textfg02)${bat}^fg $ac_symbol"
  149.         fi
  150. }
  151.  
  152.  
  153. #
  154. #song="$(mpc current)"
  155. #song="$(mpc -f %artist% current)"
  156. #song2="$(mpc -f %title% current)"
  157. #HDD_t:${exec hddtemp /dev/sda} °C
  158.  
  159. ### mpc | grep playing | awk '{print $3}'
  160. function mpd() {
  161.         sng="$(mpc current)"
  162.         sng_time="$(mpc | grep playing | awk '{print $3}')"
  163.         #sng="$(mpc -f %artist% current)"
  164.         #echo -n "$(icon headphone1) ^fg($textfg02)${sng}^fg  "
  165.         #sng=" - not playing -"
  166.         #if [ $sng != 0 ]
  167.         if [  -z "$sng" ]
  168.          then
  169.           sng=" - not playing -"
  170.           echo "$(icon headphone1) ^fg($textfg02)${sng}"
  171.          else
  172.           if [  -z "$sng_time" ]
  173.            then
  174.             sng_time="* paused *"
  175.           fi
  176.           echo "$(icon headphone1) ^fg($textfg02)${sng}  (^fg($textfg02)${sng_time})"
  177.         fi
  178. }
  179.  
  180.  
  181.  
  182. ####
  183. # true if we are using the svn version of dzen2
  184. # depending on version/distribution, this seems to have version strings like
  185. # "dzen-" or "dzen-x.x.x-svn"
  186. if dzen2 -v 2>&1 | head -n 1 | grep -q '^dzen-\([^,]*-svn\|\),'; then
  187.     dzen2_svn="true"
  188. else
  189.     dzen2_svn=""
  190. fi
  191.  
  192. if awk -Wv 2>/dev/null | head -1 | grep -q '^mawk'; then
  193.     # mawk needs "-W interactive" to line-buffer stdout correctly
  194.     # http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=593504
  195.     uniq_linebuffered() {
  196.       awk -W interactive '$0 != l { print ; l=$0 ; fflush(); }' "$@"
  197.     }
  198. else
  199.     # other awk versions (e.g. gawk) issue a warning with "-W interactive", so
  200.     # we don't want to use it there.
  201.     uniq_linebuffered() {
  202.       awk '$0 != l { print ; l=$0 ; fflush(); }' "$@"
  203.     }
  204. fi
  205.  
  206. hc pad $monitor $panel_height
  207.  
  208. {
  209.     ### Event generator ###
  210.     # based on different input data (mpc, date, hlwm hooks, ...) this generates events, formed like this:
  211.     #   <eventname>\t<data> [...]
  212.     # e.g.
  213.     #   date    ^fg(#BFBFBF)18:33^fg(#909090), 2013-10-^fg(#BFBFBF)29
  214.  
  215.     #mpc idleloop player &
  216.     #mpc idleloop player | cat &
  217.     #mpc_pid=$!
  218.     while true ; do
  219.         # "date" output is checked once a second, but an event is only
  220.         # generated if the output changed compared to the previous run.
  221.         #date +$'date\t^fg(textfg02)%a-%b-^fg(textfg02)%d ^fg(textfg02)%k:%M'
  222.         date +$'date\t^fg(#BFBFBE)%a-%b-^fg(#BFBFBE)%d ^fg(#BFBFBE)%k:%M'
  223.         sleep 1 || break
  224.     done > >(uniq_linebuffered) &
  225.     childpid=$!
  226.    
  227.     while true ; do
  228.         #echo "volume $(amixer get Master | tail -n 1 | cut -d '[' -f 2 | sed 's/%.*//g' | sed -n 1p)"
  229.         echo "$(volume)"
  230.         sleep 1 || break
  231.     done > >(uniq_linebuffered) &
  232.     vol_pid=$!
  233.    
  234.     while true ; do
  235.         #echo "layout $(xset -q|grep LED| awk '{ if (substr ($10,5,1) == 1) print "-RU-"; else print "-EN-"; }')"
  236.         echo "$(layout)"
  237.         sleep 1 || break
  238.     done > >(uniq_linebuffered) &
  239.     lay_pid=$!
  240.    
  241.     while true ; do
  242.         echo "$(memory)"
  243.         sleep 1 || break
  244.     done > >(uniq_linebuffered) &
  245.     mem_pid=$!
  246.    
  247.     while true ; do
  248.         echo "$(cpuuse)"
  249.         sleep 1 || break
  250.     done > >(uniq_linebuffered) &
  251.     cpu_pid=$!
  252.    
  253.     while true ; do
  254.         echo "$(battery)"
  255.         sleep 1 || break
  256.     done > >(uniq_linebuffered) &
  257.     bat_pid=$!
  258.    
  259.      while true ; do
  260.         echo "$(mpd)"
  261.         sleep 1 || break
  262.     done > >(uniq_linebuffered) &
  263.     mpd_pid=$!
  264.    
  265.     hc --idle
  266.     kill $childpid $vol_pid $lay_pid $mem_pid $cpu_pid $bat_pid $mpd_pid
  267. } 2> /dev/null | {
  268.     IFS=$'\t' read -ra tags <<< "$(hc tag_status $monitor)"
  269.     visible=true
  270.     date=""
  271.     windowtitle=""
  272.     while true ; do
  273.  
  274.         ### Output ###
  275.         # This part prints dzen data based on the _previous_ data handling run,
  276.         # and then waits for the next event to happen.
  277.  
  278.         bordercolor="#26221C"
  279.         separator="^bg()^fg($selbg)|"
  280.         # draw tags
  281.         for i in "${tags[@]}" ; do
  282.             case ${i:0:1} in
  283.                 '#')
  284.                     echo -n "^bg($selbg)^fg($selfg)"
  285.                     ;;
  286.                 '+')
  287.                     echo -n "^bg(#9CA668)^fg(#141414)"
  288.                     ;;
  289.                 ':')
  290.                     echo -n "^bg()^fg($textfg01)"
  291.                     ;;
  292.                 '!')
  293.                     echo -n "^bg(#FF0675)^fg(#141414)"
  294.                     ;;
  295.                 *)
  296.                     echo -n "^bg()^fg(#636363)"
  297.                     ;;
  298.             esac
  299.             if [ ! -z "$dzen2_svn" ] ; then
  300.                 # clickable tags if using SVN dzen
  301.                 echo -n "^ca(1,\"${herbstclient_command[@]:-herbstclient}\" "
  302.                 echo -n "focus_monitor \"$monitor\" && "
  303.                 echo -n "\"${herbstclient_command[@]:-herbstclient}\" "
  304.                 #echo -n "use \"${i:1}\") ${i:1} ^ca()"
  305.                 echo -n "use \"${i:1}\") ^fn(FontAwesome:size=9)${i:1}^fn() ^ca()"
  306.             else
  307.                 # non-clickable tags if using older dzen
  308.                 echo -n " ${i:1} "
  309.             fi
  310.         done
  311.        
  312.         for func1 in mpd; do
  313.             left="$(${func1})"
  314.         done
  315.        
  316.  
  317.        
  318.         echo -n "$separator"
  319.         #echo -n "$left $separator"
  320.         echo -n "^bg()^fg() ${windowtitle//^/^^}"
  321.        
  322.        
  323.         # small adjustments
  324.         right=""
  325.         for func in cpuuse memory battery volume layout; do
  326.             right="${right}$(${func}) $separator"
  327.         done
  328.  
  329.         right="${right} $date $separator"
  330.         #right_text_only=$(echo -n "$right"|sed 's.\^[^(]*([^)]*)..g')
  331.        
  332.         # get width of right aligned text.. and add some space..
  333.         width=$($textwidth "$font" "$right_text_only" "$left")
  334.         echo -n "^pa($(($panel_width - 700 - $width)))$separator^fn(Terminus:size=9)$left^fn()"
  335.         echo -n "^pa($(($panel_width - 390 - $width)))$separator$right"
  336.         #echo -n "^pa($(($panel_width - 60 - $width)))$right"
  337.         echo
  338.        
  339.        
  340.         #echo ""
  341.         ## wait for next event
  342.         #read line || break
  343.         #cmd=( $line )
  344.         # find out event origin
  345.  
  346.         ### Data handling ###
  347.         # This part handles the events generated in the event loop, and sets
  348.         # internal variables based on them. The event and its arguments are
  349.         # read into the array cmd, then action is taken depending on the event
  350.         # name.
  351.         # "Special" events (quit_panel/togglehidepanel/reload) are also handled
  352.         # here.
  353.  
  354.         # wait for next event
  355.         IFS=$'\t' read -ra cmd || break
  356.         # find out event originE
  357.         case "${cmd[0]}" in
  358.             tag*)
  359.                 #echo "resetting tags" >&2
  360.                 IFS=$'\t' read -ra tags <<< "$(hc tag_status $monitor)"
  361.                 ;;
  362.              date)
  363.                 #echo "resetting date" >&2
  364.                 date="${cmd[@]:1}"
  365.                 ;;
  366.             #vol)
  367.                 #vol="${cmd[@]:3}"
  368.                 #;;
  369.             quit_panel)
  370.                 exit
  371.                 ;;
  372.             togglehidepanel)
  373.                 currentmonidx=$(hc list_monitors | sed -n '/\[FOCUS\]$/s/:.*//p')
  374.                 if [ "${cmd[1]}" -ne "$monitor" ] ; then
  375.                     continue
  376.                 fi
  377.                 if [ "${cmd[1]}" = "current" ] && [ "$currentmonidx" -ne "$monitor" ] ; then
  378.                     continue
  379.                 fi
  380.                 echo "^togglehide()"
  381.                 if $visible ; then
  382.                     visible=false
  383.                     hc pad $monitor 0
  384.                 else
  385.                     visible=true
  386.                     hc pad $monitor $panel_height
  387.                 fi
  388.                 ;;
  389.             reload)
  390.                 exit
  391.                 ;;
  392.             focus_changed|window_title_changed)
  393.                 windowtitle="${cmd[@]:2}"
  394.                 ;;
  395.             #player)
  396.             #    ;;
  397.         esac
  398.     done
  399.  
  400.     ### dzen2 ###
  401.     # After the data is gathered and processed, the output of the previous block
  402.     # gets piped to dzen2.
  403.  
  404. } 2> /dev/null | dzen2 -w $panel_width -x $x -y $y -fn "$font" -h $panel_height \
  405.     -e 'button3=;button4=exec:herbstclient use_index -1;button5=exec:herbstclient use_index +1' \
  406.     -ta l -bg "$bgcolor" -fg "$textfg01"
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement