|
|
|
#include <assert.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include <wayland-server-core.h>
|
|
|
|
#include <wlr/interfaces/wlr_pointer.h>
|
|
|
|
#include <wlr/types/wlr_pointer.h>
|
|
|
|
|
|
|
|
#include "interfaces/wlr_input_device.h"
|
|
|
|
|
|
|
|
struct wlr_pointer *wlr_pointer_from_input_device(
|
|
|
|
struct wlr_input_device *input_device) {
|
|
|
|
assert(input_device->type == WLR_INPUT_DEVICE_POINTER);
|
|
|
|
return wl_container_of(input_device, (struct wlr_pointer *)NULL, base);
|
|
|
|
}
|
|
|
|
|
|
|
|
void wlr_pointer_init(struct wlr_pointer *pointer,
|
|
|
|
const struct wlr_pointer_impl *impl, const char *name) {
|
|
|
|
memset(pointer, 0, sizeof(*pointer));
|
|
|
|
wlr_input_device_init(&pointer->base, WLR_INPUT_DEVICE_POINTER, name);
|
|
|
|
|
|
|
|
pointer->impl = impl;
|
|
|
|
wl_signal_init(&pointer->events.motion);
|
|
|
|
wl_signal_init(&pointer->events.motion_absolute);
|
|
|
|
wl_signal_init(&pointer->events.button);
|
|
|
|
wl_signal_init(&pointer->events.axis);
|
|
|
|
wl_signal_init(&pointer->events.frame);
|
|
|
|
wl_signal_init(&pointer->events.swipe_begin);
|
|
|
|
wl_signal_init(&pointer->events.swipe_update);
|
|
|
|
wl_signal_init(&pointer->events.swipe_end);
|
|
|
|
wl_signal_init(&pointer->events.pinch_begin);
|
|
|
|
wl_signal_init(&pointer->events.pinch_update);
|
|
|
|
wl_signal_init(&pointer->events.pinch_end);
|
pointer: add hold pointer event definition
As touchpad touches are generally fully abstracted, a client cannot
currently know when a user is interacting with the touchpad without
moving. This is solved by hold gestures.
Hold gestures are notifications about one or more fingers being held
down on the touchpad without significant movement.
Hold gestures are primarily designed for two interactions:
- Hold to interact: where a hold gesture is active for some time a
menu could pop up, some object could be selected, etc.
- Hold to cancel: where e.g. kinetic scrolling is currently active,
the start of a hold gesture can be used to stop the scroll.
Unlike swipe and pinch, hold gestures, by definition, do not have
movement, so there is no need for an "update" stage in the gesture.
Create two structs, wlr_event_pointer_hold_begin and
wlr_event_pointer_hold_end, to represent hold gesture events and the
signals to emit them: wlr_pointer->pointer.hold_begin/hold_end.
4 years ago
|
|
|
wl_signal_init(&pointer->events.hold_begin);
|
|
|
|
wl_signal_init(&pointer->events.hold_end);
|
|
|
|
}
|
|
|
|
|
|
|
|
void wlr_pointer_finish(struct wlr_pointer *pointer) {
|
|
|
|
wlr_input_device_finish(&pointer->base);
|
|
|
|
|
|
|
|
free(pointer->output_name);
|
|
|
|
}
|