Собственно нужно написать небольшую обертку над MPlayer'ом, которая будет иметь собственное GTK-окно.
Необходимо сохранить контроль над MPlayer'ом, а именно:
1) При нажатии пользователем на какую-либо клавишу на клавиатуре внутри моего GTK-окна ретранслировать ее MPlayer'у в stdin, как будто она была нажата в его терминале.
2) При нажатии пользователем на какую-либо клавишу в терминале, когда запущена моя программа, также ретранслировать ее MPlayer'у.
С обоими ситуациями проблемы:
1) Привязываюсь к сигналу key_press_event окна и выполняю
Glib::ustring string(1, gdk_keyval_to_unicode(event->keyval));
write(mplayer_stdin, string.data(), string.size());
Работает, но только с простыми клавишами, представляющими собой цифры и буквы, а для стрелок и пр. - нет.
2) С stdin'ом приложения тоже косяк. Слежу за ним при помощи
const Glib::RefPtr<Glib::IOSource> io_source = Glib::IOSource::create(fd, Glib::IO_IN | Glib::IO_HUP);
io_source->connect(sigc::ptr_fun(&io_handler));
io_source->attach(Glib::MainContext::get_default());
и читаю read()'ом. В итоге получается, что данные передаются приложению только после того, как пользователь нажмет на Enter, что, естественно, меня не устраивает - видимо дело в readline или в чем-то еще.
Укажите, пожалуйста, направление, в котором следует копать.