rcconsole: fix for escape codes split into multiple reads
authorAndreas Oberritter <obi@opendreambox.org>
Tue, 16 Nov 2010 13:15:28 +0000 (14:15 +0100)
committerAndreas Oberritter <obi@opendreambox.org>
Tue, 16 Nov 2010 16:15:39 +0000 (17:15 +0100)
lib/driver/rcconsole.cpp
lib/driver/rcconsole.h

index eb5aee3db7187cc99cc1c0108fee87f0fb657c38..97a6e7c7c22354fcc9c0ac308541b0954caf67bc 100644 (file)
@@ -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);
+               }
        }
 }
 
index 85234d5b1ea75537599858ef193b73e739d9d3c8..8a24612c5bd6f4fa6566d5e20e7d063b11572297 100644 (file)
@@ -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);