1 #include <lib/driver/rcsdl.h>
2 //#include <lib/actions/action.h>
3 #include <lib/base/init.h>
4 #include <lib/base/init_num.h>
5 #include <lib/driver/input_fake.h>
11 eSDLInputDevice::eSDLInputDevice(eRCDriver *driver) : eRCDevice("SDL", driver), m_escape(false), m_unicode(0)
15 eSDLInputDevice::~eSDLInputDevice()
19 void eSDLInputDevice::handleCode(long arg)
21 const SDL_KeyboardEvent *event = (const SDL_KeyboardEvent *)arg;
22 const SDL_keysym *key = &event->keysym;
23 int km = input->getKeyboardMode();
26 if (event->type == SDL_KEYDOWN) {
27 m_unicode = key->unicode;
28 flags = eRCKey::flagMake;
30 flags = eRCKey::flagBreak;
33 if (km == eRCInput::kmNone) {
34 code = translateKey(key->sym);
36 // ASCII keys should only generate key press events
37 if (flags == eRCKey::flagBreak)
40 eDebug("unicode=%04x scancode=%02x", m_unicode, key->scancode);
41 if (m_unicode & 0xff80) {
42 eDebug("SDL: skipping unicode character");
45 code = m_unicode & ~0xff80;
46 // unicode not set...!? use key symbol
49 if (key->sym >= 128) {
50 eDebug("SDL: cannot emulate ASCII");
53 eDebug("SDL: emulate ASCII");
56 if (km == eRCInput::kmAscii) {
57 // skip ESC c or ESC '[' c
64 if (code == SDLK_ESCAPE)
67 if ((code < SDLK_SPACE) ||
68 (code == 0x7e) || // really?
69 (code == SDLK_DELETE))
72 flags |= eRCKey::flagAscii;
75 eDebug("SDL code=%d flags=%d", code, flags);
76 input->keyPressed(eRCKey(this, code, flags));
79 const char *eSDLInputDevice::getDescription() const
84 int eSDLInputDevice::translateKey(SDLKey key)
86 #define P(a) case SDLK_##a: return KEY_##a
87 #define P2(a,b) case SDLK_##a: return KEY_##b
106 P2(QUOTE,APOSTROPHE);
142 P2(LEFTBRACKET,LEFTBRACE);
144 P2(RIGHTBRACKET,RIGHTBRACE);
286 P2(KP_DIVIDE,KPSLASH);
287 P2(KP_MULTIPLY,KPASTERISK);
288 P2(KP_MINUS,KPMINUS);
290 P2(KP_ENTER,KPENTER);
291 P2(KP_EQUALS,KPEQUAL);
318 P2(SCROLLOCK,SCROLLLOCK);
319 P2(RSHIFT,RIGHTSHIFT);
320 P2(LSHIFT,LEFTSHIFT);
342 eDebug("unhandled SDL keycode: %d", key);
354 eSDLInputDriver *eSDLInputDriver::instance;
356 eSDLInputDriver::eSDLInputDriver() : eRCDriver(eRCInput::getInstance())
358 ASSERT(instance == 0);
362 eSDLInputDriver::~eSDLInputDriver()
367 void eSDLInputDriver::keyPressed(const SDL_KeyboardEvent *key)
369 eDebug("km=%d enabled=%d locked=%d",
370 input->getKeyboardMode(), enabled, input->islocked());
372 if (!enabled || input->islocked())
375 std::list<eRCDevice*>::iterator i(listeners.begin());
376 while (i != listeners.end()) {
377 (*i)->handleCode((long)key);
385 eSDLInputDriver driver;
386 eSDLInputDevice device;
389 eRCSDLInit(): driver(), device(&driver)
394 eAutoInitP0<eRCSDLInit> init_rcSDL(eAutoInitNumbers::rc+1, "SDL RC Driver");