X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/f9723e7fbf7669f063151eaf53bb1ee9f4189289..84670d3dc9c9dc29fd3af42b2f25092b3b6c2a09:/lib/driver/rcconsole.cpp?ds=sidebyside diff --git a/lib/driver/rcconsole.cpp b/lib/driver/rcconsole.cpp new file mode 100644 index 00000000..ec759164 --- /dev/null +++ b/lib/driver/rcconsole.cpp @@ -0,0 +1,120 @@ +#include +#include +#include +#include +#include +#include + +eRCConsoleDriver::eRCConsoleDriver(const char *filename): eRCDriver(eRCInput::getInstance()) +{ + handle=open(filename, O_RDONLY|O_NONBLOCK); + if (handle<0) + { + eDebug("failed to open %s", filename); + sn=0; + } else + { + sn=new eSocketNotifier(eApp, handle, eSocketNotifier::Read); + CONNECT(sn->activated, eRCConsoleDriver::keyPressed); + eRCInput::getInstance()->setFile(handle); + } + + /* set console mode */ + struct termios t,ot; + tcgetattr(handle, &t); + t.c_lflag &= ~(ECHO | ICANON | ECHOK | ECHOE | ECHONL); + ot = t; + tcsetattr(handle, TCSANOW,&t); +} + +eRCConsoleDriver::~eRCConsoleDriver() +{ + tcsetattr(handle,TCSANOW, &ot); + if (handle>=0) + close(handle); + if (sn) + delete sn; +} + +void eRCConsoleDriver::keyPressed(int) +{ + char data[16]; + char *d = data; + int num = read(handle, data, 16); + int code; +#if 0 + int km = input->getKeyboardMode(); + + if (km == eRCInput::kmNone) + return; +#endif + while (num--) + { +#if 0 + if (km == eRCInput::kmAll) +#endif + code = *d++; +#if 0 + else + { + if (*d == 27) // escape code + { + while (num) + { + num--; + if (*++d != '[') + break; + } + code = -1; + } else + code = *d; + ++d; + + if (code < 32) /* control characters */ + code = -1; + if (code == 0x7F) /* delete */ + code = -1; + } +#endif + if (code != -1) + for (std::list::iterator i(listeners.begin()); i!=listeners.end(); ++i) + (*i)->handleCode(code); + } +} + +void eRCConsole::handleCode(int code) +{ + input->keyPressed(eRCKey(this, code, 0)); +} + +eRCConsole::eRCConsole(eRCDriver *driver) + : eRCDevice("Console", driver) +{ +} + +const char *eRCConsole::getDescription() const +{ + return "Console"; +} + +const char *eRCConsole::getKeyDescription(const eRCKey &key) const +{ + return 0; +} + +int eRCConsole::getKeyCompatibleCode(const eRCKey &key) const +{ + return key.code; // | KEY_ASCII; +} + +class eRCConsoleInit +{ + eRCConsoleDriver driver; + eRCConsole device; +public: + eRCConsoleInit(): driver("/dev/vc/0"), device(&driver) + { + } +}; + +eAutoInitP0 init_rcconsole(eAutoInitNumbers::rc+1, "Console RC Driver");