Chinaunix首页 | 论坛 | 博客
  • 博客访问: 192557
  • 博文数量: 111
  • 博客积分: 3010
  • 博客等级: 中校
  • 技术积分: 1240
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-07 07:46
文章分类

全部博文(111)

文章存档

2015年(2)

2014年(1)

2011年(1)

2010年(7)

2009年(100)

我的朋友

分类: LINUX

2009-08-07 11:02:45


转载时请注明出处和作者联系方式
文章出处: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事件队列中。

阅读(407) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~