trunk 20080912
[gitenigma.git] / lib / driver / rcinput.cpp
blob406d743c5111063b2c8efca715c0661fe6c055a1
1 #include <config.h>
2 #include <lib/driver/rcinput.h>
4 #include <sys/ioctl.h>
5 #include <sys/stat.h>
7 #include <lib/base/ebase.h>
8 #include <lib/system/init.h>
9 #include <lib/system/init_num.h>
10 #include <lib/driver/input_fake.h>
12 void eRCDeviceInputDev::handleCode(int rccode)
14 struct input_event *ev = (struct input_event *)rccode;
16 if (ev->type!=EV_KEY)
17 return;
19 int km = iskeyboard ? input->getKeyboardMode() : eRCInput::kmNone;
21 if (km == eRCInput::kmAll)
22 return;
24 if (km == eRCInput::kmAscii)
26 // eDebug("filtering.. %d", ev->code);
27 bool filtered = ( ev->code > 0 && ev->code < 61 );
28 switch (ev->code)
30 case KEY_RESERVED:
31 case KEY_ESC:
32 case KEY_TAB:
33 case KEY_BACKSPACE:
34 case KEY_ENTER:
35 case KEY_LEFTCTRL:
36 case KEY_RIGHTSHIFT:
37 case KEY_LEFTALT:
38 case KEY_CAPSLOCK:
39 filtered=false;
40 default:
41 break;
43 if (filtered)
44 return;
45 // eDebug("passed!");
48 switch (ev->value)
50 case 0:
51 if ( !iskeyboard )
52 repeattimer.stop();
53 /*emit*/ input->keyPressed(eRCKey(this, ev->code, eRCKey::flagBreak));
54 break;
55 case 1:
56 memcpy(&cur, ev, sizeof(struct input_event) );
57 if ( !iskeyboard )
58 repeattimer.start(eRCInput::getInstance()->config.rdelay, 1);
59 /*emit*/ input->keyPressed(eRCKey(this, ev->code, 0));
60 break;
61 case 2:
62 if ( iskeyboard )
63 /*emit*/ input->keyPressed(eRCKey(this, ev->code, eRCKey::flagRepeat));
64 break;
68 void eRCDeviceInputDev::repeat()
70 /* emit */ input->keyPressed(eRCKey(this, cur.code, eRCKey::flagRepeat));
71 repeattimer.start(eRCInput::getInstance()->config.rrate, 1);
74 eRCDeviceInputDev::eRCDeviceInputDev(eRCInputEventDriver *driver)
75 : eRCDevice(driver->getDeviceName(), driver), repeattimer(eApp)
77 eString tmp=id;
78 tmp.upper();
79 iskeyboard = !!strstr(tmp.c_str(), "KEYBOARD");
80 eDebug("Input device \"%s\" is %sa keyboard.", id.c_str(), iskeyboard ? "" : "not ");
81 CONNECT( repeattimer.timeout, eRCDeviceInputDev::repeat);
84 const char *eRCDeviceInputDev::getDescription() const
86 return id.c_str();
89 const char *eRCDeviceInputDev::getKeyDescription(const eRCKey &key) const
91 switch (key.code)
93 case KEY_0: return "0";
94 case KEY_1: return "1";
95 case KEY_2: return "2";
96 case KEY_3: return "3";
97 case KEY_4: return "4";
98 case KEY_5: return "5";
99 case KEY_6: return "6";
100 case KEY_7: return "7";
101 case KEY_8: return "8";
102 case KEY_9: return "9";
103 case KEY_RIGHT: return "rechts";
104 case KEY_LEFT: return "links";
105 case KEY_UP: return "oben";
106 case KEY_DOWN: return "unten";
107 case KEY_OK: return "ok";
108 case KEY_MUTE: return "mute";
109 case KEY_POWER: return "power";
110 case KEY_GREEN: return "gruen";
111 case KEY_YELLOW: return "gelb";
112 case KEY_RED: return "rot";
113 case KEY_BLUE: return "blau";
114 case KEY_VOLUMEUP: return "Lautstaerke plus";
115 case KEY_VOLUMEDOWN: return "Lautstaerke minus";
116 case KEY_HELP: return "?";
117 case KEY_SETUP: return "d-Box";
118 #if 0
119 case KEY_TOPLEFT: return "oben links";
120 case KEY_TOPRIGHT: return "oben rechts";
121 case KEY_BOTTOMLEFT: return "unten links";
122 case KEY_BOTTOMRIGHT: return "unten rechts";
123 #endif
124 case KEY_HOME: return "home";
125 default: return 0;
129 int eRCDeviceInputDev::getKeyCompatibleCode(const eRCKey &key) const
131 return key.code;
134 class eInputDeviceInit
136 ePtrList<eRCInputEventDriver> m_drivers;
137 ePtrList<eRCDeviceInputDev> m_devices;
138 public:
139 eInputDeviceInit()
141 int i = 0;
142 while (1)
144 struct stat s;
145 char filename[128];
146 sprintf(filename, "/dev/input/event%d", i);
147 if (stat(filename, &s))
148 break;
149 eRCInputEventDriver *p;
150 m_drivers.push_back(p = new eRCInputEventDriver(filename));
151 m_devices.push_back(new eRCDeviceInputDev(p));
152 ++i;
154 eDebug("Found %d input devices!", i);
157 ~eInputDeviceInit()
159 while (m_drivers.size())
161 delete m_devices.back();
162 m_devices.pop_back();
163 delete m_drivers.back();
164 m_drivers.pop_back();
169 eAutoInitP0<eInputDeviceInit> init_rcinputdev(eAutoInitNumbers::rc+1, "input device driver");