Кстати, долго думал: как при подключении устройства показать окошко? Ну хорошо, любую программу при подключении флэшки можно запустить с помощью строчки где-нибудь в /etc/udev/rules.d наподобие этой:
SUBSYSTEM=="scsi", SYSFS{model}=="CF Card CF", ACTION=="add", RUN="/path/to/program"
Но ведь программа будет запущена с правами демона udevd, вне любых иксов, и вообще не знает, что иксы запущены. Ей бы надо определить, запущены ли иксы вообще, на каком именно дисплее (предусмотреть случай, когда запущены двое иксов - у меня это штатный режим), получить разрешение на подключение к этим иксам, и только тогда можно показывать окошко. Во геморрою-то...
Но, нормальные
Обходной путь получился такой. При запуске иксов фоном запускается питоновский скрипт, который каждые 5 секунд проверяет содержимое пайпа /var/run/mphotos. Если там появляется строчка "plugged" - показывается окошко и делается вся работа по копированию и проявке фоток. Иначе ждет дальше. А udev указанным выше способом при подключении флэшки запускает примитивный скрипт, который и записывает строчку "plugged" в пайп /var/run/mphotos. Все.
Огромное программисткое СПАСИБО! =) А то всё руки не доходили разобраться как узнать о подключении нового девайса.
ОтветитьУдалить:)) Да всегда пожалуйста.
ОтветитьУдалитьА на код оной "ещё одной поделки" взглянуть можно?
ОтветитьУдалитьМожно. Только, вероятно, для работы на вашей системе его придется индивидуально патчить :)
ОтветитьУдалитьhttp://portnov84.narod.ru/downloads/mphotos.tar.gz
На мой взгляд, зря не стал использовать dbus. Потому что тот самый Python-процесс в фоне и есть "аналог" dbus.
ОтветитьУдалитьДля того, чтобы процессы могли обмениваться сообщениями по dbus, они должны быть запущены в пределах одной dbus-сессии. А как запустить udevd под dbus? dbus-launch /sbin/udevd ?
ОтветитьУдалитьА если использовать "системную" шину dbus, получится уже совершенно велосипед - клон hal.
ОтветитьУдалитьВпрочем, главная причина, почему я не стал использовать dbus - в debian есть как минимум две несовместимые его версии, причем одним программам нужна одна, другим другая... путаница короче. Так что с dbus я пока что предпочитаю не связываться.
А почему бы фронтенд программе не открыть сокет и не слушать его пока udev не пошлет на этот сокет чего-нибудь? Как-то не красивы эти 5 сек...
ОтветитьУдалитьСокеты - тоже вариант, но их апи все-таки посложнее чем у пайпов ;)
ОтветитьУдалитьА самое красивое (хоть и не самое переносимое) решение ИМХО - использовать inotify для отслеживания изменений в пайпе.
откройте для себя select(2) :-)
ОтветитьУдалитьа /usr/bin/programm --display=:0 вот маленькое решение прооблемы
ОтветитьУдалить