diff options
| author | Andreas Oberritter <obi@opendreambox.org> | 2010-11-16 14:15:28 +0100 |
|---|---|---|
| committer | Andreas Oberritter <obi@opendreambox.org> | 2010-11-16 17:15:39 +0100 |
| commit | ab7b9a84ff8be233c79088a4f3ac3583f5e79dca (patch) | |
| tree | 8b0ebef0e51f48dbb511096eebe0a40cd3e244e8 | |
| parent | cf57753fe26b8468048598a53124d876f216bc3d (diff) | |
| download | enigma2-ab7b9a84ff8be233c79088a4f3ac3583f5e79dca.tar.gz enigma2-ab7b9a84ff8be233c79088a4f3ac3583f5e79dca.zip | |
rcconsole: fix for escape codes split into multiple reads
| -rw-r--r-- | lib/driver/rcconsole.cpp | 57 | ||||
| -rw-r--r-- | lib/driver/rcconsole.h | 1 |
2 files changed, 23 insertions, 35 deletions
diff --git a/lib/driver/rcconsole.cpp b/lib/driver/rcconsole.cpp index eb5aee3d..97a6e7c7 100644 --- a/lib/driver/rcconsole.cpp +++ b/lib/driver/rcconsole.cpp @@ -5,7 +5,7 @@ #include <stdio.h> #include <fcntl.h> -eRCConsoleDriver::eRCConsoleDriver(const char *filename): eRCDriver(eRCInput::getInstance()) +eRCConsoleDriver::eRCConsoleDriver(const char *filename): eRCDriver(eRCInput::getInstance()), m_escape(false) { handle=open(filename, O_RDONLY|O_NONBLOCK); if (handle<0) @@ -38,7 +38,7 @@ void eRCConsoleDriver::keyPressed(int) unsigned char data[16]; unsigned char *d = data; int num = read(handle, data, 16); - int code=-1; + unsigned char code; int km = input->getKeyboardMode(); @@ -47,42 +47,29 @@ void eRCConsoleDriver::keyPressed(int) while (num--) { -// eDebug("console code %08x\n", *d); - if (km == eRCInput::kmAll) - code = *d++; - 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; - else switch(code) - { - case 0x7E: // mute, einfg, entf - case 0x7F: // backspace - code = -1; - default: - break; + code = *d++; +// eDebug("console code %02x\n", code); + if (km == eRCInput::kmAscii) { + if (m_escape) { + if (code != '[') + m_escape = false; + continue; } + + if (code == 27) // escape code + m_escape = true; + + if ((code < 32) || // control characters + (code == 0x7e) || // mute, einfg, entf + (code == 0x7f)) // backspace + continue; } - if (code != -1) - for (std::list<eRCDevice*>::iterator i(listeners.begin()); i!=listeners.end(); ++i) - { -// eDebug("ascii %08x", code); - (*i)->handleCode(code); - } + for (std::list<eRCDevice*>::iterator i(listeners.begin()); i!=listeners.end(); ++i) + { +// eDebug("ascii %02x", code); + (*i)->handleCode(code); + } } } diff --git a/lib/driver/rcconsole.h b/lib/driver/rcconsole.h index 85234d5b..8a24612c 100644 --- a/lib/driver/rcconsole.h +++ b/lib/driver/rcconsole.h @@ -10,6 +10,7 @@ class eRCConsoleDriver: public eRCDriver protected: int handle; ePtr<eSocketNotifier> sn; + bool m_escape; void keyPressed(int); public: eRCConsoleDriver(const char *filename); |
