static void emulator_window_window_mouse_event(unsigned x, unsigned y, unsigned state) { /* NOTE: the 0 is used in hw/android/goldfish/events_device.c to * differentiate between a touch-screen and a trackball event */ user_event_mouse(x, y, 0, state); }
static int trackball_move( TrackBall ball, int dx, int dy ) { RotatorRec rot[1]; Uint32 now = SDL_GetTicks(); ball->acc_x += dx; ball->acc_y += dy; if ( norm( ball->acc_x, ball->acc_y ) > ball->acc_threshold ) { int ddx = ball->acc_x * ball->acc_scale; int ddy = ball->acc_y * ball->acc_scale; int ddt; ball->acc_x = 0; ball->acc_y = 0; switch (ball->rotation) { case SKIN_ROTATION_0: break; case SKIN_ROTATION_90: ddt = ddx; ddx = ddy; ddy = -ddt; break; case SKIN_ROTATION_180: ddx = -ddx; ddy = -ddy; break; case SKIN_ROTATION_270: ddt = ddx; ddx = -ddy; ddy = ddt; break; } user_event_mouse(ddx, ddy, 1, 0); } rotator_reset( rot, dx, dy ); rotator_apply( rot, ball->axes[0] ); rotator_apply( rot, ball->axes[1] ); rotator_apply( rot, ball->axes[2] ); if ( ball->ticks_last == 0 ) ball->ticks_last = now; else if ( now > ball->ticks_last + (1000/60) ) { ball->ticks_last = now; return 1; } return 0; }
static void emulator_window_trackball_event(int dx, int dy) { user_event_mouse(dx, dy, 1, 0); }
/* 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; } }