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);
}
Esempio n. 2
0
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);
}
Esempio n. 4
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;
    }
}