суббота, января 06, 2007

И еще одна поделка на python-gtk

Сабж. Сделал удобнейшую вещь - при втыкании в usb-разъем флэшки от фотика появляется окошко "Слить фотки". Выбираем директорию, нажимаем Старт, и начинается процесс. На одном прогрессбаре показывается процесс копирования, потом на другом - процесс проявки из RAW. Т.е. практически аналог соответствующей тулзы из Гнома. Только Гном здесь совсем не нужен, не нужен ни hal, ни dbus, а нужны python, python-gtk2, python-glade-2.

Кстати, долго думал: как при подключении устройства показать окошко? Ну хорошо, любую программу при подключении флэшки можно запустить с помощью строчки где-нибудь в /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. Все.

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

  1. Огромное программисткое СПАСИБО! =) А то всё руки не доходили разобраться как узнать о подключении нового девайса.

    ОтветитьУдалить
  2. :)) Да всегда пожалуйста.

    ОтветитьУдалить
  3. А на код оной "ещё одной поделки" взглянуть можно?

    ОтветитьУдалить
  4. Можно. Только, вероятно, для работы на вашей системе его придется индивидуально патчить :)
    http://portnov84.narod.ru/downloads/mphotos.tar.gz

    ОтветитьУдалить
  5. На мой взгляд, зря не стал использовать dbus. Потому что тот самый Python-процесс в фоне и есть "аналог" dbus.

    ОтветитьУдалить
  6. Для того, чтобы процессы могли обмениваться сообщениями по dbus, они должны быть запущены в пределах одной dbus-сессии. А как запустить udevd под dbus? dbus-launch /sbin/udevd ?

    ОтветитьУдалить
  7. А если использовать "системную" шину dbus, получится уже совершенно велосипед - клон hal.
    Впрочем, главная причина, почему я не стал использовать dbus - в debian есть как минимум две несовместимые его версии, причем одним программам нужна одна, другим другая... путаница короче. Так что с dbus я пока что предпочитаю не связываться.

    ОтветитьУдалить
  8. Анонимный10/31/2007 6:53 ДП

    А почему бы фронтенд программе не открыть сокет и не слушать его пока udev не пошлет на этот сокет чего-нибудь? Как-то не красивы эти 5 сек...

    ОтветитьУдалить
  9. Сокеты - тоже вариант, но их апи все-таки посложнее чем у пайпов ;)
    А самое красивое (хоть и не самое переносимое) решение ИМХО - использовать inotify для отслеживания изменений в пайпе.

    ОтветитьУдалить
  10. Анонимный3/22/2008 5:38 ДП

    откройте для себя select(2) :-)

    ОтветитьУдалить
  11. Анонимный3/11/2010 1:51 ДП

    а /usr/bin/programm --display=:0 вот маленькое решение прооблемы

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