Пример #1
0
static inline bool
is_inside_bottom_left_area(const struct tp_dispatch *tp,
			   const struct tp_touch *t)
{
	return is_inside_bottom_button_area(tp, t) &&
	       !is_inside_bottom_right_area(tp, t);
}
int
tp_button_handle_state(struct tp_dispatch *tp, uint64_t time)
{
	struct tp_touch *t;

	tp_for_each_touch(tp, t) {
		if (t->state == TOUCH_NONE)
			continue;

		if (t->state == TOUCH_END) {
			tp_button_handle_event(tp, t, BUTTON_EVENT_UP, time);
		} else if (t->dirty) {
			enum button_event event;

			if (is_inside_bottom_right_area(tp, t))
				event = BUTTON_EVENT_IN_BOTTOM_R;
			else if (is_inside_bottom_left_area(tp, t))
				event = BUTTON_EVENT_IN_BOTTOM_L;
			else if (is_inside_top_right_area(tp, t))
				event = BUTTON_EVENT_IN_TOP_R;
			else if (is_inside_top_middle_area(tp, t))
				event = BUTTON_EVENT_IN_TOP_M;
			else if (is_inside_top_left_area(tp, t))
				event = BUTTON_EVENT_IN_TOP_L;
			else
				event = BUTTON_EVENT_IN_AREA;

			tp_button_handle_event(tp, t, event, time);
		}
		if (tp->queued & TOUCHPAD_EVENT_BUTTON_RELEASE)
			tp_button_handle_event(tp, t, BUTTON_EVENT_RELEASE, time);
		if (tp->queued & TOUCHPAD_EVENT_BUTTON_PRESS)
			tp_button_handle_event(tp, t, BUTTON_EVENT_PRESS, time);
	}

	return 0;
}