/** * 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:; }
/** * 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 {