19 июл. 2010 г.

osd-slider - ползунок состояния для tiling WM и box'ов.

В "больших" DE, таких как KDE или GNOME, при изменении уровня яркости или громкости рисуется красивый ползунок, отображающий текущий уровень изменяемой величины:
К сожалению, подобного ползунка, но для какого-нибудь легковесного WM, как правило не предусмотрено. Например, появление в dwm подобного ползунка противоречит всей философии этого оконного менеджера. Но выход все же есть:


Думаю, большинству пользователей фреймовых или обычных оконных WM известна утилита под названием osd_cat, которая обычно идет в комплекте с пакетом xosd. Эту утилиту можно запустить с параметром -b percentage и она будет рисовать на экране ползунок, визуально отображающий число, переданное с параметром -P. Выглядит все это примерно так:
Естественно, уверен многим пришла в голову идея: добавить вызов osd_cat в соответствующий acpid'овый скрипт и наслаждаться ползунком не хуже чем у Gnome в Ubuntu. Но, к сожалению, при постепенном увеличении соответствующей величины ползунок мерцает:
video
Что самое интересное, если попеременно запускать osd_cat с разными числовыми значениями параметра -P из двух заранее открытых консолей, то ползунок больше не мерцает!
После подобного эксперимента, мне пришла в голову идея написать сервер, который будет принимать от клиентов числовые значения и запускать ползунок osd_cat с соответствующими значениями параметра -P.
На данный момент, такой сервер уже написан мной. Проект называется osd-slider и расположен по следующему адресу: http://code.google.com/p/osd-slider/. Версия 0.1 уже доступна для загрузки, также у проекта есть свой SVN (см. соответствующие вкладки на странице проекта).
После загрузки и распаковки архива, необходимо произвести компиляцию и установку, в соответствии с инструкциями, расположенными в файле ./osd-slider/README.
Перед компиляцией необходимо заглянуть в файл ./osd-slider/osd_server/define.h и поменять макросы DISPLAY и XAUTHORITY под свою систему. Для кастомизации вида osd_cat нужно работать с макросом OSD_CMD в том же файле (параметр -P обязательно должен быть в конце строки!). Например, у меня OSD_CMD имеет следующее значение:
osd_cat -b percentage -o 22 -A center -c '#42dd42' -d 2 -P
Демон osd_server нужно добавить в автозагрузку (для каждого дистрибутива свой способ).
Клиента - osd_client, предпочтительнее вызывать из acpid-скрипта. Клиент принимает один обязательный параметр - величину громкости или яркости в процентах. Получение значения для данного параметра в моем скрипте выглядит так:

В итоге, мы получаем не мигающий ползунок отображения уровня яркости:
video

9 комментариев:

  1. Привет.
    Сервер не собирается :( Постоянно выдает ошибку:
    /tmp/osd-slider/osd_server$ make
    whatis osd_cat &>/dev/null; \
    if [ "$?" -ne "0" ]; then \
    echo 'Error: osd_cat utility is not installed!'; \
    echo 'Install it first (xosd package)!'; \
    exit 1; \
    fi \

    gcc -c -Wall main.c init.c abort.c pipes.c child.c exec.c
    osd_cat (1) - X on-screen file displayer
    exec.c: In function ‘run_osdcat’:
    exec.c:26: warning: implicit declaration of function ‘WIFEXITED’
    gcc -o osd_server main.o init.o abort.o pipes.o child.o exec.o -lc
    exec.o: In function `run_osdcat':
    exec.c:(.text+0xaf): undefined reference to `WIFEXITED'
    collect2: ld returned 1 exit status
    make: *** [all] Ошибка 1

    Система Ubuntu 10.04 x86, xosd стоит, define.h под себя поправил.
    А почему "undefined reference to `WIFEXITED'" так и не смог понять %) Как быть?

    ОтветитьУдалить
  2. Судя по мануалу "undefined reference to `WIFEXITED'" возникает из-за:
    "If the _XOPEN_SOURCE feature test macro is defined, then the macros described in wait(2) (WEXITSTATUS(), etc.) are made available when including "

    Объявил в коде дефайн _XOPEN_SOURCE, теперь должно работать (смотри версию 0.1.1 или SVN).

    ОтветитьУдалить
  3. Не помогло. Та же самая ошибка - "undefined reference to `WIFEXITED'" :(
    Пробовал как из svn, так и 0.1.1 из download.

    Все include, которые в exec.c прописаны на месте (в /usr/include/, права на все файлы 644, владелец root (просто для инфы)), т.ж. проверил инклюды из других файлов, там тоже все ок.

    ОтветитьУдалить
  4. о_О не поверишь... Сразу под
    #define _XOPEN_SOURCE
    от нефиг делать, написал
    #define WIFEXITED
    и все собралось :) Или это не правильно?

    ОтветитьУдалить
  5. Нет, это один из специальных макросов, возвращающий состояние, с которым завершился форкнутый процесс.
    Он описан в stdlib.h и по идее должен спокойно использоваться при подключении этого заголовочного файла. Прочитал в комментарии к коду, что все эти макросы еще описываются в sys/wait.h - добавил соответствующую директиву в код exec.c, сейчас все должно скомпилироваться.

    Перезалил измененную версию 0.1.1

    ОтветитьУдалить
  6. Теперь собралось все :) Спасибо :)

    ОтветитьУдалить
  7. А сервер должен запускаться только от рута?

    ОтветитьУдалить
  8. Да - каталог, в котором создается named pipe, принадлежит пользователю root.

    ОтветитьУдалить