zoukankan      html  css  js  c++  java
  • KJAVA虚拟机移植笔记MIDP的SLAVE事件流程

    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事件队列中。

  • 相关阅读:
    C语言volatile解析
    使用中断开关实现全局变量互斥访问
    CentOS7下gogs安装总结
    iOS Xcode: linker command failed with exit code 1 (use -v to see invocation) 处理方法
    C# 10进制与62进制互转 数据大无压力 10进制与72,96进制任意转换
    Web网站的性能测试工具
    NetCore跨平台桌面框架Avalonia的OSX程序打包
    C# 类中静态变量静态构造函数执行顺序
    mac osx下虚拟主机配置
    React+ES6+Webpack深入浅出
  • 原文地址:https://www.cnblogs.com/zhangyunlin/p/6167522.html
Copyright © 2011-2022 走看看