April 1, 2010

Панель CPU conky + dzen2 + xmonad

Итак, в след за постом о панели питания публикую мою панель состояния CPU. Напомню что речь идёт о dzen2 панели для Xmonad генерируемой с помощью conky.

Что я хотел получить (постановка задачи):

- график общей активности процессора во времени;
- индикатор текущей активности для каждого ядра;
- текущую частоту для каждого ядра;
- общий процент текущего использования;
- общую температуру.

Как это выглядит в итоге:



К dzen2 прилагается специально расчитанный на генерацию графиков CPU инструмент gcpubar. Но у него есть минусы:

1. Он требует отдельной панели, т.е. проблемно рядом с ним на одной панели разместить ещё какой-то контент. Конечно есть опция -l, но посмотрев в документацию вы поймёте почему я от этого отказался.
2. После долгих мучений с ним я сделал вывод, что в ситуации с плавающей частотой процессора он начинает рисовать билеберду.

По этому я остановился на решении со старым добрым его же (dzen2) инструментом gdbar. Идея в том, чтобы рисовать с его помощью столбцы гравика загрузки CPU и обеспечить их ротацию через какой-то временный файл. Собственно всё в коде ниже.

Для индикаторов загрузки я ядер использовал круговые диаграммы.

Вот код конфигурации Xmonad:

~/.xmonad/xmonad.hs:
main = do
myStatusBarPipe <- spawnPipe myStatusBar
...
spawn myCPUBar
...
...
myCPUBar = "conky -c ~/.conky_cpu | sh | dzen2 -x 953 -w 90 -ta l " ++
myDzenBarGeneralOptions
...


И код conky:

~/.conky_cpu
gap_y -1000

double_buffer yes
out_to_console yes
own_window yes
own_window_type desktop
update_interval 3.0

TEXT
E='echo -n'

# Set icon
$$E '^p(5)^i(/home/gray/.dzen/bitmaps/sm2tik/cpu.xbm)^p(5)'

# Add new segment to the graph file
echo ${cpu} | gdbar -s v -h 14 -sw 1 >> /tmp/.dzen2cpugraph

# Print last 15 segments dequeuing the oldest one
QUEUE=`tail -n 15 /tmp/.dzen2cpugraph`
ISFIRST=true
for ITEM in $$QUEUE; do
$$E $$ITEM
if [ $$ISFIRST = true ]; then
echo $$ITEM >/tmp/.dzen2cpugraph
ISFIRST=false
fi
echo $$ITEM >>/tmp/.dzen2cpugraph
done

$$E '^ib(1)^fn(xft:monospace:size=5)^pa(36;0)'

# CPU usage percent
$$E 'u: ^fg(white)${cpu}%^fg()'

$$E '^pa(62;)'
$$E 't: ${acpitemp}°'

# Cores pies and frequencies
$$E '^pa(36;7)'
echo ${cpu 0} | gdbar -s p -w 7 -nonl
$$E '^fg()^p(2)${freq_g 1}'
$$E '^p(3)'
echo ${cpu 1} | gdbar -s p -w 7 -nonl
$$E '^fg()^p(2)${freq_g 2}'

echo


Всё просто. В следующий раз напишу как в Xmonad сделать затенение (точнее прозрачность) не активных тайлов (окон).

Мою последнюю конфигурацию Xmonad (пока без затенения) и всё её сопровождающее найдёте здесь Xmonad/Config_archive (поищите gray_hemp).

1 comment:

Anonymous said...

спасибо большущее!!
отличный способ формировать скрипт в коньках и перенаправлять его на sh!

Post a Comment