From b260fb56d8eb049e5dce95a92b5c1189ea29f8b4 Mon Sep 17 00:00:00 2001
From: notaz <notasas@gmail.com>
Date: Thu, 15 Mar 2012 23:07:02 +0200
Subject: [PATCH] add scancode support

probably not everything matches default SDL, but should be good enough
---
 src/video/omapdss/osdl.h       |  2 +-
 src/video/omapdss/osdl_input.c | 12 ++++++++----
 src/video/omapdss/sdlif.c      |  3 ++-
 3 files changed, 11 insertions(+), 6 deletions(-)

diff --git a/src/video/omapdss/osdl.h b/src/video/omapdss/osdl.h
index ea5bce2..2fc418c 100644
--- a/src/video/omapdss/osdl.h
+++ b/src/video/omapdss/osdl.h
@@ -56,7 +56,7 @@ void  osdl_video_finish(struct SDL_PrivateVideoData *pdata);
 void omapsdl_input_init(void);
 void omapsdl_input_bind(const char *kname, const char *sdlname);
 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);
 void omapsdl_input_finish(void);
diff --git a/src/video/omapdss/osdl_input.c b/src/video/omapdss/osdl_input.c
index b020875..94994d1 100644
--- a/src/video/omapdss/osdl_input.c
+++ b/src/video/omapdss/osdl_input.c
@@ -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.
@@ -559,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)
 {
@@ -634,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;
 			}
@@ -649,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 */
@@ -680,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;
diff --git a/src/video/omapdss/sdlif.c b/src/video/omapdss/sdlif.c
index 7511ee4..5818462 100644
--- a/src/video/omapdss/sdlif.c
+++ b/src/video/omapdss/sdlif.c
@@ -233,11 +233,12 @@ static void omap_InitOSKeymap(SDL_VideoDevice *this)
 	trace();
 }
 
-static int key_event_cb(void *cb_arg, int sdl_kc, int is_pressed)
+static int key_event_cb(void *cb_arg, int sdl_kc, int sdl_sc, int is_pressed)
 {
 	SDL_keysym keysym = { 0, };
 
 	keysym.sym = sdl_kc;
+	keysym.scancode = sdl_sc;
 	SDL_PrivateKeyboard(is_pressed, &keysym);
 }
 
-- 
2.39.5