limited minimize support
[sdl_omap.git] / src / video / omapdss / osdl_input.c
index fff2ca2..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];
@@ -28,90 +32,50 @@ static int osdl_tslib_fd;
 static struct tsdev *osdl_tslib_dev;
 
 static short osdl_evdev_map[KEY_CNT] = {
-       [KEY_0]         = SDLK_0,
-       [KEY_1]         = SDLK_1,
-       [KEY_2]         = SDLK_2,
-       [KEY_3]         = SDLK_3,
-       [KEY_4]         = SDLK_4,
-       [KEY_5]         = SDLK_5,
-       [KEY_6]         = SDLK_6,
-       [KEY_7]         = SDLK_7,
-       [KEY_8]         = SDLK_8,
-       [KEY_9]         = SDLK_9,
-       [KEY_A]         = SDLK_a,
-       [KEY_B]         = SDLK_b,
-       [KEY_C]         = SDLK_c,
-       [KEY_D]         = SDLK_d,
-       [KEY_E]         = SDLK_e,
-       [KEY_F]         = SDLK_f,
-       [KEY_G]         = SDLK_g,
-       [KEY_H]         = SDLK_h,
-       [KEY_I]         = SDLK_i,
-       [KEY_J]         = SDLK_j,
-       [KEY_K]         = SDLK_k,
-       [KEY_L]         = SDLK_l,
-       [KEY_M]         = SDLK_m,
-       [KEY_N]         = SDLK_n,
-       [KEY_O]         = SDLK_o,
-       [KEY_P]         = SDLK_p,
-       [KEY_Q]         = SDLK_q,
-       [KEY_R]         = SDLK_r,
-       [KEY_S]         = SDLK_s,
-       [KEY_T]         = SDLK_t,
-       [KEY_U]         = SDLK_u,
-       [KEY_V]         = SDLK_v,
-       [KEY_W]         = SDLK_w,
-       [KEY_X]         = SDLK_x,
-       [KEY_Y]         = SDLK_y,
-       [KEY_Z]         = SDLK_z,
-       [KEY_SPACE]     = SDLK_SPACE,
-       [KEY_BACKSPACE] = SDLK_BACKSPACE,
-       [KEY_FN]        = SDLK_MODE,
-       [KEY_DOT]       = SDLK_PERIOD,
-       [KEY_ENTER]     = SDLK_RETURN,
-       [KEY_LEFTSHIFT] = SDLK_LSHIFT,
-       [KEY_COMMA]     = SDLK_COMMA,
-//     [KEY_BRIGHTNESSUP]      =
-//     [KEY_BRIGHTNESSDOWN]    =
-//     [KEY_GRAVE]     =
-       [KEY_TAB]       = SDLK_TAB,
-       [KEY_INSERT]    = SDLK_INSERT,
-       [KEY_EQUAL]     = SDLK_EQUALS,
-       [KEY_KPPLUS]    = SDLK_KP_PLUS,
-       [KEY_BACKSLASH] = SDLK_BACKSLASH,
-       [KEY_RIGHTBRACE]= SDLK_RIGHTBRACKET,
-       [KEY_KPMINUS]   = SDLK_KP_MINUS,
-       [KEY_QUESTION]  = SDLK_QUESTION,
-       [KEY_LEFTBRACE] = SDLK_LEFTBRACKET,
-       [KEY_SLASH]     = SDLK_SLASH,
-//     [KEY_YEN]       =
-       [KEY_APOSTROPHE]= SDLK_QUOTE,
-       [KEY_ESC]       = SDLK_ESCAPE,
-       [KEY_CAPSLOCK]  = SDLK_CAPSLOCK,
-       [KEY_SEMICOLON] = SDLK_SEMICOLON,
-       [KEY_F1]        = SDLK_F1,
-       [KEY_F2]        = SDLK_F2,
-       [KEY_F3]        = SDLK_F3,
-       [KEY_F4]        = SDLK_F4,
-       [KEY_F5]        = SDLK_F5,
-       [KEY_F6]        = SDLK_F6,
-       [KEY_F7]        = SDLK_F7,
-       [KEY_F8]        = SDLK_F8,
-       [KEY_F9]        = SDLK_F9,
-       [KEY_F10]       = KEY_F10,
-       [KEY_F11]       = KEY_F11,
-       [KEY_F12]       = KEY_F12,
-       [KEY_F13]       = KEY_F13,      /* apostrophe, differs from Fn-A? */
-       [KEY_F14]       = KEY_F14,      /* pipe/bar */
-       [KEY_F15]       = KEY_F15,      /* dash */
-       [KEY_F16]       = SDLK_HASH,    /* # (pound/hash) */
-       [KEY_F17]       = SDLK_EXCLAIM, /* ! */
-//     [KEY_F18]       =               /* £ (pound) */
-       [KEY_F19]       = SDLK_QUOTEDBL,/* " */
-       [KEY_F20]       = SDLK_AT,      /* @ */
-       [KEY_F21]       = SDLK_SEMICOLON,/* : */
-//     [KEY_F22]       =
-//     [KEY_F23]       =
+       /*       normal                              fn                      */
+       [KEY_0]         = SDLK_0,         [KEY_F10]       = SDLK_F10,
+       [KEY_1]         = SDLK_1,         [KEY_F1]        = SDLK_F1,
+       [KEY_2]         = SDLK_2,         [KEY_F2]        = SDLK_F2,
+       [KEY_3]         = SDLK_3,         [KEY_F3]        = SDLK_F3,
+       [KEY_4]         = SDLK_4,         [KEY_F4]        = SDLK_F4,
+       [KEY_5]         = SDLK_5,         [KEY_F5]        = SDLK_F5,
+       [KEY_6]         = SDLK_6,         [KEY_F6]        = SDLK_F6,
+       [KEY_7]         = SDLK_7,         [KEY_F7]        = SDLK_F7,
+       [KEY_8]         = SDLK_8,         [KEY_F8]        = SDLK_F8,
+       [KEY_9]         = SDLK_9,         [KEY_F9]        = SDLK_F9,
+       [KEY_A]         = SDLK_a,         [KEY_APOSTROPHE]= SDLK_QUOTE,     /* ' */
+       [KEY_B]         = SDLK_b,         [KEY_F14]       = 124,            /* | */
+       [KEY_C]         = SDLK_c,         [KEY_BACKSLASH] = SDLK_BACKSLASH, /* \ */
+       [KEY_D]         = SDLK_d,         [KEY_KPMINUS]   = SDLK_MINUS,
+       [KEY_E]         = SDLK_e,         [KEY_LEFTBRACE] = SDLK_LEFTPAREN,
+       [KEY_F]         = SDLK_f,         [KEY_KPPLUS]    = SDLK_PLUS,
+       [KEY_G]         = SDLK_g,         [KEY_EQUAL]     = SDLK_EQUALS,
+       [KEY_H]         = SDLK_h,         [KEY_GRAVE]     = SDLK_BACKQUOTE, /* ` */
+       [KEY_I]         = SDLK_i,      /* [KEY_BRIGHTNESSUP] */
+       [KEY_J]         = SDLK_j,         [KEY_F13]       = SDLK_WORLD_4,   /* ’ (not on def SDL) */
+       [KEY_K]         = SDLK_k,         [KEY_F18]       = SDLK_WORLD_3,   /* £ (pound) */
+       [KEY_L]         = SDLK_l,         [KEY_YEN]       = SDLK_WORLD_5,
+       [KEY_M]         = SDLK_m,         [KEY_F23]       = SDLK_EURO,
+       [KEY_N]         = SDLK_n,         [KEY_F22]       = SDLK_DOLLAR,    /* $ */
+       [KEY_O]         = SDLK_o,         [KEY_F11]       = SDLK_F11,
+       [KEY_P]         = SDLK_p,         [KEY_F12]       = SDLK_F12,
+       [KEY_Q]         = SDLK_q,         [KEY_ESC]       = SDLK_ESCAPE,
+       [KEY_R]         = SDLK_r,         [KEY_RIGHTBRACE]= SDLK_RIGHTPAREN,
+       [KEY_S]         = SDLK_s,         [KEY_F19]       = SDLK_QUOTEDBL,  /* " */
+       [KEY_T]         = SDLK_t,         [KEY_F17]       = SDLK_EXCLAIM,   /* ! */
+       [KEY_U]         = SDLK_u,      /* [KEY_BRIGHTNESSDOWN] */
+       [KEY_V]         = SDLK_v,         [KEY_F16]       = SDLK_HASH,      /* # (pound/hash) */
+       [KEY_W]         = SDLK_w,         [KEY_F20]       = SDLK_AT,        /* @ */
+       [KEY_X]         = SDLK_x,         [KEY_QUESTION]  = SDLK_QUESTION,  /* ? */
+       [KEY_Y]         = SDLK_y,         [KEY_F15]       = SDLK_UNDERSCORE,/* _ */
+       [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_WORLD_95,
+       [KEY_DOT]       = SDLK_PERIOD,    [KEY_F21]       = SDLK_COLON,     /* : */
+       [KEY_ENTER]     = SDLK_RETURN,
+       [KEY_LEFTSHIFT] = SDLK_LSHIFT,    [KEY_CAPSLOCK]  = SDLK_CAPSLOCK,
+       [KEY_COMMA]     = SDLK_COMMA,     [KEY_SEMICOLON] = SDLK_SEMICOLON, /* ; */
 
        [KEY_UP]        = SDLK_UP,
        [KEY_DOWN]      = SDLK_DOWN,
@@ -123,7 +87,7 @@ static short osdl_evdev_map[KEY_CNT] = {
        [KEY_PAGEDOWN]  = SDLK_PAGEDOWN,
        [KEY_LEFTALT]   = SDLK_LALT,
        [KEY_LEFTCTRL]  = SDLK_LCTRL,
-//     [KEY_MENU]      =
+       [KEY_MENU]      = 147,          /* match default SDL here */
        [KEY_RIGHTSHIFT]= SDLK_RSHIFT,
        [KEY_RIGHTCTRL] = SDLK_RCTRL,
 };
@@ -501,10 +465,10 @@ void omapsdl_input_init(void)
                osdl_tslib_fd = ts_fd(osdl_tslib_dev);
                osdl_evdev_devs[osdl_evdev_dev_count++] = osdl_tslib_fd;
                if (fstat(osdl_tslib_fd, &stat_buf) == -1)
-                       perror("fstat ts");
+                       err_perror("fstat ts");
                else
                        touchscreen_ino = stat_buf.st_ino;
-               printf("opened tslib touchscreen\n");
+               log("opened tslib touchscreen");
        }
 #endif
 
@@ -529,9 +493,9 @@ void omapsdl_input_init(void)
                /* touchscreen check */
                if (touchscreen_ino != (dev_t)-1) {
                        if (fstat(fd, &stat_buf) == -1)
-                               perror("fstat");
+                               err_perror("fstat");
                        else if (touchscreen_ino == stat_buf.st_ino) {
-                               printf("skip %s as ts\n", name);
+                               log("skip %s as ts", name);
                                goto skip;
                        }
                }
@@ -539,7 +503,7 @@ void omapsdl_input_init(void)
                /* check supported events */
                ret = ioctl(fd, EVIOCGBIT(0, sizeof(support)), &support);
                if (ret == -1) {
-                       printf("in_evdev: ioctl failed on %s\n", name);
+                       err_perror("in_evdev: ioctl failed on %s", name);
                        goto skip;
                }
 
@@ -548,7 +512,7 @@ void omapsdl_input_init(void)
 
                ret = ioctl(fd, EVIOCGBIT(EV_KEY, sizeof(keybits)), keybits);
                if (ret == -1) {
-                       printf("in_evdev: ioctl failed on %s\n", name);
+                       err_perror("in_evdev: ioctl failed on %s", name);
                        goto skip;
                }
 
@@ -565,7 +529,7 @@ void omapsdl_input_init(void)
 
                osdl_evdev_devs[osdl_evdev_dev_count++] = fd;
                ioctl(fd, EVIOCGNAME(sizeof(name)), name);
-               printf("in_evdev: found \"%s\" with %d events (type %08x)\n",
+               log("in_evdev: found \"%s\" with %d events (type %08x)",
                        name, count, support);
                continue;
 
@@ -573,7 +537,7 @@ skip:
                close(fd);
        }
 
-       printf("found %d evdev device(s).\n", osdl_evdev_dev_count);
+       log("found %d evdev device(s).", osdl_evdev_dev_count);
 }
 
 void omapsdl_input_finish(void)
@@ -595,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)
 {
@@ -624,7 +588,7 @@ int omapsdl_input_get_events(int timeout_ms,
                ret = select(fdmax + 1, &fdset, NULL, NULL, timeout);
                if (ret == -1)
                {
-                       perror("in_evdev: select failed");
+                       err_perror("in_evdev: select failed");
                        return -1;
                }
                else if (ret == 0)
@@ -655,14 +619,14 @@ int omapsdl_input_get_events(int timeout_ms,
                                ret = read(fd, &ev, sizeof(ev));
                                if (ret < (int)sizeof(ev)) {
                                        if (errno != EAGAIN) {
-                                               perror("in_evdev: read failed");
+                                               err_perror("in_evdev: read failed");
                                                return -1;
                                        }
                                        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))
@@ -670,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;
                        }
@@ -685,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 */
@@ -716,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;