static bool cavan_mouse_event_handler(struct cavan_input_device *dev, struct input_event *event, void *data) { struct cavan_mouse_device *mouse = (struct cavan_mouse_device *) dev; switch (event->type) { case EV_KEY: switch (event->code) { case BTN_LEFT: case BTN_RIGHT: case BTN_MIDDLE: cavan_input_service_append_key_message(data, \ CAVAN_INPUT_MESSAGE_MOUSE_TOUCH, NULL, event->code, event->value); break; default: return false; } break; case EV_REL: switch (event->code) { case REL_X: mouse->x = event->value; break; case REL_Y: mouse->y = event->value; break; case REL_WHEEL: cavan_input_service_append_key_message(data, \ CAVAN_INPUT_MESSAGE_WHEEL, NULL, REL_WHEEL, event->value); break; default: return false; } break; case EV_SYN: if (mouse->x || mouse->y) { if (cavan_input_service_append_vector_message(data, \ CAVAN_INPUT_MESSAGE_MOUSE_MOVE, mouse->x, mouse->y, 0)) { mouse->x = mouse->y = 0; } } break; default: return false; } return true; }
static bool cavan_touchpad_event_handler(struct cavan_input_device *dev, struct input_event *event, void *data) { int xdiff, ydiff; struct cavan_input_service *service = data; struct cavan_touchpad_device *touchpad = (struct cavan_touchpad_device *) dev; switch (event->type) { case EV_KEY: switch (event->code) { case BTN_TOUCH: switch (touchpad->state) { case CAVAN_TOUCHPAD_STATE_DOWN1: if (touchpad->mode == CAVAN_TOUCHPAD_MODE_NONE) { touchpad->state = CAVAN_TOUCHPAD_STATE_UP1; cavan_timer_remove(&service->timer_service, &touchpad->timer); cavan_touchpad_touch(touchpad, service, 1); touchpad->timer.private_data = service; touchpad->timer.handler = cavan_touchpad_timer_handler_up; cavan_timer_insert(&service->timer_service, &touchpad->timer, 200); } else { touchpad->state = CAVAN_TOUCHPAD_STATE_IDLE; touchpad->mode = CAVAN_TOUCHPAD_MODE_NONE; } break; case CAVAN_TOUCHPAD_STATE_UP1: touchpad->state = CAVAN_TOUCHPAD_STATE_DOWN2; cavan_timer_remove(&service->timer_service, &touchpad->timer); touchpad->timer.private_data = service; touchpad->timer.handler = cavan_touchpad_timer_handler_down; cavan_timer_insert(&service->timer_service, &touchpad->timer, 200); break; case CAVAN_TOUCHPAD_STATE_DOWN2: cavan_touchpad_touch(touchpad, service, 0); if (touchpad->mode == CAVAN_TOUCHPAD_MODE_NONE) { touchpad->state = CAVAN_TOUCHPAD_STATE_UP2; cavan_touchpad_touch(touchpad, service, 1); touchpad->timer.private_data = service; touchpad->timer.handler = cavan_touchpad_timer_handler_up; cavan_timer_insert(&service->timer_service, &touchpad->timer, 200); } else { touchpad->state = CAVAN_TOUCHPAD_STATE_IDLE; touchpad->mode = CAVAN_TOUCHPAD_MODE_NONE; } break; case CAVAN_TOUCHPAD_STATE_UP2: cavan_timer_remove(&service->timer_service, &touchpad->timer); cavan_touchpad_touch(touchpad, service, 0); case CAVAN_TOUCHPAD_STATE_IDLE: if (event->value) { touchpad->state = CAVAN_TOUCHPAD_STATE_DOWN1; touchpad->timer.private_data = service; touchpad->timer.handler = cavan_touchpad_timer_handler_down; cavan_timer_insert(&service->timer_service, &touchpad->timer, 100); } else { touchpad->state = CAVAN_TOUCHPAD_STATE_IDLE; touchpad->mode = CAVAN_TOUCHPAD_MODE_NONE; } break; } break; case BTN_LEFT: case BTN_RIGHT: case BTN_MIDDLE: case BTN_0: case BTN_1: cavan_input_service_append_key_message(data, \ CAVAN_INPUT_MESSAGE_MOUSE_TOUCH, NULL, event->code, event->value); break; default: return false; } break; case EV_ABS: switch (event->code) { case ABS_X: touchpad->x = event->value; break; case ABS_Y: touchpad->y = event->value; break; case ABS_PRESSURE: case ABS_TOOL_WIDTH: break; default: return false; } break; case EV_SYN: switch (touchpad->mode) { case CAVAN_TOUCHPAD_MODE_WHEEL: ydiff = (touchpad->yold - touchpad->y) * touchpad->yspeed; if (ydiff) { cavan_input_service_append_key_message(data, \ CAVAN_INPUT_MESSAGE_WHEEL, NULL, REL_HWHEEL, ydiff > 0 ? 1 : -1); touchpad->yold = touchpad->y; } break; case CAVAN_TOUCHPAD_MODE_HWHEEL: xdiff = (touchpad->xold - touchpad->x) * touchpad->xspeed; if (xdiff) { cavan_input_service_append_key_message(data, \ CAVAN_INPUT_MESSAGE_WHEEL, NULL, REL_WHEEL, xdiff > 0 ? 1 : -1); touchpad->xold = touchpad->x; } break; case CAVAN_TOUCHPAD_MODE_MOVE: xdiff = (touchpad->x - touchpad->xold) * touchpad->xspeed; ydiff = (touchpad->y - touchpad->yold) * touchpad->yspeed; if (xdiff || ydiff) { cavan_input_service_append_vector_message(data, \ CAVAN_INPUT_MESSAGE_MOUSE_MOVE, xdiff, ydiff, 0); touchpad->xold = touchpad->x; touchpad->yold = touchpad->y; } break; case CAVAN_TOUCHPAD_MODE_NONE: break; } break; default: return false; } return true; }