Подключаем lirc к любой программе

Подключаем lirc к любой программе

Мы живем не в том мире, в котором хотели бы жить. Хотя порой для ощущений идеальности нужно не так и много. И ни для кого не секрет, что иногда от какой-либо программы хочется той функциональности, которую она предоставить не может.

И дело даже не в несовершенстве конкретной программы или узости взглядов на мир разработчиков данного программного продукта, а скорее в нестандартных запросах, которые могут возникнуть во время использования таковой. С другой стороны слово стандарт не является отображением желаний и потребностей тех, на кого рассчитан продукт. Так происходит потому, что все мы разные, хоть и похожи друг на друга.

В один прекрасный день мне захотелось почитать одну занятную книженцию, но электронная книжка была занята моей горячо любимой женой. Однако под рукой У меня имелся компьютер, настроенный на параллельный вывод на монитор и телевизор, на котором весьма удобно посмотреть один-другой фильмец, лежа в уютной постели. Так же была настроена возможность управления программами при помощи ПДУ. В итоге я решил прикрутить управление с пульта к читалке FBReader.

Данную проблему можно несколькими способами:

  • взять исходники и добавить в них нужную нам функциональность1;
  • Использовать KRemoteControl (бывший KDELirc)2;
  • Наваять на скорую руку "костыль".

Я решил использовать последний. Путем недолгого гугления в Яндексе обнаружилась замечательная софтина xdotool, которая помогает отправлять команды в оконный интерфейс приложений3. Затем был написан простенький скрипт на perl, слушающий сокет lirc и отправляющий соответствующие команды.

  1. #!/usr/bin/perl
  2. use Socket;
  3.  
  4. #открываем сокет
  5. socket(LIRCD,PF_UNIX,SOCK_STREAM,0) or die "socket: $!";
  6. #/var/run/lirc/lircd - у вас путь может отличаться.
  7. connect(LIRCD,sockaddr_un("/var/run/lirc/lircd")) or die "connect: $!";
  8.  
  9. $end_until=0;
  10. until ($end_until)
  11. {
  12.   $tmp = <LIRCD>;
  13.   if ($tmp ne "")
  14.     {
  15.       @tmparr = split (/\ /,$tmp);
  16.  
  17.       #Завершение работы программы и скрипта
  18.       if ($tmparr[2] eq "POWEROFF") //POWEROFF - название клавиши ПДУ
  19.         {
  20.           $end_until=1;
  21.           `killall -s SIGQUIT FBReader`;
  22.         }
  23.  
  24.       #Отправляется программе нажатие клавиши вверх
  25.       if ($tmparr[2] eq "WORD_PREV")
  26.         {
  27.           `xdotool search "FBReader " windowactivate --sync key Up 2>/dev/null`;
  28.         }
  29.      
  30.       #Отправляется программе нажатие клавиши вниз
  31.       if ($tmparr[2] eq "WORD_NEXT")
  32.         {
  33.           `xdotool search "FBReader " windowactivate --sync key Down 2>/dev/null`;
  34.         }
  35.      
  36.       #Отправляется программе нажатие клавиши "Page Up"
  37.       if ($tmparr[2] eq "SKIP_PREV")
  38.         {
  39.           `xdotool search "FBReader " windowactivate --sync key Page_Up 2>/dev/null`;
  40.         }
  41.      
  42.       #Отправляется программе нажатие клавиши "Page Down"
  43.       if ($tmparr[2] eq "SKIP_NEXT")
  44.         {
  45.           `xdotool search "FBReader " windowactivate --sync key Page_Down 2>/dev/null`;
  46.         }
  47.     }
  48. }

  1. Я не использовал эту возможность по трем причинам:

    1. Не у всех программ доступен исходный код.
    2. Я знаю не все языки программирования.
    3. Не люблю ручную сборку и необходимость следить за обновлениями, при этом каждый раз накладывать патч.

    ↩︎

  2. Тут привязка к KDE и DCOP. ↩︎

  3. Советую почитать страничку http://www.ibm.com/developerworks/ru/library/x-xdotool/ ↩︎