static void emulator_window_window_generic_event(int event_type, int event_code, int event_value) { user_event_generic(event_type, event_code, event_value); /* XXX: hack, replace by better code here */ if (event_value != 0) android_sensors_set_coarse_orientation(ANDROID_COARSE_PORTRAIT); else android_sensors_set_coarse_orientation(ANDROID_COARSE_LANDSCAPE); }
/* Pushes event to the event device. */ static void _push_event(int type, int code, int value) { user_event_generic(type, code, value); }
/* Asynchronous I/O callback reading user events. * Param: * opaque - UserEventsImpl instance. */ static void _userEventsImpl_io_func(void* opaque, int fd, unsigned events) { UserEventsImpl* ueimpl; AsyncStatus status; if (events & LOOP_IO_WRITE) { // We don't use async writer here, so we don't expect // any write callbacks. derror("Unexpected LOOP_IO_WRITE in _userEventsImpl_io_func\n"); return; } ueimpl = (UserEventsImpl*)opaque; // Read whatever is expected from the socket. status = asyncReader_read(&ueimpl->user_events_reader); switch (status) { case ASYNC_COMPLETE: switch (ueimpl->state) { case EXPECTS_HEADER: // We just read event header. Now we expect event parameters. ueimpl->state = EXPECTS_PARAMETERS; // Setup the reader depending on the event type. switch (ueimpl->event_header.event_type) { case AUSER_EVENT_MOUSE: asyncReader_init(&ueimpl->user_events_reader, &ueimpl->mouse_event, sizeof(ueimpl->mouse_event), &ueimpl->io); break; case AUSER_EVENT_KEYCODE: asyncReader_init(&ueimpl->user_events_reader, &ueimpl->keycode_event, sizeof(ueimpl->keycode_event), &ueimpl->io); break; case AUSER_EVENT_GENERIC: asyncReader_init(&ueimpl->user_events_reader, &ueimpl->generic_event, sizeof(ueimpl->generic_event), &ueimpl->io); break; default: derror("Unexpected user event type %d\n", ueimpl->event_header.event_type); break; } break; case EXPECTS_PARAMETERS: // We just read event parameters. Lets fire the event. switch (ueimpl->event_header.event_type) { case AUSER_EVENT_MOUSE: user_event_mouse(ueimpl->mouse_event.dx, ueimpl->mouse_event.dy, ueimpl->mouse_event.dz, ueimpl->mouse_event.buttons_state); break; case AUSER_EVENT_KEYCODE: user_event_keycode(ueimpl->keycode_event.keycode); break; case AUSER_EVENT_GENERIC: user_event_generic(ueimpl->generic_event.type, ueimpl->generic_event.code, ueimpl->generic_event.value); break; default: derror("Unexpected user event type %d\n", ueimpl->event_header.event_type); break; } // Prepare to receive the next event header. ueimpl->event_header.event_type = -1; ueimpl->state = EXPECTS_HEADER; asyncReader_init(&ueimpl->user_events_reader, &ueimpl->event_header, sizeof(ueimpl->event_header), &ueimpl->io); break; } break; case ASYNC_ERROR: loopIo_dontWantRead(&ueimpl->io); if (errno == ECONNRESET) { // UI has exited. We need to destroy user event service. destroy_user_events_client(); } else { derror("User event read error %d -> %s\n", errno, errno_str); } break; case ASYNC_NEED_MORE: // Transfer will eventually come back into this routine. return; } }