From 622a770fd82e6f53f71cef48742b2b1e5446a8e4 Mon Sep 17 00:00:00 2001 From: "giwoong.kim" Date: Mon, 16 Jul 2012 14:50:18 +0900 Subject: [PATCH] [Title] removed dependency on sdl in HW key event handling [Type] [Module] Emulator [Priority] [Jira#] [Redmine#] [Problem] [Cause] [Solution] using mloop [TestCase] --- tizen/src/maru_sdl.c | 5 ---- tizen/src/mloop_event.c | 42 +++++++++++++++++++++++++++++ tizen/src/mloop_event.h | 2 ++ tizen/src/skin/maruskin_operation.c | 16 ++--------- 4 files changed, 46 insertions(+), 19 deletions(-) mode change 100644 => 100755 tizen/src/maru_sdl.c diff --git a/tizen/src/maru_sdl.c b/tizen/src/maru_sdl.c old mode 100644 new mode 100755 index 3e617f83e5..944fcb4d63 --- a/tizen/src/maru_sdl.c +++ b/tizen/src/maru_sdl.c @@ -430,10 +430,6 @@ static void qemu_ds_refresh(DisplayState *ds) pthread_mutex_unlock(&sdl_mutex); break; } - case SDL_USEREVENT: { - handle_sdl_user_event( ev->user ); - break; - } default: break; @@ -471,7 +467,6 @@ void maruskin_sdl_init(uint64 swt_handle, int lcd_size_width, int lcd_size_heigh if (SDL_Init(SDL_INIT_VIDEO) < 0 ) { ERR("unable to init SDL: %s\n", SDL_GetError()); - exit(1); } set_emul_lcd_size(lcd_size_width, lcd_size_height); diff --git a/tizen/src/mloop_event.c b/tizen/src/mloop_event.c index e5a17dd67e..3d4570e2b9 100644 --- a/tizen/src/mloop_event.c +++ b/tizen/src/mloop_event.c @@ -39,6 +39,8 @@ #include "hw/usb.h" #include "hw/irq.h" #include "mloop_event.h" +#include "console.h" +#include "emul_state.h" #define error_report(x, ...) @@ -65,6 +67,7 @@ struct mloop_evpack { #define MLOOP_EVTYPE_USB_DEL 2 #define MLOOP_EVTYPE_INTR_UP 3 #define MLOOP_EVTYPE_INTR_DOWN 4 +#define MLLOP_EVTYPE_HWKEY 5 static struct mloop_evsock mloop = {-1,0,0}; @@ -236,6 +239,27 @@ static void mloop_evhandle_intr_down(long data) qemu_irq_lower((qemu_irq)data); } +static void mloop_evhandle_hwkey(struct mloop_evpack* pack) +{ + int event_type; + int keycode; + + memcpy(&event_type, pack->data, sizeof(int)); + memcpy(&keycode, pack->data + sizeof(int), sizeof(int)); + + if (KEY_PRESSED == event_type) { + if (kbd_mouse_is_absolute()) { + ps2kbd_put_keycode(keycode & 0x7f); + } + } else if ( KEY_RELEASED == event_type ) { + if (kbd_mouse_is_absolute()) { + ps2kbd_put_keycode(keycode | 0x80); + } + } else { + fprintf(stderr, "Unknown hardkey event type.[event_type:%d, keycode:%d]", event_type, keycode); + } +} + static void mloop_evcb_recv(struct mloop_evsock *ev) { struct mloop_evpack pack; @@ -273,6 +297,9 @@ static void mloop_evcb_recv(struct mloop_evsock *ev) case MLOOP_EVTYPE_INTR_DOWN: mloop_evhandle_intr_down(ntohl(*(long*)&pack.data[0])); break; + case MLLOP_EVTYPE_HWKEY: + mloop_evhandle_hwkey(&pack); + break; default: break; } @@ -355,3 +382,18 @@ void mloop_evcmd_lower_intr(void *irq) *(long*)&pack.data[0] = htonl((long)irq); mloop_evsock_send(&mloop, &pack); } + +void mloop_evcmd_hwkey(int event_type, int keycode) +{ + struct mloop_evpack pack; + + pack.type = htons(MLLOP_EVTYPE_HWKEY); + pack.size = htons(5 + 8); //TODO: ? + + memcpy(pack.data, &event_type, sizeof(int)); + memcpy(pack.data + sizeof(int), &keycode, sizeof(int)); + //pack.data = htons(pack.data); + + mloop_evsock_send(&mloop, &pack); +} + diff --git a/tizen/src/mloop_event.h b/tizen/src/mloop_event.h index 48c07826fb..ce0ff3ec39 100644 --- a/tizen/src/mloop_event.h +++ b/tizen/src/mloop_event.h @@ -46,6 +46,8 @@ void mloop_evcmd_set_usbdisk(void *dev); void mloop_evcmd_raise_intr(void *irq); void mloop_evcmd_lower_intr(void *irq); +void mloop_evcmd_hwkey(int event_type, int keycode); + #ifdef __cplusplus } #endif diff --git a/tizen/src/skin/maruskin_operation.c b/tizen/src/skin/maruskin_operation.c index 3da625a3be..4e28dac333 100644 --- a/tizen/src/skin/maruskin_operation.c +++ b/tizen/src/skin/maruskin_operation.c @@ -155,7 +155,7 @@ void do_key_event( int event_type, int keycode, int key_location ) void do_hardkey_event( int event_type, int keycode ) { - TRACE( "do_hardkey_event event_type:%d, keycode:%d\n", event_type, keycode ); + INFO( "do_hardkey_event event_type:%d, keycode:%d\n", event_type, keycode ); if ( is_suspended_state() ) { if ( KEY_PRESSED == event_type ) { @@ -174,19 +174,7 @@ void do_hardkey_event( int event_type, int keycode ) } } - SDL_Event event; - memset( &event, 0, sizeof(SDL_Event) ); - - event.type = SDL_USEREVENT; - event.user.code = SDL_USER_EVENT_CODE_HARDKEY; - - // use pointer as integer - event.user.data1 = (void*) event_type; - event.user.data2 = (void*) keycode; - - // see qemu_ds_refresh in maru_sdl.c - SDL_PushEvent( &event ); - + mloop_evcmd_hwkey(event_type, keycode); } void do_scale_event( double scale_factor ) -- 2.34.1