[Title] removed dependency on sdl in HW key event handling
authorgiwoong.kim <giwoong.kim@samsung.com>
Mon, 16 Jul 2012 05:50:18 +0000 (14:50 +0900)
committergiwoong.kim <giwoong.kim@samsung.com>
Mon, 16 Jul 2012 05:50:18 +0000 (14:50 +0900)
[Type]
[Module] Emulator
[Priority]
[Jira#]
[Redmine#]
[Problem]
[Cause]
[Solution] using mloop
[TestCase]

tizen/src/maru_sdl.c [changed mode: 0644->0755]
tizen/src/mloop_event.c
tizen/src/mloop_event.h
tizen/src/skin/maruskin_operation.c

old mode 100644 (file)
new mode 100755 (executable)
index 3e617f8..944fcb4
@@ -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);
index e5a17dd67e8485d41e86fa1dade11d1413ff1e68..3d4570e2b9e9b34a7711855be1dae12cba55ccb1 100644 (file)
@@ -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);
+}
+
index 48c07826fba9620d55cf792295971532dbe24e25..ce0ff3ec3927994b7c5a9c77af84c0c84820c1eb 100644 (file)
@@ -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
index 3da625a3be40c052569d29c6775173256161045c..4e28dac3335d19abd0eccd04c556713d1833b97d 100644 (file)
@@ -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 )