fix EVIOCGRAB ioctl
[enigma2.git] / lib / driver / rc.cpp
index 790c5f6c4df88542e0f91340fb2c055e766a1db0..c56fde448cd396ea72af4be94b4655e368b5e9bb 100644 (file)
@@ -8,7 +8,6 @@
 
 #include <lib/base/init.h>
 #include <lib/base/init_num.h>
-#include <lib/base/econfig.h>
 #include <lib/base/eerror.h>
 
 /*
  *  actions. have fun.
  */
 
-int eRCDevice::getKeyCompatibleCode(const eRCKey &) const
-{
-       return -1;
-}
-
-eRCDevice::eRCDevice(eString id, eRCDriver *driver): driver(driver), id(id)
+eRCDevice::eRCDevice(std::string id, eRCDriver *driver): driver(driver), id(id)
 {
        input=driver->getInput();
        driver->addCodeListener(this);
@@ -85,9 +79,8 @@ eRCShortDriver::eRCShortDriver(const char *filename): eRCDriver(eRCInput::getIns
                sn=0;
        } else
        {
-               sn=new eSocketNotifier(eApp, handle, eSocketNotifier::Read);
+               sn=eSocketNotifier::create(eApp, handle, eSocketNotifier::Read);
                CONNECT(sn->activated, eRCShortDriver::keyPressed);
-               eRCInput::getInstance()->setFile(handle);
        }
 }
 
@@ -95,8 +88,6 @@ eRCShortDriver::~eRCShortDriver()
 {
        if (handle>=0)
                close(handle);
-       if (sn)
-               delete sn;
 }
 
 void eRCInputEventDriver::keyPressed(int)
@@ -108,7 +99,7 @@ void eRCInputEventDriver::keyPressed(int)
                        break;
                if (enabled && !input->islocked())
                        for (std::list<eRCDevice*>::iterator i(listeners.begin()); i!=listeners.end(); ++i)
-                               (*i)->handleCode((int)&ev);
+                               (*i)->handleCode((long)&ev);
        }
 }
 
@@ -121,13 +112,12 @@ eRCInputEventDriver::eRCInputEventDriver(const char *filename): eRCDriver(eRCInp
                sn=0;
        } else
        {
-               sn=new eSocketNotifier(eApp, handle, eSocketNotifier::Read);
+               sn=eSocketNotifier::create(eApp, handle, eSocketNotifier::Read);
                CONNECT(sn->activated, eRCInputEventDriver::keyPressed);
-               eRCInput::getInstance()->setFile(handle);
        }
 }
 
-eString eRCInputEventDriver::getDeviceName()
+std::string eRCInputEventDriver::getDeviceName()
 {
        char name[128]="";
        if (handle >= 0)
@@ -135,12 +125,20 @@ eString eRCInputEventDriver::getDeviceName()
        return name;
 }
 
+void eRCInputEventDriver::setExclusive(bool b)
+{
+       if (handle >= 0)
+       {
+               int grab = b;
+               if (::ioctl(handle, EVIOCGRAB, grab) < 0)
+                       perror("EVIOCGRAB");
+       }
+}
+
 eRCInputEventDriver::~eRCInputEventDriver()
 {
        if (handle>=0)
                close(handle);
-       if (sn)
-               delete sn;
 }
 
 eRCConfig::eRCConfig()
@@ -163,15 +161,10 @@ void eRCConfig::reload()
 {
        rdelay=500;
        rrate=100;
-       if ( eConfig::getInstance()->getKey("/ezap/rc/repeatRate", rrate) )
-               save();
-       eConfig::getInstance()->getKey("/ezap/rc/repeatDelay", rdelay);
 }
 
 void eRCConfig::save()
 {
-       eConfig::getInstance()->setKey("/ezap/rc/repeatRate", rrate);
-       eConfig::getInstance()->setKey("/ezap/rc/repeatDelay", rdelay);
 }
 
 eRCInput *eRCInput::instance;
@@ -180,8 +173,8 @@ eRCInput::eRCInput()
 {
        ASSERT( !instance);
        instance=this;
-       handle = -1;
        locked = 0;
+       keyboardMode = kmNone;
 }
 
 eRCInput::~eRCInput()
@@ -197,47 +190,44 @@ bool eRCInput::open()
        return false;
 }
 
-int eRCInput::lock()
+void eRCInput::lock()
 {
        locked=1;
-       return handle;
+       for (std::map<std::string,eRCDevice*>::iterator i=devices.begin(); i != devices.end(); ++i)
+               i->second->setExclusive(false);
 }
 
 void eRCInput::unlock()
 {
-       if (locked)
-               locked=0;
-}
-
-void eRCInput::setFile(int newh)
-{
-       handle=newh;
+       locked=0;
+       for (std::map<std::string,eRCDevice*>::iterator i=devices.begin(); i != devices.end(); ++i)
+               i->second->setExclusive(true);
 }
 
-void eRCInput::addDevice(const eString &id, eRCDevice *dev)
+void eRCInput::addDevice(const std::string &id, eRCDevice *dev)
 {
-       devices.insert(std::pair<eString,eRCDevice*>(id, dev));
+       devices.insert(std::pair<std::string,eRCDevice*>(id, dev));
 }
 
-void eRCInput::removeDevice(const eString &id)
+void eRCInput::removeDevice(const std::string &id)
 {
        devices.erase(id);
 }
 
-eRCDevice *eRCInput::getDevice(const eString &id)
+eRCDevice *eRCInput::getDevice(const std::string &id)
 {
-       std::map<eString,eRCDevice*>::iterator i=devices.find(id);
+       std::map<std::string,eRCDevice*>::iterator i=devices.find(id);
        if (i == devices.end())
        {
                eDebug("failed, possible choices are:");
-               for (std::map<eString,eRCDevice*>::iterator i=devices.begin(); i != devices.end(); ++i) 
+               for (std::map<std::string,eRCDevice*>::iterator i=devices.begin(); i != devices.end(); ++i)
                        eDebug("%s", i->first.c_str());
                return 0;
        }
        return i->second;
 }
 
-std::map<eString,eRCDevice*,eRCInput::lstr> &eRCInput::getDevices()
+std::map<std::string,eRCDevice*,eRCInput::lstr> &eRCInput::getDevices()
 {
        return devices;
 }