KJAVA虚拟机移植笔记-MIDP的SLAVE事件流程

来源:互联网 发布:sql true false 类型 编辑:程序博客网 时间:2024/06/06 08:30

KJAVA虚拟机Hack笔记-MIDP的SLAVE事件流程

 

转载时请注明出处和作者联系方式

文章出处:http://www.limodev.cn/blog

作者联系方式:李先静

 

KJAVA虚拟机Hack笔记-MIDP的SLAVE事件流程在SLAVE事件模型中,GUI事件由自己的主循环分发。为了把GUI事件转发给JAVA,需要做些处理才行。这里以Canvas的实现,介绍一下GTK+实现中的事件处理流程:

 

o 注册GTK窗口事件处理函数

void frame_hook_key_event(GtkWidget* widget){    g_signal_connect_swapped ((gpointer) widget, "key_press_event",                            G_CALLBACK (frame_on_key_press_event),                            GTK_OBJECT (widget));    g_signal_connect_swapped ((gpointer) widget, "key_release_event",                            G_CALLBACK (frame_on_key_release_event),                            GTK_OBJECT (widget));    return;}

o 在事件处理函数中转发事件

static gboolean frame_on_key_press_event              (GtkWidget       *widget,                                        GdkEventKey     *event,                                        gpointer         user_data){    (void)widget;    (void)user_data;    handle_key_event(event->keyval, KEYMAP_STATE_PRESSED);     return FALSE;} static void handle_key_event(int keyval, int action){    MidpEvent evt;    MIDP_EVENT_INITIALIZE(evt);    evt.type = MIDP_KEY_EVENT;    evt.CHR = get_j2me_key(keyval);    evt.ACTION = action;     if (evt.type != MIDP_INVALID_EVENT)    {        midpStoreEventAndSignalForeground(evt);    }     return;}

midpStoreEventAndSignalForeground会把事件放到gForegroundIsolateId线程的native事件队列中。由于有多个线程同时操作事件队列,MIDP要求移植时实现midp_waitAndLockEventQueue和 midp_unlockEventQueue几个函数。这些函数放在midp/src/events/eventqueue_port /linux_gtk/native目录下。在JAVA这边,events/eventqueue/reference/classes/com/sun/midp/events /EventQueue.jpp中有一个线程一直挂在native消息队列上,当有事件产生时,就调用readNativeEvent把事件读出来,然后用eventQueue.post(nativeEvent)放到JAVA事件队列中。

原创粉丝点击