fb_handle_input.c

来自「This is a resource based on j2me embedde」· C语言 代码 · 共 239 行

C
239
字号
/* * * * Copyright  1990-2007 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER *  * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License version * 2 only, as published by the Free Software Foundation. *  * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License version 2 for more details (a copy is * included at /legal/license.txt). *  * You should have received a copy of the GNU General Public License * version 2 along with this work; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA *  * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa * Clara, CA 95054 or visit www.sun.com if you need additional * information or have any questions. *//** * @file * Utility functions to handle received system signals */#include <sys/time.h>#include <sys/types.h>#include <unistd.h>#include <jvm.h>#include <midpServices.h>#include <midpEvents.h>#include <midpEventUtil.h>#include <fbapp_export.h>#include <keymap_input.h>#include <timer_queue.h>#include <midp_logging.h>#ifdef DIRECTFB#include <directfb.h>#include <directfbapp_export.h>#endif#include "fb_handle_input.h"#include "fb_keymapping.h"#include "fb_read_key.h"/* IMPL_NOTE: OMAP730 keyboard events are bit-based. Thus single native     event can produce several MIDP ones. This flag indicates there are     one or more key bits still not converted into MIDP events *//** Implement input keys state */InputKeyState keyState;/** Function to read key events from a platform input device */static fReadKeyEvent readKeyEvent = NULL;/** Handle key repeat timer alarm on timer wakeup */static void handle_repeat_key_timer_alarm(TimerHandle *timer) {    static MidpEvent newMidpEvent;    static int midp_keycode;    if (timer != NULL) {        midp_keycode = (int)(get_timer_data(timer));        newMidpEvent.type = MIDP_KEY_EVENT;        newMidpEvent.CHR = midp_keycode;        newMidpEvent.ACTION = KEYMAP_STATE_REPEATED;        midpStoreEventAndSignalForeground(newMidpEvent);        timer = remove_timer(timer);        set_timer_wakeup(timer, get_timer_wakeup(timer) + REPEAT_PERIOD);        add_timer(timer);    }}/** * Support repeated key presses for a platforms with no own support for it. * * One of the possible implementations is timer-based generation of MIDP * events for a keys pressed and not released for a certain time interval. * * @param midpKeyCode MIDP keycode of the pressed/released key * @param isPressed true if the key is pressed, false if released */void handle_repeated_key_port(int midpKeyCode, jboolean isPressed) {    if (isPressed) {        jlong current_time = JVM_JavaMilliSeconds();        new_timer(current_time + REPEAT_TIMEOUT,            (void*)midpKeyCode, handle_repeat_key_timer_alarm);    } else {        delete_timer_by_userdata((void*)midpKeyCode);    }}/** * Set key mapping, input device mode and function to read * platform key events depending on input device type  */static void init_key_device() {    static int done = 0;    if (!done) {        done = KNI_TRUE;        memset(&keyState, 0, sizeof(keyState));        switch (fbapp_get_fb_device_type()) {        case LINUX_FB_OMAP730:            mapping = omap_730_keys;            bitscale_mode = KNI_TRUE;            readKeyEvent = read_omap730_key_event;            break;        case LINUX_FB_ZAURUS:            mapping = zaurus_sl5500_keys;            bitscale_mode = KNI_FALSE;            readKeyEvent = read_char_key_event;            break;        case LINUX_FB_VERSATILE_INTEGRATOR:        default:            mapping = versatile_integrator_keys;            bitscale_mode = KNI_FALSE;            readKeyEvent = read_char_key_event;            break;        }#ifdef DIRECTFB        /* DirectFB provides generic function to read input key events */        readKeyEvent = read_directfb_key_event;#endif    }}/** * Find key mapping entry by raw key value regarding the bits * changed since the previous check * */static void find_raw_key_mapping() {    int down = 0;    /* cache a few state fields for brewity */    unsigned changedBits = keyState.changedBits;    unsigned key = keyState.key;    KeyMapping *km;    /* find MIDP key code corresponding to native key */    if (bitscale_mode) {        /* key is bit-mask, seach for mapping entry */        for (km = keyState.km; km->midp_keycode != KEYMAP_KEY_INVALID &&                ((changedBits & km->raw_keydown) == 0); km++)            /* break at the first newly pressed/released key */            ;        /* check if found the corresponding entry */        if (km->midp_keycode != KEYMAP_KEY_INVALID) {            down = key & km->raw_keydown;            changedBits &= ~km->raw_keydown;        } else {            /* no entry found, reset search */            changedBits = 0;        }    } else {        /* key is key code */        for (km = mapping; km->midp_keycode != KEYMAP_KEY_INVALID; km++) {            if (km->raw_keydown == key) {                down = 1;                break;            } else if (km->raw_keyup == key) {                down = 0;                break;            }        }    }    /* update keys state */    keyState.km = km;    keyState.changedBits = changedBits;    keyState.hasPendingKeySignal = (changedBits != 0);    /* down key state could be set by read function */    if (keyState.down < 0) {        keyState.down = down;    }}/** * ARM/DIRECTFB version to read keyboard events from /dev/tty0. * * @param pNewSignal        reentry data to unblock threads waiting for a signal * @param pNewMidpEvent     a native MIDP event to be stored to Java event queue */void handle_key_port(MidpReentryData* pNewSignal, MidpEvent* pNewMidpEvent) {    int midpKeyCode;    jboolean isPressed;    jboolean repeatSupport;    init_key_device();    if (readKeyEvent()) {        find_raw_key_mapping();        midpKeyCode = keyState.km->midp_keycode;        isPressed = keyState.down ? KNI_TRUE : KNI_FALSE;        repeatSupport = KNI_TRUE;        fbapp_map_keycode_to_event(            pNewSignal, pNewMidpEvent,            midpKeyCode, isPressed, repeatSupport);   }}/** * ARM version to read mouse events. * By default it's empty because currently it does not supported pointer events * It should be implemented if required * * @param pNewSignal        reentry data to unblock threads waiting for a signal * @param pNewMidpEvent     a native MIDP event to be stored to Java event queue */void handle_pointer_port(MidpReentryData* pNewSignal, MidpEvent* pNewMidpEvent) {    (void)pNewSignal;    (void)pNewMidpEvent;}/** * An input devices can produce bit-based keyboard events. Thus single * native event can produce several MIDP ones. This function detects * whether are one or more key bits still not converted into MIDP events * * @return true when pending key exists, false otherwise */jboolean has_pending_key_port() {    return bitscale_mode ?         keyState.hasPendingKeySignal :        KNI_FALSE;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?