limited minimize support
[sdl_omap.git] / src / video / omapdss / osdl_input.c
index 1358706..e6fb1f7 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * (C) Gražvydas "notaz" Ignotas, 2010
+ * (C) Gražvydas "notaz" Ignotas, 2010-2012
  *
  * This work is licensed under the terms of the GNU LGPL, version 2.1 or later.
  * See the COPYING file in the top-level directory.
 #include <time.h>
 #include <errno.h>
 #include <linux/input.h>
+#ifdef STANDALONE
 #include <SDL/SDL.h>
+#else
+#include "SDL.h"
+#endif
 #if SDL_INPUT_TSLIB
 #include <tslib.h>
 #endif
 
-#include "omapsdl.h"
+#include "osdl.h"
 
 /* XXX: these should go to private data */
 static int osdl_evdev_devs[32];
@@ -67,7 +71,7 @@ static short osdl_evdev_map[KEY_CNT] = {
        [KEY_Z]         = SDLK_z,         [KEY_SLASH]     = SDLK_SLASH,     /* / */
        [KEY_SPACE]     = SDLK_SPACE,     [KEY_TAB]       = SDLK_TAB,
        [KEY_BACKSPACE] = SDLK_BACKSPACE, [KEY_INSERT]    = SDLK_INSERT,
-       [KEY_FN]        = SDLK_MODE,
+       [KEY_FN]        = SDLK_WORLD_95,
        [KEY_DOT]       = SDLK_PERIOD,    [KEY_F21]       = SDLK_COLON,     /* : */
        [KEY_ENTER]     = SDLK_RETURN,
        [KEY_LEFTSHIFT] = SDLK_LSHIFT,    [KEY_CAPSLOCK]  = SDLK_CAPSLOCK,
@@ -555,7 +559,7 @@ void omapsdl_input_finish(void)
 }
 
 int omapsdl_input_get_events(int timeout_ms,
-               int (*key_cb)(void *cb_arg, int sdl_kc, int is_pressed),
+               int (*key_cb)(void *cb_arg, int sdl_kc, int sdl_sc, int is_pressed),
                int (*ts_cb)(void *cb_arg, int x, int y, unsigned int pressure),
                void *cb_arg)
 {
@@ -621,8 +625,8 @@ int omapsdl_input_get_events(int timeout_ms,
                                        break;
                                }
 
-                               if (ev.type != EV_KEY)
-                                       continue; /* not key event */
+                               if (ev.type != EV_KEY || key_cb == NULL)
+                                       continue; /* not key event or not needed */
                                if ((unsigned int)ev.value > 1)
                                        continue; /* not key up/down */
                                if ((unsigned int)ev.code >= ARRAY_SIZE(osdl_evdev_map))
@@ -630,7 +634,8 @@ int omapsdl_input_get_events(int timeout_ms,
                                sdl_kc = osdl_evdev_map[ev.code];
                                if (sdl_kc == 0)
                                        continue; /* not mapped */
-                               ret = key_cb(cb_arg, sdl_kc, ev.value);
+                               /* scancode note: stock SDL doesn't do +8 in fbcon driver */
+                               ret = key_cb(cb_arg, sdl_kc, ev.code + 8, ev.value);
                                if (ret != 0)
                                        return ret;
                        }
@@ -645,13 +650,15 @@ static unsigned char g_keystate[SDLK_LAST];
 
 struct key_event {
        int sdl_kc;
+       int sdl_sc;
        int is_pressed;
 };
 
-static int do_key_cb(void *cb_arg, int sdl_kc, int is_pressed)
+static int do_key_cb(void *cb_arg, int sdl_kc, int sdl_sc, int is_pressed)
 {
        struct key_event *ev = cb_arg;
        ev->sdl_kc = sdl_kc;
+       ev->sdl_sc = sdl_sc;
        ev->is_pressed = is_pressed;
 
        return 1; /* done */
@@ -676,6 +683,7 @@ static int do_event(SDL_Event *event, int timeout)
        // event->key.which =
        event->key.state = ev.is_pressed ? SDL_PRESSED : SDL_RELEASED;
        event->key.keysym.sym = ev.sdl_kc;
+       event->key.keysym.scancode = ev.sdl_sc;
        // event->key.keysym.mod
 
        return 1;