Плюшки к dzen2

Хочу такой, на bash!

Чтобы как-то так работал:
declare font='xos4 terminus:pixelsize=16:style=bold'
declare exp='onstart=uncollapse;button1=exit;button3=exit'
tm=$(date +%m)
ty=$(date +%Y)
while read -r -n1 dzen_cal_var; do
  if [[ $dzen_cal_var == + ]]; then
   if (( "$tm" > "11" )); then
      tm=$(expr $tm - 11)
      ty=$(expr $ty + 1)
    else
      tm=$(expr $tm + 1)
    fi
  elif [[ $dzen_cal_var == - ]]; then
    if (( "$tm" < "2" )); then
      tm=$(expr $tm + 11)
      ty=$(expr $ty - 1)
    else
      tm=$(expr $tm - 1)
    fi
  fi
  echo "^ca(1,echo - ) < ^ca()$tm $ty^ca(1,echo + ) > ^ca()"
  cal $tm $ty | tail -7
done | dzen2 -p -e "$exp" -fn "$font" -w 200 -l 8 -y 26 -x -200
Задача через что-то, будет то хоть pipe, хоть &2>/dev/ass вернуть "+" в stdin родителя... такое вообще возможно???

p.s. желательно не нарушая структуры, а то у меня получилось сделать через 3<>fifo но тогда создаются много ненужных сущностей которые потом прибивать надо...
Ошибки в тексте-неповторимый стиль автора©
exec 3<>$fifo
while read -r -n1 dzen_cal_var <&3; do
echo dzen_cal_var
done
ха, не знал что та можно...

Ошибки в тексте-неповторимый стиль автора©
indeviral
ха, не знал что та можно…

хотел запустить на frankenwm.
создал этот скрипт, прописал в .xinitrc путь к нему, фифо создается, но панель пустая.
подскажешь?
эть, эт как бы наброски скрипта только календарика.
Ошибки в тексте-неповторимый стиль автора©
indeviral, есть готовый скрипт dzen-cal, можно встроить в статусбар (date) чтобы открывался по нажатию кнопки мыши
Ошибки не исчезают с опытом - они просто умнеют
vasek
спсасибо, такого не видел. довольно монструозно
да и вызов самого себя с другими параметрами, это такое себе решение (хотя признаться я до того не додумался)

у меня в итоге получилось как-то так, потом переменный в общий конфиг отправлю и вообще останется десяток строчек)))
#!/bin/bash
declare col1="^fg(#ffffff)"
declare col2="^fg(#808080)"
declare col3="^fg(#ffc123)"
declare col0="^fg()"
declare font='xos4 terminus:pixelsize=16:style=bold'
declare exp='onstart=uncollapse;button1=exec:pkill -f '$0';button3=exec:pkill -f '$0''
day=$(date +%d)
year=$(date +%Y)
month=$(date +%m)
fifo="/tmp/cal.fifo"
[[ -p $fifo ]] || mkfifo -m 600 "$fifo"
if [[ -n $(ps -aux | grep dzen2-popup | grep -v grep) ]]; then
  pkill -f "dzen2 -title-name dzen2-popup"
  pkill -f "$0"
  rm $fifo
fi
exec 3<>$fifo
echo 0 >$fifo
while read -r -n1 dzen_cal_var < $fifo; do
  if [[ $dzen_cal_var == + ]]; then
   if (( "$month" > "11" )); then
      month=$(( $month - 11 )) && year=$(( $year + 1 ))
    else
      month=$(( $month + 1 ))
    fi
  elif [[ $dzen_cal_var == - ]]; then
    if (( "$month" < "2" )); then
      month=$(( $month + 11 )) && year=$(( $year - 1 ))
    else
      month=$(( $month - 1 ))
    fi
  else
    echo "^fg(#111)^r(200x5)"
    date=$(cal $month $year | awk NR==1'{print $1" "$2}')
    echo "^pa(0)^ca(1,echo - > $fifo)  <  ^ca()$col1$date$col0^pa(140)^ca(1,echo + > $fifo)  >  ^ca()"
    if [[ $month-$year == $(date +%m-%Y) ]]; then
       cal $month $year | tail -7 | sed s/$day/${col3}$day${col0}/g
    else
       cal $month $year | tail -7
    fi
    echo "^fg(#111)^r(200x5)"
  fi
done | dzen2 -title-name "dzen2-popup" -p -e "$exp" -sa c -fn "$font" -w 200 -l 9 -y 24 -h 20 -x -200

p.s. итак, календарик у меня есть, теперь хочу "интерактивный" плейлист к mpd +-5 треков и чтобы с тыкалкой длительности(seek bar) !
Ошибки в тексте-неповторимый стиль автора©
Дружище indeviral, признаться, впервые прочитав топ, не понял о чем речь. Потом, пораскинув мозгами, подумал, ведь всё уже решено. Просто dzen не умеет передавать переменные родителю. Выход - внешний файл. В твоем случае подошел fifo, а в моем, поскольку строку надо было обновлять ежесекундно, я просто передавал переменные через /tmp-файл. И не надо создавать 3-й канал. )

playlist v0.1a с рабочим seek
#!/bin/bash
declare col1="^fg(#ffffff)"
declare col2="^fg(#808080)"
declare col3="^fg(#ffc123)"
declare col0="^fg()"
declare font='xos4 terminus:pixelsize=16:style=bold'
declare exp='onstart=uncollapse;button1=exec:pkill -f '$0';button3=exec:pkill -f '$0''
tmp=$(mktemp)
if [[ -n $(ps -aux | grep dzen2-popup | grep -v grep) ]]; then
  pkill -f "dzen2 -title-name dzen2-popup"
  pkill -f "$0"
fi
ctrl(){
ctrl+="^p(20)$col1^ca(1,mpc -q prev)< prev ^ca()"
ctrl+="^ca(1,mpc -q stop && pkill -f "$0" ) stop ^ca()"
ctrl+="^ca(1,mpc -q next) next >^ca()$col0^p()"
ctrl+="^p(150)$(mpc | awk NR==2'{print $3}')^p()"
echo "$ctrl"
}
seek(){
mpc_prec=$(mpc | awk NR==2'{print $4}' | grep -o '[0-9]*')
for i in {1..100}; do
  if (( $i < $mpc_prec )); then
    seek+="^ca(1,mpc -q seek $i%)$col3^r(4x2)$col0^ca()"
  else
    seek+="^ca(1,mpc -q seek $i%)$col2^r(4x2)$col0^ca()"
  fi
done
echo "^pa(20)$seek^pa()"
}
playlist(){
current=$(mpc | awk NR==2'{print $2}' | grep -o '#[0-9]*')
IFS=$'\n' mpc_playlist=($(mpc playlist))
for i in ${!mpc_playlist[*]}; do
  if [[ "#$i" == "$current" ]]; then
    playlist+="^pa(20)${col3}${mpc_playlist[$i-1]}${col0}^pa()\n"
    for num in $(seq $i $(( $i + 3 ))); do
      playlist+="^pa(20)${mpc_playlist[$num]}^pa()\n"
    done
  fi
done
echo -en "$playlist"
}

(echo "MPD"
while :; do
echo "$(ctrl)
$(seek)
$(playlist)
" > $tmp
cat $tmp
sleep 0.5
done) | dzen2 -title-name "dzen2-popup" -p -y 24 -x -450 -l 8 -w 450 -ta c -fn "$font" -e "$exp"
p.s. надо usb ляполку теперь запилить (люп примонтировалось, ляп отмантировалась!), а то через udev уже совсем не то(((
Ошибки в тексте-неповторимый стиль автора©
 
Зарегистрироваться или войдите чтобы оставить сообщение.