Тонкая настройка xmobar

Итак, приступим.
К сожалению вынужден сообщить, что после некоторого тестирования выяснилось, что нужно не два, а три канала:
1 - канал, который будет слушать сокет
2 - канал, который будет слушать скрипт
3 - канал, в который скрипт будет отправлять модифицированные данные
Как вариант, второй канал можно заменить текстовым файлом, т.к. информация в файле будет обновляться одновременно с обновлением первого канала, т.е. как только программа получит новые данные от сервера. В общем, это не принципиально, поэтому выкладываю способ для трёх каналов. Захотите - переделаете.

$HOME/.config/gis-weather/gw_config1.json
.....
    "pipe1": {
        "active": true,
        "path": "/tmp/haron/cur_temp",
        "text": "{t_now}"
    },
    "pipe2": {
        "active": true,
        "path": "/tmp/haron/wi_socket",
        "text": "{icon_now}"
    },
    "pipe3": {
        "active": true,
        "path": "/tmp/haron/wi_data",
        "text": "{icon_now}"
    },
.....

$HOME/.config/systemd/user/wi.socket
[Unit]
Description=Weather_icon Socket
[Socket]
ListenFIFO=/tmp/haron/wi_socket
[Install]
WantedBy=sockets.target

$HOME/.config/systemd/user/wi.service
[Unit]
Description=Weather_icon service
[Service]
ExecStart=-/home/haron/.local/bin/XMWI
StandardInput=socket

$HOME/.local/bin/XMWI
#!/usr/bin/env zsh
# The script uses the font 'Weather Icons' - https://erikflowers.github.io/weather-icons/

CONDITIONS=`cat /tmp/haron/wi_data`
II=("00.png" "01.png" "02.png" "03.png" "04.png" "05.png" "06.png" "07.png" "08.png" "09.png" "10.png" "11.png" "12.png" "13.png" "14.png" "15.png" "16.png" "17.png" "18.png" "19.png" "20.png" "21.png" "22.png" "23.png" "24.png" "25.png" "26.png" "27.png" "28.png" "29.png" "30.png" "31.png" "32.png" "33.png" "34.png" "35.png" "36.png" "37.png" "38.png" "39.png" "40.png" "41.png" "42.png" "43.png" "44.png" "45.png" "46.png" "47.png" "*")
IO=("" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "")
for i in $(seq 0 ${#II[@]}); do
    if [[ "$CONDITIONS" == "${II[$i]}" ]]; then
      echo "<fn=4>${IO[$i]}</fn>" > /tmp/haron/wi_output
    fi
done
exit 0

xmobarrc
.....
, additionalFonts  = ["xft:Terminus (TTF):size=12:weight=bold:antialias=true:hinting=true","xft:Terminus Re33:size=4","xft:FontAwesome:pixelsize=14","xft:Weather Icons:pixelsize=14"]
.....
, Run PipeReader "/tmp/haron/wi_output" "WI"
.....
template = "..... %WI% ....."

.xinitrc
...
mkfifo /tmp/username/wi_output &
...

*** Примечания

1 - пути для каналов можно прописывать на своё усмотрение - место их расположения значения не имеет, я предпочитаю в /tmp. В первый канал выводится текущая температура (способ её вывода на панель описан в этом же топике ранее), второй канал прослушивается сокетом (абсолютно неважно, что туда будет выводиться, т.к. нас интересует сам факт обновления информации, а не он сама), третий канал содержит необходимую нам информацию, которую будет считывать скрипт, преобразовывать и перенаправлять в другой канал, который и прослушивается PipeReader'ом xmobar'а, его можно заменить текстовым файлом.
Каналы должны быть прописанны именно в таком порядке, т.к. из-за специфики программы информация туда пишется по очереди.
После внесения изменений в конфиг программы её следует перезапустить.

2 - после того, как создадите сокет и сервис, требуется активировать сокет
systemctl --user start wi.socket
systemctl --user enable wi.socket

3 - в скрипте используется шрифт Weather Icons - он есть в ауре (ссылки на аур и сайт я давал в предыдущих сообщениях). Его следует прописать в xmobarrc в additionalFonts
Соответственно в скрипте следует указать этот шрифт под тем же номером, под которым он прописан в xmobarrc.
В моём примере (и моей системе) это четвёртый альтернативный шрифт xmobar, поэтому в скрипте прописано <fn=4>. Основной шрифт xmobar - это fn=0 (счёт начинается с нуля)
Альтернативные шрифты нумеруются от 1 и далее

4 - Канал wi_output, куда скрипт будет сливать модифицированную информацию, следует создавать самому. Можно делать это командой в xinitrc или, как это делаю я, пользовательским сервисом (у меня он создаёт каталог /tmp/haron, в который переносится кеш и в котором тем же сервисом создаются все нужные мне временные файлы и каналы). Если вы разместите данный канал не в /tmp, то достаточно создать его один раз.

Вроде всё.



Gnome 2 >> Unity >> KDE 4 >> Openbox >> Awesome >> Xmonad
GitHub , BitBuket
Прикрутил ещё одно действие - переключение раскладки текущего окна кликом (старый вариант был, откровенно говоря, кривоват)

yaourt -S xkblayout-state

xmobarrc
template = " ...<action=`xkblayout-state set +1`>%kbd%</action> ... " 
Gnome 2 >> Unity >> KDE 4 >> Openbox >> Awesome >> Xmonad
GitHub , BitBuket
Ещё одно небольшое "улучшение" - изменил способ вывода уровня громкости в xmobar
Раньше звук выводился периодически выполняемым скриптом. Чтобы избежать постоянного ненужного выполнения скрипта немного изменил команды в xmonad.hs и xmobarrc
Теперь это реализовано так:

1 - xinitrc или сервис
mkfifo /tmp/haron/VO

2 - xmonad.hs

      ((0,                         0x1008ff13),  spawn "/usr/bin/pulseaudio-ctl up 5 && XMVol2")
    , ((0,                         0x1008ff11),  spawn "/usr/bin/pulseaudio-ctl down 5 && XMVol2")
    , ((0,                         0x1008ff12),  spawn "/usr/bin/pulseaudio-ctl mute && XMVol2")

3 - xmobarrc
.....
, Run PipeReader "/tmp/haron/VO" "VO"
.....
template = " ... <action=`pulseaudio-ctl up && XMVol2` button=5><action=`pulseaudio-ctl down && XMVol2` button=4><action=`pulseaudio-ctl mute && XMVol2` button=1><action=`XMPavucontrol` button=3>%VO%</action></action></action></action> ..."

4 - XMVol2
#!/usr/bin/env zsh
# Modified - Haron Prime
# License © 2017 WTFPL http://www.wtfpl.net/

MIXER="default"
[ -n "$(lsmod | grep pulse)" ] && MIXER="pulse"
[ -n "$(lsmod | grep jack)" ] && MIXER="jackplug"
MIXER="${2:-$MIXER}"

SCONTROL="${BLOCK_INSTANCE:-$(amixer -D $MIXER scontrols |
                  sed -n "s/Simple mixer control '\([A-Za-z ]*\)',0/\1/p" |
                  head -n1
                )}"

STEP="${1:-5%}"

capability() { # Return "Capture" if the device is a capture device
  amixer -D $MIXER get $SCONTROL |
    sed -n "s/  Capabilities:.*cvolume.*/Capture/p"
}

volume() {
  amixer -D $MIXER get $SCONTROL $(capability)
}

format() {
  perl_filter='if (/.*\[(\d+%)\] (\[(-?\d+.\d+dB)\] )?\[(on|off)\]/)'
  perl_filter+='{CORE::say $4 eq "off" ? "MUTE" : "'
  # If dB was selected, print that instead
  perl_filter+=$([[ $STEP = *dB ]] && echo '$3' || echo '$1')
  perl_filter+='"; exit}'
  perl -ne "$perl_filter"
}

VOL=`volume | format`
if [[ $VOL = "MUTE" ]]; then
  echo '<fc=#cccccc>Vol:</fc><fn=2> </fn><fc=#ff6500>'$VOL'</fc>' > /tmp/haron/VO
else
  echo '<fc=#cccccc>Vol:</fc><fn=2> </fn>'$VOL > /tmp/haron/VO
fi
exit 0

Теперь скрипт выполняется только после события изменения громкости.
Отображаемое значение в xmobar меняется моментально.

P.S> для того, чтобы после старта xmonad/xmobar не висела надпись Updating... в ожидании события изменения громкости, в xmonad.hs следует прописать однократное выполнение скрипта при старте. У меня это реализовано так

myStartupHook  =  return () <+> adjustEventInput <+> setWMName "LG3D" <+> onScr 1 W.greedyView "W" <+> spawn "echo > /tmp/haron/minwin" <+> spawn "gis-weather" <+> spawn "XMVol2"

Уровень громкости отображается сразу после старта, никакого ожидания не происходит.

P.S> UPD
Gnome 2 >> Unity >> KDE 4 >> Openbox >> Awesome >> Xmonad
GitHub , BitBuket
Возвращаясь к нашим баранам )))

[email protected]
И еще, у меня почему-то
ST=`cat $HOME/.config/mpd/state | grep state | tail -1 | cut -d \  -f 2`
отрабатывает с заметной задержкой (пару сек.) Через же mpc - сразу.

ST=`mpc | grep "\[*\]" | cut -d \  -f 1 | sed -e 's/[^a-z]//g'`
case $ST in
    playing  ) echo "<fn=3></fn>" ;;
    paused   ) echo "<fn=3></fn>" ;;
    *        ) echo "<fn=3></fn>" ;;
esac
exit 0
Gnome 2 >> Unity >> KDE 4 >> Openbox >> Awesome >> Xmonad
GitHub , BitBuket
Haron_Prime
Возвращаясь к нашим баранам )))
Поставил у себя, работает отлично :)
как и задумывалось )))
Gnome 2 >> Unity >> KDE 4 >> Openbox >> Awesome >> Xmonad
GitHub , BitBuket
Haron_Prime
Ещё одно небольшое "улучшение" - изменил способ вывода уровня громкости в xmobar
UPD.
Изменил ещё раз.
Создал три копии скрипта XMVol2 с именами XMVolUp, XMVolDown, XMVolMute
В каждую копию добавил первой строкой действие изменения уровня громкости.
Типа вот так
#!/usr/bin/env zsh
pulseaudio-ctl up 5 &&
остальной_код_скрипта
exit 0
Ну и заменил все соответствующие команды в xmonad и xmobar

      ((0,                         0x1008ff13),  spawn "XMVolUp")
    , ((0,                         0x1008ff11),  spawn "XMVolDown")
    , ((0,                         0x1008ff12),  spawn "XMVolMute"

С одной стороны - наплодил сущностей
С другой - места на диске мне не жалко, да и занимают эти три скрипта совсем ничего. Зато мне стало удобнее ковыряться в конфигах xmonad и xmobar, а делаю я это регулярно.
В общем, получилось то, что получилось. )))
Gnome 2 >> Unity >> KDE 4 >> Openbox >> Awesome >> Xmonad
GitHub , BitBuket
Слепил ещё пару скриптиков для плавного изменения цвета в зависимости от получаемого значения
Tемпература Gpu, MB и GPU теперь выглядит так



Диапазон значений температуры 20-72 (Сначала сделал 30-82 но получилось как-то слишком зелено)
Диапазон цветов 00FF00-FFFF00-FF0000
Кому нужно - берите с гитхаба
Скрипты называются XMTCpuNew, XMTGpuNew, XMTMBNew
Корявенькие, но работают.
Входящие значения подправите под себя - я беру данные из sensors

Ещё один скрипт (XMRomNew, там же) для вывода значений использованого места на дисках
Сделан по тому же принципу
Диапазон 0-100 (green-yellow-red)


Но его ещё буду завтра редактировать

Gnome 2 >> Unity >> KDE 4 >> Openbox >> Awesome >> Xmonad
GitHub , BitBuket
В дополнение к вышенаписаному
Скрипт XMCpuLoad - высчитывает нагрузку CPU и выводит показания различным цветом в зависимости от нагрузки (шаг - 1 градус):
0% - #00FF00 ... 50% - #FFFF00 ... 100% - #FF0000

Результат выводится в канал
echo $USAGE > /tmp/haron/CU
Вывод в xmobar
, Run PipeReader "/tmp/haron/CU" "CU"
...
, template = "... %CU% ..."

P.S> как его запускать - решать вам
у меня его запуск прописан в xmonad.hs
myStartupHook  =  return () <+> .........  <+> spawn "XMCpuLoad"
Gnome 2 >> Unity >> KDE 4 >> Openbox >> Awesome >> Xmonad
GitHub , BitBuket
Haron_Prime
Скрипт XMCpuLoad
IN=("0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "10" "11" "12" "13" "14" "15" "16" "17" "18" "19" "20" "21" "22" "23" "24" "25" "26" "27" "28" "29" "30" "31" "32" "33" "34" "35" "36" "37" "38" "39" "40" "41" "42" "43" "44" "45" "46" "47" "48" "49" "50" "51" "52" "53" "54" "55" "56" "57" "58" "59" "60" "61" "62" "63" "64" "65" "66" "67" "68" "69" "70" "71" "72" "73" "74" "75" "76" "77" "78" "79" "80" "81" "82" "83" "84" "85" "86" "87" "88" "89" "90" "91" "92" "93" "79" "95" "96" "97" "98" "99" "100")
OUT=("00FF00" "05FF00" "0AFF00" "0FFF00" "14FF00" "19FF00" "1EFF00" "23FF00" "28FF00" "2DFF00" "32FF00" "37FF00" "3CFF00" "41FF00" "46FF00" "4BFF00" "50FF00" "55FF00" "5AFF00" "5FFF00" "64FF00" "69FF00" "6EFF00" "73FF00" "78FF00" "7DFF00" "82FF00" "87FF00" "8CFF00" "91FF00" "96FF00" "9BFF00" "A0FF00" "A5FF00" "AAFF00" "AFFF00" "B4FF00" "B9FF00" "BEFF00" "C3FF00" "C8FF00" "CDFF00" "D2FF00" "D7FF00" "DCFF00" "E1FF00" "E6FF00" "EBFF00" "F0FF00" "F5FF00" "FAFF00" "FFFF00" "FFFA00" "FFF500" "FFF000" "FFEB00" "FFE600" "FFE100" "FFDC00" "FFD700" "FFD200" "FFCD00" "FFC800" "FFC300" "FFBE00" "FFB900" "FFB400" "FFAF00" "FFAA00" "FFA500" "FFA000" "FF9B00" "FF9600" "FF9100" "FF8C00" "FF8700" "FF8200" "FF7D00" "FF7800" "FF7300" "FF6E00" "FF6900" "FF6400" "FF5F00" "FF5A00" "FF5500" "FF5000" "FF4B00" "FF4600" "FF4100" "FF3C00" "FF3700" "FF3200" "FF2D00" "FF2800" "FF2300" "FF1E00" "FF1900" "FF1400" "FF0F00" "FF0A00")...
USAGE=`
      for i in $(seq 0 ${#IN[@]}); do
          if [[ "$DIFF_USAGE" == "${IN[$i]}" ]]; then
            echo "<fc=#${OUT[$i]}>$DIFF_USAGE%</fc>"
          fi
      done
    `
выводит показания различным цветом в зависимости от нагрузки (шаг - 1 градус):
0% - #00FF00 ... 50% - #FFFF00 ... 100% - #FF0000
Вы теперь везде где надо и где нет будете массивы применять? На это же смотреть больно. Я уже не говорю сколько времени вы потратили на калибровку цветов... )
Тут я описывал маленькую процедуру. В вашем случае (насколько я понимаю и если нигде не ошибся) это должно выглядеть так:
if [ $DIFF_USAGE -gt 50 ] ; then
        tmp="0`printf "%x\n" $((255-($DIFF_USAGE-50)*5))`"
        echo "<fc=#ff${tmp: -2}00>$DIFF_USAGE%</fc>"
        else tmp="0`printf "%x\n" $((5*$DIFF_USAGE))`ff00"
        echo "<fc=#${tmp: -6}>$DIFF_USAGE%</fc>"
fi
Т.е. в шесть строк делает:
Aivar
При значении входных "процентов" от 0-50 цвет плавно меняется от зеленого к желтому, от 51-100 - от желтого к красному.
Дарю. )
 
Зарегистрироваться или войдите чтобы оставить сообщение.