Add hold gestures to the public API and the private functions to notify them.
Also add hold gestures to debug-events and debug-gui.
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Signed-off-by: José Expósito <jose.exposito89@gmail.com>
double scale,
bool cancelled);
+void
+gesture_notify_hold(struct libinput_device *device,
+ uint64_t time,
+ int finger_count);
+
+void
+gesture_notify_hold_end(struct libinput_device *device,
+ uint64_t time,
+ int finger_count,
+ bool cancelled);
+
void
tablet_notify_axis(struct libinput_device *device,
uint64_t time,
CASE_RETURN_STRING(LIBINPUT_EVENT_GESTURE_PINCH_BEGIN);
CASE_RETURN_STRING(LIBINPUT_EVENT_GESTURE_PINCH_UPDATE);
CASE_RETURN_STRING(LIBINPUT_EVENT_GESTURE_PINCH_END);
+ CASE_RETURN_STRING(LIBINPUT_EVENT_GESTURE_HOLD_BEGIN);
+ CASE_RETURN_STRING(LIBINPUT_EVENT_GESTURE_HOLD_END);
CASE_RETURN_STRING(LIBINPUT_EVENT_SWITCH_TOGGLE);
case LIBINPUT_EVENT_NONE:
abort();
LIBINPUT_EVENT_GESTURE_SWIPE_END,
LIBINPUT_EVENT_GESTURE_PINCH_BEGIN,
LIBINPUT_EVENT_GESTURE_PINCH_UPDATE,
- LIBINPUT_EVENT_GESTURE_PINCH_END);
+ LIBINPUT_EVENT_GESTURE_PINCH_END,
+ LIBINPUT_EVENT_GESTURE_HOLD_BEGIN,
+ LIBINPUT_EVENT_GESTURE_HOLD_END);
return (struct libinput_event_gesture *) event;
}
LIBINPUT_EVENT_GESTURE_PINCH_END,
LIBINPUT_EVENT_GESTURE_SWIPE_BEGIN,
LIBINPUT_EVENT_GESTURE_SWIPE_UPDATE,
- LIBINPUT_EVENT_GESTURE_SWIPE_END);
+ LIBINPUT_EVENT_GESTURE_SWIPE_END,
+ LIBINPUT_EVENT_GESTURE_HOLD_BEGIN,
+ LIBINPUT_EVENT_GESTURE_HOLD_END);
return us2ms(event->time);
}
LIBINPUT_EVENT_GESTURE_PINCH_END,
LIBINPUT_EVENT_GESTURE_SWIPE_BEGIN,
LIBINPUT_EVENT_GESTURE_SWIPE_UPDATE,
- LIBINPUT_EVENT_GESTURE_SWIPE_END);
+ LIBINPUT_EVENT_GESTURE_SWIPE_END,
+ LIBINPUT_EVENT_GESTURE_HOLD_BEGIN,
+ LIBINPUT_EVENT_GESTURE_HOLD_END);
return event->time;
}
LIBINPUT_EVENT_GESTURE_PINCH_END,
LIBINPUT_EVENT_GESTURE_SWIPE_BEGIN,
LIBINPUT_EVENT_GESTURE_SWIPE_UPDATE,
- LIBINPUT_EVENT_GESTURE_SWIPE_END);
+ LIBINPUT_EVENT_GESTURE_SWIPE_END,
+ LIBINPUT_EVENT_GESTURE_HOLD_BEGIN,
+ LIBINPUT_EVENT_GESTURE_HOLD_END);
return event->finger_count;
}
event->base.type,
0,
LIBINPUT_EVENT_GESTURE_PINCH_END,
- LIBINPUT_EVENT_GESTURE_SWIPE_END);
+ LIBINPUT_EVENT_GESTURE_SWIPE_END,
+ LIBINPUT_EVENT_GESTURE_HOLD_END);
return event->cancelled;
}
finger_count, cancelled, &zero, &zero, scale, 0.0);
}
+void
+gesture_notify_hold(struct libinput_device *device,
+ uint64_t time,
+ int finger_count)
+{
+ const struct normalized_coords zero = { 0.0, 0.0 };
+
+ gesture_notify(device, time, LIBINPUT_EVENT_GESTURE_HOLD_BEGIN,
+ finger_count, 0, &zero, &zero, 0.0, 0.0);
+}
+
+void
+gesture_notify_hold_end(struct libinput_device *device,
+ uint64_t time,
+ int finger_count,
+ bool cancelled)
+{
+ const struct normalized_coords zero = { 0.0, 0.0 };
+
+ gesture_notify(device, time, LIBINPUT_EVENT_GESTURE_HOLD_END,
+ finger_count, cancelled, &zero, &zero, 0, 0.0);
+}
+
void
switch_notify_toggle(struct libinput_device *device,
uint64_t time,
LIBINPUT_EVENT_GESTURE_PINCH_BEGIN,
LIBINPUT_EVENT_GESTURE_PINCH_UPDATE,
LIBINPUT_EVENT_GESTURE_PINCH_END,
+ /**
+ * @since 1.19
+ */
+ LIBINPUT_EVENT_GESTURE_HOLD_BEGIN,
+ LIBINPUT_EVENT_GESTURE_HOLD_END,
/**
* @since 1.7
case LIBINPUT_EVENT_GESTURE_PINCH_END:
str = "GESTURE PINCH END";
break;
+ case LIBINPUT_EVENT_GESTURE_HOLD_BEGIN:
+ str = "GESTURE HOLD BEGIN";
+ break;
+ case LIBINPUT_EVENT_GESTURE_HOLD_END:
+ str = "GESTURE HOLD END";
+ break;
case LIBINPUT_EVENT_TABLET_TOOL_AXIS:
str = "TABLET TOOL AXIS";
break;
case LIBINPUT_EVENT_GESTURE_PINCH_END:
type = "GESTURE_PINCH_END";
break;
+ case LIBINPUT_EVENT_GESTURE_HOLD_BEGIN:
+ type = "GESTURE_HOLD_BEGIN";
+ break;
+ case LIBINPUT_EVENT_GESTURE_HOLD_END:
+ type = "GESTURE_HOLD_END";
+ break;
case LIBINPUT_EVENT_TABLET_TOOL_AXIS:
type = "TABLET_TOOL_AXIS";
break;
type = libinput_event_get_type(ev);
if (type == LIBINPUT_EVENT_GESTURE_SWIPE_END ||
- type == LIBINPUT_EVENT_GESTURE_PINCH_END)
+ type == LIBINPUT_EVENT_GESTURE_PINCH_END ||
+ type == LIBINPUT_EVENT_GESTURE_HOLD_END)
cancelled = libinput_event_gesture_get_cancelled(t);
print_event_time(libinput_event_gesture_get_time(t));
case LIBINPUT_EVENT_GESTURE_PINCH_END:
print_gesture_event_without_coords(ev);
break;
+ case LIBINPUT_EVENT_GESTURE_HOLD_BEGIN:
+ print_gesture_event_without_coords(ev);
+ break;
+ case LIBINPUT_EVENT_GESTURE_HOLD_END:
+ print_gesture_event_without_coords(ev);
+ break;
case LIBINPUT_EVENT_TABLET_TOOL_AXIS:
print_tablet_axis_event(ev);
break;
double x, y;
} pinch;
+ struct {
+ int nfingers;
+ bool active;
+ } hold;
+
struct {
double x, y;
double x_in, y_in;
static inline void
draw_gestures(struct window *w, cairo_t *cr)
{
- int i;
int offset;
/* swipe */
cairo_save(cr);
cairo_translate(cr, w->swipe.x, w->swipe.y);
- for (i = 0; i < w->swipe.nfingers; i++) {
+ for (int i = 0; i < w->swipe.nfingers; i++) {
cairo_set_source_rgb(cr, .8, .8, .4);
cairo_arc(cr, (i - 2) * 40, 0, 20, 0, 2 * M_PI);
cairo_fill(cr);
}
- for (i = 0; i < 4; i++) { /* 4 fg max */
+ for (int i = 0; i < 4; i++) { /* 4 fg max */
cairo_set_source_rgb(cr, 0, 0, 0);
cairo_arc(cr, (i - 2) * 40, 0, 20, 0, 2 * M_PI);
cairo_stroke(cr);
cairo_stroke(cr);
cairo_restore(cr);
+
+ /* hold */
+ cairo_save(cr);
+ cairo_translate(cr, w->width/2, w->height/2 + 100);
+
+ for (int i = 4; i > 0; i--) { /* 4 fg max */
+ double r, g, b, hold_alpha;
+
+ r = .4 + .2 * (i % 2);
+ g = .2;
+ b = .2;
+ hold_alpha = (w->hold.active && i <= w->hold.nfingers) ? 1 : .5;
+
+ cairo_set_source_rgba(cr, r, g, b, hold_alpha);
+ cairo_arc(cr, 0, 0, 20 * i, 0, 2 * M_PI);
+ cairo_fill(cr);
+
+ cairo_set_source_rgba(cr, 0, 0, 0, hold_alpha);
+ cairo_arc(cr, 0, 0, 20 * i, 0, 2 * M_PI);
+ cairo_stroke(cr);
+ }
+
+ cairo_restore(cr);
}
static inline void
}
}
+static void
+handle_event_hold(struct libinput_event *ev, struct window *w)
+{
+ struct libinput_event_gesture *g = libinput_event_get_gesture_event(ev);
+ int nfingers;
+
+ nfingers = libinput_event_gesture_get_finger_count(g);
+
+ switch (libinput_event_get_type(ev)) {
+ case LIBINPUT_EVENT_GESTURE_HOLD_BEGIN:
+ w->hold.nfingers = nfingers;
+ w->hold.active = true;
+ break;
+ case LIBINPUT_EVENT_GESTURE_HOLD_END:
+ w->hold.nfingers = nfingers;
+ w->hold.active = false;
+ break;
+ default:
+ abort();
+ }
+}
+
static void
handle_event_tablet(struct libinput_event *ev, struct window *w)
{
case LIBINPUT_EVENT_GESTURE_PINCH_END:
handle_event_pinch(ev, w);
break;
+ case LIBINPUT_EVENT_GESTURE_HOLD_BEGIN:
+ case LIBINPUT_EVENT_GESTURE_HOLD_END:
+ handle_event_hold(ev, w);
+ break;
case LIBINPUT_EVENT_TABLET_TOOL_AXIS:
case LIBINPUT_EVENT_TABLET_TOOL_PROXIMITY:
case LIBINPUT_EVENT_TABLET_TOOL_TIP: