コード例 #1
0
ファイル: mouse.c プロジェクト: Jack19881218/cavan
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;
}
コード例 #2
0
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;
}