Когда-то, на welinux, а именно вот тут:
http://welinux.ru/post/3394/ публиковалось решение для данной задачи.
Но, дело в том, что purple-remote использует информацию сессии dbus, и дисплей, на котором запущен Pidgin. Если с дисплеем, все понятно, то сессия dbus постоянно разная. И именно этого не было учтено. Так же я подумал, что неплохо было бы после открытия крышки ноутбука/нетбука возвращать старый статус, стоявший до закрытия крышки.
И еще, по умолчанию в purple-remote для stdin и stdout не задано никаких кодировок.
Первым делом исправим эту досадную несправедливость:
sudo nano /usr/bin/purple-remote
и после строки
import sys, добавляем:
import codecs
sys.stdin = codecs.getwriter('utf-8')(sys.stdin);
sys.stdout = codecs.getwriter('utf-8')(sys.stdout);
сохраняем(CTRL+O, Enter
), выходим (CTRL+X)
теперь создадим скрипт, который будет выдирать данные сессии dbus. Я создавал его в папке .config своего домашнего каталога, чтобы не мозолил глаза...
nano ~/.config/xdbus.sh
после чего вставляем туда такой код:
#!/bin/bash
touch $HOME/.Xdbus
chmod 600 $HOME/.Xdbus
env | grep DBUS_SESSION_BUS_ADDRESS > $HOME/.Xdbus
echo 'export DBUS_SESSION_BUS_ADDRESS' >> $HOME/.Xdbus
env | grep XAUTHORITY >> $HOME/.Xdbus
echo 'export XAUTHORITY' >> $HOME/.Xdbus
Сохраняем, выходим.
Даем скрипту права на выполнение:
sudo chmod +x ~/.config/xdbus.sh
Добавляем скрипт в Запускаемые приложения, чтобы каждый раз при загрузке нашего пользователя у нас были новые данные о dbus-сессии. Для Gnome это будет так:
Меню->Система->Параметры->Запускаемые приложенияЖмем на
Добавить. Название пишем любое. Например - Xdbus Session Info. В строке Команда, пишем:
sh -c "/home/имя_вашего_пользователя/.config/xdbus.sh"
Комментарий можно пропустить. Жмем на
Сохранить. Выходим оттуда.
Это была подготовительная стадия, своего рода прелюдия, а теперь можно приступить непосредственно к делу.
Открываем файл
/etc/acpi/lid.shsudo nano /etc/acpi/lid.sh
И после первых двух строк:
#!/bin/bash
# TODO: Change the above to /bin/sh
вставляем нужное нам:
if [ -e /tmp/pidgin_status ]
then
STATUS=`cat /tmp/pidgin_status`;
else
export DISPLAY=:0.0;
source /home/имя_вашего_пользователя/.Xdbus; sudo -u имя_вашего_пользователя /usr/bin/purple-remote "getstatusmessage" > /tmp/pidgin_status
STATUS=`cat /tmp/pidgin_status`;
fi
grep -q closed /proc/acpi/button/lid/*/state
if [ $? = 0 ]
then
export DISPLAY=:0.0;
source /home/имя_вашего_пользователя/.Xdbus; sudo -u имя_вашего_пользователя /usr/bin/purple-remote "setstatus?status=away&message=Отошел. Крышка ноута закрыта";
else
export DISPLAY=:0.0;
export STATUS;
source /home/имя_вашего_пользователя/.Xdbus; sudo -u имя_вашего_пользователя /usr/bin/purple-remote "setstatus?status=available&message=$STATUS";
unset STATUS;
rm /tmp/pidgin_status;
fi
Думаю, объяснять что делается в каждой строке, нет необходимости, ибо каждый, кто хоть чуть-чуть знает bash, сможет в этом разобраться, или даже переделать под себя. Можно например добавить озвучку открытия и закрытия крышки через festival.
в таком случае устанавливаем его командой
sudo apt-get install festival и в вышеприведенном коде перед
вторым else добавляем:
echo "closed" | festival --tts
и перед
вторым fi:
echo "opened" | festival --tts
Ах да! Не забываем после всех манипуляций перелогиниться!