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

Хочу поделиться своим опытом в настройке xmobar. А точнее тем, как сделать его интерактивным.

Оглавление

00 - Вступление. Настройка вывода наличия и количества обновлений
01 - настройка вывода уровня громкости и действия по клику v1
02 - настройка вывода уровня нагрузки и температуры CPU и действия по клику
03 - настройка вывода температуры MB и GPU и действия по клику
04 - настройка вывода времени и даты и действия по клику
05 - настройка вывода текущей скорости сети и действия по клику
06 - настройка вывода количества трафика за текущие сутки и действия по клику
07 - настройка отображения и переключения раскладки клавиатуры и действия по клику
08 - настройка отображения использованной оперативной памяти и действия по клику
09 - простая кликабельная кнопка
10 - вывод текущей температуры воздуха v1
11 - кликабельные менюшки
12 - текущая погода v1
13 - текущая погода v2
14 - управление плейером mpd
15 - текущая погода v3
16 - переключение раскладки v2
17 - вывод уровня громкости и действия по кликам v2
18 - плавное изменение цвета текста в зависимости от получаемых значений

* Описываемые мною действия предполагают, что у вас в файле .profile (.bashprofile или .zprofile - в зависимости от того, кто какую оболочку использует в качестве основной) в параметр PATH включён каталог $HOME/.local/bin, как место нахождения пользовательских исполнительных файлов, т.к. в дальнейшем все скрипты мы будем создавать именно там.

** Во избежание ненужных вопросов "почему я использую столько внешних скриптов?" объясню сразу - для сокращения длинны строки template
Сейчас она у меня состоит из 1246 символов и в ней не так просто разобраться. Если вместо имён скриптов прописывать их содержимое, то длинна строки увеличится как минимум в 4-5 раз и разобраться в ней вообще станет невозможно. (UPD - на данный момент строка состоит уже из 2101 символа!)

*** Если обнаружите где-либо опечатки в коде - напишите мне в ЛС, буду весьма благодарен

**** Все актуальные и старые скрипты, а также актуальную версию xmobarrc и резервные копии предыдущих вариантов можно посмотреть на GitHub и Bitbucket

------------------------------------------------------------------------------------------------------------------------------------------

Поехали.
Начнём, пожалуй, с того, что лично у меня заняло больше всего времени - проверка обновлений и действия при наличии таковых.

1 - редактируем xinitrc - добавим туда следующую строку

mkfifo /tmp/pipe &

2 - создаём нужные нам скрипты

touch ~/.local/bin/{XMUpdate,XMYaourt}

3 - открываем их в текстовом редакторе и прописываем туда следующее

~/.local/bin/XMUpdate
#!/bin/sh
UPD=`checkupdates | wc -l`
if [ $UPD -gt 0 ]; then echo '<fc=#cccccc>Update:</fc> <fc=#ff6500>'$UPD' pkg</fc>' > /tmp/pipe
else echo > /tmp/pipe
fi
exit 0

~/.local/bin/XMYaourt
#!/bin/sh
urxvtc -name update -e yaourt -Syua &&
while `pgrep yaourt >/dev/null`
do
    sleep 1
done
echo > /tmp/pipe
exit 0

* вместо urxvt вам нужно вписать тот эмулятор терминала, который вам более удобен/привычен

4 - даём им права на исполнение

chmod +x ~/.local/bin/{XMUpdate,XMYaourt}

5 - редактируем .xmobarrc
Сначала добавляем наши скрипты

, Run Com        "XMUpdate" [] "" 36000
, Run PipeReader "/tmp/pipe" "Update"
* 36000 - проверка наличия обновлений будет осуществляться каждый час
** обновления проверяются только в тех репозитория, которые прописаны в pacman.conf, наличие обновлений в АУРе не проверяется

Потом прописываем их выполнение в строку template

<action=`XMYaourt` button=1>%Update%%XMUpdate%</action>

В результате, при наличии обновлений, в xmobar будет выводиться вот такая надпись



В случае отсутствия обновлений не выводится ничего. За это отвечает скрипт XMUpdate

Т.к. основной целью наших действий является интерактивность xmobar, то мы используем ещё один скрипт - XMYaourt
При клике на надписи левой кнопкой мыши откроется urxvt или тот терминал, который вы пропишите в своём скрипте, с предложением ввести пароль для обновления базы данных пакетов и установки обновлений.
После установки обновлений терминал автоматически закроется, а надпись исчезнет.

https://youtu.be/J3_Mmfww8so

Вот и всё.

В дальнейшем я планирую добавить ещё несколько примеров использования различных действий в xmobar
Gnome 2 >> Unity >> KDE 4 >> Openbox >> Awesome >> Xmonad
GitHub , BitBuket
НР, спасибо за труд, обязательно опробую твои наработки.
Пока всё интересно.
Теперь настроим управление громкостью.
Для вывода данных в xmobar я предпочитаю использовать сторонний скрипт XMVol

~/.local/bin/XMVol
#!/bin/sh

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`
echo '<fc=#cccccc>Vol:</fc> '$VOL
* в дальнейшем планируется отредактировать скрипт, для вывода данных через PipeRider

Он выводит в панель вот такую надпись



При выключении звука уровень громкости заменяется надписью MUTE

Помещаем скрипт в ~/.local/bin и даём права на исполнение.

Добавляем в xmobarc строку

Run Com        "XMVol" [] "" 10

а в строке template прописываем следующее

<action=`/usr/bin/pulseaudio-ctl up` button=5><action=`/usr/bin/pulseaudio-ctl down` button=4><action=`/usr/bin/pulseaudio-ctl mute` button=1><action=`XMncmpcpp` button=2><action=`mpc toggle` button=3>%XMVol%</action></action></action></action></action>

Расшифровка:
1- клик ЛКМ - выключение/включение звука
2 - клик ПКМ - воспроизведение/пауза mpd
3 - клик СКМ - открывает/закрывает окно терминала с запущенным ncmpcpp с помощью скрипта XMncmpcpp (расположен в ~/.local/bin)

~/.local/bin/XMncmpcpp
#!/bin/sh
if (pidof ncmpcpp >/dev/null); then kill $(pidof ncmpcpp)
else urxvtc -name ncmpcpp -e /usr/bin/ncmpcpp
fi
exit 0

4 - поворот колёсика мыши на себя - один щелчок +5% грмкомсти
5 - поворот колёсика мыши от себя - один щелчок -5% громкости
* для вывода звука используется pulseaudio
Продолжение следует
Gnome 2 >> Unity >> KDE 4 >> Openbox >> Awesome >> Xmonad
GitHub , BitBuket
Haron_Prime
В дальнейшем я планирую добавить ещё несколько примеров использования различных действий в xmobar
Навскидку - реально ли выводить список точек монтирования (авто)смонтированных сменных носителей, и чтобы по левому клику точка монтирования открывалась в файлменеджере, а по правому - вызывался скрипт отмонтирования?
Пробовать надо.
С выводом проблем нет, а вот с интерактивностью списка...
Gnome 2 >> Unity >> KDE 4 >> Openbox >> Awesome >> Xmonad
GitHub , BitBuket
Continue

Вывод нагрузки и температуры CPU

Для отображения нагрузки пользуюсь встроенными функциями xmobar

Run Cpu        ["-S","True","-t","<fc=#cccccc>CPU:</fc> <total>","-L","25","-H","75","--normal","#ffff00","--high","#ff6500"] 10
Расшифровывать все аргументы я здесь не буду - для этого есть мануал

Выглядит это так



При повышении нагрузки выше 25% цифры становятся жёлтыми, выше 75% - красно-оранжевыми

Т.к. стандартные средства xmobar для отображения температуры процессора криво работают с моим процессором (разогнанный AMD Phenom II X3 720 BE), я слепил вот такой скриптик и получаю эти данные с помощью sensors

~/.local/bin/TCPU
#!/bin/sh
temp1=`sensors | grep temp2 | tr -s \  | cut -d \  -f 2 | cut -c 2-3`
temp2=`sensors | grep temp2 | tr -s \  | cut -d \  -f 2`
if [ $temp1 -gt 54 ]; then echo '<fc=#ff6500>'$temp2'</fc>'
elif [ $temp1 -gt 44 ]; then echo '<fc=#ffff00>'$temp2'</fc>'
else echo $temp2
fi
exit 0

Температура до 45 градусов отображается дефолтным цветом, от 45 до 55 жёлтым, выше 55 красно-оранжевым.
В xmobarrc скрипт прописан так:

Run Com        "TCPU" [] "" 10

Теперь переходим к действиям по кликам.

В строке template присутствует следующая запись

<action=`XMTop-cpu` button=1><action=`XMHtop` button=3>%cpu% %TCPU%</action></action>

Клик ЛКМ вызывает/закрывает всплывающее окно через скрипт XMTop-cpu

~/.local/bin/XMTop-cpu
#!/bin/sh
if (pidof dunst >/dev/null); then kill $(pidof dunst)
else ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%cpu | head | xargs -0 notify-send -t 0
fi
exit 0



Клик ПКМ вызывает/закрывает окно терминала с запущеным HTOP с помощью скрипта XMHtop

~/.local/bin/XMHtop

#!/bin/sh
if (pidof htop >/dev/null); then kill $(pidof htop)
else urxvtc -name htop -e /usr/bin/htop
fi
exit 0

Продолжение следует
Gnome 2 >> Unity >> KDE 4 >> Openbox >> Awesome >> Xmonad
GitHub , BitBuket
Continue

Вывод температуры MB и GPU



И снова внешние скрипты

~/.local/bin/TMB
#!/bin/sh
temp1=`sensors | grep Board | tr -s \  | cut -d \  -f 3 | cut -c 2-3`
temp2=`sensors | grep Board | tr -s \  | cut -d \  -f 3`
if [ $temp1 -gt 59 ]; then echo '<fc=#cccccc>MB:</fc> <fc=#ff6500>'$temp2'</fc>'
elif [ $temp1 -gt 44 ]; then echo '<fc=#cccccc>MB:</fc> <fc=#ffff00>'$temp2'</fc>'
else echo '<fc=#cccccc>MB:</fc> '$temp2
fi
exit 0

Вывод: до +45 - дефолтный цвет, от 45 до 60 жёлтый, выше 60 красно-оранжевый

~/.local/bin/TGPU
#!/bin/sh
temp1=`sensors | grep temp1 | tail -1 | tr -s \  | cut -d \  -f 2 | cut -c 2-3`
temp2=`sensors | grep temp1 | tail -1 | tr -s \  | cut -d \  -f 2`
if [ $temp1 -gt 64 ]; then echo '<fc=#cccccc>GPU:</fc> <fc=#ff6500>'$temp2'</fc>'
elif [ $temp1 -gt 49 ]; then echo '<fc=#cccccc>GPU:</fc> <fc=#ffff00>'$temp2'</fc>'
else echo '<fc=#cccccc>GPU:</fc> '$temp2
fi
exit 0

Вывод: до 50 градусов дефолтный цвет, от 50 до 65 жёлтый, выше 65 красно-оранжевый

В xmobarrc они прописаны такЖ

, Run Com        "TMB" [] "" 10
, Run Com        "TGPU" [] "" 10

Запись в template:

<action=`XMSensors` button=13>%TMB%  %TGPU%</action>

В данном случае на ЛКМ и ПКМ повешено одно и то же действие - вызов/закрытие всплывающего окна скриптом XMSensors

~/.local/bin/XMSensors
#!/bin/sh
if (pidof dunst >/dev/null); then kill $(pidof dunst)
else sensors | xargs -0 notify-send -t 0
fi
exit 0



Продолжение следует
Gnome 2 >> Unity >> KDE 4 >> Openbox >> Awesome >> Xmonad
GitHub , BitBuket
Ну и последнее на сегодня - дата



Снова внешний скрипт XMTime

~/.local/bin/XMTime
#!/bin/sh
DATA=`date "+%d.%m.%Y"`
DAY=`date "+%A"`
TIME=`date "+%H:%M:%S"`
if [[ $DAY = "Суббота" ]]; then echo '<fc=#ffab00>'$DAY'</fc>' $DATA  '<fc=#cccccc>'$TIME'</fc>'
elif [[ $DAY = "Воскресенье" ]]; then echo '<fc=#ff6500>'$DAY'</fc>' $DATA  '<fc=#cccccc>'$TIME'</fc>'
else echo $DAY $DATA  '<fc=#cccccc>'$TIME'</fc>'
fi
exit 0

Результат работы скрипты на скрине - в воскресенье день недели отображается красно-оранжевым, в субботу оранжевым, в сотальные дни дефолтным цветом

Запись в xmobarrc

Run Com        "XMTime" [] "" 10

Запись в строке template:

<action=`XMCal` button=1><action=`XMXClock` button=3>%XMTime%</action></action>

Расшифровка:
Клик ЛКМ - вызов/закрытие всплывающего окна с календарём скриптом XMCal



~/.local/bin/XMCal
#!/bin/sh
if (pidof dunst >/dev/null); then kill $(pidof dunst)
else cal -y | xargs -0 notify-send -t 0
fi
exit 0

Клик ПКМ вызов/скрытие XClock скриптом XMXClock

~/.local/bin/XMXClock
#!/bin/sh
if (pidof xclock >/dev/null); then kill $(pidof xclock)
else xclock
fi
exit 0



Продолжение следует
Gnome 2 >> Unity >> KDE 4 >> Openbox >> Awesome >> Xmonad
GitHub , BitBuket
Спасибо за труд, кое-что уже воплотил, все работает.
Morisson, да не за что, в общем-то - я просто убивал свободное время ))))
Чуть позже продолжу - опишу остальные примочки, их осталось не так уж много
Gnome 2 >> Unity >> KDE 4 >> Openbox >> Awesome >> Xmonad
GitHub , BitBuket
 
Зарегистрироваться или войдите чтобы оставить сообщение.