Exemplo n.º 1
0
/**
 * Retrieves next event from queue. Must be called when 
 * <code>directfbapp_event_is_waiting</code> returned true.
 */
void directfbapp_get_event(void *event) {
    if (directfbapp_event_is_waiting()) {
        DFBCHECK(event_buffer->GetEvent(event_buffer, DFB_EVENT(event)));
        return;
    }
    REPORT_ERROR(LC_LOWUI, "Invalid sequence of calls: no events waiting");
dfb_err:;
}
Exemplo n.º 2
0
/**
 * Blocks the Java event thread until an event has been queued and returns
 * that event and the number of events still in the queue.
 *
 * @param event An empty event to be filled in if there is a queued
 *              event.
 *
 * @return number of events waiting in the native queue
 */
KNIEXPORT KNI_RETURNTYPE_INT
KNIDECL(com_sun_midp_events_NativeEventMonitor_waitForNativeEvent) {
    fd_set read_fds;
    fd_set write_fds;
    fd_set except_fds;
    int num_fds = 0, num_ready;
    /* IMPL_NOTE    jlong sec, usec; */
    /* IMPL_NOTE    struct timeval timeout; */
#ifdef DIRECTFB
    int keyboard_has_event = 0;
#else
    int keyboardFd = fbapp_get_keyboard_fd();
#endif /* defined(DIRECTFB) */
    int done = 0;

    do {
        FD_ZERO(&read_fds);
        FD_ZERO(&write_fds);
        FD_ZERO(&except_fds);

        FD_SET(controlPipe[0], &read_fds);
        if (num_fds <= controlPipe[0]) {
            num_fds = controlPipe[0] + 1;
        }

#ifndef DIRECTFB
        keyboardFd = fbapp_get_keyboard_fd();
        if (keyboardFd >= 0) {
            FD_SET(keyboardFd, &read_fds);
            if (num_fds <= keyboardFd) {
                num_fds = keyboardFd + 1;
            }
        }

        CVMD_gcSafeExec(_ee, {
            num_ready= select(num_fds+1, &read_fds, &write_fds, &except_fds,
                              NULL);
        });
#else
        /* We should get events from two different sources:
         * from controlPipe and from DirectFB's event queue (keyboard events).
         * At first we check for keyboard events. If this queue is empty
         * we wait 0.2s for pipe's events.
         */
        if (!directfbapp_event_is_waiting()) {
            struct timeval timeout;        
            timeout.tv_sec = 0;
            timeout.tv_usec = 200000; /* wait 0.2 sec */
            /* When the timeout expires num_ready will contain 0 */
            CVMD_gcSafeExec(_ee, {
                num_ready= select(num_fds+1, &read_fds, &write_fds, &except_fds,
                                  &timeout);
            });
        } else {