mirror of
https://gitlab.freedesktop.org/libinput/libei.git
synced 2026-05-07 02:58:01 +02:00
Revert "Add support for swipe, pinch and hold gestures"
This reverts commit ff9e8905a0.
Part-of: <https://gitlab.freedesktop.org/libinput/libei/-/merge_requests/386>
This commit is contained in:
parent
ff9e8905a0
commit
2c85e2bd9c
34 changed files with 7 additions and 6572 deletions
|
|
@ -1640,344 +1640,6 @@
|
|||
</event>
|
||||
</interface>
|
||||
|
||||
<interface name="ei_gesture_swipe" version="1">
|
||||
<description summary="swipe gesture object">
|
||||
Interface for swipe gesture requests and events.
|
||||
|
||||
This interface is only provided once per device and where a client
|
||||
requests ei_gesture_swipe.release the interface does not get re-initialized. An
|
||||
EIS implementation may adjust the behavior of the device (including removing
|
||||
the device) if the interface is released.
|
||||
|
||||
Note that for a client to receive objects of this type, it must announce
|
||||
support for this interface in ei_handshake.interface_version.
|
||||
</description>
|
||||
|
||||
<!-- ei_gesture_swipe client requests version 1 -->
|
||||
|
||||
<request name="release" since="1">
|
||||
<description summary="Gesture removal request">
|
||||
Notification that the client is no longer interested in swipe gestures.
|
||||
The EIS implementation will release any resources related to this gesture and
|
||||
send the ei_gesture_swipe.destroyed event once complete.
|
||||
</description>
|
||||
</request>
|
||||
|
||||
<request name="begin" since="1" context-type="sender">
|
||||
<description summary="Gesture begin notification">
|
||||
Starts a new swipe gesture with the given number of fingers.
|
||||
|
||||
The finger count must never be zero. While theoretically it is
|
||||
possible to have single-finger swipe gestures, clients are advised
|
||||
to avoid these as an EIS implementation is likely to immediately cancel
|
||||
(or silently ignore) these.
|
||||
|
||||
Only one swipe gesture may be active at any time, it is a protocol
|
||||
violation to send a ei_gesture_swipe.begin request before
|
||||
terminating the previous gesture (if any) with
|
||||
ei_gesture_swipe.end.
|
||||
|
||||
A swipe gesture may be terminated by the EIS implementation
|
||||
with an ei_gesture_swipe.cancelled event.
|
||||
</description>
|
||||
<arg name="fingers" type="uint32" summary="number of fingers"/>
|
||||
</request>
|
||||
|
||||
<request name="update" since="1" context-type="sender">
|
||||
<description summary="Movement notification">
|
||||
Moves the gesture's logical center by the given delta.
|
||||
|
||||
This request may be sent at most once per device frame and only
|
||||
after a gesture has begun via ei_gesture_swipe.begin and only
|
||||
before the gesture terminates with ei_gesture_swipe.end.
|
||||
|
||||
This request must not be sent in the same frame as begin or end.
|
||||
</description>
|
||||
<arg name="dx" type="float" summary="the delta x movement in logical pixels"/>
|
||||
<arg name="dy" type="float" summary="the delta y movement in logical pixels"/>
|
||||
</request>
|
||||
|
||||
<request name="end" since="1" context-type="sender">
|
||||
<description summary="Gesture end notification">
|
||||
Logically ends this gesture.
|
||||
</description>
|
||||
<arg name="is_cancelled" type="uint32" summary="1 if the gesture was cancelled or 0 otherwise"/>
|
||||
</request>
|
||||
|
||||
<!-- ei_gesture_swipe events version 1 -->
|
||||
|
||||
<event name="destroyed" type="destructor" since="1">
|
||||
<description summary="Gesture removal notification">
|
||||
This gesture has been removed and a client should release all
|
||||
associated resources.
|
||||
|
||||
This ei_gesture_swipe object will be destroyed by the EIS
|
||||
implementation immediately after this event is sent
|
||||
and as such the client must not attempt to use
|
||||
it after that point.
|
||||
</description>
|
||||
<arg name="serial" type="uint32" summary="this event's serial number"/>
|
||||
</event>
|
||||
|
||||
<event name="cancelled" since="1" context-type="sender">
|
||||
<description summary="Gesture cancellation notification">
|
||||
The current gesture has been cancelled by the EIS implementation.
|
||||
The client must discard the current gesture and not send further
|
||||
ei_gesture_swipe.update and ei_gesture_swipe.end events. Due to the asynchronous
|
||||
nature of the protocol, an EIS implementation must allow
|
||||
for ei_gesture_swipe.update and ei_gesture_swipe.end events to be received after
|
||||
sending ei_gesture_swipe.cancelled. These events must be discarded.
|
||||
|
||||
The client may begin a new gesture in the future using ei_gesture_swipe.begin.
|
||||
</description>
|
||||
<arg name="serial" type="uint32" summary="this event's serial number"/>
|
||||
</event>
|
||||
|
||||
<event name="begin" since="1" context-type="receiver">
|
||||
<description summary="Gesture begin notification">
|
||||
See the ei_gesture_swipe.begin request for details.
|
||||
</description>
|
||||
<arg name="fingers" type="uint32" summary="number of fingers"/>
|
||||
</event>
|
||||
|
||||
<event name="update" since="1" context-type="receiver">
|
||||
<description summary="Movement notification">
|
||||
See the ei_gesture_swipe.update request for details.
|
||||
</description>
|
||||
<arg name="dx" type="float" summary="the delta x movement in logical pixels"/>
|
||||
<arg name="dy" type="float" summary="the delta y movement in logical pixels"/>
|
||||
</event>
|
||||
|
||||
<event name="end" since="1" context-type="receiver">
|
||||
<description summary="Gesture end notification">
|
||||
See the ei_gesture_swipe.end request for details.
|
||||
</description>
|
||||
<arg name="is_cancelled" type="uint32" summary="1 if the gesture was cancelled or 0 otherwise"/>
|
||||
</event>
|
||||
</interface>
|
||||
|
||||
<interface name="ei_gesture_pinch" version="1">
|
||||
<description summary="pinch gesture object">
|
||||
Interface for pinch gesture requests and events.
|
||||
|
||||
This interface is only provided once per device and where a client
|
||||
requests ei_gesture_pinch.release the interface does not get re-initialized. An
|
||||
EIS implementation may adjust the behavior of the device (including removing
|
||||
the device) if the interface is released.
|
||||
|
||||
Note that for a client to receive objects of this type, it must announce
|
||||
support for this interface in ei_handshake.interface_version.
|
||||
</description>
|
||||
|
||||
<!-- ei_gesture_pinch client requests version 1 -->
|
||||
|
||||
<request name="release" since="1">
|
||||
<description summary="Gesture removal request">
|
||||
Notification that the client is no longer interested in pinch gestures.
|
||||
The EIS implementation will release any resources related to this gesture and
|
||||
send the ei_gesture_pinch.destroyed event once complete.
|
||||
</description>
|
||||
</request>
|
||||
|
||||
<request name="begin" since="1" context-type="sender">
|
||||
<description summary="Gesture begin notification">
|
||||
Starts a new pinch gesture with the given number of fingers.
|
||||
|
||||
The finger count for pinch gestures must be at least 2.
|
||||
|
||||
Only one pinch gesture may be active at any time, it is a protocol
|
||||
violation to send a ei_gesture_pinch.begin request before
|
||||
terminating the previous gesture (if any) with
|
||||
ei_gesture_pinch.end.
|
||||
|
||||
A pinch gesture may be terminated by the EIS implementation
|
||||
with an ei_gesture_pinch.cancelled event.
|
||||
</description>
|
||||
<arg name="fingers" type="uint32" summary="number of fingers"/>
|
||||
</request>
|
||||
|
||||
<request name="update" since="1" context-type="sender">
|
||||
<description summary="Movement notification">
|
||||
Moves the gesture's logical center by the given delta and/or
|
||||
updates the logical scale of the gesture and/or logically
|
||||
rotates the gesture.
|
||||
|
||||
The gesture's scale is an absolute normalized
|
||||
scale. Each pinch gesture starts at the scale of 1.0,
|
||||
subsequent events increase or decrease that scale as the
|
||||
pinch is widened or reduced. For example a scale of 2.0
|
||||
indicates the fingers are now twice as far apart relative
|
||||
to the corresponding ei_gesture_pinch.begin.
|
||||
|
||||
The rotation is the relative angle, in degrees, compared
|
||||
to the previous ei_gesture_pinch.begin or
|
||||
ei_gesture_pinch.update. A positive angle indicates CW rotation,
|
||||
a negative angle CCW rotation.
|
||||
|
||||
This request may be sent at most once per device frame and only
|
||||
after a gesture has begun via ei_gesture_pinch.begin and only
|
||||
before the gesture terminates with ei_gesture_pinch.end.
|
||||
|
||||
This request must not be sent in the same frame as begin or end.
|
||||
</description>
|
||||
<arg name="dx" type="float" summary="the delta x movement in logical pixels"/>
|
||||
<arg name="dy" type="float" summary="the delta y movement in logical pixels"/>
|
||||
<arg name="scale" type="float" summary="the scale relative to the initial finger position"/>
|
||||
<arg name="degrees" type="float" summary="the rotation angle in degrees clockwise"/>
|
||||
</request>
|
||||
|
||||
<request name="end" since="1" context-type="sender">
|
||||
<description summary="Gesture end notification">
|
||||
Logically ends this gesture.
|
||||
</description>
|
||||
<arg name="is_cancelled" type="uint32" summary="1 if the gesture was cancelled or 0 otherwise"/>
|
||||
</request>
|
||||
|
||||
<!-- ei_gesture_pinch events version 1 -->
|
||||
|
||||
<event name="destroyed" type="destructor" since="1">
|
||||
<description summary="Gesture removal notification">
|
||||
This gesture has been removed and a client should release all
|
||||
associated resources.
|
||||
|
||||
This ei_gesture_pinch object will be destroyed by the EIS
|
||||
implementation immediately after this event is sent
|
||||
and as such the client must not attempt to use
|
||||
it after that point.
|
||||
</description>
|
||||
<arg name="serial" type="uint32" summary="this event's serial number"/>
|
||||
</event>
|
||||
|
||||
<event name="cancelled" since="1" context-type="sender">
|
||||
<description summary="Gesture cancellation notification">
|
||||
The current gesture has been cancelled by the EIS implementation.
|
||||
The client must discard the current gesture and not send further
|
||||
ei_gesture_pinch.update and ei_gesture_pinch.end events. Due to the asynchronous
|
||||
nature of the protocol, an EIS implementation must allow
|
||||
for ei_gesture_pinch.update and ei_gesture_pinch.end events to be received after
|
||||
sending ei_gesture_pinch.cancelled. These events must be discarded.
|
||||
|
||||
The client may begin a new gesture in the future using ei_gesture_pinch.begin.
|
||||
</description>
|
||||
<arg name="serial" type="uint32" summary="this event's serial number"/>
|
||||
</event>
|
||||
|
||||
<event name="begin" since="1" context-type="receiver">
|
||||
<description summary="Gesture begin notification">
|
||||
See the ei_gesture_pinch.begin request for details.
|
||||
</description>
|
||||
<arg name="fingers" type="uint32" summary="number of fingers"/>
|
||||
</event>
|
||||
|
||||
<event name="update" since="1" context-type="receiver">
|
||||
<description summary="Movement notification">
|
||||
See the ei_gesture_pinch.update request for details.
|
||||
</description>
|
||||
<arg name="dx" type="float" summary="the delta x movement in logical pixels"/>
|
||||
<arg name="dy" type="float" summary="the delta y movement in logical pixels"/>
|
||||
<arg name="scale" type="float" summary="the scale relative to the initial finger position"/>
|
||||
<arg name="degrees" type="float" summary="the rotation angle in degrees clockwise"/>
|
||||
</event>
|
||||
|
||||
<event name="end" since="1" context-type="receiver">
|
||||
<description summary="Gesture end notification">
|
||||
See the ei_gesture_pinch.end request for details.
|
||||
</description>
|
||||
<arg name="is_cancelled" type="uint32" summary="1 if the gesture was cancelled or 0 otherwise"/>
|
||||
</event>
|
||||
</interface>
|
||||
|
||||
<interface name="ei_gesture_hold" version="1">
|
||||
<description summary="hold gesture object">
|
||||
Interface for hold gesture requests and events.
|
||||
|
||||
This interface is only provided once per device and where a client
|
||||
requests ei_gesture_hold.release the interface does not get re-initialized. An
|
||||
EIS implementation may adjust the behavior of the device (including removing
|
||||
the device) if the interface is released.
|
||||
|
||||
Note that for a client to receive objects of this type, it must announce
|
||||
support for this interface in ei_handshake.interface_version.
|
||||
</description>
|
||||
|
||||
<!-- ei_gesture_hold client requests version 1 -->
|
||||
|
||||
<request name="release" since="1">
|
||||
<description summary="Gesture removal request">
|
||||
Notification that the client is no longer interested in hold gestures.
|
||||
The EIS implementation will release any resources related to this gesture and
|
||||
send the ei_gesture_hold.destroyed event once complete.
|
||||
</description>
|
||||
</request>
|
||||
|
||||
<request name="begin" since="1" context-type="sender">
|
||||
<description summary="Gesture begin notification">
|
||||
Starts a new hold gesture with the given number of fingers.
|
||||
|
||||
The finger count must never be zero.
|
||||
|
||||
Only one hold gesture may be active at any time, it is a protocol
|
||||
violation to send a ei_gesture_hold.begin request before
|
||||
terminating the previous gesture (if any) with
|
||||
ei_gesture_hold.end.
|
||||
|
||||
A hold gesture may be terminated by the EIS implementation
|
||||
with an ei_gesture_hold.cancelled event.
|
||||
</description>
|
||||
<arg name="fingers" type="uint32" summary="number of fingers"/>
|
||||
</request>
|
||||
|
||||
<request name="end" since="1" context-type="sender">
|
||||
<description summary="Gesture end notification">
|
||||
Logically ends this gesture.
|
||||
</description>
|
||||
<arg name="is_cancelled" type="uint32" summary="1 if the gesture was cancelled or 0 otherwise"/>
|
||||
</request>
|
||||
|
||||
<!-- ei_gesture_hold events version 1 -->
|
||||
|
||||
<event name="destroyed" type="destructor" since="1">
|
||||
<description summary="Gesture removal notification">
|
||||
This gesture has been removed and a client should release all
|
||||
associated resources.
|
||||
|
||||
This ei_gesture_hold object will be destroyed by the EIS
|
||||
implementation immediately after this event is sent
|
||||
and as such the client must not attempt to use
|
||||
it after that point.
|
||||
</description>
|
||||
<arg name="serial" type="uint32" summary="this event's serial number"/>
|
||||
</event>
|
||||
|
||||
<event name="cancelled" since="1" context-type="sender">
|
||||
<description summary="Gesture cancellation notification">
|
||||
The current gesture has been cancelled by the EIS implementation.
|
||||
The client must discard the current gesture and not send further
|
||||
ei_gesture_hold.end events. Due to the asynchronous
|
||||
nature of the protocol, an EIS implementation must allow for
|
||||
ei_gesture_hold.end events to be received after
|
||||
sending ei_gesture_hold.cancelled. These events must be discarded.
|
||||
|
||||
The client may begin a new gesture in the future using ei_gesture_hold.begin.
|
||||
</description>
|
||||
<arg name="serial" type="uint32" summary="this event's serial number"/>
|
||||
</event>
|
||||
|
||||
<event name="begin" since="1" context-type="receiver">
|
||||
<description summary="Gesture begin notification">
|
||||
See the ei_gesture_hold.begin request for details.
|
||||
</description>
|
||||
<arg name="fingers" type="uint32" summary="number of fingers"/>
|
||||
</event>
|
||||
|
||||
<event name="end" since="1" context-type="receiver">
|
||||
<description summary="Gesture end notification">
|
||||
See the ei_gesture_hold.end request for details.
|
||||
</description>
|
||||
<arg name="is_cancelled" type="uint32" summary="1 if the gesture was cancelled or 0 otherwise"/>
|
||||
</event>
|
||||
</interface>
|
||||
|
||||
<interface name="ei_text" version="1">
|
||||
<description summary="text object">
|
||||
Interface for text-based requests and events.
|
||||
|
|
@ -2093,7 +1755,6 @@
|
|||
within the same frame is undefined.
|
||||
</description>
|
||||
<arg name="text" type="string" allow-null="false" summary="the utf-8 compatible text"/>
|
||||
|
||||
</event>
|
||||
</interface>
|
||||
</protocol>
|
||||
|
|
|
|||
|
|
@ -91,9 +91,6 @@ ei_device_destroy(struct ei_device *device)
|
|||
ei_button_unref(device->button);
|
||||
ei_touchscreen_unref(device->touchscreen);
|
||||
ei_keyboard_unref(device->keyboard);
|
||||
ei_gesture_swipe_unref(device->swipe);
|
||||
ei_gesture_pinch_unref(device->pinch);
|
||||
ei_gesture_hold_unref(device->hold);
|
||||
ei_text_unref(device->text);
|
||||
ei_seat_unref(seat);
|
||||
free(device->name);
|
||||
|
|
@ -259,8 +256,6 @@ handle_msg_done(struct ei_device *device)
|
|||
mask_add(device->capabilities, EI_DEVICE_CAP_KEYBOARD);
|
||||
if (device->touchscreen)
|
||||
mask_add(device->capabilities, EI_DEVICE_CAP_TOUCH);
|
||||
if (device->swipe || device->pinch || device->hold)
|
||||
mask_add(device->capabilities, EI_DEVICE_CAP_GESTURES);
|
||||
if (device->text)
|
||||
mask_add(device->capabilities, EI_DEVICE_CAP_TEXT);
|
||||
|
||||
|
|
@ -270,7 +265,6 @@ handle_msg_done(struct ei_device *device)
|
|||
!ei_device_has_capability(device, EI_DEVICE_CAP_TOUCH) &&
|
||||
!ei_device_has_capability(device, EI_DEVICE_CAP_BUTTON) &&
|
||||
!ei_device_has_capability(device, EI_DEVICE_CAP_SCROLL) &&
|
||||
!ei_device_has_capability(device, EI_DEVICE_CAP_GESTURES) &&
|
||||
!ei_device_has_capability(device, EI_DEVICE_CAP_TEXT)) {
|
||||
log_debug(ei,
|
||||
"Rejecting device %#" PRIx64 " '%s' with no known capabilities",
|
||||
|
|
@ -285,7 +279,7 @@ handle_msg_done(struct ei_device *device)
|
|||
ei_queue_device_added_event(device);
|
||||
ei_device_done(device);
|
||||
log_debug(ei,
|
||||
"Added device %#" PRIx64 " '%s' caps: %s%s%s%s%s%s%s%s seat: %s",
|
||||
"Added device %#" PRIx64 " '%s' caps: %s%s%s%s%s%s%s seat: %s",
|
||||
ei_device_get_id(device),
|
||||
ei_device_get_name(device),
|
||||
ei_device_has_capability(device, EI_DEVICE_CAP_POINTER) ? "p" : "",
|
||||
|
|
@ -294,7 +288,6 @@ handle_msg_done(struct ei_device *device)
|
|||
ei_device_has_capability(device, EI_DEVICE_CAP_TOUCH) ? "t" : "",
|
||||
ei_device_has_capability(device, EI_DEVICE_CAP_BUTTON) ? "b" : "",
|
||||
ei_device_has_capability(device, EI_DEVICE_CAP_SCROLL) ? "s" : "",
|
||||
ei_device_has_capability(device, EI_DEVICE_CAP_GESTURES) ? "g" : "",
|
||||
ei_device_has_capability(device, EI_DEVICE_CAP_TEXT) ? "x" : "",
|
||||
ei_seat_get_name(ei_device_get_seat(device)));
|
||||
return NULL;
|
||||
|
|
@ -336,14 +329,6 @@ handle_msg_paused(struct ei_device *device, uint32_t serial)
|
|||
} \
|
||||
} while(0)
|
||||
|
||||
#define DISCONNECT_IF_RECEIVER_CONTEXT(device_) do {\
|
||||
struct ei *ei_ = ei_device_get_context(device_); \
|
||||
if (!ei_is_sender(ei_)) { \
|
||||
return brei_result_new(EI_CONNECTION_DISCONNECT_REASON_MODE, \
|
||||
"Invalid event from sender EIS context. Disconnecting"); \
|
||||
} \
|
||||
} while(0)
|
||||
|
||||
static struct brei_result *
|
||||
handle_msg_start_emulating(struct ei_device *device, uint32_t serial, uint32_t sequence)
|
||||
{
|
||||
|
|
@ -494,24 +479,6 @@ handle_msg_interface(struct ei_device *device, object_id_t id, const char *name,
|
|||
"Duplicate ei_touchscreen interface object on device");
|
||||
|
||||
device->touchscreen = ei_touchscreen_new(device, id, version);
|
||||
} else if (streq(name, EI_GESTURE_SWIPE_INTERFACE_NAME)) {
|
||||
DISCONNECT_IF_INVALID_VERSION(ei, ei_gesture_swipe, id, version);
|
||||
if (device->swipe)
|
||||
return brei_result_new(EI_CONNECTION_DISCONNECT_REASON_PROTOCOL,
|
||||
"Duplicate ei_gesture_swipe object on device");
|
||||
device->swipe = ei_gesture_swipe_new(device, id, version);
|
||||
} else if (streq(name, EI_GESTURE_PINCH_INTERFACE_NAME)) {
|
||||
DISCONNECT_IF_INVALID_VERSION(ei, ei_gesture_pinch, id, version);
|
||||
if (device->pinch)
|
||||
return brei_result_new(EI_CONNECTION_DISCONNECT_REASON_PROTOCOL,
|
||||
"Duplicate ei_gesture_pinch object on device");
|
||||
device->pinch = ei_gesture_pinch_new(device, id, version);
|
||||
} else if (streq(name, EI_GESTURE_HOLD_INTERFACE_NAME)) {
|
||||
DISCONNECT_IF_INVALID_VERSION(ei, ei_gesture_hold, id, version);
|
||||
if (device->hold)
|
||||
return brei_result_new(EI_CONNECTION_DISCONNECT_REASON_PROTOCOL,
|
||||
"Duplicate ei_gesture_hold object on device");
|
||||
device->hold = ei_gesture_hold_new(device, id, version);
|
||||
} else if (streq(name, EI_TEXT_INTERFACE_NAME)) {
|
||||
DISCONNECT_IF_INVALID_VERSION(ei, ei_text, id, version);
|
||||
if (device->text)
|
||||
|
|
@ -968,386 +935,6 @@ ei_device_get_touchscreen_interface(struct ei_device *device)
|
|||
return &touchscreen_interface;
|
||||
}
|
||||
|
||||
static struct brei_result *
|
||||
handle_msg_gesture_swipe_destroy(struct ei_gesture_swipe *swipe, uint32_t serial)
|
||||
{
|
||||
struct ei *ei = ei_gesture_swipe_get_context(swipe);
|
||||
ei_update_serial(ei, serial);
|
||||
|
||||
struct ei_device *device = ei_gesture_swipe_get_device(swipe);
|
||||
ei_gesture_swipe_unref(steal(&device->swipe));
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static struct brei_result *
|
||||
handle_msg_gesture_swipe_begin(struct ei_gesture_swipe *swipe, uint32_t nfingers)
|
||||
{
|
||||
struct ei_device *device = ei_gesture_swipe_get_device(swipe);
|
||||
|
||||
DISCONNECT_IF_SENDER_CONTEXT(device);
|
||||
|
||||
if (!ei_device_has_capability(device, EI_DEVICE_CAP_GESTURES)) {
|
||||
return brei_result_new(EI_CONNECTION_DISCONNECT_REASON_PROTOCOL,
|
||||
"Swipe begin event for non-gesture device");
|
||||
}
|
||||
|
||||
if (nfingers == 0) {
|
||||
return brei_result_new(EI_CONNECTION_DISCONNECT_REASON_PROTOCOL,
|
||||
"Swipe begin event with zero fingers");
|
||||
}
|
||||
|
||||
if (device->state == EI_DEVICE_STATE_EMULATING) {
|
||||
if (device->gesture_state.swipe.is_active) {
|
||||
return brei_result_new(EI_CONNECTION_DISCONNECT_REASON_PROTOCOL,
|
||||
"Swipe begin event while swipe is active");
|
||||
}
|
||||
device->gesture_state.swipe.is_active = true;
|
||||
device->gesture_state.swipe.nfingers = nfingers;
|
||||
ei_queue_swipe_begin_event(device, nfingers);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return maybe_error_on_device_state(device, "swipe begin");
|
||||
}
|
||||
|
||||
static struct brei_result *
|
||||
handle_msg_gesture_swipe_update(struct ei_gesture_swipe *swipe, float dx, float dy)
|
||||
{
|
||||
struct ei_device *device = ei_gesture_swipe_get_device(swipe);
|
||||
|
||||
DISCONNECT_IF_SENDER_CONTEXT(device);
|
||||
|
||||
if (!ei_device_has_capability(device, EI_DEVICE_CAP_GESTURES)) {
|
||||
return brei_result_new(EI_CONNECTION_DISCONNECT_REASON_PROTOCOL,
|
||||
"Swipe update event for non-gesture device");
|
||||
}
|
||||
|
||||
if (!device->gesture_state.swipe.is_active) {
|
||||
return brei_result_new(EI_CONNECTION_DISCONNECT_REASON_PROTOCOL,
|
||||
"Swipe update event while no swipe is active");
|
||||
}
|
||||
|
||||
if (device->state == EI_DEVICE_STATE_EMULATING) {
|
||||
ei_queue_swipe_update_event(device, dx, dy);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return maybe_error_on_device_state(device, "swipe update");
|
||||
}
|
||||
|
||||
static struct brei_result *
|
||||
handle_msg_gesture_swipe_end(struct ei_gesture_swipe *swipe, uint32_t is_cancelled)
|
||||
{
|
||||
struct ei_device *device = ei_gesture_swipe_get_device(swipe);
|
||||
|
||||
DISCONNECT_IF_SENDER_CONTEXT(device);
|
||||
|
||||
if (!ei_device_has_capability(device, EI_DEVICE_CAP_GESTURES)) {
|
||||
return brei_result_new(EI_CONNECTION_DISCONNECT_REASON_PROTOCOL,
|
||||
"Swipe end event for non-gesture device");
|
||||
}
|
||||
|
||||
if (!device->gesture_state.swipe.is_active) {
|
||||
return brei_result_new(EI_CONNECTION_DISCONNECT_REASON_PROTOCOL,
|
||||
"Swipe end event while no swipe is active");
|
||||
}
|
||||
|
||||
if (device->state == EI_DEVICE_STATE_EMULATING) {
|
||||
ei_queue_swipe_end_event(device, !!is_cancelled);
|
||||
device->gesture_state.swipe.is_active = false;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return maybe_error_on_device_state(device, "swipe end");
|
||||
}
|
||||
|
||||
static struct brei_result *
|
||||
handle_msg_gesture_swipe_cancelled(struct ei_gesture_swipe *swipe, uint32_t serial)
|
||||
{
|
||||
struct ei *ei = ei_gesture_swipe_get_context(swipe);
|
||||
struct ei_device *device = ei_gesture_swipe_get_device(swipe);
|
||||
ei_update_serial(ei, serial);
|
||||
|
||||
DISCONNECT_IF_RECEIVER_CONTEXT(device);
|
||||
|
||||
if (!ei_device_has_capability(device, EI_DEVICE_CAP_GESTURES)) {
|
||||
return brei_result_new(EI_CONNECTION_DISCONNECT_REASON_PROTOCOL,
|
||||
"Swipe cancelled event for non-gesture device");
|
||||
}
|
||||
|
||||
/* EIS may have cancelled us while we've ended the gesture,
|
||||
* swallow the cancel if that happened */
|
||||
if (device->gesture_state.swipe.current_swipe) {
|
||||
if (device->state == EI_DEVICE_STATE_EMULATING)
|
||||
ei_queue_swipe_cancelled_event(device);
|
||||
device->gesture_state.swipe.current_swipe = NULL;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return maybe_error_on_device_state(device, "swipe cancel");
|
||||
}
|
||||
|
||||
static const struct ei_gesture_swipe_interface swipe_interface = {
|
||||
.destroyed = handle_msg_gesture_swipe_destroy,
|
||||
.begin = handle_msg_gesture_swipe_begin,
|
||||
.update = handle_msg_gesture_swipe_update,
|
||||
.end = handle_msg_gesture_swipe_end,
|
||||
.cancelled = handle_msg_gesture_swipe_cancelled,
|
||||
};
|
||||
|
||||
const struct ei_gesture_swipe_interface *
|
||||
ei_device_get_gesture_swipe_interface(struct ei_device *device)
|
||||
{
|
||||
return &swipe_interface;
|
||||
}
|
||||
|
||||
static struct brei_result *
|
||||
handle_msg_gesture_pinch_destroy(struct ei_gesture_pinch *pinch, uint32_t serial)
|
||||
{
|
||||
struct ei *ei = ei_gesture_pinch_get_context(pinch);
|
||||
ei_update_serial(ei, serial);
|
||||
|
||||
struct ei_device *device = ei_gesture_pinch_get_device(pinch);
|
||||
ei_gesture_pinch_unref(steal(&device->pinch));
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static struct brei_result *
|
||||
handle_msg_gesture_pinch_begin(struct ei_gesture_pinch *pinch, uint32_t nfingers)
|
||||
{
|
||||
struct ei_device *device = ei_gesture_pinch_get_device(pinch);
|
||||
|
||||
DISCONNECT_IF_SENDER_CONTEXT(device);
|
||||
|
||||
if (!ei_device_has_capability(device, EI_DEVICE_CAP_GESTURES)) {
|
||||
return brei_result_new(EI_CONNECTION_DISCONNECT_REASON_PROTOCOL,
|
||||
"Pinch begin event for non-gesture device");
|
||||
}
|
||||
|
||||
if (nfingers < 2) {
|
||||
return brei_result_new(EI_CONNECTION_DISCONNECT_REASON_PROTOCOL,
|
||||
"Pinch begin event with fewer than 2 fingers");
|
||||
}
|
||||
|
||||
if (device->state == EI_DEVICE_STATE_EMULATING) {
|
||||
if (device->gesture_state.pinch.is_active) {
|
||||
return brei_result_new(EI_CONNECTION_DISCONNECT_REASON_PROTOCOL,
|
||||
"Pinch begin event while pinch is active");
|
||||
}
|
||||
device->gesture_state.pinch.is_active = true;
|
||||
device->gesture_state.pinch.nfingers = nfingers;
|
||||
ei_queue_pinch_begin_event(device, nfingers);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return maybe_error_on_device_state(device, "pinch begin");
|
||||
}
|
||||
|
||||
static struct brei_result *
|
||||
handle_msg_gesture_pinch_update(struct ei_gesture_pinch *pinch,
|
||||
float dx,
|
||||
float dy,
|
||||
float scale,
|
||||
float rotation)
|
||||
{
|
||||
struct ei_device *device = ei_gesture_pinch_get_device(pinch);
|
||||
|
||||
DISCONNECT_IF_SENDER_CONTEXT(device);
|
||||
|
||||
if (!ei_device_has_capability(device, EI_DEVICE_CAP_GESTURES)) {
|
||||
return brei_result_new(EI_CONNECTION_DISCONNECT_REASON_PROTOCOL,
|
||||
"Pinch update event for non-gesture device");
|
||||
}
|
||||
|
||||
if (!device->gesture_state.pinch.is_active) {
|
||||
return brei_result_new(EI_CONNECTION_DISCONNECT_REASON_PROTOCOL,
|
||||
"Pinch update event while no pinch is active");
|
||||
}
|
||||
|
||||
if (device->state == EI_DEVICE_STATE_EMULATING) {
|
||||
ei_queue_pinch_update_event(device, dx, dy, scale, rotation);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return maybe_error_on_device_state(device, "pinch update");
|
||||
}
|
||||
|
||||
static struct brei_result *
|
||||
handle_msg_gesture_pinch_end(struct ei_gesture_pinch *pinch, uint32_t is_cancelled)
|
||||
{
|
||||
struct ei_device *device = ei_gesture_pinch_get_device(pinch);
|
||||
|
||||
DISCONNECT_IF_SENDER_CONTEXT(device);
|
||||
|
||||
if (!ei_device_has_capability(device, EI_DEVICE_CAP_GESTURES)) {
|
||||
return brei_result_new(EI_CONNECTION_DISCONNECT_REASON_PROTOCOL,
|
||||
"Pinch end event for non-gesture device");
|
||||
}
|
||||
|
||||
if (!device->gesture_state.pinch.is_active) {
|
||||
return brei_result_new(EI_CONNECTION_DISCONNECT_REASON_PROTOCOL,
|
||||
"Pinch end event while no pinch is active");
|
||||
}
|
||||
|
||||
if (device->state == EI_DEVICE_STATE_EMULATING) {
|
||||
ei_queue_pinch_end_event(device, !!is_cancelled);
|
||||
device->gesture_state.pinch.is_active = false;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return maybe_error_on_device_state(device, "pinch end");
|
||||
}
|
||||
|
||||
static struct brei_result *
|
||||
handle_msg_gesture_pinch_cancelled(struct ei_gesture_pinch *pinch, uint32_t serial)
|
||||
{
|
||||
struct ei *ei = ei_gesture_pinch_get_context(pinch);
|
||||
struct ei_device *device = ei_gesture_pinch_get_device(pinch);
|
||||
ei_update_serial(ei, serial);
|
||||
|
||||
DISCONNECT_IF_RECEIVER_CONTEXT(device);
|
||||
|
||||
if (!ei_device_has_capability(device, EI_DEVICE_CAP_GESTURES)) {
|
||||
return brei_result_new(EI_CONNECTION_DISCONNECT_REASON_PROTOCOL,
|
||||
"Pinch cancelled event for non-gesture device");
|
||||
}
|
||||
|
||||
/* EIS may have cancelled us while we've ended the gesture,
|
||||
* swallow the cancel if that happened */
|
||||
if (device->gesture_state.pinch.current_pinch) {
|
||||
if (device->state == EI_DEVICE_STATE_EMULATING)
|
||||
ei_queue_pinch_cancelled_event(device);
|
||||
device->gesture_state.pinch.current_pinch = NULL;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return maybe_error_on_device_state(device, "pinch cancel");
|
||||
}
|
||||
|
||||
static const struct ei_gesture_pinch_interface pinch_interface = {
|
||||
.destroyed = handle_msg_gesture_pinch_destroy,
|
||||
.begin = handle_msg_gesture_pinch_begin,
|
||||
.update = handle_msg_gesture_pinch_update,
|
||||
.end = handle_msg_gesture_pinch_end,
|
||||
.cancelled = handle_msg_gesture_pinch_cancelled,
|
||||
};
|
||||
|
||||
const struct ei_gesture_pinch_interface *
|
||||
ei_device_get_gesture_pinch_interface(struct ei_device *device)
|
||||
{
|
||||
return &pinch_interface;
|
||||
}
|
||||
|
||||
static struct brei_result *
|
||||
handle_msg_gesture_hold_destroy(struct ei_gesture_hold *hold, uint32_t serial)
|
||||
{
|
||||
struct ei *ei = ei_gesture_hold_get_context(hold);
|
||||
ei_update_serial(ei, serial);
|
||||
|
||||
struct ei_device *device = ei_gesture_hold_get_device(hold);
|
||||
ei_gesture_hold_unref(steal(&device->hold));
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static struct brei_result *
|
||||
handle_msg_gesture_hold_begin(struct ei_gesture_hold *hold, uint32_t nfingers)
|
||||
{
|
||||
struct ei_device *device = ei_gesture_hold_get_device(hold);
|
||||
|
||||
DISCONNECT_IF_SENDER_CONTEXT(device);
|
||||
|
||||
if (!ei_device_has_capability(device, EI_DEVICE_CAP_GESTURES)) {
|
||||
return brei_result_new(EI_CONNECTION_DISCONNECT_REASON_PROTOCOL,
|
||||
"Hold begin event for non-gesture device");
|
||||
}
|
||||
|
||||
if (nfingers == 0) {
|
||||
return brei_result_new(EI_CONNECTION_DISCONNECT_REASON_PROTOCOL,
|
||||
"Hold begin event with zero fingers");
|
||||
}
|
||||
|
||||
if (device->state == EI_DEVICE_STATE_EMULATING) {
|
||||
if (device->gesture_state.hold.is_active) {
|
||||
return brei_result_new(EI_CONNECTION_DISCONNECT_REASON_PROTOCOL,
|
||||
"Hold begin event while hold is active");
|
||||
}
|
||||
device->gesture_state.hold.is_active = true;
|
||||
device->gesture_state.hold.nfingers = nfingers;
|
||||
ei_queue_hold_begin_event(device, nfingers);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return maybe_error_on_device_state(device, "hold begin");
|
||||
}
|
||||
|
||||
static struct brei_result *
|
||||
handle_msg_gesture_hold_end(struct ei_gesture_hold *hold, uint32_t is_cancelled)
|
||||
{
|
||||
struct ei_device *device = ei_gesture_hold_get_device(hold);
|
||||
|
||||
DISCONNECT_IF_SENDER_CONTEXT(device);
|
||||
|
||||
if (!ei_device_has_capability(device, EI_DEVICE_CAP_GESTURES)) {
|
||||
return brei_result_new(EI_CONNECTION_DISCONNECT_REASON_PROTOCOL,
|
||||
"Hold end event for non-gesture device");
|
||||
}
|
||||
|
||||
if (!device->gesture_state.hold.is_active) {
|
||||
return brei_result_new(EI_CONNECTION_DISCONNECT_REASON_PROTOCOL,
|
||||
"Hold end event while no hold is active");
|
||||
}
|
||||
|
||||
if (device->state == EI_DEVICE_STATE_EMULATING) {
|
||||
ei_queue_hold_end_event(device, !!is_cancelled);
|
||||
device->gesture_state.hold.is_active = false;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return maybe_error_on_device_state(device, "hold end");
|
||||
}
|
||||
|
||||
static struct brei_result *
|
||||
handle_msg_gesture_hold_cancelled(struct ei_gesture_hold *hold, uint32_t serial)
|
||||
{
|
||||
struct ei *ei = ei_gesture_hold_get_context(hold);
|
||||
struct ei_device *device = ei_gesture_hold_get_device(hold);
|
||||
ei_update_serial(ei, serial);
|
||||
|
||||
DISCONNECT_IF_RECEIVER_CONTEXT(device);
|
||||
|
||||
if (!ei_device_has_capability(device, EI_DEVICE_CAP_GESTURES)) {
|
||||
return brei_result_new(EI_CONNECTION_DISCONNECT_REASON_PROTOCOL,
|
||||
"Hold cancelled event for non-gesture device");
|
||||
}
|
||||
|
||||
/* EIS may have cancelled us while we've ended the gesture,
|
||||
* swallow the cancel if that happened */
|
||||
if (device->gesture_state.hold.current_hold) {
|
||||
if (device->state == EI_DEVICE_STATE_EMULATING)
|
||||
ei_queue_hold_cancelled_event(device);
|
||||
device->gesture_state.hold.current_hold = NULL;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return maybe_error_on_device_state(device, "hold cancel");
|
||||
}
|
||||
|
||||
static const struct ei_gesture_hold_interface hold_interface = {
|
||||
.destroyed = handle_msg_gesture_hold_destroy,
|
||||
.begin = handle_msg_gesture_hold_begin,
|
||||
.end = handle_msg_gesture_hold_end,
|
||||
.cancelled = handle_msg_gesture_hold_cancelled,
|
||||
};
|
||||
|
||||
const struct ei_gesture_hold_interface *
|
||||
ei_device_get_gesture_hold_interface(struct ei_device *device)
|
||||
{
|
||||
return &hold_interface;
|
||||
}
|
||||
|
||||
static struct brei_result *
|
||||
handle_msg_text_destroy(struct ei_text *text, uint32_t serial)
|
||||
{
|
||||
|
|
@ -1560,12 +1147,6 @@ ei_device_send_release(struct ei_device *device)
|
|||
ei_scroll_request_release(device->scroll);
|
||||
if (device->button)
|
||||
ei_button_request_release(device->button);
|
||||
if (device->swipe)
|
||||
ei_gesture_swipe_request_release(device->swipe);
|
||||
if (device->pinch)
|
||||
ei_gesture_pinch_request_release(device->pinch);
|
||||
if (device->hold)
|
||||
ei_gesture_hold_request_release(device->hold);
|
||||
|
||||
int rc = ei_device_request_release(device);
|
||||
if (rc)
|
||||
|
|
@ -1626,9 +1207,6 @@ ei_device_removed_by_server(struct ei_device *device)
|
|||
ei_touchscreen_unref(steal(&device->touchscreen));
|
||||
ei_scroll_unref(steal(&device->scroll));
|
||||
ei_button_unref(steal(&device->button));
|
||||
ei_gesture_swipe_unref(steal(&device->swipe));
|
||||
ei_gesture_pinch_unref(steal(&device->pinch));
|
||||
ei_gesture_hold_unref(steal(&device->hold));
|
||||
|
||||
ei_unregister_object(ei, &device->proto_object);
|
||||
ei_queue_device_removed_event(device);
|
||||
|
|
@ -1704,7 +1282,6 @@ ei_device_has_capability(struct ei_device *device, enum ei_device_capability cap
|
|||
case EI_DEVICE_CAP_TOUCH:
|
||||
case EI_DEVICE_CAP_BUTTON:
|
||||
case EI_DEVICE_CAP_SCROLL:
|
||||
case EI_DEVICE_CAP_GESTURES:
|
||||
case EI_DEVICE_CAP_TEXT:
|
||||
return mask_all(device->capabilities, cap);
|
||||
}
|
||||
|
|
@ -2468,21 +2045,3 @@ ei_device_frame(struct ei_device *device, uint64_t time)
|
|||
ei_disconnect(ei_device_get_context(device));
|
||||
return;
|
||||
}
|
||||
|
||||
_public_ struct ei_swipe *
|
||||
ei_device_swipe_new(struct ei_device *device, uint32_t nfingers)
|
||||
{
|
||||
return ei_swipe_new(device, nfingers);
|
||||
}
|
||||
|
||||
_public_ struct ei_pinch *
|
||||
ei_device_pinch_new(struct ei_device *device, uint32_t nfingers)
|
||||
{
|
||||
return ei_pinch_new(device, nfingers);
|
||||
}
|
||||
|
||||
_public_ struct ei_hold *
|
||||
ei_device_hold_new(struct ei_device *device, uint32_t nfingers)
|
||||
{
|
||||
return ei_hold_new(device, nfingers);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -66,9 +66,6 @@ struct ei_device {
|
|||
struct ei_button *button;
|
||||
struct ei_keyboard *keyboard;
|
||||
struct ei_touchscreen *touchscreen;
|
||||
struct ei_gesture_swipe *swipe;
|
||||
struct ei_gesture_pinch *pinch;
|
||||
struct ei_gesture_hold *hold;
|
||||
struct ei_text *text;
|
||||
|
||||
struct list link;
|
||||
|
|
@ -90,33 +87,6 @@ struct ei_device {
|
|||
bool x_is_cancelled, y_is_cancelled;
|
||||
} scroll_state;
|
||||
|
||||
struct {
|
||||
struct {
|
||||
/* receiver */
|
||||
bool is_active;
|
||||
uint32_t nfingers;
|
||||
|
||||
/* sender */
|
||||
struct ei_swipe *current_swipe; /* no ref! */
|
||||
} swipe;
|
||||
struct {
|
||||
/* receiver */
|
||||
bool is_active;
|
||||
uint32_t nfingers;
|
||||
|
||||
/* sender */
|
||||
struct ei_pinch *current_pinch; /* no ref! */
|
||||
} pinch;
|
||||
struct {
|
||||
/* receiver */
|
||||
bool is_active;
|
||||
uint32_t nfingers;
|
||||
|
||||
/* sender */
|
||||
struct ei_hold *current_hold; /* no ref! */
|
||||
} hold;
|
||||
} gesture_state;
|
||||
|
||||
struct ei_keymap *keymap;
|
||||
|
||||
char *pending_region_mapping_id;
|
||||
|
|
@ -157,13 +127,6 @@ OBJECT_DECLARE_GETTER(ei_device, scroll_interface, const struct ei_scroll_interf
|
|||
OBJECT_DECLARE_GETTER(ei_device, button_interface, const struct ei_button_interface *);
|
||||
OBJECT_DECLARE_GETTER(ei_device, keyboard_interface, const struct ei_keyboard_interface *);
|
||||
OBJECT_DECLARE_GETTER(ei_device, touchscreen_interface, const struct ei_touchscreen_interface *);
|
||||
OBJECT_DECLARE_GETTER(ei_device,
|
||||
gesture_swipe_interface,
|
||||
const struct ei_gesture_swipe_interface *);
|
||||
OBJECT_DECLARE_GETTER(ei_device,
|
||||
gesture_pinch_interface,
|
||||
const struct ei_gesture_pinch_interface *);
|
||||
OBJECT_DECLARE_GETTER(ei_device, gesture_hold_interface, const struct ei_gesture_hold_interface *);
|
||||
OBJECT_DECLARE_GETTER(ei_device, text_interface, const struct ei_text_interface *);
|
||||
OBJECT_DECLARE_SETTER(ei_device, type, enum ei_device_type);
|
||||
OBJECT_DECLARE_SETTER(ei_device, name, const char *);
|
||||
|
|
|
|||
|
|
@ -63,17 +63,6 @@ ei_event_type_to_string(enum ei_event_type type)
|
|||
CASE_RETURN_STRING(EI_EVENT_TOUCH_DOWN);
|
||||
CASE_RETURN_STRING(EI_EVENT_TOUCH_UP);
|
||||
CASE_RETURN_STRING(EI_EVENT_TOUCH_MOTION);
|
||||
CASE_RETURN_STRING(EI_EVENT_SWIPE_BEGIN);
|
||||
CASE_RETURN_STRING(EI_EVENT_SWIPE_UPDATE);
|
||||
CASE_RETURN_STRING(EI_EVENT_SWIPE_END);
|
||||
CASE_RETURN_STRING(EI_EVENT_SWIPE_CANCELLED);
|
||||
CASE_RETURN_STRING(EI_EVENT_PINCH_BEGIN);
|
||||
CASE_RETURN_STRING(EI_EVENT_PINCH_UPDATE);
|
||||
CASE_RETURN_STRING(EI_EVENT_PINCH_END);
|
||||
CASE_RETURN_STRING(EI_EVENT_PINCH_CANCELLED);
|
||||
CASE_RETURN_STRING(EI_EVENT_HOLD_BEGIN);
|
||||
CASE_RETURN_STRING(EI_EVENT_HOLD_END);
|
||||
CASE_RETURN_STRING(EI_EVENT_HOLD_CANCELLED);
|
||||
CASE_RETURN_STRING(EI_EVENT_TEXT_KEYSYM);
|
||||
CASE_RETURN_STRING(EI_EVENT_TEXT_UTF8);
|
||||
}
|
||||
|
|
@ -109,17 +98,6 @@ ei_event_destroy(struct ei_event *event)
|
|||
case EI_EVENT_TOUCH_DOWN:
|
||||
case EI_EVENT_TOUCH_UP:
|
||||
case EI_EVENT_TOUCH_MOTION:
|
||||
case EI_EVENT_SWIPE_BEGIN:
|
||||
case EI_EVENT_SWIPE_UPDATE:
|
||||
case EI_EVENT_SWIPE_END:
|
||||
case EI_EVENT_SWIPE_CANCELLED:
|
||||
case EI_EVENT_PINCH_BEGIN:
|
||||
case EI_EVENT_PINCH_UPDATE:
|
||||
case EI_EVENT_PINCH_END:
|
||||
case EI_EVENT_PINCH_CANCELLED:
|
||||
case EI_EVENT_HOLD_BEGIN:
|
||||
case EI_EVENT_HOLD_END:
|
||||
case EI_EVENT_HOLD_CANCELLED:
|
||||
case EI_EVENT_TEXT_KEYSYM:
|
||||
break;
|
||||
case EI_EVENT_TEXT_UTF8:
|
||||
|
|
@ -385,110 +363,6 @@ ei_event_touch_get_is_cancel(struct ei_event *event)
|
|||
return event->touch.is_cancel;
|
||||
}
|
||||
|
||||
_public_ uint32_t
|
||||
ei_event_swipe_get_finger_count(struct ei_event *event)
|
||||
{
|
||||
require_event_type(event,
|
||||
0,
|
||||
EI_EVENT_SWIPE_BEGIN,
|
||||
EI_EVENT_SWIPE_UPDATE,
|
||||
EI_EVENT_SWIPE_END);
|
||||
|
||||
return event->gestures.nfingers;
|
||||
}
|
||||
|
||||
_public_ double
|
||||
ei_event_swipe_get_dx(struct ei_event *event)
|
||||
{
|
||||
require_event_type(event, 0.0, EI_EVENT_SWIPE_UPDATE);
|
||||
|
||||
return event->gestures.dx;
|
||||
}
|
||||
|
||||
_public_ double
|
||||
ei_event_swipe_get_dy(struct ei_event *event)
|
||||
{
|
||||
require_event_type(event, 0.0, EI_EVENT_SWIPE_UPDATE);
|
||||
|
||||
return event->gestures.dy;
|
||||
}
|
||||
|
||||
_public_ bool
|
||||
ei_event_swipe_get_is_cancelled(struct ei_event *event)
|
||||
{
|
||||
require_event_type(event, false, EI_EVENT_SWIPE_END);
|
||||
|
||||
return event->gestures.is_cancelled;
|
||||
}
|
||||
|
||||
_public_ uint32_t
|
||||
ei_event_pinch_get_finger_count(struct ei_event *event)
|
||||
{
|
||||
require_event_type(event,
|
||||
0,
|
||||
EI_EVENT_PINCH_BEGIN,
|
||||
EI_EVENT_PINCH_UPDATE,
|
||||
EI_EVENT_PINCH_END);
|
||||
|
||||
return event->gestures.nfingers;
|
||||
}
|
||||
|
||||
_public_ double
|
||||
ei_event_pinch_get_dx(struct ei_event *event)
|
||||
{
|
||||
require_event_type(event, 0.0, EI_EVENT_PINCH_UPDATE);
|
||||
|
||||
return event->gestures.dx;
|
||||
}
|
||||
|
||||
_public_ double
|
||||
ei_event_pinch_get_dy(struct ei_event *event)
|
||||
{
|
||||
require_event_type(event, 0.0, EI_EVENT_PINCH_UPDATE);
|
||||
|
||||
return event->gestures.dy;
|
||||
}
|
||||
|
||||
_public_ double
|
||||
ei_event_pinch_get_rotation(struct ei_event *event)
|
||||
{
|
||||
require_event_type(event, 0.0, EI_EVENT_PINCH_UPDATE);
|
||||
|
||||
return event->gestures.degrees;
|
||||
}
|
||||
|
||||
_public_ double
|
||||
ei_event_pinch_get_scale(struct ei_event *event)
|
||||
{
|
||||
require_event_type(event, 0.0, EI_EVENT_PINCH_UPDATE);
|
||||
|
||||
return event->gestures.scale;
|
||||
}
|
||||
|
||||
_public_ bool
|
||||
ei_event_pinch_get_is_cancelled(struct ei_event *event)
|
||||
{
|
||||
require_event_type(event, false, EI_EVENT_PINCH_END);
|
||||
|
||||
return event->gestures.is_cancelled;
|
||||
}
|
||||
|
||||
_public_ uint32_t
|
||||
ei_event_hold_get_finger_count(struct ei_event *event)
|
||||
{
|
||||
require_event_type(event, 0, EI_EVENT_HOLD_BEGIN, EI_EVENT_HOLD_END);
|
||||
|
||||
return event->gestures.nfingers;
|
||||
}
|
||||
|
||||
_public_ bool
|
||||
ei_event_hold_get_is_cancelled(struct ei_event *event)
|
||||
{
|
||||
require_event_type(event, false, EI_EVENT_HOLD_END);
|
||||
|
||||
return event->gestures.is_cancelled;
|
||||
}
|
||||
|
||||
_public_ uint32_t
|
||||
ei_event_text_get_keysym(struct ei_event *event)
|
||||
{
|
||||
|
|
@ -529,17 +403,6 @@ ei_event_get_time(struct ei_event *event)
|
|||
EI_EVENT_TOUCH_DOWN,
|
||||
EI_EVENT_TOUCH_UP,
|
||||
EI_EVENT_TOUCH_MOTION,
|
||||
EI_EVENT_SWIPE_BEGIN,
|
||||
EI_EVENT_SWIPE_UPDATE,
|
||||
EI_EVENT_SWIPE_END,
|
||||
EI_EVENT_SWIPE_CANCELLED,
|
||||
EI_EVENT_PINCH_BEGIN,
|
||||
EI_EVENT_PINCH_UPDATE,
|
||||
EI_EVENT_PINCH_END,
|
||||
EI_EVENT_PINCH_CANCELLED,
|
||||
EI_EVENT_HOLD_BEGIN,
|
||||
EI_EVENT_HOLD_END,
|
||||
EI_EVENT_HOLD_CANCELLED,
|
||||
EI_EVENT_TEXT_KEYSYM,
|
||||
EI_EVENT_TEXT_UTF8,
|
||||
EI_EVENT_FRAME);
|
||||
|
|
|
|||
|
|
@ -81,13 +81,6 @@ struct ei_event {
|
|||
struct {
|
||||
struct ei_pingpong *pingpong;
|
||||
} sync;
|
||||
struct {
|
||||
uint32_t nfingers;
|
||||
double dx, dy;
|
||||
double degrees;
|
||||
double scale;
|
||||
bool is_cancelled;
|
||||
} gestures;
|
||||
};
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -1,769 +0,0 @@
|
|||
/* SPDX-License-Identifier: MIT */
|
||||
/*
|
||||
* Copyright © 2024 Red Hat, Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the next
|
||||
* paragraph) shall be included in all copies or substantial portions of the
|
||||
* Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include <errno.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
#include "util-bits.h"
|
||||
#include "util-io.h"
|
||||
#include "util-macros.h"
|
||||
#include "util-mem.h"
|
||||
#include "util-strings.h"
|
||||
#include "util-version.h"
|
||||
|
||||
#include "ei-proto.h"
|
||||
#include "libei-private.h"
|
||||
|
||||
static void
|
||||
ei_gesture_swipe_destroy(struct ei_gesture_swipe *swipe)
|
||||
{
|
||||
struct ei *ei = ei_gesture_swipe_get_context(swipe);
|
||||
ei_unregister_object(ei, &swipe->proto_object);
|
||||
}
|
||||
|
||||
OBJECT_IMPLEMENT_REF(ei_gesture_swipe);
|
||||
OBJECT_IMPLEMENT_UNREF_CLEANUP(ei_gesture_swipe);
|
||||
|
||||
static OBJECT_IMPLEMENT_CREATE(ei_gesture_swipe);
|
||||
static OBJECT_IMPLEMENT_PARENT(ei_gesture_swipe, ei_device);
|
||||
OBJECT_IMPLEMENT_GETTER_AS_REF(ei_gesture_swipe, proto_object, const struct brei_object *);
|
||||
|
||||
struct ei_device *
|
||||
ei_gesture_swipe_get_device(struct ei_gesture_swipe *swipe)
|
||||
{
|
||||
return ei_gesture_swipe_parent(swipe);
|
||||
}
|
||||
|
||||
struct ei *
|
||||
ei_gesture_swipe_get_context(struct ei_gesture_swipe *swipe)
|
||||
{
|
||||
return ei_device_get_context(ei_gesture_swipe_get_device(swipe));
|
||||
}
|
||||
|
||||
const struct ei_gesture_swipe_interface *
|
||||
ei_gesture_swipe_get_interface(struct ei_gesture_swipe *swipe)
|
||||
{
|
||||
struct ei_device *device = ei_gesture_swipe_get_device(swipe);
|
||||
return ei_device_get_gesture_swipe_interface(device);
|
||||
}
|
||||
|
||||
struct ei_gesture_swipe *
|
||||
ei_gesture_swipe_new(struct ei_device *device, object_id_t id, uint32_t version)
|
||||
{
|
||||
struct ei_gesture_swipe *swipe = ei_gesture_swipe_create(&device->object);
|
||||
struct ei *ei = ei_device_get_context(device);
|
||||
|
||||
swipe->proto_object.id = id;
|
||||
swipe->proto_object.implementation = swipe;
|
||||
swipe->proto_object.interface = &ei_gesture_swipe_proto_interface;
|
||||
swipe->proto_object.version = version;
|
||||
ei_register_object(ei, &swipe->proto_object);
|
||||
|
||||
return swipe; /* ref owned by caller */
|
||||
}
|
||||
|
||||
static void
|
||||
ei_gesture_pinch_destroy(struct ei_gesture_pinch *pinch)
|
||||
{
|
||||
struct ei *ei = ei_gesture_pinch_get_context(pinch);
|
||||
ei_unregister_object(ei, &pinch->proto_object);
|
||||
}
|
||||
|
||||
OBJECT_IMPLEMENT_REF(ei_gesture_pinch);
|
||||
OBJECT_IMPLEMENT_UNREF_CLEANUP(ei_gesture_pinch);
|
||||
|
||||
static OBJECT_IMPLEMENT_CREATE(ei_gesture_pinch);
|
||||
static OBJECT_IMPLEMENT_PARENT(ei_gesture_pinch, ei_device);
|
||||
OBJECT_IMPLEMENT_GETTER_AS_REF(ei_gesture_pinch, proto_object, const struct brei_object *);
|
||||
|
||||
struct ei_device *
|
||||
ei_gesture_pinch_get_device(struct ei_gesture_pinch *pinch)
|
||||
{
|
||||
return ei_gesture_pinch_parent(pinch);
|
||||
}
|
||||
|
||||
struct ei *
|
||||
ei_gesture_pinch_get_context(struct ei_gesture_pinch *pinch)
|
||||
{
|
||||
return ei_device_get_context(ei_gesture_pinch_get_device(pinch));
|
||||
}
|
||||
|
||||
const struct ei_gesture_pinch_interface *
|
||||
ei_gesture_pinch_get_interface(struct ei_gesture_pinch *pinch)
|
||||
{
|
||||
struct ei_device *device = ei_gesture_pinch_get_device(pinch);
|
||||
return ei_device_get_gesture_pinch_interface(device);
|
||||
}
|
||||
|
||||
struct ei_gesture_pinch *
|
||||
ei_gesture_pinch_new(struct ei_device *device, object_id_t id, uint32_t version)
|
||||
{
|
||||
struct ei_gesture_pinch *pinch = ei_gesture_pinch_create(&device->object);
|
||||
struct ei *ei = ei_device_get_context(device);
|
||||
|
||||
pinch->proto_object.id = id;
|
||||
pinch->proto_object.implementation = pinch;
|
||||
pinch->proto_object.interface = &ei_gesture_pinch_proto_interface;
|
||||
pinch->proto_object.version = version;
|
||||
ei_register_object(ei, &pinch->proto_object);
|
||||
|
||||
return pinch; /* ref owned by caller */
|
||||
}
|
||||
|
||||
static void
|
||||
ei_gesture_hold_destroy(struct ei_gesture_hold *hold)
|
||||
{
|
||||
struct ei *ei = ei_gesture_hold_get_context(hold);
|
||||
ei_unregister_object(ei, &hold->proto_object);
|
||||
}
|
||||
|
||||
OBJECT_IMPLEMENT_REF(ei_gesture_hold);
|
||||
OBJECT_IMPLEMENT_UNREF_CLEANUP(ei_gesture_hold);
|
||||
|
||||
static OBJECT_IMPLEMENT_CREATE(ei_gesture_hold);
|
||||
static OBJECT_IMPLEMENT_PARENT(ei_gesture_hold, ei_device);
|
||||
OBJECT_IMPLEMENT_GETTER_AS_REF(ei_gesture_hold, proto_object, const struct brei_object *);
|
||||
|
||||
struct ei_device *
|
||||
ei_gesture_hold_get_device(struct ei_gesture_hold *hold)
|
||||
{
|
||||
return ei_gesture_hold_parent(hold);
|
||||
}
|
||||
|
||||
struct ei *
|
||||
ei_gesture_hold_get_context(struct ei_gesture_hold *hold)
|
||||
{
|
||||
return ei_device_get_context(ei_gesture_hold_get_device(hold));
|
||||
}
|
||||
|
||||
const struct ei_gesture_hold_interface *
|
||||
ei_gesture_hold_get_interface(struct ei_gesture_hold *hold)
|
||||
{
|
||||
struct ei_device *device = ei_gesture_hold_get_device(hold);
|
||||
return ei_device_get_gesture_hold_interface(device);
|
||||
}
|
||||
|
||||
struct ei_gesture_hold *
|
||||
ei_gesture_hold_new(struct ei_device *device, object_id_t id, uint32_t version)
|
||||
{
|
||||
struct ei_gesture_hold *hold = ei_gesture_hold_create(&device->object);
|
||||
struct ei *ei = ei_device_get_context(device);
|
||||
|
||||
hold->proto_object.id = id;
|
||||
hold->proto_object.implementation = hold;
|
||||
hold->proto_object.interface = &ei_gesture_hold_proto_interface;
|
||||
hold->proto_object.version = version;
|
||||
ei_register_object(ei, &hold->proto_object);
|
||||
|
||||
return hold; /* ref owned by caller */
|
||||
}
|
||||
|
||||
static void
|
||||
ei_gesture_destroy(struct ei_gesture *gesture)
|
||||
{
|
||||
ei_device_unref(gesture->device);
|
||||
}
|
||||
|
||||
static OBJECT_IMPLEMENT_INIT(ei_gesture);
|
||||
OBJECT_IMPLEMENT_REF(ei_gesture);
|
||||
OBJECT_IMPLEMENT_UNREF(ei_gesture);
|
||||
|
||||
struct ei_device *
|
||||
ei_gesture_get_device(struct ei_gesture *gesture)
|
||||
{
|
||||
return gesture->device;
|
||||
}
|
||||
|
||||
struct ei *
|
||||
ei_gesture_get_context(struct ei_gesture *gesture)
|
||||
{
|
||||
return ei_device_get_context(ei_gesture_get_device(gesture));
|
||||
}
|
||||
|
||||
static void
|
||||
ei_gesture_init(struct ei_gesture *gesture, struct ei_device *device, uint32_t nfingers)
|
||||
{
|
||||
/* Not using the device as parent object because we need a ref
|
||||
* to it */
|
||||
ei_gesture_init_object(gesture, NULL);
|
||||
|
||||
gesture->state = EI_GESTURE_STATE_NEW;
|
||||
gesture->device = ei_device_ref(device);
|
||||
gesture->nfingers = nfingers;
|
||||
}
|
||||
|
||||
struct ei_swipe *
|
||||
ei_swipe_new(struct ei_device *device, uint32_t nfingers)
|
||||
{
|
||||
if (!ei_device_has_capability(device, EI_DEVICE_CAP_GESTURES)) {
|
||||
log_bug_client(ei_device_get_context(device),
|
||||
"%s: device is not a gesture device",
|
||||
__func__);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (nfingers == 0) {
|
||||
log_bug_client(ei_device_get_context(device),
|
||||
"zero-finger gestures are not possible");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!device->swipe)
|
||||
return NULL;
|
||||
|
||||
struct ei_swipe *swipe = xalloc(sizeof *swipe);
|
||||
ei_gesture_init(&swipe->base, device, nfingers);
|
||||
|
||||
return swipe;
|
||||
}
|
||||
|
||||
_public_ struct ei_swipe *
|
||||
ei_swipe_ref(struct ei_swipe *swipe)
|
||||
{
|
||||
return (struct ei_swipe *)ei_gesture_ref(&swipe->base);
|
||||
}
|
||||
|
||||
_public_ struct ei_swipe *
|
||||
ei_swipe_unref(struct ei_swipe *swipe)
|
||||
{
|
||||
if (!swipe)
|
||||
return NULL;
|
||||
|
||||
struct ei_device *device = ei_gesture_get_device(&swipe->base);
|
||||
|
||||
if (swipe == device->gesture_state.swipe.current_swipe) {
|
||||
if (swipe->base.state == EI_GESTURE_STATE_BEGUN &&
|
||||
device->state == EI_DEVICE_STATE_EMULATING) {
|
||||
ei_swipe_cancel(swipe);
|
||||
}
|
||||
}
|
||||
|
||||
return (struct ei_swipe *)ei_gesture_unref(&swipe->base);
|
||||
}
|
||||
|
||||
struct ei *
|
||||
ei_swipe_get_context(struct ei_swipe *swipe)
|
||||
{
|
||||
return ei_gesture_get_context(&swipe->base);
|
||||
}
|
||||
|
||||
_public_ void
|
||||
ei_swipe_begin(struct ei_swipe *swipe)
|
||||
{
|
||||
struct ei_device *device = swipe->base.device;
|
||||
struct ei *ei = ei_device_get_context(device);
|
||||
|
||||
if (swipe->base.state != EI_GESTURE_STATE_NEW) {
|
||||
log_bug_client(ei_gesture_get_context(&swipe->base), "gesture cannot begin twice");
|
||||
return;
|
||||
}
|
||||
|
||||
if (device->gesture_state.swipe.current_swipe) {
|
||||
log_bug_client(
|
||||
ei_gesture_get_context(&swipe->base),
|
||||
"a different swipe gesture is already in process, ignoring this one");
|
||||
return;
|
||||
}
|
||||
|
||||
if (device->state != EI_DEVICE_STATE_EMULATING) {
|
||||
log_bug_client(ei_device_get_context(device),
|
||||
"%s: device is not emulating",
|
||||
__func__);
|
||||
return;
|
||||
}
|
||||
|
||||
if (ei->state == EI_STATE_NEW || ei->state == EI_STATE_DISCONNECTED)
|
||||
return;
|
||||
|
||||
if (!device->swipe)
|
||||
return;
|
||||
|
||||
if (swipe->base.nfingers == 0) {
|
||||
log_bug_client(ei_device_get_context(device),
|
||||
"zero-finger gestures are invalid, ignoring gesture");
|
||||
return;
|
||||
}
|
||||
|
||||
device->gesture_state.swipe.current_swipe = swipe;
|
||||
|
||||
device->send_frame_event = true;
|
||||
|
||||
swipe->base.state = EI_GESTURE_STATE_BEGUN;
|
||||
int rc = ei_gesture_swipe_request_begin(device->swipe, swipe->base.nfingers);
|
||||
if (rc)
|
||||
ei_disconnect(ei);
|
||||
}
|
||||
|
||||
_public_ void
|
||||
ei_swipe_update(struct ei_swipe *swipe, double x, double y)
|
||||
{
|
||||
struct ei_device *device = swipe->base.device;
|
||||
struct ei *ei = ei_device_get_context(device);
|
||||
|
||||
if (swipe->base.state != EI_GESTURE_STATE_BEGUN) {
|
||||
log_bug_client(ei_gesture_get_context(&swipe->base),
|
||||
"gesture in invalid state for update");
|
||||
return;
|
||||
}
|
||||
|
||||
if (device->gesture_state.swipe.current_swipe != swipe) {
|
||||
log_bug_client(
|
||||
ei_gesture_get_context(&swipe->base),
|
||||
"a different swipe gesture is already in process, ignoring this one");
|
||||
return;
|
||||
}
|
||||
|
||||
/* FIXME: what do we do with a gesture when the device stops emulating? */
|
||||
if (device->state != EI_DEVICE_STATE_EMULATING) {
|
||||
log_bug_client(ei_device_get_context(device),
|
||||
"%s: device is not emulating",
|
||||
__func__);
|
||||
return;
|
||||
}
|
||||
|
||||
if (ei->state == EI_STATE_NEW || ei->state == EI_STATE_DISCONNECTED)
|
||||
return;
|
||||
|
||||
if (!device->swipe)
|
||||
return;
|
||||
|
||||
device->send_frame_event = true;
|
||||
|
||||
int rc = ei_gesture_swipe_request_update(device->swipe, x, y);
|
||||
if (rc)
|
||||
ei_disconnect(ei);
|
||||
}
|
||||
|
||||
static void
|
||||
ei_swipe_end_cancel(struct ei_swipe *swipe, bool is_cancel)
|
||||
{
|
||||
struct ei_device *device = swipe->base.device;
|
||||
struct ei *ei = ei_device_get_context(device);
|
||||
|
||||
if (swipe->base.state != EI_GESTURE_STATE_BEGUN) {
|
||||
log_bug_client(ei_gesture_get_context(&swipe->base),
|
||||
"gesture in invalid state for end/cancel");
|
||||
return;
|
||||
}
|
||||
|
||||
if (device->gesture_state.swipe.current_swipe != swipe) {
|
||||
log_bug_client(
|
||||
ei_gesture_get_context(&swipe->base),
|
||||
"a different swipe gesture is already in process, ignoring this one");
|
||||
return;
|
||||
}
|
||||
|
||||
/* FIXME: what do we do with a gesture when the device stops emulating? */
|
||||
if (device->state != EI_DEVICE_STATE_EMULATING) {
|
||||
log_bug_client(ei_device_get_context(device),
|
||||
"%s: device is not emulating",
|
||||
__func__);
|
||||
return;
|
||||
}
|
||||
|
||||
if (ei->state == EI_STATE_NEW || ei->state == EI_STATE_DISCONNECTED)
|
||||
return;
|
||||
|
||||
if (!device->swipe)
|
||||
return;
|
||||
|
||||
swipe->base.state = EI_GESTURE_STATE_ENDED;
|
||||
device->gesture_state.swipe.current_swipe = NULL;
|
||||
|
||||
device->send_frame_event = true;
|
||||
|
||||
int rc = ei_gesture_swipe_request_end(device->swipe, is_cancel);
|
||||
if (rc)
|
||||
ei_disconnect(ei);
|
||||
}
|
||||
|
||||
_public_ void
|
||||
ei_swipe_end(struct ei_swipe *swipe)
|
||||
{
|
||||
ei_swipe_end_cancel(swipe, false);
|
||||
}
|
||||
|
||||
_public_ void
|
||||
ei_swipe_cancel(struct ei_swipe *swipe)
|
||||
{
|
||||
ei_swipe_end_cancel(swipe, true);
|
||||
}
|
||||
|
||||
struct ei_pinch *
|
||||
ei_pinch_new(struct ei_device *device, uint32_t nfingers)
|
||||
{
|
||||
if (!ei_device_has_capability(device, EI_DEVICE_CAP_GESTURES)) {
|
||||
log_bug_client(ei_device_get_context(device),
|
||||
"%s: device is not a gesture device",
|
||||
__func__);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (nfingers < 2) {
|
||||
log_bug_client(ei_device_get_context(device),
|
||||
"pinch gestures require at least 2 fingers");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!device->pinch)
|
||||
return NULL;
|
||||
|
||||
/* Not using the device as parent object because we need a ref
|
||||
* to it */
|
||||
struct ei_pinch *pinch = xalloc(sizeof *pinch);
|
||||
ei_gesture_init(&pinch->base, device, nfingers);
|
||||
|
||||
return pinch;
|
||||
}
|
||||
|
||||
_public_ struct ei_pinch *
|
||||
ei_pinch_ref(struct ei_pinch *pinch)
|
||||
{
|
||||
return (struct ei_pinch *)ei_gesture_ref(&pinch->base);
|
||||
}
|
||||
|
||||
_public_ struct ei_pinch *
|
||||
ei_pinch_unref(struct ei_pinch *pinch)
|
||||
{
|
||||
if (!pinch)
|
||||
return NULL;
|
||||
|
||||
struct ei_device *device = ei_gesture_get_device(&pinch->base);
|
||||
|
||||
if (pinch == device->gesture_state.pinch.current_pinch) {
|
||||
if (pinch->base.state == EI_GESTURE_STATE_BEGUN &&
|
||||
device->state == EI_DEVICE_STATE_EMULATING) {
|
||||
ei_pinch_cancel(pinch);
|
||||
}
|
||||
}
|
||||
|
||||
return (struct ei_pinch *)ei_gesture_unref(&pinch->base);
|
||||
}
|
||||
|
||||
struct ei *
|
||||
ei_pinch_get_context(struct ei_pinch *pinch)
|
||||
{
|
||||
return ei_gesture_get_context(&pinch->base);
|
||||
}
|
||||
|
||||
_public_ void
|
||||
ei_pinch_begin(struct ei_pinch *pinch)
|
||||
{
|
||||
struct ei_device *device = pinch->base.device;
|
||||
struct ei *ei = ei_device_get_context(device);
|
||||
|
||||
if (pinch->base.state != EI_GESTURE_STATE_NEW) {
|
||||
log_bug_client(ei_gesture_get_context(&pinch->base), "gesture cannot begin twice");
|
||||
return;
|
||||
}
|
||||
|
||||
if (device->gesture_state.pinch.current_pinch) {
|
||||
log_bug_client(
|
||||
ei_gesture_get_context(&pinch->base),
|
||||
"a different pinch gesture is already in process, ignoring this one");
|
||||
return;
|
||||
}
|
||||
|
||||
if (device->state != EI_DEVICE_STATE_EMULATING) {
|
||||
log_bug_client(ei_device_get_context(device),
|
||||
"%s: device is not emulating",
|
||||
__func__);
|
||||
return;
|
||||
}
|
||||
|
||||
if (ei->state == EI_STATE_NEW || ei->state == EI_STATE_DISCONNECTED)
|
||||
return;
|
||||
|
||||
if (!device->pinch)
|
||||
return;
|
||||
|
||||
if (pinch->base.nfingers == 0) {
|
||||
log_bug_client(ei_device_get_context(device),
|
||||
"zero-finger gestures are invalid, ignoring gesture");
|
||||
return;
|
||||
}
|
||||
|
||||
device->gesture_state.pinch.current_pinch = pinch;
|
||||
|
||||
device->send_frame_event = true;
|
||||
|
||||
pinch->base.state = EI_GESTURE_STATE_BEGUN;
|
||||
int rc = ei_gesture_pinch_request_begin(device->pinch, pinch->base.nfingers);
|
||||
if (rc)
|
||||
ei_disconnect(ei);
|
||||
}
|
||||
|
||||
_public_ void
|
||||
ei_pinch_update(struct ei_pinch *pinch, double x, double y, double scale, double rotation)
|
||||
{
|
||||
struct ei_device *device = pinch->base.device;
|
||||
struct ei *ei = ei_device_get_context(device);
|
||||
|
||||
if (pinch->base.state != EI_GESTURE_STATE_BEGUN) {
|
||||
log_bug_client(ei_gesture_get_context(&pinch->base),
|
||||
"gesture in invalid state for update");
|
||||
return;
|
||||
}
|
||||
|
||||
if (device->gesture_state.pinch.current_pinch != pinch) {
|
||||
log_bug_client(
|
||||
ei_gesture_get_context(&pinch->base),
|
||||
"a different pinch gesture is already in process, ignoring this one");
|
||||
return;
|
||||
}
|
||||
|
||||
/* FIXME: what do we do with a gesture when the device stops emulating? */
|
||||
if (device->state != EI_DEVICE_STATE_EMULATING) {
|
||||
log_bug_client(ei_device_get_context(device),
|
||||
"%s: device is not emulating",
|
||||
__func__);
|
||||
return;
|
||||
}
|
||||
|
||||
if (ei->state == EI_STATE_NEW || ei->state == EI_STATE_DISCONNECTED)
|
||||
return;
|
||||
|
||||
if (!device->pinch)
|
||||
return;
|
||||
|
||||
device->send_frame_event = true;
|
||||
|
||||
int rc = ei_gesture_pinch_request_update(device->pinch, x, y, scale, rotation);
|
||||
if (rc)
|
||||
ei_disconnect(ei);
|
||||
}
|
||||
|
||||
static void
|
||||
ei_pinch_end_cancel(struct ei_pinch *pinch, bool is_cancel)
|
||||
{
|
||||
struct ei_device *device = pinch->base.device;
|
||||
struct ei *ei = ei_device_get_context(device);
|
||||
|
||||
if (pinch->base.state != EI_GESTURE_STATE_BEGUN) {
|
||||
log_bug_client(ei_gesture_get_context(&pinch->base),
|
||||
"gesture in invalid state for end/cancel");
|
||||
return;
|
||||
}
|
||||
|
||||
if (device->gesture_state.pinch.current_pinch != pinch) {
|
||||
log_bug_client(
|
||||
ei_gesture_get_context(&pinch->base),
|
||||
"a different pinch gesture is already in process, ignoring this one");
|
||||
return;
|
||||
}
|
||||
|
||||
/* FIXME: what do we do with a gesture when the device stops emulating? */
|
||||
if (device->state != EI_DEVICE_STATE_EMULATING) {
|
||||
log_bug_client(ei_device_get_context(device),
|
||||
"%s: device is not emulating",
|
||||
__func__);
|
||||
return;
|
||||
}
|
||||
|
||||
if (ei->state == EI_STATE_NEW || ei->state == EI_STATE_DISCONNECTED)
|
||||
return;
|
||||
|
||||
if (!device->pinch)
|
||||
return;
|
||||
|
||||
pinch->base.state = EI_GESTURE_STATE_ENDED;
|
||||
device->gesture_state.pinch.current_pinch = NULL;
|
||||
|
||||
device->send_frame_event = true;
|
||||
|
||||
int rc = ei_gesture_pinch_request_end(device->pinch, is_cancel);
|
||||
if (rc)
|
||||
ei_disconnect(ei);
|
||||
}
|
||||
|
||||
_public_ void
|
||||
ei_pinch_end(struct ei_pinch *pinch)
|
||||
{
|
||||
ei_pinch_end_cancel(pinch, false);
|
||||
}
|
||||
|
||||
_public_ void
|
||||
ei_pinch_cancel(struct ei_pinch *pinch)
|
||||
{
|
||||
ei_pinch_end_cancel(pinch, true);
|
||||
}
|
||||
|
||||
struct ei_hold *
|
||||
ei_hold_new(struct ei_device *device, uint32_t nfingers)
|
||||
{
|
||||
if (!ei_device_has_capability(device, EI_DEVICE_CAP_GESTURES)) {
|
||||
log_bug_client(ei_device_get_context(device),
|
||||
"%s: device is not a gesture device",
|
||||
__func__);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (nfingers == 0) {
|
||||
log_bug_client(ei_device_get_context(device),
|
||||
"zero-finger gestures are not possible");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!device->hold)
|
||||
return NULL;
|
||||
|
||||
/* Not using the device as parent object because we need a ref
|
||||
* to it */
|
||||
struct ei_hold *hold = xalloc(sizeof *hold);
|
||||
ei_gesture_init(&hold->base, device, nfingers);
|
||||
|
||||
return hold;
|
||||
}
|
||||
|
||||
_public_ struct ei_hold *
|
||||
ei_hold_ref(struct ei_hold *hold)
|
||||
{
|
||||
return (struct ei_hold *)ei_gesture_ref(&hold->base);
|
||||
}
|
||||
|
||||
_public_ struct ei_hold *
|
||||
ei_hold_unref(struct ei_hold *hold)
|
||||
{
|
||||
if (!hold)
|
||||
return NULL;
|
||||
|
||||
struct ei_device *device = ei_gesture_get_device(&hold->base);
|
||||
|
||||
if (hold == device->gesture_state.hold.current_hold) {
|
||||
if (hold->base.state == EI_GESTURE_STATE_BEGUN &&
|
||||
device->state == EI_DEVICE_STATE_EMULATING) {
|
||||
ei_hold_cancel(hold);
|
||||
}
|
||||
}
|
||||
|
||||
return (struct ei_hold *)ei_gesture_unref(&hold->base);
|
||||
}
|
||||
|
||||
struct ei *
|
||||
ei_hold_get_context(struct ei_hold *hold)
|
||||
{
|
||||
return ei_gesture_get_context(&hold->base);
|
||||
}
|
||||
|
||||
_public_ void
|
||||
ei_hold_begin(struct ei_hold *hold)
|
||||
{
|
||||
struct ei_device *device = hold->base.device;
|
||||
struct ei *ei = ei_device_get_context(device);
|
||||
|
||||
if (hold->base.state != EI_GESTURE_STATE_NEW) {
|
||||
log_bug_client(ei_gesture_get_context(&hold->base), "gesture cannot begin twice");
|
||||
return;
|
||||
}
|
||||
|
||||
if (device->gesture_state.hold.current_hold) {
|
||||
log_bug_client(ei_gesture_get_context(&hold->base),
|
||||
"a different hold gesture is already in process, ignoring this one");
|
||||
return;
|
||||
}
|
||||
|
||||
if (device->state != EI_DEVICE_STATE_EMULATING) {
|
||||
log_bug_client(ei_device_get_context(device),
|
||||
"%s: device is not emulating",
|
||||
__func__);
|
||||
return;
|
||||
}
|
||||
|
||||
if (ei->state == EI_STATE_NEW || ei->state == EI_STATE_DISCONNECTED)
|
||||
return;
|
||||
|
||||
if (!device->hold)
|
||||
return;
|
||||
|
||||
if (hold->base.nfingers == 0) {
|
||||
log_bug_client(ei_device_get_context(device),
|
||||
"zero-finger gestures are invalid, ignoring gesture");
|
||||
return;
|
||||
}
|
||||
|
||||
device->gesture_state.hold.current_hold = hold;
|
||||
|
||||
device->send_frame_event = true;
|
||||
|
||||
hold->base.state = EI_GESTURE_STATE_BEGUN;
|
||||
int rc = ei_gesture_hold_request_begin(device->hold, hold->base.nfingers);
|
||||
if (rc)
|
||||
ei_disconnect(ei);
|
||||
}
|
||||
|
||||
static void
|
||||
ei_hold_end_cancel(struct ei_hold *hold, bool is_cancel)
|
||||
{
|
||||
struct ei_device *device = hold->base.device;
|
||||
struct ei *ei = ei_device_get_context(device);
|
||||
|
||||
if (hold->base.state != EI_GESTURE_STATE_BEGUN) {
|
||||
log_bug_client(ei_gesture_get_context(&hold->base),
|
||||
"gesture in invalid state for end/cancel");
|
||||
return;
|
||||
}
|
||||
|
||||
if (device->gesture_state.hold.current_hold != hold) {
|
||||
log_bug_client(ei_gesture_get_context(&hold->base),
|
||||
"a different hold gesture is already in process, ignoring this one");
|
||||
return;
|
||||
}
|
||||
|
||||
/* FIXME: what do we do with a gesture when the device stops emulating? */
|
||||
if (device->state != EI_DEVICE_STATE_EMULATING) {
|
||||
log_bug_client(ei_device_get_context(device),
|
||||
"%s: device is not emulating",
|
||||
__func__);
|
||||
return;
|
||||
}
|
||||
|
||||
if (ei->state == EI_STATE_NEW || ei->state == EI_STATE_DISCONNECTED)
|
||||
return;
|
||||
|
||||
if (!device->hold)
|
||||
return;
|
||||
|
||||
hold->base.state = EI_GESTURE_STATE_ENDED;
|
||||
device->gesture_state.hold.current_hold = NULL;
|
||||
|
||||
device->send_frame_event = true;
|
||||
|
||||
int rc = ei_gesture_hold_request_end(device->hold, is_cancel);
|
||||
if (rc)
|
||||
ei_disconnect(ei);
|
||||
}
|
||||
|
||||
_public_ void
|
||||
ei_hold_end(struct ei_hold *hold)
|
||||
{
|
||||
ei_hold_end_cancel(hold, false);
|
||||
}
|
||||
|
||||
_public_ void
|
||||
ei_hold_cancel(struct ei_hold *hold)
|
||||
{
|
||||
ei_hold_end_cancel(hold, true);
|
||||
}
|
||||
|
|
@ -1,123 +0,0 @@
|
|||
/* SPDX-License-Identifier: MIT */
|
||||
/*
|
||||
* Copyright © 2024 Red Hat, Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the next
|
||||
* paragraph) shall be included in all copies or substantial portions of the
|
||||
* Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "util-list.h"
|
||||
#include "util-object.h"
|
||||
|
||||
#include "brei-shared.h"
|
||||
|
||||
struct ei;
|
||||
struct ei_device;
|
||||
|
||||
/* This is the protocol-only object, not exposed in the API. See ei_swipe() for
|
||||
* the C API object */
|
||||
struct ei_gesture_swipe {
|
||||
struct object object;
|
||||
struct brei_object proto_object;
|
||||
};
|
||||
|
||||
OBJECT_DECLARE_GETTER(ei_gesture_swipe, context, struct ei *);
|
||||
OBJECT_DECLARE_GETTER(ei_gesture_swipe, device, struct ei_device *);
|
||||
OBJECT_DECLARE_GETTER(ei_gesture_swipe, proto_object, const struct brei_object *);
|
||||
OBJECT_DECLARE_GETTER(ei_gesture_swipe, interface, const struct ei_gesture_swipe_interface *);
|
||||
OBJECT_DECLARE_REF(ei_gesture_swipe);
|
||||
OBJECT_DECLARE_UNREF(ei_gesture_swipe);
|
||||
|
||||
struct ei_gesture_swipe *
|
||||
ei_gesture_swipe_new(struct ei_device *device, object_id_t id, uint32_t version);
|
||||
|
||||
/* This is the protocol-only object, not exposed in the API. See ei_pinch() for
|
||||
* the C API object */
|
||||
struct ei_gesture_pinch {
|
||||
struct object object;
|
||||
struct brei_object proto_object;
|
||||
};
|
||||
|
||||
OBJECT_DECLARE_GETTER(ei_gesture_pinch, context, struct ei *);
|
||||
OBJECT_DECLARE_GETTER(ei_gesture_pinch, device, struct ei_device *);
|
||||
OBJECT_DECLARE_GETTER(ei_gesture_pinch, proto_object, const struct brei_object *);
|
||||
OBJECT_DECLARE_GETTER(ei_gesture_pinch, interface, const struct ei_gesture_pinch_interface *);
|
||||
OBJECT_DECLARE_REF(ei_gesture_pinch);
|
||||
OBJECT_DECLARE_UNREF(ei_gesture_pinch);
|
||||
|
||||
struct ei_gesture_pinch *
|
||||
ei_gesture_pinch_new(struct ei_device *device, object_id_t id, uint32_t version);
|
||||
|
||||
/* This is the protocol-only object, not exposed in the API. See ei_hold() for
|
||||
* the C API object */
|
||||
struct ei_gesture_hold {
|
||||
struct object object;
|
||||
struct brei_object proto_object;
|
||||
};
|
||||
|
||||
OBJECT_DECLARE_GETTER(ei_gesture_hold, context, struct ei *);
|
||||
OBJECT_DECLARE_GETTER(ei_gesture_hold, device, struct ei_device *);
|
||||
OBJECT_DECLARE_GETTER(ei_gesture_hold, proto_object, const struct brei_object *);
|
||||
OBJECT_DECLARE_GETTER(ei_gesture_hold, interface, const struct ei_gesture_hold_interface *);
|
||||
OBJECT_DECLARE_REF(ei_gesture_hold);
|
||||
OBJECT_DECLARE_UNREF(ei_gesture_hold);
|
||||
|
||||
struct ei_gesture_hold *
|
||||
ei_gesture_hold_new(struct ei_device *device, object_id_t id, uint32_t version);
|
||||
|
||||
enum ei_gesture_state { EI_GESTURE_STATE_NEW, EI_GESTURE_STATE_BEGUN, EI_GESTURE_STATE_ENDED };
|
||||
|
||||
/* This is the parent object for all the C API gestures */
|
||||
struct ei_gesture {
|
||||
struct object object;
|
||||
struct ei_device *device;
|
||||
enum ei_gesture_state state;
|
||||
uint32_t nfingers;
|
||||
};
|
||||
|
||||
OBJECT_DECLARE_REF(ei_gesture);
|
||||
OBJECT_DECLARE_UNREF(ei_gesture);
|
||||
OBJECT_DECLARE_GETTER(ei_gesture, context, struct ei *);
|
||||
OBJECT_DECLARE_GETTER(ei_gesture, device, struct ei_device *);
|
||||
|
||||
struct ei_swipe {
|
||||
struct ei_gesture base;
|
||||
};
|
||||
|
||||
struct ei_pinch {
|
||||
struct ei_gesture base;
|
||||
};
|
||||
|
||||
struct ei_hold {
|
||||
struct ei_gesture base;
|
||||
};
|
||||
|
||||
struct ei_swipe *
|
||||
ei_swipe_new(struct ei_device *device, uint32_t nfingers);
|
||||
OBJECT_DECLARE_GETTER(ei_swipe, context, struct ei *);
|
||||
|
||||
struct ei_pinch *
|
||||
ei_pinch_new(struct ei_device *device, uint32_t nfingers);
|
||||
OBJECT_DECLARE_GETTER(ei_pinch, context, struct ei *);
|
||||
|
||||
struct ei_hold *
|
||||
ei_hold_new(struct ei_device *device, uint32_t nfingers);
|
||||
OBJECT_DECLARE_GETTER(ei_hold, context, struct ei *);
|
||||
|
|
@ -116,15 +116,6 @@ ei_handshake_initialize(struct ei_handshake *setup, uint32_t version)
|
|||
ei_handshake_request_interface_version(setup,
|
||||
EI_TOUCHSCREEN_INTERFACE_NAME,
|
||||
v->ei_touchscreen);
|
||||
ei_handshake_request_interface_version(setup,
|
||||
EI_GESTURE_SWIPE_INTERFACE_NAME,
|
||||
v->ei_gesture_swipe);
|
||||
ei_handshake_request_interface_version(setup,
|
||||
EI_GESTURE_PINCH_INTERFACE_NAME,
|
||||
v->ei_gesture_pinch);
|
||||
ei_handshake_request_interface_version(setup,
|
||||
EI_GESTURE_HOLD_INTERFACE_NAME,
|
||||
v->ei_gesture_hold);
|
||||
ei_handshake_request_interface_version(setup, EI_TEXT_INTERFACE_NAME, v->ei_text);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -39,7 +39,6 @@
|
|||
#include "libei-connection.h"
|
||||
#include "libei-device.h"
|
||||
#include "libei-event.h"
|
||||
#include "libei-gestures.h"
|
||||
#include "libei-handshake.h"
|
||||
#include "libei-keyboard.h"
|
||||
#include "libei-pingpong.h"
|
||||
|
|
@ -78,9 +77,6 @@ struct ei_interface_versions {
|
|||
uint32_t ei_button;
|
||||
uint32_t ei_keyboard;
|
||||
uint32_t ei_touchscreen;
|
||||
uint32_t ei_gesture_swipe;
|
||||
uint32_t ei_gesture_pinch;
|
||||
uint32_t ei_gesture_hold;
|
||||
uint32_t ei_text;
|
||||
};
|
||||
|
||||
|
|
@ -258,43 +254,6 @@ ei_queue_text_utf8_event(struct ei_device *device, const char *utf8);
|
|||
void
|
||||
ei_sync_event_send_done(struct ei_event *e);
|
||||
|
||||
void
|
||||
ei_queue_swipe_begin_event(struct ei_device *device, uint32_t nfingers);
|
||||
|
||||
void
|
||||
ei_queue_swipe_update_event(struct ei_device *device, double dx, double dy);
|
||||
|
||||
void
|
||||
ei_queue_swipe_end_event(struct ei_device *device, bool is_cancelled);
|
||||
|
||||
void
|
||||
ei_queue_swipe_cancelled_event(struct ei_device *device);
|
||||
|
||||
void
|
||||
ei_queue_pinch_begin_event(struct ei_device *device, uint32_t nfingers);
|
||||
|
||||
void
|
||||
ei_queue_pinch_update_event(struct ei_device *device,
|
||||
double dx,
|
||||
double dy,
|
||||
double scale,
|
||||
double rotation);
|
||||
|
||||
void
|
||||
ei_queue_pinch_end_event(struct ei_device *device, bool is_cancelled);
|
||||
|
||||
void
|
||||
ei_queue_pinch_cancelled_event(struct ei_device *device);
|
||||
|
||||
void
|
||||
ei_queue_hold_begin_event(struct ei_device *device, uint32_t nfingers);
|
||||
|
||||
void
|
||||
ei_queue_hold_end_event(struct ei_device *device, bool is_cancelled);
|
||||
|
||||
void
|
||||
ei_queue_hold_cancelled_event(struct ei_device *device);
|
||||
|
||||
_printf_(6, 7) void
|
||||
ei_log_msg(struct ei *ei,
|
||||
enum ei_log_priority priority,
|
||||
|
|
|
|||
|
|
@ -251,10 +251,6 @@ ei_seat_has_capability(struct ei_seat *seat, enum ei_device_capability cap)
|
|||
return seat->capabilities.map[EI_SCROLL_INTERFACE_INDEX] != 0;
|
||||
case EI_DEVICE_CAP_BUTTON:
|
||||
return seat->capabilities.map[EI_BUTTON_INTERFACE_INDEX] != 0;
|
||||
case EI_DEVICE_CAP_GESTURES:
|
||||
return seat->capabilities.map[EI_GESTURE_SWIPE_INTERFACE_INDEX] != 0 ||
|
||||
seat->capabilities.map[EI_GESTURE_PINCH_INTERFACE_INDEX] != 0 ||
|
||||
seat->capabilities.map[EI_GESTURE_HOLD_INTERFACE_INDEX] != 0;
|
||||
case EI_DEVICE_CAP_TEXT:
|
||||
return seat->capabilities.map[EI_TEXT_INTERFACE_INDEX] != 0;
|
||||
}
|
||||
|
|
@ -291,10 +287,6 @@ ei_seat_cap_mask(struct ei_seat *seat, enum ei_device_capability cap)
|
|||
return seat->capabilities.map[EI_BUTTON_INTERFACE_INDEX];
|
||||
case EI_DEVICE_CAP_SCROLL:
|
||||
return seat->capabilities.map[EI_SCROLL_INTERFACE_INDEX];
|
||||
case EI_DEVICE_CAP_GESTURES:
|
||||
return seat->capabilities.map[EI_GESTURE_SWIPE_INTERFACE_INDEX] |
|
||||
seat->capabilities.map[EI_GESTURE_PINCH_INTERFACE_INDEX] |
|
||||
seat->capabilities.map[EI_GESTURE_HOLD_INTERFACE_INDEX];
|
||||
case EI_DEVICE_CAP_TEXT:
|
||||
return seat->capabilities.map[EI_TEXT_INTERFACE_INDEX];
|
||||
}
|
||||
|
|
|
|||
155
src/libei.c
155
src/libei.c
|
|
@ -132,9 +132,6 @@ ei_create_context(bool is_sender, void *user_data)
|
|||
.ei_keyboard = VERSION_V(1),
|
||||
.ei_text = VERSION_V(1),
|
||||
.ei_touchscreen = VERSION_V(2),
|
||||
.ei_gesture_swipe = VERSION_V(1),
|
||||
.ei_gesture_pinch = VERSION_V(1),
|
||||
.ei_gesture_hold = VERSION_V(1),
|
||||
};
|
||||
/* This must be v1 until the server tells us otherwise */
|
||||
ei->handshake = ei_handshake_new(ei, VERSION_V(1));
|
||||
|
|
@ -253,17 +250,6 @@ update_event_timestamp(struct ei_event *event, uint64_t time)
|
|||
case EI_EVENT_TOUCH_DOWN:
|
||||
case EI_EVENT_TOUCH_UP:
|
||||
case EI_EVENT_TOUCH_MOTION:
|
||||
case EI_EVENT_SWIPE_BEGIN:
|
||||
case EI_EVENT_SWIPE_UPDATE:
|
||||
case EI_EVENT_SWIPE_END:
|
||||
case EI_EVENT_SWIPE_CANCELLED:
|
||||
case EI_EVENT_PINCH_BEGIN:
|
||||
case EI_EVENT_PINCH_UPDATE:
|
||||
case EI_EVENT_PINCH_END:
|
||||
case EI_EVENT_PINCH_CANCELLED:
|
||||
case EI_EVENT_HOLD_BEGIN:
|
||||
case EI_EVENT_HOLD_END:
|
||||
case EI_EVENT_HOLD_CANCELLED:
|
||||
case EI_EVENT_TEXT_KEYSYM:
|
||||
case EI_EVENT_TEXT_UTF8:
|
||||
if (event->timestamp != 0) {
|
||||
|
|
@ -301,17 +287,6 @@ queue_event(struct ei *ei, struct ei_event *event)
|
|||
case EI_EVENT_TOUCH_DOWN:
|
||||
case EI_EVENT_TOUCH_UP:
|
||||
case EI_EVENT_TOUCH_MOTION:
|
||||
case EI_EVENT_SWIPE_BEGIN:
|
||||
case EI_EVENT_SWIPE_UPDATE:
|
||||
case EI_EVENT_SWIPE_END:
|
||||
case EI_EVENT_SWIPE_CANCELLED:
|
||||
case EI_EVENT_PINCH_BEGIN:
|
||||
case EI_EVENT_PINCH_UPDATE:
|
||||
case EI_EVENT_PINCH_END:
|
||||
case EI_EVENT_PINCH_CANCELLED:
|
||||
case EI_EVENT_HOLD_BEGIN:
|
||||
case EI_EVENT_HOLD_END:
|
||||
case EI_EVENT_HOLD_CANCELLED:
|
||||
case EI_EVENT_TEXT_KEYSYM:
|
||||
case EI_EVENT_TEXT_UTF8:
|
||||
prefix = "pending ";
|
||||
|
|
@ -655,136 +630,6 @@ ei_queue_touch_cancel_event(struct ei_device *device, uint32_t touchid)
|
|||
queue_event(ei_device_get_context(device), e);
|
||||
}
|
||||
|
||||
void
|
||||
ei_queue_swipe_begin_event(struct ei_device *device, uint32_t nfingers)
|
||||
{
|
||||
struct ei_event *e = ei_event_new_for_device(device);
|
||||
|
||||
e->type = EI_EVENT_SWIPE_BEGIN;
|
||||
e->gestures.nfingers = nfingers;
|
||||
|
||||
queue_event(ei_device_get_context(device), e);
|
||||
}
|
||||
|
||||
void
|
||||
ei_queue_swipe_update_event(struct ei_device *device, double dx, double dy)
|
||||
{
|
||||
struct ei_event *e = ei_event_new_for_device(device);
|
||||
|
||||
e->type = EI_EVENT_SWIPE_UPDATE;
|
||||
e->gestures.nfingers = device->gesture_state.swipe.nfingers;
|
||||
e->gestures.dx = dx;
|
||||
e->gestures.dy = dy;
|
||||
|
||||
queue_event(ei_device_get_context(device), e);
|
||||
}
|
||||
|
||||
void
|
||||
ei_queue_swipe_end_event(struct ei_device *device, bool is_cancelled)
|
||||
{
|
||||
struct ei_event *e = ei_event_new_for_device(device);
|
||||
|
||||
e->type = EI_EVENT_SWIPE_END;
|
||||
e->gestures.nfingers = device->gesture_state.swipe.nfingers;
|
||||
e->gestures.is_cancelled = is_cancelled;
|
||||
|
||||
queue_event(ei_device_get_context(device), e);
|
||||
}
|
||||
|
||||
void
|
||||
ei_queue_swipe_cancelled_event(struct ei_device *device)
|
||||
{
|
||||
struct ei_event *e = ei_event_new_for_device(device);
|
||||
|
||||
e->type = EI_EVENT_SWIPE_CANCELLED;
|
||||
|
||||
queue_event(ei_device_get_context(device), e);
|
||||
}
|
||||
|
||||
void
|
||||
ei_queue_pinch_begin_event(struct ei_device *device, uint32_t nfingers)
|
||||
{
|
||||
struct ei_event *e = ei_event_new_for_device(device);
|
||||
|
||||
e->type = EI_EVENT_PINCH_BEGIN;
|
||||
e->gestures.nfingers = nfingers;
|
||||
|
||||
queue_event(ei_device_get_context(device), e);
|
||||
}
|
||||
|
||||
void
|
||||
ei_queue_pinch_update_event(struct ei_device *device,
|
||||
double dx,
|
||||
double dy,
|
||||
double scale,
|
||||
double rotation)
|
||||
{
|
||||
struct ei_event *e = ei_event_new_for_device(device);
|
||||
e->type = EI_EVENT_PINCH_UPDATE;
|
||||
e->gestures.nfingers = device->gesture_state.pinch.nfingers;
|
||||
e->gestures.scale = scale;
|
||||
e->gestures.degrees = rotation;
|
||||
e->gestures.dx = dx;
|
||||
e->gestures.dy = dy;
|
||||
|
||||
queue_event(ei_device_get_context(device), e);
|
||||
}
|
||||
|
||||
void
|
||||
ei_queue_pinch_end_event(struct ei_device *device, bool is_cancelled)
|
||||
{
|
||||
struct ei_event *e = ei_event_new_for_device(device);
|
||||
|
||||
e->type = EI_EVENT_PINCH_END;
|
||||
e->gestures.nfingers = device->gesture_state.pinch.nfingers;
|
||||
e->gestures.is_cancelled = is_cancelled;
|
||||
|
||||
queue_event(ei_device_get_context(device), e);
|
||||
}
|
||||
|
||||
void
|
||||
ei_queue_pinch_cancelled_event(struct ei_device *device)
|
||||
{
|
||||
struct ei_event *e = ei_event_new_for_device(device);
|
||||
|
||||
e->type = EI_EVENT_PINCH_CANCELLED;
|
||||
|
||||
queue_event(ei_device_get_context(device), e);
|
||||
}
|
||||
|
||||
void
|
||||
ei_queue_hold_begin_event(struct ei_device *device, uint32_t nfingers)
|
||||
{
|
||||
struct ei_event *e = ei_event_new_for_device(device);
|
||||
|
||||
e->type = EI_EVENT_HOLD_BEGIN;
|
||||
e->gestures.nfingers = nfingers;
|
||||
|
||||
queue_event(ei_device_get_context(device), e);
|
||||
}
|
||||
|
||||
void
|
||||
ei_queue_hold_end_event(struct ei_device *device, bool is_cancelled)
|
||||
{
|
||||
struct ei_event *e = ei_event_new_for_device(device);
|
||||
|
||||
e->type = EI_EVENT_HOLD_END;
|
||||
e->gestures.nfingers = device->gesture_state.hold.nfingers;
|
||||
e->gestures.is_cancelled = is_cancelled;
|
||||
|
||||
queue_event(ei_device_get_context(device), e);
|
||||
}
|
||||
|
||||
void
|
||||
ei_queue_hold_cancelled_event(struct ei_device *device)
|
||||
{
|
||||
struct ei_event *e = ei_event_new_for_device(device);
|
||||
|
||||
e->type = EI_EVENT_HOLD_CANCELLED;
|
||||
|
||||
queue_event(ei_device_get_context(device), e);
|
||||
}
|
||||
|
||||
void
|
||||
ei_queue_text_keysym_event(struct ei_device *device, uint32_t keysym, bool is_press)
|
||||
{
|
||||
|
|
|
|||
601
src/libei.h
601
src/libei.h
|
|
@ -215,39 +215,6 @@ struct ei_region;
|
|||
*/
|
||||
struct ei_touch;
|
||||
|
||||
/**
|
||||
* @struct ei_swipe
|
||||
*
|
||||
* A single swipe gesture.
|
||||
*
|
||||
* @see ei_device_swipe_new
|
||||
* @see ei_swipe_begin
|
||||
* @see ei_swipe_update
|
||||
* @see ei_swipe_end
|
||||
*/
|
||||
struct ei_swipe;
|
||||
/**
|
||||
* @struct ei_pinch
|
||||
*
|
||||
* A single pinch gesture.
|
||||
*
|
||||
* @see ei_device_pinch_new
|
||||
* @see ei_pinch_begin
|
||||
* @see ei_pinch_update
|
||||
* @see ei_pinch_end
|
||||
*/
|
||||
struct ei_pinch;
|
||||
/**
|
||||
* @struct ei_hold
|
||||
*
|
||||
* A single hold gesture.
|
||||
*
|
||||
* @see ei_device_hold_new
|
||||
* @see ei_hold_begin
|
||||
* @see ei_hold_end
|
||||
*/
|
||||
struct ei_hold;
|
||||
|
||||
/**
|
||||
* @struct ei_ping
|
||||
*
|
||||
|
|
@ -330,24 +297,12 @@ enum ei_device_capability {
|
|||
* The device can send button events
|
||||
*/
|
||||
EI_DEVICE_CAP_BUTTON = (1 << 5),
|
||||
/**
|
||||
* The device can send gesture events.
|
||||
*
|
||||
* The ei protocol separates available gestures
|
||||
* into swipe, pinch and hold and a device may support
|
||||
* any number of those independently. For simplicity,
|
||||
* the libei C API only provides one capability that
|
||||
* is set if the device supports any of those gestures.
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
EI_DEVICE_CAP_GESTURES = (1 << 6),
|
||||
/**
|
||||
* The device can send text-like data
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
EI_DEVICE_CAP_TEXT = (1 << 7),
|
||||
EI_DEVICE_CAP_TEXT = (1 << 6),
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
@ -451,7 +406,6 @@ enum ei_event_type {
|
|||
* - any buttons or keys logically down are released
|
||||
* - any modifiers logically down are released
|
||||
* - any touches logically down are released
|
||||
* - any gestures logically active are ended
|
||||
*
|
||||
* Sender clients must wait until @ref EI_EVENT_DEVICE_RESUMED
|
||||
* before sending events.
|
||||
|
|
@ -652,127 +606,6 @@ enum ei_event_type {
|
|||
*/
|
||||
EI_EVENT_TOUCH_MOTION,
|
||||
|
||||
/**
|
||||
* Event for a swipe begin. Only one swipe gesture may be active
|
||||
* at any time.
|
||||
*
|
||||
* @note This event is only generated on a receiver ei context.
|
||||
* See ei_device_swipe_new() and ei_swipe_begin() for the sender context API.
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
EI_EVENT_SWIPE_BEGIN = 900,
|
||||
/**
|
||||
* Event for an update to the current ongoing swipe gesture.
|
||||
*
|
||||
* This library accumulates all updates to the gesture within the same
|
||||
* device frame into one gesture event.
|
||||
*
|
||||
* @note This event is only generated on a receiver ei context.
|
||||
* See ei_device_swipe_new() and ei_swipe_update() for the sender context API.
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
EI_EVENT_SWIPE_UPDATE,
|
||||
/**
|
||||
* Event for the logical end to the current ongoing swipe gesture.
|
||||
*
|
||||
* @note This event is only generated on a receiver ei context.
|
||||
* See ei_device_swipe_new() and ei_swipe_end() for the sender context API.
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
EI_EVENT_SWIPE_END,
|
||||
/**
|
||||
* Event for an EIS-initiated cancellation of a gesture.
|
||||
*
|
||||
* If this event is received the current on going gesture should be
|
||||
* released without further updates or sending an end event (see
|
||||
* ei_swipe_unref()).
|
||||
*
|
||||
* @note This event is only generated on a sender ei context.
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
EI_EVENT_SWIPE_CANCELLED,
|
||||
|
||||
/**
|
||||
* Event for a pinch begin. Only one pinch gesture may be active
|
||||
* at any time.
|
||||
*
|
||||
* @note This event is only generated on a receiver ei context.
|
||||
* See ei_device_pinch_new() and ei_pinch_begin() for the sender context API.
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
EI_EVENT_PINCH_BEGIN = 910,
|
||||
/**
|
||||
* Event for an update to the current ongoing pinch gesture.
|
||||
*
|
||||
* This library accumulates all updates to the gesture within the same
|
||||
* device frame into one gesture event, e.g. where the gestures moves
|
||||
* and rotates only one update event is generated.
|
||||
*
|
||||
* @note This event is only generated on a receiver ei context.
|
||||
* See ei_device_pinch_new() and ei_pinch_update() for the sender context API.
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
EI_EVENT_PINCH_UPDATE,
|
||||
/**
|
||||
* Event for the logical end to the current ongoing pinch gesture.
|
||||
*
|
||||
* @note This event is only generated on a receiver ei context.
|
||||
* See ei_device_pinch_new() and ei_pinch_end() for the sender context API.
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
EI_EVENT_PINCH_END,
|
||||
/**
|
||||
* Event for an EIS-initiated cancellation of a gesture.
|
||||
*
|
||||
* If this event is received the current on going gesture should be
|
||||
* released without further updates or sending an end event (see
|
||||
* ei_pinch_unref()).
|
||||
*
|
||||
* @note This event is only generated on a sender ei context.
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
EI_EVENT_PINCH_CANCELLED,
|
||||
|
||||
/**
|
||||
* Event for a hold begin. Only one hold gesture may be active
|
||||
* at any time.
|
||||
*
|
||||
* @note This event is only generated on a receiver ei context.
|
||||
* See ei_device_hold_new() and ei_hold_begin() for the sender context API.
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
EI_EVENT_HOLD_BEGIN = 920,
|
||||
/**
|
||||
* Event for the logical end to the current ongoing hold gesture.
|
||||
*
|
||||
* @note This event is only generated on a receiver ei context.
|
||||
* See ei_device_hold_new() and ei_hold_end() for the sender context API.
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
EI_EVENT_HOLD_END,
|
||||
/**
|
||||
* Event for an EIS-initiated cancellation of a gesture.
|
||||
*
|
||||
* If this event is received the current on going gesture should be
|
||||
* released without further updates or sending an end event (see
|
||||
* ei_hold_unref()).
|
||||
*
|
||||
* @note This event is only generated on a sender ei context.
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
EI_EVENT_HOLD_CANCELLED,
|
||||
|
||||
/**
|
||||
* Event for a single keysym logically pressed/released on this device.
|
||||
* The keysym is an XKB-compatible keysym (not key code!) and may not be
|
||||
|
|
@ -783,7 +616,7 @@ enum ei_event_type {
|
|||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
EI_EVENT_TEXT_KEYSYM = 930,
|
||||
EI_EVENT_TEXT_KEYSYM = 900,
|
||||
|
||||
/**
|
||||
* Event for a UTF-8 compatible text sequence sent by this device.
|
||||
|
|
@ -2246,297 +2079,6 @@ ei_touch_get_user_data(struct ei_touch *touch);
|
|||
struct ei_device *
|
||||
ei_touch_get_device(struct ei_touch *touch);
|
||||
|
||||
/**
|
||||
* @ingroup libei-sender
|
||||
*
|
||||
* Initiate a new swipe gesture on a device with the @ref EI_DEVICE_CAP_GESTURES
|
||||
* capability. This gesture does not immediately send events, use
|
||||
* ei_swipe_begin(), ei_swipe_update() and ei_swipe_end().
|
||||
*
|
||||
* The returned gesture has a refcount of at least 1, use ei_swipe_unref() to
|
||||
* release resources associated with this gesture
|
||||
*
|
||||
* This method is only available on an ei sender context.
|
||||
*
|
||||
* If the underlying device does not support swipe gestures, this function
|
||||
* returns NULL.
|
||||
*
|
||||
* @param device A device with @ref EI_DEVICE_CAP_GESTURES capability
|
||||
* @param nfingers The number of fingers, must be greater than 0
|
||||
* @return A new swipe gesture or NULL on error
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
struct ei_swipe *
|
||||
ei_device_swipe_new(struct ei_device *device, uint32_t nfingers);
|
||||
|
||||
/**
|
||||
* @ingroup libei-sender
|
||||
*
|
||||
* Starts the swipe gesture.
|
||||
*
|
||||
* This function can only be called once on an ei_swipe object. Further
|
||||
* calls to ei_swipe_begin() on the same object are silently ignored.
|
||||
*
|
||||
* @param swipe A newly created swipe gesture
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
void
|
||||
ei_swipe_begin(struct ei_swipe *swipe);
|
||||
|
||||
/**
|
||||
* @ingroup libei-sender
|
||||
*
|
||||
* Update the swipe gestures's position by the given relative delta.
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
void
|
||||
ei_swipe_update(struct ei_swipe *swipe, double x, double y);
|
||||
|
||||
/**
|
||||
* @ingroup libei-sender
|
||||
*
|
||||
* Release this swipe. After this call, the swipe event becomes inert and
|
||||
* no longer responds to either ei_swipe_begin(),
|
||||
* ei_swipe_update(), ei_swipe_cancel() or
|
||||
* ei_swipe_end() and the caller should call ei_swipe_unref().
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
void
|
||||
ei_swipe_end(struct ei_swipe *swipe);
|
||||
|
||||
/**
|
||||
* @ingroup libei-sender
|
||||
*
|
||||
* Cancel this swipe. After this call, the swipe event becomes inert and
|
||||
* no longer responds to either ei_swipe_begin(),
|
||||
* ei_swipe_update(), ei_swipe_cancel() or
|
||||
* ei_swipe_end() and the caller should call ei_swipe_unref().
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
void
|
||||
ei_swipe_cancel(struct ei_swipe *swipe);
|
||||
|
||||
/**
|
||||
* @ingroup libei-sender
|
||||
*
|
||||
* Increase the refcount of this struct by one. Use ei_swipe_unref() to
|
||||
* decrease the refcount.
|
||||
*
|
||||
* @return the argument passed into the function
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
struct ei_swipe *
|
||||
ei_swipe_ref(struct ei_swipe *swipe);
|
||||
|
||||
/**
|
||||
* @ingroup libei-sender
|
||||
*
|
||||
* Decrease the refcount of this struct by one. When the refcount reaches
|
||||
* zero, all allocated resources for this struct are released.
|
||||
*
|
||||
* @return always NULL
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
struct ei_swipe *
|
||||
ei_swipe_unref(struct ei_swipe *swipe);
|
||||
|
||||
/**
|
||||
* @ingroup libei-sender
|
||||
*
|
||||
* Initiate a new pinch gesture on a device with the @ref EI_DEVICE_CAP_GESTURES
|
||||
* capability. This gesture does not immediately send events, use
|
||||
* ei_pinch_begin(), ei_pinch_update() and ei_pinch_end().
|
||||
*
|
||||
* The returned gesture has a refcount of at least 1, use ei_pinch_unref() to
|
||||
* release resources associated with this gesture
|
||||
*
|
||||
* This method is only available on an ei sender context.
|
||||
*
|
||||
* If the underlying device does not support pinch gestures, this function
|
||||
* returns NULL.
|
||||
*
|
||||
* @param device A device with @ref EI_DEVICE_CAP_GESTURES capability
|
||||
* @param nfingers The number of fingers, must be at least 2
|
||||
* @return A new pinch gesture or NULL on error
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
struct ei_pinch *
|
||||
ei_device_pinch_new(struct ei_device *device, uint32_t nfingers);
|
||||
|
||||
/**
|
||||
* @ingroup libei-sender
|
||||
*
|
||||
* Starts the pinch gesture.
|
||||
*
|
||||
* This function can only be called once on an ei_pinch object. Further
|
||||
* calls to ei_pinch_begin() on the same object are silently ignored.
|
||||
*
|
||||
* @param pinch A newly created pinch gesture
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
void
|
||||
ei_pinch_begin(struct ei_pinch *pinch);
|
||||
|
||||
/**
|
||||
* @ingroup libei-sender
|
||||
*
|
||||
* Update the pinch gestures's position by the given relative delta.
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
void
|
||||
ei_pinch_update(struct ei_pinch *pinch, double x, double y, double scale, double rotation);
|
||||
|
||||
/**
|
||||
* @ingroup libei-sender
|
||||
*
|
||||
* Release this pinch. After this call, the pinch event becomes inert and
|
||||
* no longer responds to either ei_pinch_begin(),
|
||||
* ei_pinch_update(), ei_pinch_cancel() or
|
||||
* ei_pinch_end() and the caller should call ei_pinch_unref().
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
void
|
||||
ei_pinch_end(struct ei_pinch *pinch);
|
||||
|
||||
/**
|
||||
* @ingroup libei-sender
|
||||
*
|
||||
* Cancel this pinch. After this call, the pinch event becomes inert and
|
||||
* no longer responds to either ei_pinch_begin(),
|
||||
* ei_pinch_update(), ei_pinch_cancel() or
|
||||
* ei_pinch_end() and the caller should call ei_pinch_unref().
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
void
|
||||
ei_pinch_cancel(struct ei_pinch *pinch);
|
||||
|
||||
/**
|
||||
* @ingroup libei-sender
|
||||
*
|
||||
* Increase the refcount of this struct by one. Use ei_pinch_unref() to
|
||||
* decrease the refcount.
|
||||
*
|
||||
* @return the argument passed into the function
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
struct ei_pinch *
|
||||
ei_pinch_ref(struct ei_pinch *pinch);
|
||||
|
||||
/**
|
||||
* @ingroup libei-sender
|
||||
*
|
||||
* Decrease the refcount of this struct by one. When the refcount reaches
|
||||
* zero, all allocated resources for this struct are released.
|
||||
*
|
||||
* @return always NULL
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
struct ei_pinch *
|
||||
ei_pinch_unref(struct ei_pinch *pinch);
|
||||
|
||||
/**
|
||||
* @ingroup libei-sender
|
||||
*
|
||||
* Initiate a new hold gesture on a device with the @ref EI_DEVICE_CAP_GESTURES
|
||||
* capability. This gesture does not immediately send events, use
|
||||
* ei_hold_begin() and ei_hold_end().
|
||||
*
|
||||
* The returned gesture has a refcount of at least 1, use ei_hold_unref() to
|
||||
* release resources associated with this gesture
|
||||
*
|
||||
* This method is only available on an ei sender context.
|
||||
*
|
||||
* If the underlying device does not support hold gestures, this function
|
||||
* returns NULL.
|
||||
*
|
||||
* @param device A device with @ref EI_DEVICE_CAP_GESTURES capability
|
||||
* @param nfingers The number of fingers, must be greater than 0
|
||||
* @return A new hold gesture or NULL on error
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
struct ei_hold *
|
||||
ei_device_hold_new(struct ei_device *device, uint32_t nfingers);
|
||||
|
||||
/**
|
||||
* @ingroup libei-sender
|
||||
*
|
||||
* Starts the hold gesture.
|
||||
*
|
||||
* This function can only be called once on an ei_hold object. Further
|
||||
* calls to ei_hold_begin() on the same object are silently ignored.
|
||||
*
|
||||
* @param hold A newly created hold gesture
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
void
|
||||
ei_hold_begin(struct ei_hold *hold);
|
||||
|
||||
/**
|
||||
* @ingroup libei-sender
|
||||
*
|
||||
* Release this hold. After this call, the hold event becomes inert and
|
||||
* no longer responds to either ei_hold_begin(), ei_hold_cancel() or
|
||||
* ei_hold_end() and the caller should call ei_hold_unref().
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
void
|
||||
ei_hold_end(struct ei_hold *hold);
|
||||
|
||||
/**
|
||||
* @ingroup libei-sender
|
||||
*
|
||||
* Cancel this hold. After this call, the hold event becomes inert and
|
||||
* no longer responds to either ei_hold_begin(), ei_hold_cancel() or
|
||||
* ei_hold_end() and the caller should call ei_hold_unref().
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
void
|
||||
ei_hold_cancel(struct ei_hold *hold);
|
||||
|
||||
/**
|
||||
* @ingroup libei-sender
|
||||
*
|
||||
* Increase the refcount of this struct by one. Use ei_hold_unref() to
|
||||
* decrease the refcount.
|
||||
*
|
||||
* @return the argument passed into the function
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
struct ei_hold *
|
||||
ei_hold_ref(struct ei_hold *hold);
|
||||
|
||||
/**
|
||||
* @ingroup libei-sender
|
||||
*
|
||||
* Decrease the refcount of this struct by one. When the refcount reaches
|
||||
* zero, all allocated resources for this struct are released.
|
||||
*
|
||||
* @return always NULL
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
struct ei_hold *
|
||||
ei_hold_unref(struct ei_hold *hold);
|
||||
|
||||
/**
|
||||
* Return the seat from this event.
|
||||
*
|
||||
|
|
@ -2799,145 +2341,6 @@ ei_event_touch_get_y(struct ei_event *event);
|
|||
bool
|
||||
ei_event_touch_get_is_cancel(struct ei_event *event);
|
||||
|
||||
/**
|
||||
* @ingroup libei-receiver
|
||||
*
|
||||
* For an event of type @ref EI_EVENT_SWIPE_BEGIN,
|
||||
* @ref EI_EVENT_SWIPE_UPDATE or @ref EI_EVENT_SWIPE_END
|
||||
* return the finger count for this gesture.
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
uint32_t
|
||||
ei_event_swipe_get_finger_count(struct ei_event *event);
|
||||
|
||||
/**
|
||||
* @ingroup libei-receiver
|
||||
*
|
||||
* For an event of type @ref EI_EVENT_SWIPE_UPDATE
|
||||
* return the relative x movement of the logical center
|
||||
* of the gesture in logical pixels or mm, depending on the device type.
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
double
|
||||
ei_event_swipe_get_dx(struct ei_event *event);
|
||||
|
||||
/**
|
||||
* @ingroup libei-receiver
|
||||
*
|
||||
* For an event of type @ref EI_EVENT_SWIPE_UPDATE
|
||||
* return the relative y movement of the logical center
|
||||
* of the gesture in logical pixels or mm, depending on the device type.
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
double
|
||||
ei_event_swipe_get_dy(struct ei_event *event);
|
||||
|
||||
/**
|
||||
* @ingroup libei-receiver
|
||||
*
|
||||
* For an event of type @ref EI_EVENT_SWIPE_END
|
||||
* return true if the gesture was cancelled, false otherwise.
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
bool
|
||||
ei_event_swipe_get_is_cancelled(struct ei_event *event);
|
||||
|
||||
/**
|
||||
* @ingroup libei-receiver
|
||||
*
|
||||
* For an event of type @ref EI_EVENT_PINCH_BEGIN,
|
||||
* @ref EI_EVENT_PINCH_UPDATE or @ref EI_EVENT_PINCH_END
|
||||
* return the finger count for this gesture.
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
uint32_t
|
||||
ei_event_pinch_get_finger_count(struct ei_event *event);
|
||||
|
||||
/**
|
||||
* @ingroup libei-receiver
|
||||
*
|
||||
* For an event of type @ref EI_EVENT_PINCH_UPDATE
|
||||
* return the relative x movement of the logical center
|
||||
* of the gesture in logical pixels or mm, depending on the device type.
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
double
|
||||
ei_event_pinch_get_dx(struct ei_event *event);
|
||||
|
||||
/**
|
||||
* @ingroup libei-receiver
|
||||
*
|
||||
* For an event of type @ref EI_EVENT_PINCH_UPDATE
|
||||
* return the relative y movement of the logical center
|
||||
* of the gesture in logical pixels or mm, depending on the device type.
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
double
|
||||
ei_event_pinch_get_dy(struct ei_event *event);
|
||||
|
||||
/**
|
||||
* @ingroup libei-receiver
|
||||
*
|
||||
* For an event of type @ref EI_EVENT_PINCH_UPDATE
|
||||
* return the relative angle of rotation in degrees clockwise.
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
double
|
||||
ei_event_pinch_get_rotation(struct ei_event *event);
|
||||
|
||||
/**
|
||||
* @ingroup libei-receiver
|
||||
*
|
||||
* For an event of type @ref EI_EVENT_PINCH_UPDATE
|
||||
* return the normalized scale of the gesture.
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
double
|
||||
ei_event_pinch_get_scale(struct ei_event *event);
|
||||
|
||||
/**
|
||||
* @ingroup libei-receiver
|
||||
*
|
||||
* For an event of type @ref EI_EVENT_PINCH_END
|
||||
* return true if the gesture was cancelled, false otherwise.
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
bool
|
||||
ei_event_pinch_get_is_cancelled(struct ei_event *event);
|
||||
|
||||
/**
|
||||
* @ingroup libei-receiver
|
||||
*
|
||||
* For an event of type @ref EI_EVENT_HOLD_BEGIN
|
||||
* or @ref EI_EVENT_HOLD_END
|
||||
* return the finger count for this gesture.
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
uint32_t
|
||||
ei_event_hold_get_finger_count(struct ei_event *event);
|
||||
|
||||
/**
|
||||
* @ingroup libei-receiver
|
||||
*
|
||||
* For an event of type @ref EI_EVENT_HOLD_END
|
||||
* return true if the gesture was cancelled, false otherwise.
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
bool
|
||||
ei_event_hold_get_is_cancelled(struct ei_event *event);
|
||||
|
||||
/**
|
||||
* @ingroup libei-receiver
|
||||
*
|
||||
|
|
|
|||
|
|
@ -539,9 +539,6 @@ eis_client_new(struct eis *eis, int fd)
|
|||
.ei_keyboard = VERSION_V(1),
|
||||
.ei_text = VERSION_V(1),
|
||||
.ei_touchscreen = VERSION_V(2),
|
||||
.ei_gesture_swipe = VERSION_V(1),
|
||||
.ei_gesture_pinch = VERSION_V(1),
|
||||
.ei_gesture_hold = VERSION_V(1),
|
||||
};
|
||||
struct source *s = source_new(fd, client_dispatch, client);
|
||||
int rc = sink_add_source(eis->sink, s);
|
||||
|
|
|
|||
|
|
@ -52,9 +52,6 @@ struct eis_client_interface_versions {
|
|||
uint32_t ei_button;
|
||||
uint32_t ei_keyboard;
|
||||
uint32_t ei_touchscreen;
|
||||
uint32_t ei_gesture_swipe;
|
||||
uint32_t ei_gesture_pinch;
|
||||
uint32_t ei_gesture_hold;
|
||||
uint32_t ei_text;
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -33,7 +33,6 @@
|
|||
#include "util-time.h"
|
||||
|
||||
#include "eis-proto.h"
|
||||
#include "libeis-gestures.h"
|
||||
#include "libeis-private.h"
|
||||
|
||||
static_assert((int)EIS_DEVICE_TYPE_VIRTUAL == EIS_DEVICE_DEVICE_TYPE_VIRTUAL, "ABI mismatch");
|
||||
|
|
@ -148,9 +147,6 @@ eis_device_destroy(struct eis_device *device)
|
|||
eis_pointer_unref(device->pointer);
|
||||
eis_touchscreen_unref(device->touchscreen);
|
||||
eis_keyboard_unref(device->keyboard);
|
||||
eis_gesture_swipe_unref(device->swipe);
|
||||
eis_gesture_pinch_unref(device->pinch);
|
||||
eis_gesture_hold_unref(device->hold);
|
||||
eis_text_unref(device->text);
|
||||
|
||||
free(device->name);
|
||||
|
|
@ -816,309 +812,6 @@ eis_device_get_touchscreen_interface(struct eis_device *device)
|
|||
return &touchscreen_interface;
|
||||
}
|
||||
|
||||
static struct brei_result *
|
||||
client_msg_gesture_swipe_release(struct eis_gesture_swipe *swipe)
|
||||
{
|
||||
struct eis_device *device = eis_gesture_swipe_get_device(swipe);
|
||||
|
||||
if (!eis_device_has_capability(device, EIS_DEVICE_CAP_GESTURES)) {
|
||||
return brei_result_new(EIS_CONNECTION_DISCONNECT_REASON_PROTOCOL,
|
||||
"swipe release event for non-gesture device");
|
||||
}
|
||||
|
||||
if (device->swipe) {
|
||||
eis_gesture_swipe_event_destroyed(
|
||||
device->swipe,
|
||||
eis_client_get_next_serial(eis_device_get_client(device)));
|
||||
eis_gesture_swipe_unref(steal(&device->swipe));
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct brei_result *
|
||||
client_msg_gesture_swipe_begin(struct eis_gesture_swipe *swipe, uint32_t nfingers)
|
||||
{
|
||||
struct eis_device *device = eis_gesture_swipe_get_device(swipe);
|
||||
|
||||
DISCONNECT_IF_RECEIVER_CONTEXT(device);
|
||||
|
||||
if (!eis_device_has_capability(device, EIS_DEVICE_CAP_GESTURES)) {
|
||||
return brei_result_new(EIS_CONNECTION_DISCONNECT_REASON_PROTOCOL,
|
||||
"Swipe begin event for non-gesture device");
|
||||
}
|
||||
|
||||
if (nfingers == 0) {
|
||||
return brei_result_new(EIS_CONNECTION_DISCONNECT_REASON_PROTOCOL,
|
||||
"Swipe begin event with zero fingers");
|
||||
}
|
||||
|
||||
if (device->state == EIS_DEVICE_STATE_EMULATING) {
|
||||
if (device->gesture_state.swipe.is_active) {
|
||||
return brei_result_new(EIS_CONNECTION_DISCONNECT_REASON_PROTOCOL,
|
||||
"Swipe begin event while swipe is active");
|
||||
}
|
||||
device->gesture_state.swipe.is_active = true;
|
||||
device->gesture_state.swipe.nfingers = nfingers;
|
||||
eis_queue_swipe_begin_event(device, nfingers);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return maybe_error_on_device_state(device, "swipe begin");
|
||||
}
|
||||
|
||||
static struct brei_result *
|
||||
client_msg_gesture_swipe_update(struct eis_gesture_swipe *swipe, float dx, float dy)
|
||||
{
|
||||
struct eis_device *device = eis_gesture_swipe_get_device(swipe);
|
||||
|
||||
DISCONNECT_IF_RECEIVER_CONTEXT(device);
|
||||
|
||||
if (!eis_device_has_capability(device, EIS_DEVICE_CAP_GESTURES)) {
|
||||
return brei_result_new(EIS_CONNECTION_DISCONNECT_REASON_PROTOCOL,
|
||||
"Swipe update event for non-gesture device");
|
||||
}
|
||||
|
||||
if (device->gesture_state.swipe.is_active) {
|
||||
if (device->state == EIS_DEVICE_STATE_EMULATING)
|
||||
eis_queue_swipe_update_event(device, dx, dy);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return maybe_error_on_device_state(device, "swipe update");
|
||||
}
|
||||
|
||||
static struct brei_result *
|
||||
client_msg_gesture_swipe_end(struct eis_gesture_swipe *swipe, uint32_t is_cancelled)
|
||||
{
|
||||
struct eis_device *device = eis_gesture_swipe_get_device(swipe);
|
||||
|
||||
DISCONNECT_IF_RECEIVER_CONTEXT(device);
|
||||
|
||||
if (!eis_device_has_capability(device, EIS_DEVICE_CAP_GESTURES)) {
|
||||
return brei_result_new(EIS_CONNECTION_DISCONNECT_REASON_PROTOCOL,
|
||||
"Swipe end event for non-gesture device");
|
||||
}
|
||||
|
||||
if (device->gesture_state.swipe.is_active) {
|
||||
if (device->state == EIS_DEVICE_STATE_EMULATING)
|
||||
eis_queue_swipe_end_event(device, !!is_cancelled);
|
||||
device->gesture_state.swipe.is_active = false;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return maybe_error_on_device_state(device, "swipe end");
|
||||
}
|
||||
|
||||
static const struct eis_gesture_swipe_interface swipe_interface = {
|
||||
.release = client_msg_gesture_swipe_release,
|
||||
.begin = client_msg_gesture_swipe_begin,
|
||||
.update = client_msg_gesture_swipe_update,
|
||||
.end = client_msg_gesture_swipe_end,
|
||||
};
|
||||
|
||||
const struct eis_gesture_swipe_interface *
|
||||
eis_device_get_gesture_swipe_interface(struct eis_device *device)
|
||||
{
|
||||
return &swipe_interface;
|
||||
}
|
||||
|
||||
static struct brei_result *
|
||||
client_msg_gesture_pinch_release(struct eis_gesture_pinch *pinch)
|
||||
{
|
||||
struct eis_device *device = eis_gesture_pinch_get_device(pinch);
|
||||
|
||||
if (!eis_device_has_capability(device, EIS_DEVICE_CAP_GESTURES)) {
|
||||
return brei_result_new(EIS_CONNECTION_DISCONNECT_REASON_PROTOCOL,
|
||||
"Pinch release event for non-gesture device");
|
||||
}
|
||||
|
||||
if (device->pinch) {
|
||||
eis_gesture_pinch_event_destroyed(
|
||||
device->pinch,
|
||||
eis_client_get_next_serial(eis_device_get_client(device)));
|
||||
eis_gesture_pinch_unref(steal(&device->pinch));
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct brei_result *
|
||||
client_msg_gesture_pinch_begin(struct eis_gesture_pinch *pinch, uint32_t nfingers)
|
||||
{
|
||||
struct eis_device *device = eis_gesture_pinch_get_device(pinch);
|
||||
|
||||
DISCONNECT_IF_RECEIVER_CONTEXT(device);
|
||||
|
||||
if (!eis_device_has_capability(device, EIS_DEVICE_CAP_GESTURES)) {
|
||||
return brei_result_new(EIS_CONNECTION_DISCONNECT_REASON_PROTOCOL,
|
||||
"Pinch begin event for non-gesture device");
|
||||
}
|
||||
|
||||
if (nfingers < 2) {
|
||||
return brei_result_new(EIS_CONNECTION_DISCONNECT_REASON_PROTOCOL,
|
||||
"Pinch begin event with fewer than 2 fingers");
|
||||
}
|
||||
|
||||
if (device->state == EIS_DEVICE_STATE_EMULATING) {
|
||||
if (device->gesture_state.pinch.is_active) {
|
||||
return brei_result_new(EIS_CONNECTION_DISCONNECT_REASON_PROTOCOL,
|
||||
"Pinch begin event while pinch is active");
|
||||
}
|
||||
device->gesture_state.pinch.is_active = true;
|
||||
device->gesture_state.pinch.nfingers = nfingers;
|
||||
eis_queue_pinch_begin_event(device, nfingers);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return maybe_error_on_device_state(device, "pinch begin");
|
||||
}
|
||||
|
||||
static struct brei_result *
|
||||
client_msg_gesture_pinch_update(struct eis_gesture_pinch *pinch,
|
||||
float dx,
|
||||
float dy,
|
||||
float scale,
|
||||
float rotation)
|
||||
{
|
||||
struct eis_device *device = eis_gesture_pinch_get_device(pinch);
|
||||
|
||||
DISCONNECT_IF_RECEIVER_CONTEXT(device);
|
||||
|
||||
if (!eis_device_has_capability(device, EIS_DEVICE_CAP_GESTURES)) {
|
||||
return brei_result_new(EIS_CONNECTION_DISCONNECT_REASON_PROTOCOL,
|
||||
"Pinch update event for non-gesture device");
|
||||
}
|
||||
|
||||
if (device->gesture_state.pinch.is_active) {
|
||||
if (device->state == EIS_DEVICE_STATE_EMULATING)
|
||||
eis_queue_pinch_update_event(device, dx, dy, scale, rotation);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return maybe_error_on_device_state(device, "pinch update");
|
||||
}
|
||||
|
||||
static struct brei_result *
|
||||
client_msg_gesture_pinch_end(struct eis_gesture_pinch *pinch, uint32_t is_cancelled)
|
||||
{
|
||||
struct eis_device *device = eis_gesture_pinch_get_device(pinch);
|
||||
|
||||
DISCONNECT_IF_RECEIVER_CONTEXT(device);
|
||||
|
||||
if (!eis_device_has_capability(device, EIS_DEVICE_CAP_GESTURES)) {
|
||||
return brei_result_new(EIS_CONNECTION_DISCONNECT_REASON_PROTOCOL,
|
||||
"Pinch end event for non-gesture device");
|
||||
}
|
||||
|
||||
if (device->gesture_state.pinch.is_active) {
|
||||
if (device->state == EIS_DEVICE_STATE_EMULATING)
|
||||
eis_queue_pinch_end_event(device, !!is_cancelled);
|
||||
device->gesture_state.pinch.is_active = false;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return maybe_error_on_device_state(device, "pinch end");
|
||||
}
|
||||
|
||||
static const struct eis_gesture_pinch_interface pinch_interface = {
|
||||
.release = client_msg_gesture_pinch_release,
|
||||
.begin = client_msg_gesture_pinch_begin,
|
||||
.update = client_msg_gesture_pinch_update,
|
||||
.end = client_msg_gesture_pinch_end,
|
||||
};
|
||||
|
||||
const struct eis_gesture_pinch_interface *
|
||||
eis_device_get_gesture_pinch_interface(struct eis_device *device)
|
||||
{
|
||||
return &pinch_interface;
|
||||
}
|
||||
|
||||
static struct brei_result *
|
||||
client_msg_gesture_hold_release(struct eis_gesture_hold *hold)
|
||||
{
|
||||
struct eis_device *device = eis_gesture_hold_get_device(hold);
|
||||
|
||||
if (!eis_device_has_capability(device, EIS_DEVICE_CAP_GESTURES)) {
|
||||
return brei_result_new(EIS_CONNECTION_DISCONNECT_REASON_PROTOCOL,
|
||||
"hold release event for non-gesture device");
|
||||
}
|
||||
|
||||
if (device->hold) {
|
||||
eis_gesture_hold_event_destroyed(
|
||||
device->hold,
|
||||
eis_client_get_next_serial(eis_device_get_client(device)));
|
||||
eis_gesture_hold_unref(steal(&device->hold));
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct brei_result *
|
||||
client_msg_gesture_hold_begin(struct eis_gesture_hold *hold, uint32_t nfingers)
|
||||
{
|
||||
struct eis_device *device = eis_gesture_hold_get_device(hold);
|
||||
|
||||
DISCONNECT_IF_RECEIVER_CONTEXT(device);
|
||||
|
||||
if (!eis_device_has_capability(device, EIS_DEVICE_CAP_GESTURES)) {
|
||||
return brei_result_new(EIS_CONNECTION_DISCONNECT_REASON_PROTOCOL,
|
||||
"Hold begin event for non-gesture device");
|
||||
}
|
||||
|
||||
if (nfingers == 0) {
|
||||
return brei_result_new(EIS_CONNECTION_DISCONNECT_REASON_PROTOCOL,
|
||||
"Hold begin event with zero fingers");
|
||||
}
|
||||
|
||||
if (device->state == EIS_DEVICE_STATE_EMULATING) {
|
||||
if (device->gesture_state.hold.is_active) {
|
||||
return brei_result_new(EIS_CONNECTION_DISCONNECT_REASON_PROTOCOL,
|
||||
"Hold begin event while hold is active");
|
||||
}
|
||||
device->gesture_state.hold.is_active = true;
|
||||
device->gesture_state.hold.nfingers = nfingers;
|
||||
eis_queue_hold_begin_event(device, nfingers);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return maybe_error_on_device_state(device, "hold begin");
|
||||
}
|
||||
|
||||
static struct brei_result *
|
||||
client_msg_gesture_hold_end(struct eis_gesture_hold *hold, uint32_t is_cancelled)
|
||||
{
|
||||
struct eis_device *device = eis_gesture_hold_get_device(hold);
|
||||
|
||||
DISCONNECT_IF_RECEIVER_CONTEXT(device);
|
||||
|
||||
if (!eis_device_has_capability(device, EIS_DEVICE_CAP_GESTURES)) {
|
||||
return brei_result_new(EIS_CONNECTION_DISCONNECT_REASON_PROTOCOL,
|
||||
"Hold end event for non-gesture device");
|
||||
}
|
||||
|
||||
if (device->gesture_state.hold.is_active) {
|
||||
if (device->state == EIS_DEVICE_STATE_EMULATING)
|
||||
eis_queue_hold_end_event(device, !!is_cancelled);
|
||||
device->gesture_state.hold.is_active = false;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return maybe_error_on_device_state(device, "hold end");
|
||||
}
|
||||
|
||||
static const struct eis_gesture_hold_interface hold_interface = {
|
||||
.release = client_msg_gesture_hold_release,
|
||||
.begin = client_msg_gesture_hold_begin,
|
||||
.end = client_msg_gesture_hold_end,
|
||||
};
|
||||
|
||||
const struct eis_gesture_hold_interface *
|
||||
eis_device_get_gesture_hold_interface(struct eis_device *device)
|
||||
{
|
||||
return &hold_interface;
|
||||
}
|
||||
|
||||
static struct brei_result *
|
||||
client_msg_text_release(struct eis_text *text)
|
||||
{
|
||||
|
|
@ -1265,7 +958,6 @@ eis_device_configure_capability(struct eis_device *device, enum eis_device_capab
|
|||
case EIS_DEVICE_CAP_TOUCH:
|
||||
case EIS_DEVICE_CAP_BUTTON:
|
||||
case EIS_DEVICE_CAP_SCROLL:
|
||||
case EIS_DEVICE_CAP_GESTURES:
|
||||
case EIS_DEVICE_CAP_TEXT:
|
||||
mask_add(device->capabilities, cap);
|
||||
break;
|
||||
|
|
@ -1415,31 +1107,6 @@ eis_device_add(struct eis_device *device)
|
|||
if (rc < 0)
|
||||
goto out;
|
||||
}
|
||||
if (eis_device_has_capability(device, EIS_DEVICE_CAP_GESTURES)) {
|
||||
device->swipe = eis_gesture_swipe_new(device);
|
||||
rc = eis_device_event_interface(device,
|
||||
eis_gesture_swipe_get_id(device->swipe),
|
||||
EIS_GESTURE_SWIPE_INTERFACE_NAME,
|
||||
eis_gesture_swipe_get_version(device->swipe));
|
||||
if (rc < 0)
|
||||
goto out;
|
||||
|
||||
device->pinch = eis_gesture_pinch_new(device);
|
||||
rc = eis_device_event_interface(device,
|
||||
eis_gesture_pinch_get_id(device->pinch),
|
||||
EIS_GESTURE_PINCH_INTERFACE_NAME,
|
||||
eis_gesture_pinch_get_version(device->pinch));
|
||||
if (rc < 0)
|
||||
goto out;
|
||||
|
||||
device->hold = eis_gesture_hold_new(device);
|
||||
rc = eis_device_event_interface(device,
|
||||
eis_gesture_hold_get_id(device->hold),
|
||||
EIS_GESTURE_HOLD_INTERFACE_NAME,
|
||||
eis_gesture_hold_get_version(device->hold));
|
||||
if (rc < 0)
|
||||
goto out;
|
||||
}
|
||||
if (eis_device_has_capability(device, EIS_DEVICE_CAP_TEXT)) {
|
||||
device->text = eis_text_new(device);
|
||||
rc = eis_device_event_interface(device,
|
||||
|
|
@ -1508,20 +1175,6 @@ eis_device_remove(struct eis_device *device)
|
|||
eis_keyboard_event_destroyed(device->keyboard, eis_client_get_next_serial(client));
|
||||
eis_keyboard_unref(steal(&device->keyboard));
|
||||
}
|
||||
if (device->swipe) {
|
||||
eis_gesture_swipe_event_destroyed(device->swipe,
|
||||
eis_client_get_next_serial(client));
|
||||
eis_gesture_swipe_unref(steal(&device->swipe));
|
||||
}
|
||||
if (device->pinch) {
|
||||
eis_gesture_pinch_event_destroyed(device->pinch,
|
||||
eis_client_get_next_serial(client));
|
||||
eis_gesture_pinch_unref(steal(&device->pinch));
|
||||
}
|
||||
if (device->hold) {
|
||||
eis_gesture_hold_event_destroyed(device->hold, eis_client_get_next_serial(client));
|
||||
eis_gesture_hold_unref(steal(&device->hold));
|
||||
}
|
||||
if (device->text) {
|
||||
eis_text_event_destroyed(device->text, eis_client_get_next_serial(client));
|
||||
eis_text_unref(steal(&device->text));
|
||||
|
|
@ -1552,7 +1205,6 @@ eis_device_has_capability(struct eis_device *device, enum eis_device_capability
|
|||
case EIS_DEVICE_CAP_TOUCH:
|
||||
case EIS_DEVICE_CAP_BUTTON:
|
||||
case EIS_DEVICE_CAP_SCROLL:
|
||||
case EIS_DEVICE_CAP_GESTURES:
|
||||
case EIS_DEVICE_CAP_TEXT:
|
||||
return mask_all(device->capabilities, cap);
|
||||
}
|
||||
|
|
@ -2069,9 +1721,6 @@ eis_device_pause(struct eis_device *device)
|
|||
for (size_t i = 0; i < ARRAY_LENGTH(device->touch_state.down); i++) {
|
||||
device->touch_state.down[i] = UINT64_MAX;
|
||||
}
|
||||
device->gesture_state.swipe.is_active = false;
|
||||
device->gesture_state.pinch.is_active = false;
|
||||
device->gesture_state.hold.is_active = false;
|
||||
}
|
||||
|
||||
_public_ void
|
||||
|
|
@ -2113,90 +1762,3 @@ eis_device_keyboard_send_xkb_modifiers(struct eis_device *device,
|
|||
latched,
|
||||
group);
|
||||
}
|
||||
|
||||
_public_ void
|
||||
eis_device_swipe_cancel(struct eis_device *device)
|
||||
{
|
||||
if (!eis_device_has_capability(device, EIS_DEVICE_CAP_GESTURES)) {
|
||||
log_bug_client(eis_device_get_context(device),
|
||||
"%s: device is not a gesture device",
|
||||
__func__);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!device->swipe)
|
||||
return;
|
||||
|
||||
if (!device->gesture_state.swipe.is_active)
|
||||
return;
|
||||
|
||||
device->gesture_state.swipe.is_active = false;
|
||||
struct eis_client *client = eis_device_get_client(device);
|
||||
eis_gesture_swipe_event_cancelled(device->swipe, eis_client_get_next_serial(client));
|
||||
}
|
||||
|
||||
_public_ void
|
||||
eis_device_pinch_cancel(struct eis_device *device)
|
||||
{
|
||||
if (!eis_device_has_capability(device, EIS_DEVICE_CAP_GESTURES)) {
|
||||
log_bug_client(eis_device_get_context(device),
|
||||
"%s: device is not a gesture device",
|
||||
__func__);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!device->pinch)
|
||||
return;
|
||||
|
||||
if (!device->gesture_state.pinch.is_active)
|
||||
return;
|
||||
|
||||
device->gesture_state.pinch.is_active = false;
|
||||
struct eis_client *client = eis_device_get_client(device);
|
||||
eis_gesture_pinch_event_cancelled(device->pinch, eis_client_get_next_serial(client));
|
||||
}
|
||||
|
||||
_public_ void
|
||||
eis_device_hold_cancel(struct eis_device *device)
|
||||
{
|
||||
if (!eis_device_has_capability(device, EIS_DEVICE_CAP_GESTURES)) {
|
||||
log_bug_client(eis_device_get_context(device),
|
||||
"%s: device is not a gesture device",
|
||||
__func__);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!device->hold)
|
||||
return;
|
||||
|
||||
if (!device->gesture_state.hold.is_active)
|
||||
return;
|
||||
|
||||
device->gesture_state.hold.is_active = false;
|
||||
struct eis_client *client = eis_device_get_client(device);
|
||||
eis_gesture_hold_event_cancelled(device->hold, eis_client_get_next_serial(client));
|
||||
}
|
||||
|
||||
_public_ struct eis_swipe *
|
||||
eis_device_swipe_new(struct eis_device *device, uint32_t nfingers)
|
||||
{
|
||||
struct eis_swipe *swipe = eis_swipe_new(device, nfingers);
|
||||
|
||||
return swipe;
|
||||
}
|
||||
|
||||
_public_ struct eis_pinch *
|
||||
eis_device_pinch_new(struct eis_device *device, uint32_t nfingers)
|
||||
{
|
||||
struct eis_pinch *pinch = eis_pinch_new(device, nfingers);
|
||||
|
||||
return pinch;
|
||||
}
|
||||
|
||||
_public_ struct eis_hold *
|
||||
eis_device_hold_new(struct eis_device *device, uint32_t nfingers)
|
||||
{
|
||||
struct eis_hold *hold = eis_hold_new(device, nfingers);
|
||||
|
||||
return hold;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -58,9 +58,6 @@ struct eis_device {
|
|||
struct eis_button *button;
|
||||
struct eis_keyboard *keyboard;
|
||||
struct eis_touchscreen *touchscreen;
|
||||
struct eis_gesture_swipe *swipe;
|
||||
struct eis_gesture_pinch *pinch;
|
||||
struct eis_gesture_hold *hold;
|
||||
struct eis_text *text;
|
||||
|
||||
char *name;
|
||||
|
|
@ -92,33 +89,6 @@ struct eis_device {
|
|||
struct {
|
||||
uint64_t down[EIS_MAX_TOUCHES]; /* touch id */
|
||||
} touch_state;
|
||||
|
||||
struct {
|
||||
struct {
|
||||
/* receiver */
|
||||
bool is_active;
|
||||
uint32_t nfingers;
|
||||
|
||||
/* sender */
|
||||
struct eis_swipe *current_swipe; /* no ref! */
|
||||
} swipe;
|
||||
struct {
|
||||
/* receiver */
|
||||
bool is_active;
|
||||
uint32_t nfingers;
|
||||
|
||||
/* sender */
|
||||
struct eis_pinch *current_pinch; /* no ref! */
|
||||
} pinch;
|
||||
struct {
|
||||
/* receiver */
|
||||
bool is_active;
|
||||
uint32_t nfingers;
|
||||
|
||||
/* sender */
|
||||
struct eis_hold *current_hold; /* no ref! */
|
||||
} hold;
|
||||
} gesture_state;
|
||||
};
|
||||
|
||||
struct eis_touch {
|
||||
|
|
@ -163,15 +133,6 @@ OBJECT_DECLARE_GETTER(eis_device, scroll_interface, const struct eis_scroll_inte
|
|||
OBJECT_DECLARE_GETTER(eis_device, button_interface, const struct eis_button_interface *);
|
||||
OBJECT_DECLARE_GETTER(eis_device, keyboard_interface, const struct eis_keyboard_interface *);
|
||||
OBJECT_DECLARE_GETTER(eis_device, touchscreen_interface, const struct eis_touchscreen_interface *);
|
||||
OBJECT_DECLARE_GETTER(eis_device,
|
||||
gesture_swipe_interface,
|
||||
const struct eis_gesture_swipe_interface *);
|
||||
OBJECT_DECLARE_GETTER(eis_device,
|
||||
gesture_pinch_interface,
|
||||
const struct eis_gesture_pinch_interface *);
|
||||
OBJECT_DECLARE_GETTER(eis_device,
|
||||
gesture_hold_interface,
|
||||
const struct eis_gesture_hold_interface *);
|
||||
OBJECT_DECLARE_GETTER(eis_device, text_interface, const struct eis_text_interface *);
|
||||
|
||||
static inline bool
|
||||
|
|
|
|||
|
|
@ -58,14 +58,6 @@ eis_event_destroy(struct eis_event *event)
|
|||
case EIS_EVENT_TOUCH_MOTION:
|
||||
case EIS_EVENT_TOUCH_UP:
|
||||
case EIS_EVENT_FRAME:
|
||||
case EIS_EVENT_SWIPE_BEGIN:
|
||||
case EIS_EVENT_SWIPE_UPDATE:
|
||||
case EIS_EVENT_SWIPE_END:
|
||||
case EIS_EVENT_PINCH_BEGIN:
|
||||
case EIS_EVENT_PINCH_UPDATE:
|
||||
case EIS_EVENT_PINCH_END:
|
||||
case EIS_EVENT_HOLD_BEGIN:
|
||||
case EIS_EVENT_HOLD_END:
|
||||
case EIS_EVENT_TEXT_KEYSYM:
|
||||
handled = true;
|
||||
break;
|
||||
|
|
@ -228,7 +220,6 @@ eis_event_seat_has_capability(struct eis_event *event, enum eis_device_capabilit
|
|||
case EIS_DEVICE_CAP_TOUCH:
|
||||
case EIS_DEVICE_CAP_BUTTON:
|
||||
case EIS_DEVICE_CAP_SCROLL:
|
||||
case EIS_DEVICE_CAP_GESTURES:
|
||||
case EIS_DEVICE_CAP_TEXT:
|
||||
return mask_all(event->bind.capabilities, cap);
|
||||
}
|
||||
|
|
@ -445,110 +436,6 @@ eis_event_touch_get_is_cancel(struct eis_event *event)
|
|||
return event->touch.is_cancel;
|
||||
}
|
||||
|
||||
_public_ uint32_t
|
||||
eis_event_swipe_get_finger_count(struct eis_event *event)
|
||||
{
|
||||
require_event_type(event,
|
||||
0,
|
||||
EIS_EVENT_SWIPE_BEGIN,
|
||||
EIS_EVENT_SWIPE_UPDATE,
|
||||
EIS_EVENT_SWIPE_END);
|
||||
|
||||
return event->gestures.nfingers;
|
||||
}
|
||||
|
||||
_public_ double
|
||||
eis_event_swipe_get_dx(struct eis_event *event)
|
||||
{
|
||||
require_event_type(event, 0.0, EIS_EVENT_SWIPE_UPDATE);
|
||||
|
||||
return event->gestures.dx;
|
||||
}
|
||||
|
||||
_public_ double
|
||||
eis_event_swipe_get_dy(struct eis_event *event)
|
||||
{
|
||||
require_event_type(event, 0.0, EIS_EVENT_SWIPE_UPDATE);
|
||||
|
||||
return event->gestures.dy;
|
||||
}
|
||||
|
||||
_public_ bool
|
||||
eis_event_swipe_get_is_cancelled(struct eis_event *event)
|
||||
{
|
||||
require_event_type(event, false, EIS_EVENT_SWIPE_END);
|
||||
|
||||
return event->gestures.is_cancelled;
|
||||
}
|
||||
|
||||
_public_ uint32_t
|
||||
eis_event_pinch_get_finger_count(struct eis_event *event)
|
||||
{
|
||||
require_event_type(event,
|
||||
0,
|
||||
EIS_EVENT_PINCH_BEGIN,
|
||||
EIS_EVENT_PINCH_UPDATE,
|
||||
EIS_EVENT_PINCH_END);
|
||||
|
||||
return event->gestures.nfingers;
|
||||
}
|
||||
|
||||
_public_ double
|
||||
eis_event_pinch_get_dx(struct eis_event *event)
|
||||
{
|
||||
require_event_type(event, 0.0, EIS_EVENT_PINCH_UPDATE);
|
||||
|
||||
return event->gestures.dx;
|
||||
}
|
||||
|
||||
_public_ double
|
||||
eis_event_pinch_get_dy(struct eis_event *event)
|
||||
{
|
||||
require_event_type(event, 0.0, EIS_EVENT_PINCH_UPDATE);
|
||||
|
||||
return event->gestures.dy;
|
||||
}
|
||||
|
||||
_public_ double
|
||||
eis_event_pinch_get_rotation(struct eis_event *event)
|
||||
{
|
||||
require_event_type(event, 0.0, EIS_EVENT_PINCH_UPDATE);
|
||||
|
||||
return event->gestures.degrees;
|
||||
}
|
||||
|
||||
_public_ double
|
||||
eis_event_pinch_get_scale(struct eis_event *event)
|
||||
{
|
||||
require_event_type(event, 0.0, EIS_EVENT_PINCH_UPDATE);
|
||||
|
||||
return event->gestures.scale;
|
||||
}
|
||||
|
||||
_public_ bool
|
||||
eis_event_pinch_get_is_cancelled(struct eis_event *event)
|
||||
{
|
||||
require_event_type(event, false, EIS_EVENT_PINCH_END);
|
||||
|
||||
return event->gestures.is_cancelled;
|
||||
}
|
||||
|
||||
_public_ uint32_t
|
||||
eis_event_hold_get_finger_count(struct eis_event *event)
|
||||
{
|
||||
require_event_type(event, 0, EIS_EVENT_HOLD_BEGIN, EIS_EVENT_HOLD_END);
|
||||
|
||||
return event->gestures.nfingers;
|
||||
}
|
||||
|
||||
_public_ bool
|
||||
eis_event_hold_get_is_cancelled(struct eis_event *event)
|
||||
{
|
||||
require_event_type(event, false, EIS_EVENT_HOLD_END);
|
||||
|
||||
return event->gestures.is_cancelled;
|
||||
}
|
||||
|
||||
_public_ uint32_t
|
||||
eis_event_text_get_keysym(struct eis_event *event)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -75,13 +75,6 @@ struct eis_event {
|
|||
struct {
|
||||
struct eis_callback *callback;
|
||||
} sync;
|
||||
struct {
|
||||
uint32_t nfingers;
|
||||
double dx, dy; /* relative motion */
|
||||
double degrees;
|
||||
double scale;
|
||||
bool is_cancelled;
|
||||
} gestures;
|
||||
};
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -1,824 +0,0 @@
|
|||
/* SPDX-License-Identifier: MIT */
|
||||
/*
|
||||
* Copyright © 2024 Red Hat, Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the next
|
||||
* paragraph) shall be included in all copies or substantial portions of the
|
||||
* Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include <errno.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
#include "util-bits.h"
|
||||
#include "util-io.h"
|
||||
#include "util-macros.h"
|
||||
#include "util-mem.h"
|
||||
#include "util-strings.h"
|
||||
#include "util-version.h"
|
||||
|
||||
#include "eis-proto.h"
|
||||
#include "libeis-client.h"
|
||||
#include "libeis-gestures.h"
|
||||
#include "libeis-private.h"
|
||||
|
||||
static void
|
||||
eis_gesture_swipe_destroy(struct eis_gesture_swipe *swipe)
|
||||
{
|
||||
struct eis_client *client = eis_gesture_swipe_get_client(swipe);
|
||||
eis_client_unregister_object(client, &swipe->proto_object);
|
||||
}
|
||||
|
||||
OBJECT_IMPLEMENT_REF(eis_gesture_swipe);
|
||||
OBJECT_IMPLEMENT_UNREF_CLEANUP(eis_gesture_swipe);
|
||||
|
||||
static OBJECT_IMPLEMENT_CREATE(eis_gesture_swipe);
|
||||
static OBJECT_IMPLEMENT_PARENT(eis_gesture_swipe, eis_device);
|
||||
OBJECT_IMPLEMENT_GETTER_AS_REF(eis_gesture_swipe, proto_object, const struct brei_object *);
|
||||
|
||||
uint32_t
|
||||
eis_gesture_swipe_get_version(struct eis_gesture_swipe *swipe)
|
||||
{
|
||||
return swipe->proto_object.version;
|
||||
}
|
||||
|
||||
object_id_t
|
||||
eis_gesture_swipe_get_id(struct eis_gesture_swipe *swipe)
|
||||
{
|
||||
return swipe->proto_object.id;
|
||||
}
|
||||
|
||||
struct eis_device *
|
||||
eis_gesture_swipe_get_device(struct eis_gesture_swipe *swipe)
|
||||
{
|
||||
return eis_gesture_swipe_parent(swipe);
|
||||
}
|
||||
|
||||
struct eis_client *
|
||||
eis_gesture_swipe_get_client(struct eis_gesture_swipe *swipe)
|
||||
{
|
||||
return eis_device_get_client(eis_gesture_swipe_get_device(swipe));
|
||||
}
|
||||
|
||||
struct eis *
|
||||
eis_gesture_swipe_get_context(struct eis_gesture_swipe *swipe)
|
||||
{
|
||||
return eis_device_get_context(eis_gesture_swipe_get_device(swipe));
|
||||
}
|
||||
|
||||
const struct eis_gesture_swipe_interface *
|
||||
eis_gesture_swipe_get_interface(struct eis_gesture_swipe *swipe)
|
||||
{
|
||||
struct eis_device *device = eis_gesture_swipe_get_device(swipe);
|
||||
return eis_device_get_gesture_swipe_interface(device);
|
||||
}
|
||||
|
||||
struct eis_gesture_swipe *
|
||||
eis_gesture_swipe_new(struct eis_device *device)
|
||||
{
|
||||
struct eis_gesture_swipe *swipe = eis_gesture_swipe_create(&device->object);
|
||||
struct eis_client *client = eis_device_get_client(device);
|
||||
|
||||
swipe->proto_object.id = eis_client_get_new_id(client);
|
||||
swipe->proto_object.implementation = swipe;
|
||||
swipe->proto_object.interface = &eis_gesture_swipe_proto_interface;
|
||||
swipe->proto_object.version = client->interface_versions.ei_gesture_swipe;
|
||||
eis_client_register_object(client, &swipe->proto_object);
|
||||
|
||||
return swipe; /* ref owned by caller */
|
||||
}
|
||||
|
||||
static void
|
||||
eis_gesture_pinch_destroy(struct eis_gesture_pinch *pinch)
|
||||
{
|
||||
struct eis_client *client = eis_gesture_pinch_get_client(pinch);
|
||||
eis_client_unregister_object(client, &pinch->proto_object);
|
||||
}
|
||||
|
||||
OBJECT_IMPLEMENT_REF(eis_gesture_pinch);
|
||||
OBJECT_IMPLEMENT_UNREF_CLEANUP(eis_gesture_pinch);
|
||||
|
||||
static OBJECT_IMPLEMENT_CREATE(eis_gesture_pinch);
|
||||
static OBJECT_IMPLEMENT_PARENT(eis_gesture_pinch, eis_device);
|
||||
OBJECT_IMPLEMENT_GETTER_AS_REF(eis_gesture_pinch, proto_object, const struct brei_object *);
|
||||
|
||||
uint32_t
|
||||
eis_gesture_pinch_get_version(struct eis_gesture_pinch *pinch)
|
||||
{
|
||||
return pinch->proto_object.version;
|
||||
}
|
||||
|
||||
object_id_t
|
||||
eis_gesture_pinch_get_id(struct eis_gesture_pinch *pinch)
|
||||
{
|
||||
return pinch->proto_object.id;
|
||||
}
|
||||
|
||||
struct eis_device *
|
||||
eis_gesture_pinch_get_device(struct eis_gesture_pinch *pinch)
|
||||
{
|
||||
return eis_gesture_pinch_parent(pinch);
|
||||
}
|
||||
|
||||
struct eis_client *
|
||||
eis_gesture_pinch_get_client(struct eis_gesture_pinch *pinch)
|
||||
{
|
||||
return eis_device_get_client(eis_gesture_pinch_get_device(pinch));
|
||||
}
|
||||
|
||||
struct eis *
|
||||
eis_gesture_pinch_get_context(struct eis_gesture_pinch *pinch)
|
||||
{
|
||||
return eis_device_get_context(eis_gesture_pinch_get_device(pinch));
|
||||
}
|
||||
|
||||
const struct eis_gesture_pinch_interface *
|
||||
eis_gesture_pinch_get_interface(struct eis_gesture_pinch *pinch)
|
||||
{
|
||||
struct eis_device *device = eis_gesture_pinch_get_device(pinch);
|
||||
return eis_device_get_gesture_pinch_interface(device);
|
||||
}
|
||||
|
||||
struct eis_gesture_pinch *
|
||||
eis_gesture_pinch_new(struct eis_device *device)
|
||||
{
|
||||
struct eis_gesture_pinch *pinch = eis_gesture_pinch_create(&device->object);
|
||||
struct eis_client *client = eis_device_get_client(device);
|
||||
|
||||
pinch->proto_object.id = eis_client_get_new_id(client);
|
||||
pinch->proto_object.implementation = pinch;
|
||||
pinch->proto_object.interface = &eis_gesture_pinch_proto_interface;
|
||||
pinch->proto_object.version = client->interface_versions.ei_gesture_pinch;
|
||||
eis_client_register_object(client, &pinch->proto_object);
|
||||
|
||||
return pinch; /* ref owned by caller */
|
||||
}
|
||||
|
||||
static void
|
||||
eis_gesture_hold_destroy(struct eis_gesture_hold *hold)
|
||||
{
|
||||
struct eis_client *client = eis_gesture_hold_get_client(hold);
|
||||
eis_client_unregister_object(client, &hold->proto_object);
|
||||
}
|
||||
|
||||
OBJECT_IMPLEMENT_REF(eis_gesture_hold);
|
||||
OBJECT_IMPLEMENT_UNREF_CLEANUP(eis_gesture_hold);
|
||||
|
||||
static OBJECT_IMPLEMENT_CREATE(eis_gesture_hold);
|
||||
static OBJECT_IMPLEMENT_PARENT(eis_gesture_hold, eis_device);
|
||||
OBJECT_IMPLEMENT_GETTER_AS_REF(eis_gesture_hold, proto_object, const struct brei_object *);
|
||||
|
||||
uint32_t
|
||||
eis_gesture_hold_get_version(struct eis_gesture_hold *hold)
|
||||
{
|
||||
return hold->proto_object.version;
|
||||
}
|
||||
|
||||
object_id_t
|
||||
eis_gesture_hold_get_id(struct eis_gesture_hold *hold)
|
||||
{
|
||||
return hold->proto_object.id;
|
||||
}
|
||||
|
||||
struct eis_device *
|
||||
eis_gesture_hold_get_device(struct eis_gesture_hold *hold)
|
||||
{
|
||||
return eis_gesture_hold_parent(hold);
|
||||
}
|
||||
|
||||
struct eis_client *
|
||||
eis_gesture_hold_get_client(struct eis_gesture_hold *hold)
|
||||
{
|
||||
return eis_device_get_client(eis_gesture_hold_get_device(hold));
|
||||
}
|
||||
|
||||
struct eis *
|
||||
eis_gesture_hold_get_context(struct eis_gesture_hold *hold)
|
||||
{
|
||||
return eis_device_get_context(eis_gesture_hold_get_device(hold));
|
||||
}
|
||||
|
||||
const struct eis_gesture_hold_interface *
|
||||
eis_gesture_hold_get_interface(struct eis_gesture_hold *hold)
|
||||
{
|
||||
struct eis_device *device = eis_gesture_hold_get_device(hold);
|
||||
return eis_device_get_gesture_hold_interface(device);
|
||||
}
|
||||
|
||||
struct eis_gesture_hold *
|
||||
eis_gesture_hold_new(struct eis_device *device)
|
||||
{
|
||||
struct eis_gesture_hold *hold = eis_gesture_hold_create(&device->object);
|
||||
struct eis_client *client = eis_device_get_client(device);
|
||||
|
||||
hold->proto_object.id = eis_client_get_new_id(client);
|
||||
hold->proto_object.implementation = hold;
|
||||
hold->proto_object.interface = &eis_gesture_hold_proto_interface;
|
||||
hold->proto_object.version = client->interface_versions.ei_gesture_hold;
|
||||
eis_client_register_object(client, &hold->proto_object);
|
||||
|
||||
return hold; /* ref owned by caller */
|
||||
}
|
||||
|
||||
static void
|
||||
eis_gesture_destroy(struct eis_gesture *gesture)
|
||||
{
|
||||
eis_device_unref(gesture->device);
|
||||
}
|
||||
|
||||
static OBJECT_IMPLEMENT_INIT(eis_gesture);
|
||||
OBJECT_IMPLEMENT_REF(eis_gesture);
|
||||
OBJECT_IMPLEMENT_UNREF(eis_gesture);
|
||||
|
||||
struct eis_device *
|
||||
eis_gesture_get_device(struct eis_gesture *gesture)
|
||||
{
|
||||
return gesture->device;
|
||||
}
|
||||
|
||||
struct eis *
|
||||
eis_gesture_get_context(struct eis_gesture *gesture)
|
||||
{
|
||||
return eis_device_get_context(eis_gesture_get_device(gesture));
|
||||
}
|
||||
|
||||
static void
|
||||
eis_gesture_init(struct eis_gesture *gesture, struct eis_device *device, uint32_t nfingers)
|
||||
{
|
||||
/* Not using the device as parent object because we need a ref
|
||||
* to it */
|
||||
eis_gesture_init_object(gesture, NULL);
|
||||
|
||||
gesture->state = EIS_GESTURE_STATE_NEW;
|
||||
gesture->device = eis_device_ref(device);
|
||||
gesture->nfingers = nfingers;
|
||||
}
|
||||
|
||||
struct eis_swipe *
|
||||
eis_swipe_new(struct eis_device *device, uint32_t nfingers)
|
||||
{
|
||||
if (!eis_device_has_capability(device, EIS_DEVICE_CAP_GESTURES)) {
|
||||
log_bug_client(eis_device_get_context(device),
|
||||
"%s: device is not a gesture device",
|
||||
__func__);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (nfingers == 0) {
|
||||
log_bug_client(eis_device_get_context(device),
|
||||
"zero-finger gestures are not possible");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!device->swipe)
|
||||
return NULL;
|
||||
|
||||
struct eis_swipe *swipe = xalloc(sizeof *swipe);
|
||||
eis_gesture_init(&swipe->base, device, nfingers);
|
||||
|
||||
return swipe;
|
||||
}
|
||||
|
||||
_public_ struct eis_swipe *
|
||||
eis_swipe_ref(struct eis_swipe *swipe)
|
||||
{
|
||||
return (struct eis_swipe *)eis_gesture_ref(&swipe->base);
|
||||
}
|
||||
|
||||
_public_ struct eis_swipe *
|
||||
eis_swipe_unref(struct eis_swipe *swipe)
|
||||
{
|
||||
if (!swipe)
|
||||
return NULL;
|
||||
|
||||
struct eis_device *device = eis_gesture_get_device(&swipe->base);
|
||||
|
||||
if (swipe == device->gesture_state.swipe.current_swipe) {
|
||||
if (swipe->base.state == EIS_GESTURE_STATE_BEGUN &&
|
||||
device->state == EIS_DEVICE_STATE_EMULATING) {
|
||||
eis_swipe_cancel(swipe);
|
||||
}
|
||||
}
|
||||
|
||||
return (struct eis_swipe *)eis_gesture_unref(&swipe->base);
|
||||
}
|
||||
|
||||
struct eis *
|
||||
eis_swipe_get_context(struct eis_swipe *swipe)
|
||||
{
|
||||
return eis_gesture_get_context(&swipe->base);
|
||||
}
|
||||
|
||||
_public_ void
|
||||
eis_swipe_begin(struct eis_swipe *swipe)
|
||||
{
|
||||
struct eis_device *device = swipe->base.device;
|
||||
struct eis_client *client = eis_device_get_client(device);
|
||||
|
||||
if (swipe->base.state != EIS_GESTURE_STATE_NEW) {
|
||||
log_bug_client(eis_gesture_get_context(&swipe->base), "gesture cannot begin twice");
|
||||
return;
|
||||
}
|
||||
|
||||
if (device->gesture_state.swipe.current_swipe) {
|
||||
log_bug_client(
|
||||
eis_gesture_get_context(&swipe->base),
|
||||
"a different swipe gesture is already in process, ignoring this one");
|
||||
return;
|
||||
}
|
||||
|
||||
if (device->state != EIS_DEVICE_STATE_EMULATING) {
|
||||
log_bug_client(eis_device_get_context(device),
|
||||
"%s: device is not emulating",
|
||||
__func__);
|
||||
return;
|
||||
}
|
||||
|
||||
if (client->state == EIS_CLIENT_STATE_NEW || client->state == EIS_CLIENT_STATE_DISCONNECTED)
|
||||
return;
|
||||
|
||||
if (!device->swipe)
|
||||
return;
|
||||
|
||||
if (swipe->base.nfingers == 0) {
|
||||
log_bug_client(eis_device_get_context(device),
|
||||
"zero-finger gestures are invalid, ignoring gesture");
|
||||
return;
|
||||
}
|
||||
|
||||
device->gesture_state.swipe.current_swipe = swipe;
|
||||
|
||||
device->send_frame_event = true;
|
||||
|
||||
swipe->base.state = EIS_GESTURE_STATE_BEGUN;
|
||||
int rc = eis_gesture_swipe_event_begin(device->swipe, swipe->base.nfingers);
|
||||
if (rc)
|
||||
eis_client_disconnect(client);
|
||||
}
|
||||
|
||||
_public_ void
|
||||
eis_swipe_update(struct eis_swipe *swipe, double x, double y)
|
||||
{
|
||||
struct eis_device *device = swipe->base.device;
|
||||
struct eis_client *client = eis_device_get_client(device);
|
||||
|
||||
if (swipe->base.state != EIS_GESTURE_STATE_BEGUN) {
|
||||
log_bug_client(eis_gesture_get_context(&swipe->base),
|
||||
"gesture in invalid state for update");
|
||||
return;
|
||||
}
|
||||
|
||||
if (device->gesture_state.swipe.current_swipe != swipe) {
|
||||
log_bug_client(
|
||||
eis_gesture_get_context(&swipe->base),
|
||||
"a different swipe gesture is already in process, ignoring this one");
|
||||
return;
|
||||
}
|
||||
|
||||
/* FIXME: what do we do with a gesture when the device stops emulating? */
|
||||
if (device->state != EIS_DEVICE_STATE_EMULATING) {
|
||||
log_bug_client(eis_device_get_context(device),
|
||||
"%s: device is not emulating",
|
||||
__func__);
|
||||
return;
|
||||
}
|
||||
|
||||
if (client->state == EIS_CLIENT_STATE_NEW || client->state == EIS_CLIENT_STATE_DISCONNECTED)
|
||||
return;
|
||||
|
||||
if (!device->swipe)
|
||||
return;
|
||||
|
||||
device->send_frame_event = true;
|
||||
|
||||
int rc = eis_gesture_swipe_event_update(device->swipe, x, y);
|
||||
if (rc)
|
||||
eis_client_disconnect(client);
|
||||
}
|
||||
|
||||
static void
|
||||
eis_swipe_end_cancel(struct eis_swipe *swipe, bool is_cancel)
|
||||
{
|
||||
struct eis_device *device = swipe->base.device;
|
||||
struct eis_client *client = eis_device_get_client(device);
|
||||
|
||||
if (swipe->base.state != EIS_GESTURE_STATE_BEGUN) {
|
||||
log_bug_client(eis_gesture_get_context(&swipe->base),
|
||||
"gesture in invalid state for end/cancel");
|
||||
return;
|
||||
}
|
||||
|
||||
if (device->gesture_state.swipe.current_swipe != swipe) {
|
||||
log_bug_client(
|
||||
eis_gesture_get_context(&swipe->base),
|
||||
"a different swipe gesture is already in process, ignoring this one");
|
||||
return;
|
||||
}
|
||||
|
||||
/* FIXME: what do we do with a gesture when the device stops emulating? */
|
||||
if (device->state != EIS_DEVICE_STATE_EMULATING) {
|
||||
log_bug_client(eis_device_get_context(device),
|
||||
"%s: device is not emulating",
|
||||
__func__);
|
||||
return;
|
||||
}
|
||||
|
||||
if (client->state == EIS_CLIENT_STATE_NEW || client->state == EIS_CLIENT_STATE_DISCONNECTED)
|
||||
return;
|
||||
|
||||
if (!device->swipe)
|
||||
return;
|
||||
|
||||
swipe->base.state = EIS_GESTURE_STATE_ENDED;
|
||||
device->gesture_state.swipe.current_swipe = NULL;
|
||||
|
||||
device->send_frame_event = true;
|
||||
|
||||
int rc = eis_gesture_swipe_event_end(device->swipe, is_cancel);
|
||||
if (rc)
|
||||
eis_client_disconnect(client);
|
||||
}
|
||||
|
||||
_public_ void
|
||||
eis_swipe_end(struct eis_swipe *swipe)
|
||||
{
|
||||
eis_swipe_end_cancel(swipe, false);
|
||||
}
|
||||
|
||||
_public_ void
|
||||
eis_swipe_cancel(struct eis_swipe *swipe)
|
||||
{
|
||||
eis_swipe_end_cancel(swipe, true);
|
||||
}
|
||||
|
||||
struct eis_pinch *
|
||||
eis_pinch_new(struct eis_device *device, uint32_t nfingers)
|
||||
{
|
||||
if (!eis_device_has_capability(device, EIS_DEVICE_CAP_GESTURES)) {
|
||||
log_bug_client(eis_device_get_context(device),
|
||||
"%s: device is not a gesture device",
|
||||
__func__);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (nfingers < 2) {
|
||||
log_bug_client(eis_device_get_context(device),
|
||||
"pinch gestures require at least 2 fingers");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!device->pinch)
|
||||
return NULL;
|
||||
|
||||
/* Not using the device as parent object because we need a ref
|
||||
* to it */
|
||||
struct eis_pinch *pinch = xalloc(sizeof *pinch);
|
||||
eis_gesture_init(&pinch->base, device, nfingers);
|
||||
|
||||
return pinch;
|
||||
}
|
||||
|
||||
_public_ struct eis_pinch *
|
||||
eis_pinch_ref(struct eis_pinch *pinch)
|
||||
{
|
||||
return (struct eis_pinch *)eis_gesture_ref(&pinch->base);
|
||||
}
|
||||
|
||||
_public_ struct eis_pinch *
|
||||
eis_pinch_unref(struct eis_pinch *pinch)
|
||||
{
|
||||
if (!pinch)
|
||||
return NULL;
|
||||
|
||||
struct eis_device *device = eis_gesture_get_device(&pinch->base);
|
||||
|
||||
if (pinch == device->gesture_state.pinch.current_pinch) {
|
||||
if (pinch->base.state == EIS_GESTURE_STATE_BEGUN &&
|
||||
device->state == EIS_DEVICE_STATE_EMULATING) {
|
||||
eis_pinch_cancel(pinch);
|
||||
}
|
||||
}
|
||||
|
||||
return (struct eis_pinch *)eis_gesture_unref(&pinch->base);
|
||||
}
|
||||
|
||||
struct eis *
|
||||
eis_pinch_get_context(struct eis_pinch *pinch)
|
||||
{
|
||||
return eis_gesture_get_context(&pinch->base);
|
||||
}
|
||||
|
||||
_public_ void
|
||||
eis_pinch_begin(struct eis_pinch *pinch)
|
||||
{
|
||||
struct eis_device *device = pinch->base.device;
|
||||
struct eis_client *client = eis_device_get_client(device);
|
||||
|
||||
if (pinch->base.state != EIS_GESTURE_STATE_NEW) {
|
||||
log_bug_client(eis_gesture_get_context(&pinch->base), "gesture cannot begin twice");
|
||||
return;
|
||||
}
|
||||
|
||||
if (device->gesture_state.pinch.current_pinch) {
|
||||
log_bug_client(
|
||||
eis_gesture_get_context(&pinch->base),
|
||||
"a different pinch gesture is already in process, ignoring this one");
|
||||
return;
|
||||
}
|
||||
|
||||
if (device->state != EIS_DEVICE_STATE_EMULATING) {
|
||||
log_bug_client(eis_device_get_context(device),
|
||||
"%s: device is not emulating",
|
||||
__func__);
|
||||
return;
|
||||
}
|
||||
|
||||
if (client->state == EIS_CLIENT_STATE_NEW || client->state == EIS_CLIENT_STATE_DISCONNECTED)
|
||||
return;
|
||||
|
||||
if (!device->pinch)
|
||||
return;
|
||||
|
||||
if (pinch->base.nfingers == 0) {
|
||||
log_bug_client(eis_device_get_context(device),
|
||||
"zero-finger gestures are invalid, ignoring gesture");
|
||||
return;
|
||||
}
|
||||
|
||||
device->gesture_state.pinch.current_pinch = pinch;
|
||||
|
||||
device->send_frame_event = true;
|
||||
|
||||
pinch->base.state = EIS_GESTURE_STATE_BEGUN;
|
||||
int rc = eis_gesture_pinch_event_begin(device->pinch, pinch->base.nfingers);
|
||||
if (rc)
|
||||
eis_client_disconnect(client);
|
||||
}
|
||||
|
||||
_public_ void
|
||||
eis_pinch_update(struct eis_pinch *pinch, double x, double y, double scale, double rotation)
|
||||
{
|
||||
struct eis_device *device = pinch->base.device;
|
||||
struct eis_client *client = eis_device_get_client(device);
|
||||
|
||||
if (pinch->base.state != EIS_GESTURE_STATE_BEGUN) {
|
||||
log_bug_client(eis_gesture_get_context(&pinch->base),
|
||||
"gesture in invalid state for update");
|
||||
return;
|
||||
}
|
||||
|
||||
if (device->gesture_state.pinch.current_pinch != pinch) {
|
||||
log_bug_client(
|
||||
eis_gesture_get_context(&pinch->base),
|
||||
"a different pinch gesture is already in process, ignoring this one");
|
||||
return;
|
||||
}
|
||||
|
||||
/* FIXME: what do we do with a gesture when the device stops emulating? */
|
||||
if (device->state != EIS_DEVICE_STATE_EMULATING) {
|
||||
log_bug_client(eis_device_get_context(device),
|
||||
"%s: device is not emulating",
|
||||
__func__);
|
||||
return;
|
||||
}
|
||||
|
||||
if (client->state == EIS_CLIENT_STATE_NEW || client->state == EIS_CLIENT_STATE_DISCONNECTED)
|
||||
return;
|
||||
|
||||
if (!device->pinch)
|
||||
return;
|
||||
|
||||
device->send_frame_event = true;
|
||||
|
||||
int rc = eis_gesture_pinch_event_update(device->pinch, x, y, scale, rotation);
|
||||
if (rc)
|
||||
eis_client_disconnect(client);
|
||||
}
|
||||
|
||||
static void
|
||||
eis_pinch_end_cancel(struct eis_pinch *pinch, bool is_cancel)
|
||||
{
|
||||
struct eis_device *device = pinch->base.device;
|
||||
struct eis_client *client = eis_device_get_client(device);
|
||||
|
||||
if (pinch->base.state != EIS_GESTURE_STATE_BEGUN) {
|
||||
log_bug_client(eis_gesture_get_context(&pinch->base),
|
||||
"gesture in invalid state for end/cancel");
|
||||
return;
|
||||
}
|
||||
|
||||
if (device->gesture_state.pinch.current_pinch != pinch) {
|
||||
log_bug_client(
|
||||
eis_gesture_get_context(&pinch->base),
|
||||
"a different pinch gesture is already in process, ignoring this one");
|
||||
return;
|
||||
}
|
||||
|
||||
if (device->state != EIS_DEVICE_STATE_EMULATING) {
|
||||
log_bug_client(eis_device_get_context(device),
|
||||
"%s: device is not emulating",
|
||||
__func__);
|
||||
return;
|
||||
}
|
||||
|
||||
if (client->state == EIS_CLIENT_STATE_NEW || client->state == EIS_CLIENT_STATE_DISCONNECTED)
|
||||
return;
|
||||
|
||||
if (!device->pinch)
|
||||
return;
|
||||
|
||||
pinch->base.state = EIS_GESTURE_STATE_ENDED;
|
||||
device->gesture_state.pinch.current_pinch = NULL;
|
||||
|
||||
device->send_frame_event = true;
|
||||
|
||||
int rc = eis_gesture_pinch_event_end(device->pinch, is_cancel);
|
||||
if (rc)
|
||||
eis_client_disconnect(client);
|
||||
}
|
||||
|
||||
_public_ void
|
||||
eis_pinch_end(struct eis_pinch *pinch)
|
||||
{
|
||||
eis_pinch_end_cancel(pinch, false);
|
||||
}
|
||||
|
||||
_public_ void
|
||||
eis_pinch_cancel(struct eis_pinch *pinch)
|
||||
{
|
||||
eis_pinch_end_cancel(pinch, true);
|
||||
}
|
||||
|
||||
_public_ void
|
||||
eis_hold_begin(struct eis_hold *hold)
|
||||
{
|
||||
struct eis_device *device = hold->base.device;
|
||||
struct eis_client *client = eis_device_get_client(device);
|
||||
|
||||
if (hold->base.state != EIS_GESTURE_STATE_NEW) {
|
||||
log_bug_client(eis_gesture_get_context(&hold->base), "gesture cannot begin twice");
|
||||
return;
|
||||
}
|
||||
|
||||
if (device->gesture_state.hold.current_hold) {
|
||||
log_bug_client(eis_gesture_get_context(&hold->base),
|
||||
"a different hold gesture is already in process, ignoring this one");
|
||||
return;
|
||||
}
|
||||
|
||||
if (device->state != EIS_DEVICE_STATE_EMULATING) {
|
||||
log_bug_client(eis_device_get_context(device),
|
||||
"%s: device is not emulating",
|
||||
__func__);
|
||||
return;
|
||||
}
|
||||
|
||||
if (client->state == EIS_CLIENT_STATE_NEW || client->state == EIS_CLIENT_STATE_DISCONNECTED)
|
||||
return;
|
||||
|
||||
if (!device->hold)
|
||||
return;
|
||||
|
||||
if (hold->base.nfingers == 0) {
|
||||
log_bug_client(eis_device_get_context(device),
|
||||
"zero-finger gestures are invalid, ignoring gesture");
|
||||
return;
|
||||
}
|
||||
|
||||
device->gesture_state.hold.current_hold = hold;
|
||||
|
||||
device->send_frame_event = true;
|
||||
|
||||
hold->base.state = EIS_GESTURE_STATE_BEGUN;
|
||||
int rc = eis_gesture_hold_event_begin(device->hold, hold->base.nfingers);
|
||||
if (rc)
|
||||
eis_client_disconnect(client);
|
||||
}
|
||||
|
||||
struct eis_hold *
|
||||
eis_hold_new(struct eis_device *device, uint32_t nfingers)
|
||||
{
|
||||
if (!eis_device_has_capability(device, EIS_DEVICE_CAP_GESTURES)) {
|
||||
log_bug_client(eis_device_get_context(device),
|
||||
"%s: device is not a gesture device",
|
||||
__func__);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (nfingers == 0) {
|
||||
log_bug_client(eis_device_get_context(device),
|
||||
"zero-finger gestures are not possible");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!device->hold)
|
||||
return NULL;
|
||||
|
||||
/* Not using the device as parent object because we need a ref
|
||||
* to it */
|
||||
struct eis_hold *hold = xalloc(sizeof *hold);
|
||||
eis_gesture_init(&hold->base, device, nfingers);
|
||||
|
||||
return hold;
|
||||
}
|
||||
|
||||
_public_ struct eis_hold *
|
||||
eis_hold_ref(struct eis_hold *hold)
|
||||
{
|
||||
return (struct eis_hold *)eis_gesture_ref(&hold->base);
|
||||
}
|
||||
|
||||
_public_ struct eis_hold *
|
||||
eis_hold_unref(struct eis_hold *hold)
|
||||
{
|
||||
if (!hold)
|
||||
return NULL;
|
||||
|
||||
struct eis_device *device = eis_gesture_get_device(&hold->base);
|
||||
|
||||
if (hold == device->gesture_state.hold.current_hold) {
|
||||
if (hold->base.state == EIS_GESTURE_STATE_BEGUN &&
|
||||
device->state == EIS_DEVICE_STATE_EMULATING) {
|
||||
eis_hold_cancel(hold);
|
||||
}
|
||||
}
|
||||
|
||||
return (struct eis_hold *)eis_gesture_unref(&hold->base);
|
||||
}
|
||||
|
||||
struct eis *
|
||||
eis_hold_get_context(struct eis_hold *hold)
|
||||
{
|
||||
return eis_gesture_get_context(&hold->base);
|
||||
}
|
||||
|
||||
static void
|
||||
eis_hold_end_cancel(struct eis_hold *hold, bool is_cancel)
|
||||
{
|
||||
struct eis_device *device = hold->base.device;
|
||||
struct eis_client *client = eis_device_get_client(device);
|
||||
|
||||
if (hold->base.state != EIS_GESTURE_STATE_BEGUN) {
|
||||
log_bug_client(eis_gesture_get_context(&hold->base),
|
||||
"gesture in invalid state for end/cancel");
|
||||
return;
|
||||
}
|
||||
|
||||
if (device->gesture_state.hold.current_hold != hold) {
|
||||
log_bug_client(eis_gesture_get_context(&hold->base),
|
||||
"a different hold gesture is already in process, ignoring this one");
|
||||
return;
|
||||
}
|
||||
|
||||
/* FIXME: what do we do with a gesture when the device stops emulating? */
|
||||
if (device->state != EIS_DEVICE_STATE_EMULATING) {
|
||||
log_bug_client(eis_device_get_context(device),
|
||||
"%s: device is not emulating",
|
||||
__func__);
|
||||
return;
|
||||
}
|
||||
|
||||
if (client->state == EIS_CLIENT_STATE_NEW || client->state == EIS_CLIENT_STATE_DISCONNECTED)
|
||||
return;
|
||||
|
||||
if (!device->hold)
|
||||
return;
|
||||
|
||||
hold->base.state = EIS_GESTURE_STATE_ENDED;
|
||||
device->gesture_state.hold.current_hold = NULL;
|
||||
|
||||
device->send_frame_event = true;
|
||||
|
||||
int rc = eis_gesture_hold_event_end(device->hold, is_cancel);
|
||||
if (rc)
|
||||
eis_client_disconnect(client);
|
||||
}
|
||||
|
||||
_public_ void
|
||||
eis_hold_end(struct eis_hold *hold)
|
||||
{
|
||||
eis_hold_end_cancel(hold, false);
|
||||
}
|
||||
|
||||
_public_ void
|
||||
eis_hold_cancel(struct eis_hold *hold)
|
||||
{
|
||||
eis_hold_end_cancel(hold, true);
|
||||
}
|
||||
|
|
@ -1,132 +0,0 @@
|
|||
/* SPDX-License-Identifier: MIT */
|
||||
/*
|
||||
* Copyright © 2024 Red Hat, Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the next
|
||||
* paragraph) shall be included in all copies or substantial portions of the
|
||||
* Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "util-list.h"
|
||||
#include "util-object.h"
|
||||
|
||||
#include "brei-shared.h"
|
||||
|
||||
struct eis;
|
||||
struct eis_device;
|
||||
|
||||
/* This is the protocol-only object, not exposed in the API. See eis_swipe() for
|
||||
* the C API object */
|
||||
struct eis_gesture_swipe {
|
||||
struct object object;
|
||||
struct brei_object proto_object;
|
||||
};
|
||||
|
||||
OBJECT_DECLARE_GETTER(eis_gesture_swipe, id, object_id_t);
|
||||
OBJECT_DECLARE_GETTER(eis_gesture_swipe, version, uint32_t);
|
||||
OBJECT_DECLARE_GETTER(eis_gesture_swipe, context, struct eis *);
|
||||
OBJECT_DECLARE_GETTER(eis_gesture_swipe, client, struct eis_client *);
|
||||
OBJECT_DECLARE_GETTER(eis_gesture_swipe, device, struct eis_device *);
|
||||
OBJECT_DECLARE_GETTER(eis_gesture_swipe, proto_object, const struct brei_object *);
|
||||
OBJECT_DECLARE_GETTER(eis_gesture_swipe, interface, const struct eis_gesture_swipe_interface *);
|
||||
OBJECT_DECLARE_REF(eis_gesture_swipe);
|
||||
OBJECT_DECLARE_UNREF(eis_gesture_swipe);
|
||||
|
||||
struct eis_gesture_swipe *
|
||||
eis_gesture_swipe_new(struct eis_device *device);
|
||||
|
||||
/* This is the protocol-only object, not exposed in the API. See eis_pinch() for
|
||||
* the C API object */
|
||||
struct eis_gesture_pinch {
|
||||
struct object object;
|
||||
struct brei_object proto_object;
|
||||
};
|
||||
|
||||
OBJECT_DECLARE_GETTER(eis_gesture_pinch, id, object_id_t);
|
||||
OBJECT_DECLARE_GETTER(eis_gesture_pinch, version, uint32_t);
|
||||
OBJECT_DECLARE_GETTER(eis_gesture_pinch, context, struct eis *);
|
||||
OBJECT_DECLARE_GETTER(eis_gesture_pinch, client, struct eis_client *);
|
||||
OBJECT_DECLARE_GETTER(eis_gesture_pinch, device, struct eis_device *);
|
||||
OBJECT_DECLARE_GETTER(eis_gesture_pinch, proto_object, const struct brei_object *);
|
||||
OBJECT_DECLARE_GETTER(eis_gesture_pinch, interface, const struct eis_gesture_pinch_interface *);
|
||||
OBJECT_DECLARE_REF(eis_gesture_pinch);
|
||||
OBJECT_DECLARE_UNREF(eis_gesture_pinch);
|
||||
|
||||
struct eis_gesture_pinch *
|
||||
eis_gesture_pinch_new(struct eis_device *device);
|
||||
|
||||
/* This is the protocol-only object, not exposed in the API. See eis_hold() for
|
||||
* the C API object */
|
||||
struct eis_gesture_hold {
|
||||
struct object object;
|
||||
struct brei_object proto_object;
|
||||
};
|
||||
|
||||
OBJECT_DECLARE_GETTER(eis_gesture_hold, id, object_id_t);
|
||||
OBJECT_DECLARE_GETTER(eis_gesture_hold, version, uint32_t);
|
||||
OBJECT_DECLARE_GETTER(eis_gesture_hold, context, struct eis *);
|
||||
OBJECT_DECLARE_GETTER(eis_gesture_hold, client, struct eis_client *);
|
||||
OBJECT_DECLARE_GETTER(eis_gesture_hold, device, struct eis_device *);
|
||||
OBJECT_DECLARE_GETTER(eis_gesture_hold, proto_object, const struct brei_object *);
|
||||
OBJECT_DECLARE_GETTER(eis_gesture_hold, interface, const struct eis_gesture_hold_interface *);
|
||||
OBJECT_DECLARE_REF(eis_gesture_hold);
|
||||
OBJECT_DECLARE_UNREF(eis_gesture_hold);
|
||||
|
||||
struct eis_gesture_hold *
|
||||
eis_gesture_hold_new(struct eis_device *device);
|
||||
|
||||
enum eis_gesture_state { EIS_GESTURE_STATE_NEW, EIS_GESTURE_STATE_BEGUN, EIS_GESTURE_STATE_ENDED };
|
||||
|
||||
/* This is the parent object for all the C API gestures */
|
||||
struct eis_gesture {
|
||||
struct object object;
|
||||
struct eis_device *device;
|
||||
enum eis_gesture_state state;
|
||||
uint32_t nfingers;
|
||||
};
|
||||
|
||||
OBJECT_DECLARE_REF(eis_gesture);
|
||||
OBJECT_DECLARE_UNREF(eis_gesture);
|
||||
OBJECT_DECLARE_GETTER(eis_gesture, context, struct eis *);
|
||||
OBJECT_DECLARE_GETTER(eis_gesture, device, struct eis_device *);
|
||||
|
||||
struct eis_swipe {
|
||||
struct eis_gesture base;
|
||||
};
|
||||
|
||||
struct eis_pinch {
|
||||
struct eis_gesture base;
|
||||
};
|
||||
|
||||
struct eis_hold {
|
||||
struct eis_gesture base;
|
||||
};
|
||||
|
||||
struct eis_swipe *
|
||||
eis_swipe_new(struct eis_device *device, uint32_t nfingers);
|
||||
OBJECT_DECLARE_GETTER(eis_swipe, context, struct eis *);
|
||||
|
||||
struct eis_pinch *
|
||||
eis_pinch_new(struct eis_device *device, uint32_t nfingers);
|
||||
OBJECT_DECLARE_GETTER(eis_pinch, context, struct eis *);
|
||||
|
||||
struct eis_hold *
|
||||
eis_hold_new(struct eis_device *device, uint32_t nfingers);
|
||||
OBJECT_DECLARE_GETTER(eis_hold, context, struct eis *);
|
||||
|
|
@ -136,9 +136,6 @@ client_msg_finish(struct eis_handshake *setup)
|
|||
SEND_INTERFACE_VERSION(EIS_SCROLL, ei_scroll);
|
||||
SEND_INTERFACE_VERSION(EIS_KEYBOARD, ei_keyboard);
|
||||
SEND_INTERFACE_VERSION(EIS_TOUCHSCREEN, ei_touchscreen);
|
||||
SEND_INTERFACE_VERSION(EIS_GESTURE_SWIPE, ei_gesture_swipe);
|
||||
SEND_INTERFACE_VERSION(EIS_GESTURE_PINCH, ei_gesture_pinch);
|
||||
SEND_INTERFACE_VERSION(EIS_GESTURE_HOLD, ei_gesture_hold);
|
||||
|
||||
#undef SEND_INTERFACE_VERSION
|
||||
|
||||
|
|
@ -240,9 +237,6 @@ client_msg_interface_version(struct eis_handshake *setup, const char *name, uint
|
|||
VERSION_ENTRY(ei_scroll),
|
||||
VERSION_ENTRY(ei_keyboard),
|
||||
VERSION_ENTRY(ei_touchscreen),
|
||||
VERSION_ENTRY(ei_gesture_swipe),
|
||||
VERSION_ENTRY(ei_gesture_pinch),
|
||||
VERSION_ENTRY(ei_gesture_hold),
|
||||
VERSION_ENTRY(ei_text),
|
||||
#undef VERSION_ENTRY
|
||||
};
|
||||
|
|
|
|||
|
|
@ -164,34 +164,6 @@ eis_queue_text_utf8_event(struct eis_device *device, const char *utf8);
|
|||
void
|
||||
eis_sync_event_send_done(struct eis_event *e);
|
||||
|
||||
void
|
||||
eis_queue_swipe_begin_event(struct eis_device *device, uint32_t nfingers);
|
||||
|
||||
void
|
||||
eis_queue_swipe_update_event(struct eis_device *device, double dx, double dy);
|
||||
|
||||
void
|
||||
eis_queue_swipe_end_event(struct eis_device *device, bool is_cancelled);
|
||||
|
||||
void
|
||||
eis_queue_pinch_begin_event(struct eis_device *device, uint32_t nfingers);
|
||||
|
||||
void
|
||||
eis_queue_pinch_update_event(struct eis_device *device,
|
||||
double dx,
|
||||
double dy,
|
||||
double scale,
|
||||
double rotation);
|
||||
|
||||
void
|
||||
eis_queue_pinch_end_event(struct eis_device *device, bool is_cancelled);
|
||||
|
||||
void
|
||||
eis_queue_hold_begin_event(struct eis_device *device, uint32_t nfingers);
|
||||
|
||||
void
|
||||
eis_queue_hold_end_event(struct eis_device *device, bool is_cancelled);
|
||||
|
||||
_printf_(6, 7) void
|
||||
eis_log_msg(struct eis *eis,
|
||||
enum eis_log_priority priority,
|
||||
|
|
|
|||
|
|
@ -103,12 +103,6 @@ convert_capabilities(uint64_t caps)
|
|||
capabilities |= EIS_DEVICE_CAP_BUTTON;
|
||||
if (caps & bit(EIS_SCROLL_INTERFACE_INDEX))
|
||||
capabilities |= EIS_DEVICE_CAP_SCROLL;
|
||||
if (caps & bit(EIS_GESTURE_SWIPE_INTERFACE_INDEX))
|
||||
capabilities |= EIS_DEVICE_CAP_GESTURES;
|
||||
if (caps & bit(EIS_GESTURE_PINCH_INTERFACE_INDEX))
|
||||
capabilities |= EIS_DEVICE_CAP_GESTURES;
|
||||
if (caps & bit(EIS_GESTURE_HOLD_INTERFACE_INDEX))
|
||||
capabilities |= EIS_DEVICE_CAP_GESTURES;
|
||||
if (caps & bit(EIS_TEXT_INTERFACE_INDEX))
|
||||
capabilities |= EIS_DEVICE_CAP_TEXT;
|
||||
|
||||
|
|
@ -248,27 +242,6 @@ eis_seat_add(struct eis_seat *seat)
|
|||
mask_add(seat->capabilities.proto_mask, mask);
|
||||
}
|
||||
|
||||
if (seat->capabilities.c_mask & EIS_DEVICE_CAP_GESTURES &&
|
||||
client->interface_versions.ei_gesture_swipe > 0) {
|
||||
uint64_t mask = bit(EIS_GESTURE_SWIPE_INTERFACE_INDEX);
|
||||
eis_seat_event_capability(seat, mask, EIS_GESTURE_SWIPE_INTERFACE_NAME);
|
||||
mask_add(seat->capabilities.proto_mask, mask);
|
||||
}
|
||||
|
||||
if (seat->capabilities.c_mask & EIS_DEVICE_CAP_GESTURES &&
|
||||
client->interface_versions.ei_gesture_pinch > 0) {
|
||||
uint64_t mask = bit(EIS_GESTURE_PINCH_INTERFACE_INDEX);
|
||||
eis_seat_event_capability(seat, mask, EIS_GESTURE_PINCH_INTERFACE_NAME);
|
||||
mask_add(seat->capabilities.proto_mask, mask);
|
||||
}
|
||||
|
||||
if (seat->capabilities.c_mask & EIS_DEVICE_CAP_GESTURES &&
|
||||
client->interface_versions.ei_gesture_hold > 0) {
|
||||
uint64_t mask = bit(EIS_GESTURE_HOLD_INTERFACE_INDEX);
|
||||
eis_seat_event_capability(seat, mask, EIS_GESTURE_HOLD_INTERFACE_NAME);
|
||||
mask_add(seat->capabilities.proto_mask, mask);
|
||||
}
|
||||
|
||||
if (seat->capabilities.c_mask & EIS_DEVICE_CAP_TEXT &&
|
||||
client->interface_versions.ei_text > 0) {
|
||||
uint64_t mask = bit(EIS_TEXT_INTERFACE_INDEX);
|
||||
|
|
@ -368,7 +341,6 @@ eis_seat_configure_capability(struct eis_seat *seat, enum eis_device_capability
|
|||
case EIS_DEVICE_CAP_TOUCH:
|
||||
case EIS_DEVICE_CAP_BUTTON:
|
||||
case EIS_DEVICE_CAP_SCROLL:
|
||||
case EIS_DEVICE_CAP_GESTURES:
|
||||
case EIS_DEVICE_CAP_TEXT:
|
||||
mask_add(seat->capabilities.c_mask, cap);
|
||||
break;
|
||||
|
|
@ -385,7 +357,6 @@ eis_seat_has_capability(struct eis_seat *seat, enum eis_device_capability cap)
|
|||
case EIS_DEVICE_CAP_TOUCH:
|
||||
case EIS_DEVICE_CAP_BUTTON:
|
||||
case EIS_DEVICE_CAP_SCROLL:
|
||||
case EIS_DEVICE_CAP_GESTURES:
|
||||
case EIS_DEVICE_CAP_TEXT:
|
||||
return mask_all(seat->capabilities.c_mask, cap);
|
||||
}
|
||||
|
|
|
|||
124
src/libeis.c
124
src/libeis.c
|
|
@ -153,14 +153,6 @@ eis_event_type_to_string(enum eis_event_type type)
|
|||
CASE_RETURN_STRING(EIS_EVENT_TOUCH_UP);
|
||||
CASE_RETURN_STRING(EIS_EVENT_TOUCH_MOTION);
|
||||
CASE_RETURN_STRING(EIS_EVENT_FRAME);
|
||||
CASE_RETURN_STRING(EIS_EVENT_SWIPE_BEGIN);
|
||||
CASE_RETURN_STRING(EIS_EVENT_SWIPE_UPDATE);
|
||||
CASE_RETURN_STRING(EIS_EVENT_SWIPE_END);
|
||||
CASE_RETURN_STRING(EIS_EVENT_PINCH_BEGIN);
|
||||
CASE_RETURN_STRING(EIS_EVENT_PINCH_UPDATE);
|
||||
CASE_RETURN_STRING(EIS_EVENT_PINCH_END);
|
||||
CASE_RETURN_STRING(EIS_EVENT_HOLD_BEGIN);
|
||||
CASE_RETURN_STRING(EIS_EVENT_HOLD_END);
|
||||
CASE_RETURN_STRING(EIS_EVENT_TEXT_KEYSYM);
|
||||
CASE_RETURN_STRING(EIS_EVENT_TEXT_UTF8);
|
||||
}
|
||||
|
|
@ -183,14 +175,6 @@ update_event_timestamp(struct eis_event *event, uint64_t time)
|
|||
case EIS_EVENT_TOUCH_DOWN:
|
||||
case EIS_EVENT_TOUCH_UP:
|
||||
case EIS_EVENT_TOUCH_MOTION:
|
||||
case EIS_EVENT_SWIPE_BEGIN:
|
||||
case EIS_EVENT_SWIPE_UPDATE:
|
||||
case EIS_EVENT_SWIPE_END:
|
||||
case EIS_EVENT_PINCH_BEGIN:
|
||||
case EIS_EVENT_PINCH_UPDATE:
|
||||
case EIS_EVENT_PINCH_END:
|
||||
case EIS_EVENT_HOLD_BEGIN:
|
||||
case EIS_EVENT_HOLD_END:
|
||||
case EIS_EVENT_TEXT_KEYSYM:
|
||||
case EIS_EVENT_TEXT_UTF8:
|
||||
if (event->timestamp != 0) {
|
||||
|
|
@ -229,14 +213,6 @@ eis_queue_event(struct eis_event *event)
|
|||
case EIS_EVENT_TOUCH_DOWN:
|
||||
case EIS_EVENT_TOUCH_UP:
|
||||
case EIS_EVENT_TOUCH_MOTION:
|
||||
case EIS_EVENT_SWIPE_BEGIN:
|
||||
case EIS_EVENT_SWIPE_UPDATE:
|
||||
case EIS_EVENT_SWIPE_END:
|
||||
case EIS_EVENT_PINCH_BEGIN:
|
||||
case EIS_EVENT_PINCH_UPDATE:
|
||||
case EIS_EVENT_PINCH_END:
|
||||
case EIS_EVENT_HOLD_BEGIN:
|
||||
case EIS_EVENT_HOLD_END:
|
||||
case EIS_EVENT_TEXT_KEYSYM:
|
||||
case EIS_EVENT_TEXT_UTF8:
|
||||
prefix = "pending ";
|
||||
|
|
@ -508,106 +484,6 @@ eis_queue_touch_cancel_event(struct eis_device *device, uint32_t touchid)
|
|||
eis_queue_event(e);
|
||||
}
|
||||
|
||||
void
|
||||
eis_queue_swipe_begin_event(struct eis_device *device, uint32_t nfingers)
|
||||
{
|
||||
struct eis_event *e = eis_event_new_for_device(device);
|
||||
|
||||
e->type = EIS_EVENT_SWIPE_BEGIN;
|
||||
e->gestures.nfingers = nfingers;
|
||||
|
||||
eis_queue_event(e);
|
||||
}
|
||||
|
||||
void
|
||||
eis_queue_swipe_update_event(struct eis_device *device, double dx, double dy)
|
||||
{
|
||||
struct eis_event *e = eis_event_new_for_device(device);
|
||||
|
||||
e->type = EIS_EVENT_SWIPE_UPDATE;
|
||||
e->gestures.nfingers = device->gesture_state.swipe.nfingers;
|
||||
e->gestures.dx = dx;
|
||||
e->gestures.dy = dy;
|
||||
|
||||
eis_queue_event(e);
|
||||
}
|
||||
|
||||
void
|
||||
eis_queue_swipe_end_event(struct eis_device *device, bool is_cancelled)
|
||||
{
|
||||
struct eis_event *e = eis_event_new_for_device(device);
|
||||
|
||||
e->type = EIS_EVENT_SWIPE_END;
|
||||
e->gestures.nfingers = device->gesture_state.swipe.nfingers;
|
||||
e->gestures.is_cancelled = is_cancelled;
|
||||
|
||||
eis_queue_event(e);
|
||||
}
|
||||
|
||||
void
|
||||
eis_queue_pinch_begin_event(struct eis_device *device, uint32_t nfingers)
|
||||
{
|
||||
struct eis_event *e = eis_event_new_for_device(device);
|
||||
|
||||
e->type = EIS_EVENT_PINCH_BEGIN;
|
||||
e->gestures.nfingers = nfingers;
|
||||
|
||||
eis_queue_event(e);
|
||||
}
|
||||
|
||||
void
|
||||
eis_queue_pinch_update_event(struct eis_device *device,
|
||||
double dx,
|
||||
double dy,
|
||||
double scale,
|
||||
double rotation)
|
||||
{
|
||||
struct eis_event *e = eis_event_new_for_device(device);
|
||||
e->type = EIS_EVENT_PINCH_UPDATE;
|
||||
e->gestures.nfingers = device->gesture_state.pinch.nfingers;
|
||||
e->gestures.scale = scale;
|
||||
e->gestures.degrees = rotation;
|
||||
e->gestures.dx = dx;
|
||||
e->gestures.dy = dy;
|
||||
|
||||
eis_queue_event(e);
|
||||
}
|
||||
|
||||
void
|
||||
eis_queue_pinch_end_event(struct eis_device *device, bool is_cancelled)
|
||||
{
|
||||
struct eis_event *e = eis_event_new_for_device(device);
|
||||
|
||||
e->type = EIS_EVENT_PINCH_END;
|
||||
e->gestures.nfingers = device->gesture_state.pinch.nfingers;
|
||||
e->gestures.is_cancelled = is_cancelled;
|
||||
|
||||
eis_queue_event(e);
|
||||
}
|
||||
|
||||
void
|
||||
eis_queue_hold_begin_event(struct eis_device *device, uint32_t nfingers)
|
||||
{
|
||||
struct eis_event *e = eis_event_new_for_device(device);
|
||||
|
||||
e->type = EIS_EVENT_HOLD_BEGIN;
|
||||
e->gestures.nfingers = nfingers;
|
||||
|
||||
eis_queue_event(e);
|
||||
}
|
||||
|
||||
void
|
||||
eis_queue_hold_end_event(struct eis_device *device, bool is_cancelled)
|
||||
{
|
||||
struct eis_event *e = eis_event_new_for_device(device);
|
||||
|
||||
e->type = EIS_EVENT_HOLD_END;
|
||||
e->gestures.nfingers = device->gesture_state.hold.nfingers;
|
||||
e->gestures.is_cancelled = is_cancelled;
|
||||
|
||||
eis_queue_event(e);
|
||||
}
|
||||
|
||||
void
|
||||
eis_queue_text_keysym_event(struct eis_device *device, uint32_t keysym, bool is_press)
|
||||
{
|
||||
|
|
|
|||
604
src/libeis.h
604
src/libeis.h
|
|
@ -146,18 +146,6 @@ struct eis_keymap;
|
|||
* @struct eis_touch
|
||||
*/
|
||||
struct eis_touch;
|
||||
/**
|
||||
* @struct eis_swipe
|
||||
*/
|
||||
struct eis_swipe;
|
||||
/**
|
||||
* @struct eis_pinch
|
||||
*/
|
||||
struct eis_pinch;
|
||||
/**
|
||||
* @struct eis_hold
|
||||
*/
|
||||
struct eis_hold;
|
||||
|
||||
/**
|
||||
* @struct eis_ping
|
||||
|
|
@ -237,11 +225,7 @@ enum eis_device_capability {
|
|||
/**
|
||||
* @since 1.6
|
||||
*/
|
||||
EIS_DEVICE_CAP_GESTURES = (1 << 6),
|
||||
/**
|
||||
* @since 1.6
|
||||
*/
|
||||
EIS_DEVICE_CAP_TEXT = (1 << 7),
|
||||
EIS_DEVICE_CAP_TEXT = (1 << 6),
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
@ -421,97 +405,12 @@ enum eis_event_type {
|
|||
*/
|
||||
EIS_EVENT_TOUCH_MOTION,
|
||||
|
||||
/**
|
||||
* Event for a swipe begin. Only one swipe gesture may be active
|
||||
* at any time.
|
||||
*
|
||||
* @note This event is only generated on a sender eis context.
|
||||
* See eis_device_swipe_new() and eis_swipe_begin() for the receiver context API.
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
EIS_EVENT_SWIPE_BEGIN = 900,
|
||||
/**
|
||||
* Event for an update to the current ongoing swipe gesture.
|
||||
*
|
||||
* This library accumulates all updates to the gesture within the same
|
||||
* device frame into one gesture event.
|
||||
*
|
||||
* @note This event is only generated on a sender eis context.
|
||||
* See eis_device_swipe_new() and eis_swipe_update() for the receiver context API.
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
EIS_EVENT_SWIPE_UPDATE,
|
||||
/**
|
||||
* Event for the logical end to the current ongoing swipe gesture.
|
||||
*
|
||||
* @note This event is only generated on a sender eis context.
|
||||
* See eis_device_swipe_new() and eis_swipe_end() for the receiver context API.
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
EIS_EVENT_SWIPE_END,
|
||||
|
||||
/**
|
||||
* Event for a pinch begin. Only one pinch gesture may be active
|
||||
* at any time.
|
||||
*
|
||||
* @note This event is only generated on a sender eis context.
|
||||
* See eis_device_pinch_new() and eis_pinch_begin() for the receiver context API.
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
EIS_EVENT_PINCH_BEGIN = 910,
|
||||
/**
|
||||
* Event for an update to the current ongoing pinch gesture.
|
||||
*
|
||||
* This library accumulates all updates to the gesture within the same
|
||||
* device frame into one gesture event, e.g. where the gestures moves
|
||||
* and rotates only one update event is generated.
|
||||
*
|
||||
* @note This event is only generated on a sender eis context.
|
||||
* See eis_device_pinch_new() and eis_pinch_update() for the receiver context API.
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
EIS_EVENT_PINCH_UPDATE,
|
||||
/**
|
||||
* Event for the logical end to the current ongoing pinch gesture.
|
||||
*
|
||||
* @note This event is only generated on a sender eis context.
|
||||
* See eis_device_pinch_new() and eis_pinch_end() for the receiver context API.
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
EIS_EVENT_PINCH_END,
|
||||
|
||||
/**
|
||||
* Event for a hold begin. Only one hold gesture may be active
|
||||
* at any time.
|
||||
*
|
||||
* @note This event is only generated on a sender eis context.
|
||||
* See eis_device_hold_new() and eis_hold_begin() for the receiver context API.
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
EIS_EVENT_HOLD_BEGIN = 920,
|
||||
/**
|
||||
* Event for the logical end to the current ongoing hold gesture.
|
||||
*
|
||||
* @note This event is only generated on a sender eis context.
|
||||
* See eis_device_hold_new() and eis_hold_end() for the receiver context API.
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
EIS_EVENT_HOLD_END,
|
||||
|
||||
/**
|
||||
* A key sym logical press or release event
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
EIS_EVENT_TEXT_KEYSYM = 1000,
|
||||
EIS_EVENT_TEXT_KEYSYM = 900,
|
||||
|
||||
/**
|
||||
* A UTF-8 text event
|
||||
|
|
@ -1473,8 +1372,7 @@ eis_device_remove(struct eis_device *device);
|
|||
* - any buttons or keys logically down are released
|
||||
* - any modifiers logically down are released
|
||||
* - any touches logically down are released
|
||||
* - any gestures logically active are ended
|
||||
* No events will be sent for these state changes back to a neutral state.
|
||||
* No events will be sent for these releases back to a neutral state.
|
||||
*
|
||||
* @param device A connected device
|
||||
*/
|
||||
|
|
@ -1826,363 +1724,6 @@ eis_touch_get_user_data(struct eis_touch *touch);
|
|||
struct eis_device *
|
||||
eis_touch_get_device(struct eis_touch *touch);
|
||||
|
||||
/**
|
||||
* @ingroup libeis-sender
|
||||
*
|
||||
* Cancel any ongoing swipe gesture on a device with the @ref EIS_DEVICE_CAP_GESTURES
|
||||
* capability. This notifies the client of the gesture cancelation and the client
|
||||
* may no longer send @ref EIS_EVENT_SWIPE_UPDATE or
|
||||
* @ref EIS_EVENT_SWIPE_END for the current gestures.
|
||||
*
|
||||
* Due to the asynchronous nature of the protocol, events of type
|
||||
* @ref EIS_EVENT_SWIPE_UPDATE and/or
|
||||
* @ref EIS_EVENT_SWIPE_END may have already been sent by the client. An EIS
|
||||
* implementation must ignore those events.
|
||||
*
|
||||
* This method is only available on a sender eis context.
|
||||
*
|
||||
* If no swipe gesture is currently in progress, this function does nothing.
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
void
|
||||
eis_device_swipe_cancel(struct eis_device *device);
|
||||
|
||||
/**
|
||||
* @ingroup libeis-sender
|
||||
*
|
||||
* Cancel any ongoing pinch gesture on a device with the @ref EIS_DEVICE_CAP_GESTURES
|
||||
* capability. This notifies the client of the gesture cancelation and the client
|
||||
* may no longer send @ref EIS_EVENT_PINCH_UPDATE or
|
||||
* @ref EIS_EVENT_PINCH_END for the current gestures.
|
||||
*
|
||||
* Due to the asynchronous nature of the protocol, events of type
|
||||
* @ref EIS_EVENT_PINCH_UPDATE and/or
|
||||
* @ref EIS_EVENT_PINCH_END may have already been sent by the client. An EIS
|
||||
* implementation must ignore those events.
|
||||
*
|
||||
* This method is only available on a sender eis context.
|
||||
*
|
||||
* If no pinch gesture is currently in progress, this function does nothing.
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
void
|
||||
eis_device_pinch_cancel(struct eis_device *device);
|
||||
|
||||
/**
|
||||
* @ingroup libeis-sender
|
||||
*
|
||||
* Cancel any ongoing hold gesture on a device with the @ref EIS_DEVICE_CAP_GESTURES
|
||||
* capability. This notifies the client of the gesture cancelation and the client
|
||||
* may no longer send @ref EIS_EVENT_HOLD_END for the current gestures.
|
||||
*
|
||||
* Due to the asynchronous nature of the protocol, events of type
|
||||
* @ref EIS_EVENT_HOLD_END may have already been sent by the client. An EIS
|
||||
* implementation must ignore those events.
|
||||
*
|
||||
* This method is only available on a sender eis context.
|
||||
*
|
||||
* If no hold gesture is currently in progress, this function does nothing.
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
void
|
||||
eis_device_hold_cancel(struct eis_device *device);
|
||||
|
||||
/**
|
||||
* @ingroup libeis-receiver
|
||||
*
|
||||
* Initiate a new swipe gesture on a device with the @ref EIS_DEVICE_CAP_GESTURES
|
||||
* capability. This gesture does not immediately send events, use
|
||||
* eis_swipe_begin(), eis_swipe_update() and eis_swipe_end().
|
||||
*
|
||||
* The returned gesture has a refcount of at least 1, use eis_swipe_unref() to
|
||||
* release resources associated with this gesture
|
||||
*
|
||||
* This method is only available on an eis receiver context.
|
||||
*
|
||||
* If the underlying device does not support swipe gestures, this function
|
||||
* returns NULL.
|
||||
*
|
||||
* @param device A device with @ref EIS_DEVICE_CAP_GESTURES capability
|
||||
* @param nfingers The number of fingers, must be greater than 0
|
||||
* @return A new swipe gesture or NULL on error
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
struct eis_swipe *
|
||||
eis_device_swipe_new(struct eis_device *device, uint32_t nfingers);
|
||||
|
||||
/**
|
||||
* @ingroup libeis-receiver
|
||||
*
|
||||
* Starts the swipe gesture.
|
||||
*
|
||||
* This function can only be called once on an eis_swipe object. Further
|
||||
* calls to eis_swipe_begin() on the same object are silently ignored.
|
||||
*
|
||||
* @param swipe A newly created swipe gesture
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
void
|
||||
eis_swipe_begin(struct eis_swipe *swipe);
|
||||
|
||||
/**
|
||||
* @ingroup libeis-receiver
|
||||
*
|
||||
* Update the swipe gestures's position by the given relative delta.
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
void
|
||||
eis_swipe_update(struct eis_swipe *swipe, double x, double y);
|
||||
|
||||
/**
|
||||
* @ingroup libeis-receiver
|
||||
*
|
||||
* Release this swipe. After this call, the swipe event becomes inert and
|
||||
* no longer responds to either eis_swipe_begin(),
|
||||
* eis_swipe_update(), eis_swipe_cancel() or
|
||||
* eis_swipe_end() and the caller should call eis_swipe_unref().
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
void
|
||||
eis_swipe_end(struct eis_swipe *swipe);
|
||||
|
||||
/**
|
||||
* @ingroup libeis-receiver
|
||||
*
|
||||
* Cancel this swipe. After this call, the swipe event becomes inert and
|
||||
* no longer responds to either eis_swipe_begin(),
|
||||
* eis_swipe_update(), eis_swipe_cancel() or
|
||||
* eis_swipe_end() and the caller should call eis_swipe_unref().
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
void
|
||||
eis_swipe_cancel(struct eis_swipe *swipe);
|
||||
|
||||
/**
|
||||
* @ingroup libeis-receiver
|
||||
*
|
||||
* Increase the refcount of this struct by one. Use eis_swipe_unref() to
|
||||
* decrease the refcount.
|
||||
*
|
||||
* @return the argument passed into the function
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
struct eis_swipe *
|
||||
eis_swipe_ref(struct eis_swipe *swipe);
|
||||
|
||||
/**
|
||||
* @ingroup libeis-receiver
|
||||
*
|
||||
* Decrease the refcount of this struct by one. When the refcount reaches
|
||||
* zero, all allocated resources for this struct are released.
|
||||
*
|
||||
* @return always NULL
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
struct eis_swipe *
|
||||
eis_swipe_unref(struct eis_swipe *swipe);
|
||||
|
||||
/**
|
||||
* @ingroup libeis-receiver
|
||||
*
|
||||
* Initiate a new pinch gesture on a device with the @ref EIS_DEVICE_CAP_GESTURES
|
||||
* capability. This gesture does not immediately send events, use
|
||||
* eis_pinch_begin(), eis_pinch_update() and eis_pinch_end().
|
||||
*
|
||||
* The returned gesture has a refcount of at least 1, use eis_pinch_unref() to
|
||||
* release resources associated with this gesture
|
||||
*
|
||||
* This method is only available on an eis receiver context.
|
||||
*
|
||||
* If the underlying device does not support pinch gestures, this function
|
||||
* returns NULL.
|
||||
*
|
||||
* @param device A device with @ref EIS_DEVICE_CAP_GESTURES capability
|
||||
* @param nfingers The number of fingers, must be at least 2
|
||||
* @return A new pinch gesture or NULL on error
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
struct eis_pinch *
|
||||
eis_device_pinch_new(struct eis_device *device, uint32_t nfingers);
|
||||
|
||||
/**
|
||||
* @ingroup libeis-receiver
|
||||
*
|
||||
* Starts the pinch gesture.
|
||||
*
|
||||
* This function can only be called once on an eis_pinch object. Further
|
||||
* calls to eis_pinch_begin() on the same object are silently ignored.
|
||||
*
|
||||
* @param pinch A newly created pinch gesture
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
void
|
||||
eis_pinch_begin(struct eis_pinch *pinch);
|
||||
|
||||
/**
|
||||
* @ingroup libeis-receiver
|
||||
*
|
||||
* Update the pinch gestures's position by the given relative delta.
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
void
|
||||
eis_pinch_update(struct eis_pinch *pinch, double x, double y, double scale, double rotation);
|
||||
|
||||
/**
|
||||
* @ingroup libeis-receiver
|
||||
*
|
||||
* Release this pinch. After this call, the pinch event becomes inert and
|
||||
* no longer responds to either eis_pinch_begin(),
|
||||
* eis_pinch_update(), eis_pinch_cancel() or
|
||||
* eis_pinch_end() and the caller should call eis_pinch_unref().
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
void
|
||||
eis_pinch_end(struct eis_pinch *pinch);
|
||||
|
||||
/**
|
||||
* @ingroup libeis-receiver
|
||||
*
|
||||
* Cancel this pinch. After this call, the pinch event becomes inert and
|
||||
* no longer responds to either eis_pinch_begin(),
|
||||
* eis_pinch_update(), eis_pinch_cancel() or
|
||||
* eis_pinch_end() and the caller should call eis_pinch_unref().
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
void
|
||||
eis_pinch_cancel(struct eis_pinch *pinch);
|
||||
|
||||
/**
|
||||
* @ingroup libeis-receiver
|
||||
*
|
||||
* Increase the refcount of this struct by one. Use eis_pinch_unref() to
|
||||
* decrease the refcount.
|
||||
*
|
||||
* @return the argument passed into the function
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
struct eis_pinch *
|
||||
eis_pinch_ref(struct eis_pinch *pinch);
|
||||
|
||||
/**
|
||||
* @ingroup libeis-receiver
|
||||
*
|
||||
* Decrease the refcount of this struct by one. When the refcount reaches
|
||||
* zero, all allocated resources for this struct are released.
|
||||
*
|
||||
* @return always NULL
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
struct eis_pinch *
|
||||
eis_pinch_unref(struct eis_pinch *pinch);
|
||||
|
||||
/**
|
||||
* @ingroup libeis-receiver
|
||||
*
|
||||
* Initiate a new hold gesture on a device with the @ref EIS_DEVICE_CAP_GESTURES
|
||||
* capability. This gesture does not immediately send events, use
|
||||
* eis_hold_begin() and eis_hold_end().
|
||||
*
|
||||
* The returned gesture has a refcount of at least 1, use eis_hold_unref() to
|
||||
* release resources associated with this gesture
|
||||
*
|
||||
* This method is only available on an eis receiver context.
|
||||
*
|
||||
* If the underlying device does not support hold gestures, this function
|
||||
* returns NULL.
|
||||
*
|
||||
* @param device A device with @ref EIS_DEVICE_CAP_GESTURES capability
|
||||
* @param nfingers The number of fingers, must be greater than 0
|
||||
* @return A new hold gesture or NULL on error
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
struct eis_hold *
|
||||
eis_device_hold_new(struct eis_device *device, uint32_t nfingers);
|
||||
|
||||
/**
|
||||
* @ingroup libeis-receiver
|
||||
*
|
||||
* Starts the hold gesture.
|
||||
*
|
||||
* This function can only be called once on an eis_hold object. Further
|
||||
* calls to eis_hold_begin() on the same object are silently ignored.
|
||||
*
|
||||
* @param hold A newly created hold gesture
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
void
|
||||
eis_hold_begin(struct eis_hold *hold);
|
||||
|
||||
/**
|
||||
* @ingroup libeis-receiver
|
||||
*
|
||||
* Release this hold. After this call, the hold event becomes inert and
|
||||
* no longer responds to either eis_hold_begin(),
|
||||
* eis_hold_cancel() or
|
||||
* eis_hold_end() and the caller should call eis_hold_unref().
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
void
|
||||
eis_hold_end(struct eis_hold *hold);
|
||||
|
||||
/**
|
||||
* @ingroup libeis-receiver
|
||||
*
|
||||
* Cancel this hold. After this call, the hold event becomes inert and
|
||||
* no longer responds to either eis_hold_begin(),
|
||||
* eis_hold_cancel() or
|
||||
* eis_hold_end() and the caller should call eis_hold_unref().
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
void
|
||||
eis_hold_cancel(struct eis_hold *hold);
|
||||
|
||||
/**
|
||||
* @ingroup libeis-receiver
|
||||
*
|
||||
* Increase the refcount of this struct by one. Use eis_hold_unref() to
|
||||
* decrease the refcount.
|
||||
*
|
||||
* @return the argument passed into the function
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
struct eis_hold *
|
||||
eis_hold_ref(struct eis_hold *hold);
|
||||
|
||||
/**
|
||||
* @ingroup libeis-receiver
|
||||
*
|
||||
* Decrease the refcount of this struct by one. When the refcount reaches
|
||||
* zero, all allocated resources for this struct are released.
|
||||
*
|
||||
* @return always NULL
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
struct eis_hold *
|
||||
eis_hold_unref(struct eis_hold *hold);
|
||||
|
||||
/**
|
||||
* @ingroup libeis-sender
|
||||
*
|
||||
|
|
@ -2374,145 +1915,6 @@ eis_event_touch_get_y(struct eis_event *event);
|
|||
bool
|
||||
eis_event_touch_get_is_cancel(struct eis_event *event);
|
||||
|
||||
/**
|
||||
* @ingroup libeis-sender
|
||||
*
|
||||
* For an event of type @ref EIS_EVENT_SWIPE_BEGIN,
|
||||
* @ref EIS_EVENT_SWIPE_UPDATE or @ref EIS_EVENT_SWIPE_END
|
||||
* return the finger count for this gesture.
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
uint32_t
|
||||
eis_event_swipe_get_finger_count(struct eis_event *event);
|
||||
|
||||
/**
|
||||
* @ingroup libeis-sender
|
||||
*
|
||||
* For an event of type @ref EIS_EVENT_SWIPE_UPDATE
|
||||
* return the relative x movement of the logical center
|
||||
* of the gesture in logical pixels or mm, depending on the device type.
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
double
|
||||
eis_event_swipe_get_dx(struct eis_event *event);
|
||||
|
||||
/**
|
||||
* @ingroup libeis-sender
|
||||
*
|
||||
* For an event of type @ref EIS_EVENT_SWIPE_UPDATE
|
||||
* return the relative y movement of the logical center
|
||||
* of the gesture in logical pixels or mm, depending on the device type.
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
double
|
||||
eis_event_swipe_get_dy(struct eis_event *event);
|
||||
|
||||
/**
|
||||
* @ingroup libeis-sender
|
||||
*
|
||||
* For an event of type @ref EIS_EVENT_SWIPE_END
|
||||
* return true if the gesture was cancelled, false otherwise.
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
bool
|
||||
eis_event_swipe_get_is_cancelled(struct eis_event *event);
|
||||
|
||||
/**
|
||||
* @ingroup libeis-sender
|
||||
*
|
||||
* For an event of type @ref EIS_EVENT_PINCH_BEGIN,
|
||||
* @ref EIS_EVENT_PINCH_UPDATE or @ref EIS_EVENT_PINCH_END
|
||||
* return the finger count for this gesture.
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
uint32_t
|
||||
eis_event_pinch_get_finger_count(struct eis_event *event);
|
||||
|
||||
/**
|
||||
* @ingroup libeis-sender
|
||||
*
|
||||
* For an event of type @ref EIS_EVENT_PINCH_UPDATE
|
||||
* return the relative x movement of the logical center
|
||||
* of the gesture in logical pixels or mm, depending on the device type.
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
double
|
||||
eis_event_pinch_get_dx(struct eis_event *event);
|
||||
|
||||
/**
|
||||
* @ingroup libeis-sender
|
||||
*
|
||||
* For an event of type @ref EIS_EVENT_PINCH_UPDATE
|
||||
* return the relative y movement of the logical center
|
||||
* of the gesture in logical pixels or mm, depending on the device type.
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
double
|
||||
eis_event_pinch_get_dy(struct eis_event *event);
|
||||
|
||||
/**
|
||||
* @ingroup libeis-sender
|
||||
*
|
||||
* For an event of type @ref EIS_EVENT_PINCH_UPDATE
|
||||
* return the relative angle of rotation in degrees clockwise.
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
double
|
||||
eis_event_pinch_get_rotation(struct eis_event *event);
|
||||
|
||||
/**
|
||||
* @ingroup libeis-sender
|
||||
*
|
||||
* For an event of type @ref EIS_EVENT_PINCH_UPDATE
|
||||
* return the normalized scale of the gesture.
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
double
|
||||
eis_event_pinch_get_scale(struct eis_event *event);
|
||||
|
||||
/**
|
||||
* @ingroup libeis-sender
|
||||
*
|
||||
* For an event of type @ref EIS_EVENT_PINCH_END
|
||||
* return true if the gesture was cancelled, false otherwise.
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
bool
|
||||
eis_event_pinch_get_is_cancelled(struct eis_event *event);
|
||||
|
||||
/**
|
||||
* @ingroup libeis-sender
|
||||
*
|
||||
* For an event of type @ref EIS_EVENT_HOLD_BEGIN
|
||||
* or @ref EIS_EVENT_HOLD_END
|
||||
* return the finger count for this gesture.
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
uint32_t
|
||||
eis_event_hold_get_finger_count(struct eis_event *event);
|
||||
|
||||
/**
|
||||
* @ingroup libeis-sender
|
||||
*
|
||||
* For an event of type @ref EIS_EVENT_HOLD_END
|
||||
* return true if the gesture was cancelled, false otherwise.
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
bool
|
||||
eis_event_hold_get_is_cancelled(struct eis_event *event);
|
||||
|
||||
/**
|
||||
* @ingroup libeis-sender
|
||||
*
|
||||
|
|
|
|||
|
|
@ -67,7 +67,6 @@ if build_libei
|
|||
'libei-device.c',
|
||||
'libei-event.c',
|
||||
'libei-fd.c',
|
||||
'libei-gestures.c',
|
||||
'libei-handshake.c',
|
||||
'libei-keyboard.c',
|
||||
'libei-log.c',
|
||||
|
|
@ -148,7 +147,6 @@ if build_libeis
|
|||
'libeis-device.c',
|
||||
'libeis-event.c',
|
||||
'libeis-fd.c',
|
||||
'libeis-gestures.c',
|
||||
'libeis-handshake.c',
|
||||
'libeis-keyboard.c',
|
||||
'libeis-log.c',
|
||||
|
|
|
|||
|
|
@ -135,12 +135,6 @@ static MunitResult _func(const MunitParameter params[], void *user_data)
|
|||
#define MUNIT_TEST_PARAM(name_) \
|
||||
munit_parameters_get(params, name_)
|
||||
|
||||
#define MUNIT_TEST_PARAM_BOOL(name_) \
|
||||
streq(munit_parameters_get(params, name_), "true")
|
||||
|
||||
#define MUNIT_TEST_PARAM_INT(name_) \
|
||||
atoi(munit_parameters_get(params, name_))
|
||||
|
||||
/**
|
||||
* Defines a struct global_setup_function in a custom ELF section that we can
|
||||
* then find in munit_tests_run() to do setup based on argv and/or pass userdata
|
||||
|
|
|
|||
|
|
@ -74,7 +74,6 @@ struct peck {
|
|||
struct eis_device *eis_button;
|
||||
struct eis_device *eis_scroll;
|
||||
struct eis_device *eis_touch;
|
||||
struct eis_device *eis_gestures;
|
||||
|
||||
struct ei_seat *ei_seat;
|
||||
struct ei_device *ei_pointer;
|
||||
|
|
@ -83,7 +82,6 @@ struct peck {
|
|||
struct ei_device *ei_button;
|
||||
struct ei_device *ei_scroll;
|
||||
struct ei_device *ei_touch;
|
||||
struct ei_device *ei_gestures;
|
||||
|
||||
uint64_t now;
|
||||
|
||||
|
|
@ -176,7 +174,6 @@ peck_destroy(struct peck *peck)
|
|||
eis_device_unref(peck->eis_touch);
|
||||
eis_device_unref(peck->eis_button);
|
||||
eis_device_unref(peck->eis_scroll);
|
||||
eis_device_unref(peck->eis_gestures);
|
||||
eis_seat_unref(peck->eis_seat);
|
||||
|
||||
ei_device_unref(peck->ei_pointer);
|
||||
|
|
@ -185,7 +182,6 @@ peck_destroy(struct peck *peck)
|
|||
ei_device_unref(peck->ei_touch);
|
||||
ei_device_unref(peck->ei_button);
|
||||
ei_device_unref(peck->ei_scroll);
|
||||
ei_device_unref(peck->ei_gestures);
|
||||
ei_seat_unref(peck->ei_seat);
|
||||
|
||||
ei_unref(peck->ei);
|
||||
|
|
@ -354,13 +350,6 @@ peck_eis_get_default_touch(struct peck *peck)
|
|||
return peck->eis_touch;
|
||||
}
|
||||
|
||||
struct eis_device *
|
||||
peck_eis_get_default_gestures(struct peck *peck)
|
||||
{
|
||||
munit_assert_ptr_not_null(peck->eis_gestures);
|
||||
return peck->eis_gestures;
|
||||
}
|
||||
|
||||
struct ei_seat *
|
||||
peck_ei_get_default_seat(struct peck *peck)
|
||||
{
|
||||
|
|
@ -410,13 +399,6 @@ peck_ei_get_default_touch(struct peck *peck)
|
|||
return peck->ei_touch;
|
||||
}
|
||||
|
||||
struct ei_device *
|
||||
peck_ei_get_default_gestures(struct peck *peck)
|
||||
{
|
||||
munit_assert_ptr_not_null(peck->ei_gestures);
|
||||
return peck->ei_gestures;
|
||||
}
|
||||
|
||||
/* Ensures that device frames in tests always have an ascending and fixed
|
||||
* interval. Every time this is called it adds 10ms to the time offset.
|
||||
*/
|
||||
|
|
@ -767,7 +749,6 @@ peck_enable_eis_behavior(struct peck *peck, enum peck_eis_behavior behavior)
|
|||
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_ADD_POINTER_ABSOLUTE);
|
||||
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_ADD_KEYBOARD);
|
||||
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_ADD_TOUCH);
|
||||
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_ADD_GESTURES);
|
||||
break;
|
||||
case PECK_EIS_BEHAVIOR_HANDLE_BIND_SEAT:
|
||||
case PECK_EIS_BEHAVIOR_HANDLE_CLOSE_DEVICE:
|
||||
|
|
@ -779,9 +760,6 @@ peck_enable_eis_behavior(struct peck *peck, enum peck_eis_behavior behavior)
|
|||
case PECK_EIS_BEHAVIOR_ADD_POINTER_ABSOLUTE:
|
||||
case PECK_EIS_BEHAVIOR_ADD_KEYBOARD:
|
||||
case PECK_EIS_BEHAVIOR_ADD_TOUCH:
|
||||
case PECK_EIS_BEHAVIOR_ADD_GESTURES:
|
||||
flag_set(peck->eis_behavior, behavior);
|
||||
break;
|
||||
case PECK_EIS_BEHAVIOR_HANDLE_DEVICE_READY:
|
||||
flag_set(peck->eis_behavior, behavior);
|
||||
break;
|
||||
|
|
@ -840,7 +818,6 @@ peck_disable_eis_behavior(struct peck *peck, enum peck_eis_behavior behavior)
|
|||
case PECK_EIS_BEHAVIOR_ADD_POINTER_ABSOLUTE:
|
||||
case PECK_EIS_BEHAVIOR_ADD_KEYBOARD:
|
||||
case PECK_EIS_BEHAVIOR_ADD_TOUCH:
|
||||
case PECK_EIS_BEHAVIOR_ADD_GESTURES:
|
||||
case PECK_EIS_BEHAVIOR_HANDLE_DEVICE_READY:
|
||||
case PECK_EIS_BEHAVIOR_REJECT_CLIENT:
|
||||
case PECK_EIS_BEHAVIOR_ACCEPT_CLIENT:
|
||||
|
|
@ -875,7 +852,6 @@ peck_enable_ei_behavior(struct peck *peck, enum peck_ei_behavior behavior)
|
|||
peck_enable_ei_behavior(peck, PECK_EI_BEHAVIOR_HANDLE_ADDED_TOUCH);
|
||||
peck_enable_ei_behavior(peck, PECK_EI_BEHAVIOR_HANDLE_ADDED_BUTTON);
|
||||
peck_enable_ei_behavior(peck, PECK_EI_BEHAVIOR_HANDLE_ADDED_SCROLL);
|
||||
peck_enable_ei_behavior(peck, PECK_EI_BEHAVIOR_HANDLE_ADDED_GESTURES);
|
||||
break;
|
||||
case PECK_EI_BEHAVIOR_AUTOSTART:
|
||||
case PECK_EI_BEHAVIOR_HANDLE_ADDED_POINTER:
|
||||
|
|
@ -884,7 +860,6 @@ peck_enable_ei_behavior(struct peck *peck, enum peck_ei_behavior behavior)
|
|||
case PECK_EI_BEHAVIOR_HANDLE_ADDED_TOUCH:
|
||||
case PECK_EI_BEHAVIOR_HANDLE_ADDED_BUTTON:
|
||||
case PECK_EI_BEHAVIOR_HANDLE_ADDED_SCROLL:
|
||||
case PECK_EI_BEHAVIOR_HANDLE_ADDED_GESTURES:
|
||||
case PECK_EI_BEHAVIOR_HANDLE_FRAME:
|
||||
case PECK_EI_BEHAVIOR_HANDLE_SYNC:
|
||||
case PECK_EI_BEHAVIOR_HANDLE_RESUMED:
|
||||
|
|
@ -926,7 +901,6 @@ peck_disable_ei_behavior(struct peck *peck, enum peck_ei_behavior behavior)
|
|||
case PECK_EI_BEHAVIOR_HANDLE_ADDED_TOUCH:
|
||||
case PECK_EI_BEHAVIOR_HANDLE_ADDED_BUTTON:
|
||||
case PECK_EI_BEHAVIOR_HANDLE_ADDED_SCROLL:
|
||||
case PECK_EI_BEHAVIOR_HANDLE_ADDED_GESTURES:
|
||||
case PECK_EI_BEHAVIOR_HANDLE_FRAME:
|
||||
case PECK_EI_BEHAVIOR_HANDLE_SYNC:
|
||||
case PECK_EI_BEHAVIOR_HANDLE_RESUMED:
|
||||
|
|
@ -947,7 +921,6 @@ peck_create_eis_seat(struct peck *peck, struct eis_client *client)
|
|||
eis_seat_configure_capability(seat, EIS_DEVICE_CAP_TOUCH);
|
||||
eis_seat_configure_capability(seat, EIS_DEVICE_CAP_BUTTON);
|
||||
eis_seat_configure_capability(seat, EIS_DEVICE_CAP_SCROLL);
|
||||
eis_seat_configure_capability(seat, EIS_DEVICE_CAP_GESTURES);
|
||||
|
||||
log_debug(peck, "EIS adding seat: '%s'\n", eis_seat_get_name(seat));
|
||||
eis_seat_add(seat);
|
||||
|
|
@ -1034,23 +1007,6 @@ peck_eis_create_touch(struct peck *peck, struct eis_seat *seat, const char *name
|
|||
return device;
|
||||
}
|
||||
|
||||
static inline struct eis_device *
|
||||
peck_eis_create_gestures(struct peck *peck, struct eis_seat *seat, const char *name)
|
||||
{
|
||||
struct eis_device *device = eis_seat_new_device(seat);
|
||||
_unref_(eis_region) *region = eis_device_new_region(device);
|
||||
|
||||
eis_region_set_offset(region, 0, 0);
|
||||
eis_region_set_size(region, 1920, 1080);
|
||||
|
||||
eis_device_configure_name(device, name);
|
||||
eis_device_configure_capability(device, EIS_DEVICE_CAP_GESTURES);
|
||||
eis_region_add(region);
|
||||
eis_device_add(device);
|
||||
|
||||
return device;
|
||||
}
|
||||
|
||||
static inline void
|
||||
peck_handle_eis_seat_bind(struct peck *peck, struct eis_event *e)
|
||||
{
|
||||
|
|
@ -1142,35 +1098,13 @@ peck_handle_eis_seat_bind(struct peck *peck, struct eis_event *e)
|
|||
}
|
||||
}
|
||||
|
||||
if (eis_event_seat_has_capability(e, EIS_DEVICE_CAP_GESTURES)) {
|
||||
if (flag_is_set(peck->eis_behavior, PECK_EIS_BEHAVIOR_ADD_GESTURES) &&
|
||||
!peck->eis_gestures) {
|
||||
log_debug(peck, "EIS creating default gesture\n");
|
||||
_unref_(eis_device) *gestures =
|
||||
peck_eis_create_gestures(peck, seat, "default gesture");
|
||||
|
||||
if (flag_is_set(peck->eis_behavior, PECK_EIS_BEHAVIOR_RESUME_DEVICE))
|
||||
eis_device_resume(gestures);
|
||||
|
||||
peck->eis_gestures = eis_device_ref(gestures);
|
||||
}
|
||||
} else {
|
||||
if (peck->eis_gestures) {
|
||||
log_debug(peck, "EIS removing default gesture\n");
|
||||
|
||||
_unref_(eis_device) *gestures = steal(&peck->eis_gestures);
|
||||
eis_device_remove(gestures);
|
||||
}
|
||||
}
|
||||
|
||||
/* Removing all caps means removing the seat */
|
||||
if (!eis_event_seat_has_capability(e, EIS_DEVICE_CAP_POINTER) &&
|
||||
!eis_event_seat_has_capability(e, EIS_DEVICE_CAP_POINTER_ABSOLUTE) &&
|
||||
!eis_event_seat_has_capability(e, EIS_DEVICE_CAP_KEYBOARD) &&
|
||||
!eis_event_seat_has_capability(e, EIS_DEVICE_CAP_BUTTON) &&
|
||||
!eis_event_seat_has_capability(e, EIS_DEVICE_CAP_SCROLL) &&
|
||||
!eis_event_seat_has_capability(e, EIS_DEVICE_CAP_TOUCH) &&
|
||||
!eis_event_seat_has_capability(e, EIS_DEVICE_CAP_GESTURES))
|
||||
!eis_event_seat_has_capability(e, EIS_DEVICE_CAP_TOUCH))
|
||||
eis_seat_remove(seat);
|
||||
}
|
||||
|
||||
|
|
@ -1190,8 +1124,6 @@ peck_eis_device_remove(struct peck *peck, struct eis_device *device)
|
|||
peck->eis_button = eis_device_unref(device);
|
||||
if (device == peck->eis_scroll)
|
||||
peck->eis_scroll = eis_device_unref(device);
|
||||
if (device == peck->eis_gestures)
|
||||
peck->eis_gestures = eis_device_unref(device);
|
||||
}
|
||||
|
||||
bool
|
||||
|
|
@ -1273,14 +1205,6 @@ _peck_dispatch_eis(struct peck *peck, int lineno)
|
|||
case EIS_EVENT_TOUCH_DOWN:
|
||||
case EIS_EVENT_TOUCH_UP:
|
||||
case EIS_EVENT_TOUCH_MOTION:
|
||||
case EIS_EVENT_SWIPE_BEGIN:
|
||||
case EIS_EVENT_SWIPE_UPDATE:
|
||||
case EIS_EVENT_SWIPE_END:
|
||||
case EIS_EVENT_PINCH_BEGIN:
|
||||
case EIS_EVENT_PINCH_UPDATE:
|
||||
case EIS_EVENT_PINCH_END:
|
||||
case EIS_EVENT_HOLD_BEGIN:
|
||||
case EIS_EVENT_HOLD_END:
|
||||
case EIS_EVENT_TEXT_KEYSYM:
|
||||
case EIS_EVENT_TEXT_UTF8:
|
||||
peck->eis_needs_frame = true;
|
||||
|
|
@ -1367,10 +1291,6 @@ peck_check_ei_added(struct peck *peck, struct ei_event *e)
|
|||
flag_is_set(peck->ei_behavior, PECK_EI_BEHAVIOR_HANDLE_ADDED_SCROLL))
|
||||
return tristate_yes;
|
||||
|
||||
if (ei_device_has_capability(device, EI_DEVICE_CAP_GESTURES) &&
|
||||
flag_is_set(peck->ei_behavior, PECK_EI_BEHAVIOR_HANDLE_ADDED_GESTURES))
|
||||
return tristate_yes;
|
||||
|
||||
return tristate_unset;
|
||||
}
|
||||
|
||||
|
|
@ -1447,22 +1367,10 @@ _peck_dispatch_ei(struct peck *peck, int lineno)
|
|||
case EI_EVENT_TOUCH_DOWN:
|
||||
case EI_EVENT_TOUCH_UP:
|
||||
case EI_EVENT_TOUCH_MOTION:
|
||||
case EI_EVENT_SWIPE_BEGIN:
|
||||
case EI_EVENT_SWIPE_UPDATE:
|
||||
case EI_EVENT_SWIPE_END:
|
||||
case EI_EVENT_PINCH_BEGIN:
|
||||
case EI_EVENT_PINCH_UPDATE:
|
||||
case EI_EVENT_PINCH_END:
|
||||
case EI_EVENT_HOLD_BEGIN:
|
||||
case EI_EVENT_HOLD_END:
|
||||
case EI_EVENT_TEXT_KEYSYM:
|
||||
case EI_EVENT_TEXT_UTF8:
|
||||
peck->ei_needs_frame = true;
|
||||
break;
|
||||
case EI_EVENT_SWIPE_CANCELLED:
|
||||
case EI_EVENT_PINCH_CANCELLED:
|
||||
case EI_EVENT_HOLD_CANCELLED:
|
||||
break;
|
||||
}
|
||||
|
||||
log_debug(peck,
|
||||
|
|
@ -1497,7 +1405,6 @@ _peck_dispatch_ei(struct peck *peck, int lineno)
|
|||
EI_DEVICE_CAP_TOUCH,
|
||||
EI_DEVICE_CAP_BUTTON,
|
||||
EI_DEVICE_CAP_SCROLL,
|
||||
EI_DEVICE_CAP_GESTURES,
|
||||
NULL);
|
||||
break;
|
||||
}
|
||||
|
|
@ -1521,9 +1428,6 @@ _peck_dispatch_ei(struct peck *peck, int lineno)
|
|||
if (!peck->ei_scroll &&
|
||||
ei_device_has_capability(device, EI_DEVICE_CAP_SCROLL))
|
||||
peck->ei_scroll = ei_device_ref(device);
|
||||
if (!peck->ei_gestures &&
|
||||
ei_device_has_capability(device, EI_DEVICE_CAP_GESTURES))
|
||||
peck->ei_gestures = ei_device_ref(device);
|
||||
break;
|
||||
}
|
||||
case EI_EVENT_DEVICE_RESUMED:
|
||||
|
|
@ -1784,70 +1688,6 @@ _peck_ei_touch_event(struct ei *ei, enum ei_event_type type, double x, double y,
|
|||
return event;
|
||||
}
|
||||
|
||||
struct ei_event *
|
||||
_peck_ei_swipe_event(struct ei *ei, enum ei_event_type type, int lineno)
|
||||
{
|
||||
assert(type == EI_EVENT_SWIPE_BEGIN || type == EI_EVENT_SWIPE_UPDATE ||
|
||||
type == EI_EVENT_SWIPE_END);
|
||||
|
||||
struct ei_event *event = _peck_ei_next_event(ei, type, lineno);
|
||||
|
||||
return event;
|
||||
}
|
||||
|
||||
struct ei_event *
|
||||
_peck_ei_pinch_event(struct ei *ei, enum ei_event_type type, int lineno)
|
||||
{
|
||||
assert(type == EI_EVENT_PINCH_BEGIN || type == EI_EVENT_PINCH_UPDATE ||
|
||||
type == EI_EVENT_PINCH_END);
|
||||
|
||||
struct ei_event *event = _peck_ei_next_event(ei, type, lineno);
|
||||
|
||||
return event;
|
||||
}
|
||||
|
||||
struct ei_event *
|
||||
_peck_ei_hold_event(struct ei *ei, enum ei_event_type type, int lineno)
|
||||
{
|
||||
assert(type == EI_EVENT_HOLD_BEGIN || type == EI_EVENT_HOLD_END);
|
||||
|
||||
struct ei_event *event = _peck_ei_next_event(ei, type, lineno);
|
||||
|
||||
return event;
|
||||
}
|
||||
|
||||
struct eis_event *
|
||||
_peck_eis_swipe_event(struct eis *eis, enum eis_event_type type, int lineno)
|
||||
{
|
||||
assert(type == EIS_EVENT_SWIPE_BEGIN || type == EIS_EVENT_SWIPE_UPDATE ||
|
||||
type == EIS_EVENT_SWIPE_END);
|
||||
|
||||
struct eis_event *event = _peck_eis_next_event(eis, type, lineno);
|
||||
|
||||
return event;
|
||||
}
|
||||
|
||||
struct eis_event *
|
||||
_peck_eis_pinch_event(struct eis *eis, enum eis_event_type type, int lineno)
|
||||
{
|
||||
assert(type == EIS_EVENT_PINCH_BEGIN || type == EIS_EVENT_PINCH_UPDATE ||
|
||||
type == EIS_EVENT_PINCH_END);
|
||||
|
||||
struct eis_event *event = _peck_eis_next_event(eis, type, lineno);
|
||||
|
||||
return event;
|
||||
}
|
||||
|
||||
struct eis_event *
|
||||
_peck_eis_hold_event(struct eis *eis, enum eis_event_type type, int lineno)
|
||||
{
|
||||
assert(type == EIS_EVENT_HOLD_BEGIN || type == EIS_EVENT_HOLD_END);
|
||||
|
||||
struct eis_event *event = _peck_eis_next_event(eis, type, lineno);
|
||||
|
||||
return event;
|
||||
}
|
||||
|
||||
const char *
|
||||
peck_ei_event_name(struct ei_event *e)
|
||||
{
|
||||
|
|
@ -1886,17 +1726,6 @@ peck_ei_event_type_name(enum ei_event_type type)
|
|||
CASE_STRING(TOUCH_DOWN);
|
||||
CASE_STRING(TOUCH_UP);
|
||||
CASE_STRING(TOUCH_MOTION);
|
||||
CASE_STRING(SWIPE_BEGIN);
|
||||
CASE_STRING(SWIPE_UPDATE);
|
||||
CASE_STRING(SWIPE_END);
|
||||
CASE_STRING(SWIPE_CANCELLED);
|
||||
CASE_STRING(PINCH_BEGIN);
|
||||
CASE_STRING(PINCH_UPDATE);
|
||||
CASE_STRING(PINCH_END);
|
||||
CASE_STRING(PINCH_CANCELLED);
|
||||
CASE_STRING(HOLD_BEGIN);
|
||||
CASE_STRING(HOLD_END);
|
||||
CASE_STRING(HOLD_CANCELLED);
|
||||
CASE_STRING(TEXT_KEYSYM);
|
||||
CASE_STRING(TEXT_UTF8);
|
||||
}
|
||||
|
|
@ -1938,14 +1767,6 @@ peck_eis_event_type_name(enum eis_event_type type)
|
|||
CASE_STRING(TOUCH_DOWN);
|
||||
CASE_STRING(TOUCH_UP);
|
||||
CASE_STRING(TOUCH_MOTION);
|
||||
CASE_STRING(SWIPE_BEGIN);
|
||||
CASE_STRING(SWIPE_UPDATE);
|
||||
CASE_STRING(SWIPE_END);
|
||||
CASE_STRING(PINCH_BEGIN);
|
||||
CASE_STRING(PINCH_UPDATE);
|
||||
CASE_STRING(PINCH_END);
|
||||
CASE_STRING(HOLD_BEGIN);
|
||||
CASE_STRING(HOLD_END);
|
||||
CASE_STRING(FRAME);
|
||||
CASE_STRING(TEXT_KEYSYM);
|
||||
CASE_STRING(TEXT_UTF8);
|
||||
|
|
|
|||
|
|
@ -106,7 +106,6 @@ enum peck_eis_behavior {
|
|||
PECK_EIS_BEHAVIOR_ADD_POINTER_ABSOLUTE,
|
||||
PECK_EIS_BEHAVIOR_ADD_KEYBOARD,
|
||||
PECK_EIS_BEHAVIOR_ADD_TOUCH,
|
||||
PECK_EIS_BEHAVIOR_ADD_GESTURES,
|
||||
|
||||
PECK_EIS_BEHAVIOR_RESUME_DEVICE,
|
||||
PECK_EIS_BEHAVIOR_SUSPEND_DEVICE,
|
||||
|
|
@ -138,7 +137,6 @@ enum peck_ei_behavior {
|
|||
PECK_EI_BEHAVIOR_HANDLE_ADDED_TOUCH,
|
||||
PECK_EI_BEHAVIOR_HANDLE_ADDED_BUTTON,
|
||||
PECK_EI_BEHAVIOR_HANDLE_ADDED_SCROLL,
|
||||
PECK_EI_BEHAVIOR_HANDLE_ADDED_GESTURES,
|
||||
|
||||
PECK_EI_BEHAVIOR_HANDLE_RESUMED,
|
||||
PECK_EI_BEHAVIOR_HANDLE_PAUSED,
|
||||
|
|
@ -248,9 +246,6 @@ peck_eis_get_default_pointer_absolute(struct peck *peck);
|
|||
struct eis_device *
|
||||
peck_eis_get_default_touch(struct peck *peck);
|
||||
|
||||
struct eis_device *
|
||||
peck_eis_get_default_gestures(struct peck *peck);
|
||||
|
||||
struct eis_device *
|
||||
peck_eis_get_default_button(struct peck *peck);
|
||||
|
||||
|
|
@ -278,9 +273,6 @@ peck_ei_get_default_pointer_absolute(struct peck *peck);
|
|||
struct ei_device *
|
||||
peck_ei_get_default_touch(struct peck *peck);
|
||||
|
||||
struct ei_device *
|
||||
peck_ei_get_default_gestures(struct peck *peck);
|
||||
|
||||
uint64_t
|
||||
peck_ei_now(struct peck *peck);
|
||||
|
||||
|
|
@ -383,62 +375,6 @@ _peck_eis_touch_event(struct eis *eis, enum eis_event_type type, double x, doubl
|
|||
struct ei_event *
|
||||
_peck_ei_touch_event(struct ei *ei, enum ei_event_type type, double x, double y, int lineno);
|
||||
|
||||
#define peck_eis_swipe_begin(_ei) \
|
||||
_peck_eis_swipe_event(_ei, EIS_EVENT_SWIPE_BEGIN, __LINE__)
|
||||
#define peck_eis_swipe_update(_ei) \
|
||||
_peck_eis_swipe_event(_ei, EIS_EVENT_SWIPE_UPDATE, __LINE__)
|
||||
#define peck_eis_swipe_end(_ei) \
|
||||
_peck_eis_swipe_event(_ei, EIS_EVENT_SWIPE_END, __LINE__)
|
||||
|
||||
struct eis_event *
|
||||
_peck_eis_swipe_event(struct eis *eis, enum eis_event_type type, int lineno);
|
||||
|
||||
#define peck_eis_pinch_begin(_ei) \
|
||||
_peck_eis_pinch_event(_ei, EIS_EVENT_PINCH_BEGIN, __LINE__)
|
||||
#define peck_eis_pinch_update(_ei) \
|
||||
_peck_eis_pinch_event(_ei, EIS_EVENT_PINCH_UPDATE, __LINE__)
|
||||
#define peck_eis_pinch_end(_ei) \
|
||||
_peck_eis_pinch_event(_ei, EIS_EVENT_PINCH_END, __LINE__)
|
||||
|
||||
struct eis_event *
|
||||
_peck_eis_pinch_event(struct eis *eis, enum eis_event_type type, int lineno);
|
||||
|
||||
#define peck_eis_hold_begin(_ei) \
|
||||
_peck_eis_hold_event(_ei, EIS_EVENT_HOLD_BEGIN, __LINE__)
|
||||
#define peck_eis_hold_end(_ei) \
|
||||
_peck_eis_hold_event(_ei, EIS_EVENT_HOLD_END, __LINE__)
|
||||
|
||||
struct eis_event *
|
||||
_peck_eis_hold_event(struct eis *eis, enum eis_event_type type, int lineno);
|
||||
|
||||
#define peck_ei_swipe_begin(_ei) \
|
||||
_peck_ei_swipe_event(_ei, EI_EVENT_SWIPE_BEGIN, __LINE__)
|
||||
#define peck_ei_swipe_update(_ei) \
|
||||
_peck_ei_swipe_event(_ei, EI_EVENT_SWIPE_UPDATE, __LINE__)
|
||||
#define peck_ei_swipe_end(_ei) \
|
||||
_peck_ei_swipe_event(_ei, EI_EVENT_SWIPE_END, __LINE__)
|
||||
|
||||
struct ei_event *
|
||||
_peck_ei_swipe_event(struct ei *ei, enum ei_event_type type, int lineno);
|
||||
|
||||
#define peck_ei_pinch_begin(_ei) \
|
||||
_peck_ei_pinch_event(_ei, EI_EVENT_PINCH_BEGIN, __LINE__)
|
||||
#define peck_ei_pinch_update(_ei) \
|
||||
_peck_ei_pinch_event(_ei, EI_EVENT_PINCH_UPDATE, __LINE__)
|
||||
#define peck_ei_pinch_end(_ei) \
|
||||
_peck_ei_pinch_event(_ei, EI_EVENT_PINCH_END, __LINE__)
|
||||
|
||||
struct ei_event *
|
||||
_peck_ei_pinch_event(struct ei *ei, enum ei_event_type type, int lineno);
|
||||
|
||||
#define peck_ei_hold_begin(_ei) \
|
||||
_peck_ei_hold_event(_ei, EI_EVENT_HOLD_BEGIN, __LINE__)
|
||||
#define peck_ei_hold_end(_ei) \
|
||||
_peck_ei_hold_event(_ei, EI_EVENT_HOLD_END, __LINE__)
|
||||
|
||||
struct ei_event *
|
||||
_peck_ei_hold_event(struct ei *ei, enum ei_event_type type, int lineno);
|
||||
|
||||
const char *
|
||||
peck_ei_event_name(struct ei_event *e);
|
||||
|
||||
|
|
@ -462,9 +398,6 @@ DEFINE_UNREF_CLEANUP_FUNC(ei_keymap);
|
|||
DEFINE_UNREF_CLEANUP_FUNC(ei_seat);
|
||||
DEFINE_UNREF_CLEANUP_FUNC(ei_region);
|
||||
DEFINE_UNREF_CLEANUP_FUNC(ei_ping);
|
||||
DEFINE_UNREF_CLEANUP_FUNC(ei_swipe);
|
||||
DEFINE_UNREF_CLEANUP_FUNC(ei_pinch);
|
||||
DEFINE_UNREF_CLEANUP_FUNC(ei_hold);
|
||||
|
||||
DEFINE_UNREF_CLEANUP_FUNC(eis);
|
||||
DEFINE_UNREF_CLEANUP_FUNC(eis_client);
|
||||
|
|
@ -475,9 +408,6 @@ DEFINE_UNREF_CLEANUP_FUNC(eis_keymap);
|
|||
DEFINE_UNREF_CLEANUP_FUNC(eis_seat);
|
||||
DEFINE_UNREF_CLEANUP_FUNC(eis_region);
|
||||
DEFINE_UNREF_CLEANUP_FUNC(eis_ping);
|
||||
DEFINE_UNREF_CLEANUP_FUNC(eis_swipe);
|
||||
DEFINE_UNREF_CLEANUP_FUNC(eis_pinch);
|
||||
DEFINE_UNREF_CLEANUP_FUNC(eis_hold);
|
||||
|
||||
/* Macros intended just for readability to make it more obvious which part
|
||||
of a test handles server vs client */
|
||||
|
|
|
|||
|
|
@ -67,14 +67,11 @@ MUNIT_TEST(test_ei_device_basics)
|
|||
munit_assert_false(
|
||||
eis_device_has_capability(device, EIS_DEVICE_CAP_POINTER_ABSOLUTE));
|
||||
munit_assert_false(eis_device_has_capability(device, EIS_DEVICE_CAP_TOUCH));
|
||||
munit_assert_false(eis_device_has_capability(device, EIS_DEVICE_CAP_GESTURES));
|
||||
|
||||
eis_device_configure_capability(device, EIS_DEVICE_CAP_POINTER);
|
||||
munit_assert_true(eis_device_has_capability(device, EIS_DEVICE_CAP_POINTER));
|
||||
eis_device_configure_capability(device, EIS_DEVICE_CAP_KEYBOARD);
|
||||
munit_assert_true(eis_device_has_capability(device, EIS_DEVICE_CAP_KEYBOARD));
|
||||
eis_device_configure_capability(device, EIS_DEVICE_CAP_GESTURES);
|
||||
munit_assert_true(eis_device_has_capability(device, EIS_DEVICE_CAP_GESTURES));
|
||||
|
||||
eis_device_add(device);
|
||||
|
||||
|
|
@ -103,7 +100,6 @@ MUNIT_TEST(test_ei_device_basics)
|
|||
munit_assert_false(
|
||||
ei_device_has_capability(device, EI_DEVICE_CAP_POINTER_ABSOLUTE));
|
||||
munit_assert_false(ei_device_has_capability(device, EI_DEVICE_CAP_TOUCH));
|
||||
munit_assert_true(ei_device_has_capability(device, EI_DEVICE_CAP_GESTURES));
|
||||
}
|
||||
|
||||
return MUNIT_OK;
|
||||
|
|
@ -1944,176 +1940,6 @@ MUNIT_TEST(test_ei_device_remove_no_stop_emulating_event)
|
|||
return MUNIT_OK;
|
||||
}
|
||||
|
||||
MUNIT_TEST_WITH_PARAMS(test_ei_device_gesture_swipe,
|
||||
"@cancel",
|
||||
"true",
|
||||
"false",
|
||||
"@nfingers",
|
||||
"1",
|
||||
"2",
|
||||
"3",
|
||||
"4")
|
||||
{
|
||||
_unref_(peck) *peck = peck_new();
|
||||
bool cancel = MUNIT_TEST_PARAM_BOOL("@cancel");
|
||||
int nfingers = MUNIT_TEST_PARAM_INT("@nfingers");
|
||||
|
||||
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_ACCEPT_ALL);
|
||||
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_ADD_GESTURES);
|
||||
peck_enable_ei_behavior(peck, PECK_EI_BEHAVIOR_AUTODEVICES);
|
||||
peck_dispatch_until_stable(peck);
|
||||
|
||||
with_client(peck) {
|
||||
struct ei_device *device = peck_ei_get_default_gestures(peck);
|
||||
_unref_(ei_swipe) *swipe = ei_device_swipe_new(device, nfingers);
|
||||
ei_swipe_begin(swipe);
|
||||
ei_device_frame(device, peck_ei_now(peck));
|
||||
|
||||
ei_swipe_update(swipe, 1.1, 2.2);
|
||||
ei_device_frame(device, peck_ei_now(peck));
|
||||
|
||||
if (cancel)
|
||||
ei_swipe_cancel(swipe);
|
||||
else
|
||||
ei_swipe_end(swipe);
|
||||
ei_device_frame(device, peck_ei_now(peck));
|
||||
}
|
||||
|
||||
peck_dispatch_until_stable(peck);
|
||||
|
||||
with_server(peck) {
|
||||
_unref_(eis_event) *begin = peck_eis_swipe_begin(eis);
|
||||
munit_assert_int(eis_event_swipe_get_finger_count(begin), ==, nfingers);
|
||||
|
||||
_unref_(eis_event) *update = peck_eis_swipe_update(eis);
|
||||
munit_assert_int(eis_event_swipe_get_finger_count(update), ==, nfingers);
|
||||
munit_assert_float(eis_event_swipe_get_dx(update), ==, 1.1);
|
||||
munit_assert_float(eis_event_swipe_get_dy(update), ==, 2.2);
|
||||
|
||||
_unref_(eis_event) *end = peck_eis_swipe_end(eis);
|
||||
munit_assert_int(eis_event_swipe_get_finger_count(end), ==, nfingers);
|
||||
if (cancel)
|
||||
munit_assert_true(eis_event_swipe_get_is_cancelled(end));
|
||||
else
|
||||
munit_assert_false(eis_event_swipe_get_is_cancelled(end));
|
||||
|
||||
peck_assert_no_eis_events(eis);
|
||||
}
|
||||
|
||||
return MUNIT_OK;
|
||||
}
|
||||
|
||||
MUNIT_TEST_WITH_PARAMS(test_ei_device_gesture_pinch,
|
||||
"@cancel",
|
||||
"true",
|
||||
"false",
|
||||
"@nfingers",
|
||||
"2",
|
||||
"3",
|
||||
"4")
|
||||
{
|
||||
_unref_(peck) *peck = peck_new();
|
||||
bool cancel = MUNIT_TEST_PARAM_BOOL("@cancel");
|
||||
int nfingers = MUNIT_TEST_PARAM_INT("@nfingers");
|
||||
|
||||
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_ACCEPT_ALL);
|
||||
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_ADD_GESTURES);
|
||||
peck_enable_ei_behavior(peck, PECK_EI_BEHAVIOR_AUTODEVICES);
|
||||
peck_dispatch_until_stable(peck);
|
||||
|
||||
with_client(peck) {
|
||||
struct ei_device *device = peck_ei_get_default_gestures(peck);
|
||||
_unref_(ei_pinch) *pinch = ei_device_pinch_new(device, nfingers);
|
||||
ei_pinch_begin(pinch);
|
||||
ei_device_frame(device, peck_ei_now(peck));
|
||||
|
||||
ei_pinch_update(pinch, 1.1, 2.2, 3.3, 4.4);
|
||||
ei_device_frame(device, peck_ei_now(peck));
|
||||
|
||||
if (cancel)
|
||||
ei_pinch_cancel(pinch);
|
||||
else
|
||||
ei_pinch_end(pinch);
|
||||
ei_device_frame(device, peck_ei_now(peck));
|
||||
}
|
||||
|
||||
peck_dispatch_until_stable(peck);
|
||||
|
||||
with_server(peck) {
|
||||
_unref_(eis_event) *begin = peck_eis_pinch_begin(eis);
|
||||
munit_assert_int(eis_event_pinch_get_finger_count(begin), ==, nfingers);
|
||||
|
||||
_unref_(eis_event) *update = peck_eis_pinch_update(eis);
|
||||
munit_assert_int(eis_event_pinch_get_finger_count(update), ==, nfingers);
|
||||
munit_assert_float(eis_event_pinch_get_dx(update), ==, 1.1);
|
||||
munit_assert_float(eis_event_pinch_get_dy(update), ==, 2.2);
|
||||
munit_assert_float(eis_event_pinch_get_scale(update), ==, 3.3);
|
||||
munit_assert_float(eis_event_pinch_get_rotation(update), ==, 4.4);
|
||||
|
||||
_unref_(eis_event) *end = peck_eis_pinch_end(eis);
|
||||
munit_assert_int(eis_event_pinch_get_finger_count(end), ==, nfingers);
|
||||
if (cancel)
|
||||
munit_assert_true(eis_event_pinch_get_is_cancelled(end));
|
||||
else
|
||||
munit_assert_false(eis_event_pinch_get_is_cancelled(end));
|
||||
|
||||
peck_assert_no_eis_events(eis);
|
||||
}
|
||||
|
||||
return MUNIT_OK;
|
||||
}
|
||||
|
||||
MUNIT_TEST_WITH_PARAMS(test_ei_device_gesture_hold,
|
||||
"@cancel",
|
||||
"true",
|
||||
"false",
|
||||
"@nfingers",
|
||||
"1",
|
||||
"2",
|
||||
"3",
|
||||
"4")
|
||||
{
|
||||
_unref_(peck) *peck = peck_new();
|
||||
bool cancel = MUNIT_TEST_PARAM_BOOL("@cancel");
|
||||
int nfingers = MUNIT_TEST_PARAM_INT("@nfingers");
|
||||
|
||||
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_ACCEPT_ALL);
|
||||
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_ADD_GESTURES);
|
||||
peck_enable_ei_behavior(peck, PECK_EI_BEHAVIOR_AUTODEVICES);
|
||||
peck_dispatch_until_stable(peck);
|
||||
|
||||
with_client(peck) {
|
||||
struct ei_device *device = peck_ei_get_default_gestures(peck);
|
||||
_unref_(ei_hold) *hold = ei_device_hold_new(device, nfingers);
|
||||
ei_hold_begin(hold);
|
||||
ei_device_frame(device, peck_ei_now(peck));
|
||||
|
||||
if (cancel)
|
||||
ei_hold_cancel(hold);
|
||||
else
|
||||
ei_hold_end(hold);
|
||||
ei_device_frame(device, peck_ei_now(peck));
|
||||
}
|
||||
|
||||
peck_dispatch_until_stable(peck);
|
||||
|
||||
with_server(peck) {
|
||||
_unref_(eis_event) *begin = peck_eis_hold_begin(eis);
|
||||
munit_assert_int(eis_event_hold_get_finger_count(begin), ==, nfingers);
|
||||
|
||||
_unref_(eis_event) *end = peck_eis_hold_end(eis);
|
||||
munit_assert_int(eis_event_hold_get_finger_count(end), ==, nfingers);
|
||||
if (cancel)
|
||||
munit_assert_true(eis_event_hold_get_is_cancelled(end));
|
||||
else
|
||||
munit_assert_false(eis_event_hold_get_is_cancelled(end));
|
||||
|
||||
peck_assert_no_eis_events(eis);
|
||||
}
|
||||
|
||||
return MUNIT_OK;
|
||||
}
|
||||
|
||||
MUNIT_TEST(test_passive_ei_device_start_stop_emulating)
|
||||
{
|
||||
_unref_(peck) *peck = peck_new_context("mode", PECK_EI_RECEIVER);
|
||||
|
|
@ -3180,759 +3006,3 @@ MUNIT_TEST(test_passive_ei_flush_frame)
|
|||
|
||||
return MUNIT_OK;
|
||||
}
|
||||
|
||||
MUNIT_TEST_WITH_PARAMS(test_passive_ei_device_gesture_swipe,
|
||||
"@cancel",
|
||||
"true",
|
||||
"false",
|
||||
"@nfingers",
|
||||
"1",
|
||||
"2",
|
||||
"3",
|
||||
"4")
|
||||
{
|
||||
_unref_(peck) *peck = peck_new_context("mode", PECK_EI_RECEIVER);
|
||||
bool cancel = MUNIT_TEST_PARAM_BOOL("@cancel");
|
||||
int nfingers = MUNIT_TEST_PARAM_INT("@nfingers");
|
||||
|
||||
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_ACCEPT_ALL);
|
||||
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_ADD_GESTURES);
|
||||
peck_enable_ei_behavior(peck, PECK_EI_BEHAVIOR_AUTODEVICES);
|
||||
peck_dispatch_until_stable(peck);
|
||||
|
||||
uint32_t sequence = 123;
|
||||
|
||||
with_server(peck) {
|
||||
struct eis_device *device = peck_eis_get_default_gestures(peck);
|
||||
|
||||
eis_device_start_emulating(device, sequence);
|
||||
|
||||
_unref_(eis_swipe) *swipe = eis_device_swipe_new(device, nfingers);
|
||||
eis_swipe_begin(swipe);
|
||||
eis_device_frame(device, peck_eis_now(peck));
|
||||
|
||||
eis_swipe_update(swipe, 1.1, 2.2);
|
||||
eis_device_frame(device, peck_eis_now(peck));
|
||||
|
||||
if (cancel)
|
||||
eis_swipe_cancel(swipe);
|
||||
else
|
||||
eis_swipe_end(swipe);
|
||||
eis_device_frame(device, peck_eis_now(peck));
|
||||
}
|
||||
|
||||
peck_dispatch_until_stable(peck);
|
||||
|
||||
with_client(peck) {
|
||||
_unref_(ei_event) *start = peck_ei_next_event(ei, EI_EVENT_DEVICE_START_EMULATING);
|
||||
|
||||
_unref_(ei_event) *begin = peck_ei_swipe_begin(ei);
|
||||
munit_assert_int(ei_event_swipe_get_finger_count(begin), ==, nfingers);
|
||||
|
||||
_unref_(ei_event) *update = peck_ei_swipe_update(ei);
|
||||
munit_assert_int(ei_event_swipe_get_finger_count(update), ==, nfingers);
|
||||
munit_assert_float(ei_event_swipe_get_dx(update), ==, 1.1);
|
||||
munit_assert_float(ei_event_swipe_get_dy(update), ==, 2.2);
|
||||
|
||||
_unref_(ei_event) *end = peck_ei_swipe_end(ei);
|
||||
munit_assert_int(ei_event_swipe_get_finger_count(end), ==, nfingers);
|
||||
if (cancel)
|
||||
munit_assert_true(ei_event_swipe_get_is_cancelled(end));
|
||||
else
|
||||
munit_assert_false(ei_event_swipe_get_is_cancelled(end));
|
||||
peck_assert_no_ei_events(ei);
|
||||
}
|
||||
|
||||
return MUNIT_OK;
|
||||
}
|
||||
|
||||
MUNIT_TEST_WITH_PARAMS(test_passive_ei_device_gesture_pinch,
|
||||
"@cancel",
|
||||
"true",
|
||||
"false",
|
||||
"@nfingers",
|
||||
"2",
|
||||
"3",
|
||||
"4")
|
||||
{
|
||||
_unref_(peck) *peck = peck_new_context("mode", PECK_EI_RECEIVER);
|
||||
bool cancel = MUNIT_TEST_PARAM_BOOL("@cancel");
|
||||
int nfingers = MUNIT_TEST_PARAM_INT("@nfingers");
|
||||
|
||||
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_ACCEPT_ALL);
|
||||
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_ADD_GESTURES);
|
||||
peck_enable_ei_behavior(peck, PECK_EI_BEHAVIOR_AUTODEVICES);
|
||||
peck_dispatch_until_stable(peck);
|
||||
|
||||
uint32_t sequence = 123;
|
||||
|
||||
with_server(peck) {
|
||||
struct eis_device *device = peck_eis_get_default_gestures(peck);
|
||||
|
||||
eis_device_start_emulating(device, sequence);
|
||||
|
||||
_unref_(eis_pinch) *pinch = eis_device_pinch_new(device, nfingers);
|
||||
eis_pinch_begin(pinch);
|
||||
eis_device_frame(device, peck_eis_now(peck));
|
||||
|
||||
eis_pinch_update(pinch, 1.1, 2.2, 3.3, 4.4);
|
||||
eis_device_frame(device, peck_eis_now(peck));
|
||||
|
||||
if (cancel)
|
||||
eis_pinch_cancel(pinch);
|
||||
else
|
||||
eis_pinch_end(pinch);
|
||||
eis_device_frame(device, peck_eis_now(peck));
|
||||
}
|
||||
|
||||
peck_dispatch_until_stable(peck);
|
||||
|
||||
with_client(peck) {
|
||||
_unref_(ei_event) *start = peck_ei_next_event(ei, EI_EVENT_DEVICE_START_EMULATING);
|
||||
|
||||
_unref_(ei_event) *begin = peck_ei_pinch_begin(ei);
|
||||
munit_assert_int(ei_event_pinch_get_finger_count(begin), ==, nfingers);
|
||||
|
||||
_unref_(ei_event) *update = peck_ei_pinch_update(ei);
|
||||
munit_assert_int(ei_event_pinch_get_finger_count(update), ==, nfingers);
|
||||
munit_assert_float(ei_event_pinch_get_dx(update), ==, 1.1);
|
||||
munit_assert_float(ei_event_pinch_get_dy(update), ==, 2.2);
|
||||
munit_assert_float(ei_event_pinch_get_scale(update), ==, 3.3);
|
||||
munit_assert_float(ei_event_pinch_get_rotation(update), ==, 4.4);
|
||||
|
||||
_unref_(ei_event) *end = peck_ei_pinch_end(ei);
|
||||
munit_assert_int(ei_event_pinch_get_finger_count(end), ==, nfingers);
|
||||
if (cancel)
|
||||
munit_assert_true(ei_event_pinch_get_is_cancelled(end));
|
||||
else
|
||||
munit_assert_false(ei_event_pinch_get_is_cancelled(end));
|
||||
|
||||
peck_assert_no_ei_events(ei);
|
||||
}
|
||||
|
||||
return MUNIT_OK;
|
||||
}
|
||||
|
||||
MUNIT_TEST_WITH_PARAMS(test_passive_ei_device_gesture_hold,
|
||||
"@cancel",
|
||||
"true",
|
||||
"false",
|
||||
"@nfingers",
|
||||
"1",
|
||||
"2",
|
||||
"3",
|
||||
"4")
|
||||
{
|
||||
_unref_(peck) *peck = peck_new_context("mode", PECK_EI_RECEIVER);
|
||||
bool cancel = MUNIT_TEST_PARAM_BOOL("@cancel");
|
||||
int nfingers = MUNIT_TEST_PARAM_INT("@nfingers");
|
||||
|
||||
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_ACCEPT_ALL);
|
||||
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_ADD_GESTURES);
|
||||
peck_enable_ei_behavior(peck, PECK_EI_BEHAVIOR_AUTODEVICES);
|
||||
|
||||
peck_dispatch_until_stable(peck);
|
||||
|
||||
uint32_t sequence = 123;
|
||||
with_server(peck) {
|
||||
struct eis_device *device = peck_eis_get_default_gestures(peck);
|
||||
|
||||
eis_device_start_emulating(device, sequence);
|
||||
|
||||
_unref_(eis_hold) *hold = eis_device_hold_new(device, nfingers);
|
||||
eis_hold_begin(hold);
|
||||
eis_device_frame(device, peck_eis_now(peck));
|
||||
|
||||
if (cancel)
|
||||
eis_hold_cancel(hold);
|
||||
else
|
||||
eis_hold_end(hold);
|
||||
eis_device_frame(device, peck_eis_now(peck));
|
||||
}
|
||||
|
||||
peck_dispatch_until_stable(peck);
|
||||
|
||||
with_client(peck) {
|
||||
_unref_(ei_event) *start = peck_ei_next_event(ei, EI_EVENT_DEVICE_START_EMULATING);
|
||||
|
||||
_unref_(ei_event) *begin = peck_ei_hold_begin(ei);
|
||||
munit_assert_int(ei_event_hold_get_finger_count(begin), ==, nfingers);
|
||||
|
||||
_unref_(ei_event) *end = peck_ei_hold_end(ei);
|
||||
munit_assert_int(ei_event_hold_get_finger_count(end), ==, nfingers);
|
||||
if (cancel)
|
||||
munit_assert_true(ei_event_hold_get_is_cancelled(end));
|
||||
else
|
||||
munit_assert_false(ei_event_hold_get_is_cancelled(end));
|
||||
|
||||
peck_assert_no_ei_events(ei);
|
||||
}
|
||||
|
||||
return MUNIT_OK;
|
||||
}
|
||||
|
||||
enum gesture_type { SWIPE, PINCH, HOLD };
|
||||
|
||||
static inline enum gesture_type
|
||||
gesture_type_from_string(const char *string)
|
||||
{
|
||||
if (streq(string, "swipe"))
|
||||
return SWIPE;
|
||||
else if (streq(string, "pinch"))
|
||||
return PINCH;
|
||||
else if (streq(string, "hold"))
|
||||
return HOLD;
|
||||
abort();
|
||||
}
|
||||
|
||||
MUNIT_TEST_WITH_PARAMS(test_eis_device_gesture_cancel_noop, "@gesture", "swipe", "pinch", "hold")
|
||||
{
|
||||
enum gesture_type gesture = gesture_type_from_string(MUNIT_TEST_PARAM("@gesture"));
|
||||
_unref_(peck) *peck = peck_new();
|
||||
|
||||
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_ACCEPT_ALL);
|
||||
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_ADD_GESTURES);
|
||||
peck_enable_ei_behavior(peck, PECK_EI_BEHAVIOR_AUTODEVICES);
|
||||
peck_dispatch_until_stable(peck);
|
||||
|
||||
/* Test 1: Canceling when no gesture is active - should be a noop */
|
||||
with_server(peck) {
|
||||
struct eis_device *device = peck_eis_get_default_gestures(peck);
|
||||
|
||||
switch (gesture) {
|
||||
case SWIPE:
|
||||
eis_device_swipe_cancel(device);
|
||||
break;
|
||||
case PINCH:
|
||||
eis_device_pinch_cancel(device);
|
||||
break;
|
||||
case HOLD:
|
||||
eis_device_hold_cancel(device);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
peck_dispatch_until_stable(peck);
|
||||
|
||||
with_client(peck) {
|
||||
/* Should have no events since no gesture was active */
|
||||
peck_assert_no_ei_events(ei);
|
||||
}
|
||||
|
||||
/* Test 2: Canceling after gesture has ended - should be a noop */
|
||||
int nfingers = 2;
|
||||
|
||||
with_client(peck) {
|
||||
struct ei_device *device = peck_ei_get_default_gestures(peck);
|
||||
|
||||
switch (gesture) {
|
||||
case SWIPE: {
|
||||
_unref_(ei_swipe) *swipe = ei_device_swipe_new(device, nfingers);
|
||||
ei_swipe_begin(swipe);
|
||||
ei_device_frame(device, peck_ei_now(peck));
|
||||
ei_swipe_end(swipe);
|
||||
ei_device_frame(device, peck_ei_now(peck));
|
||||
break;
|
||||
}
|
||||
case PINCH: {
|
||||
_unref_(ei_pinch) *pinch = ei_device_pinch_new(device, nfingers);
|
||||
ei_pinch_begin(pinch);
|
||||
ei_device_frame(device, peck_ei_now(peck));
|
||||
ei_pinch_end(pinch);
|
||||
ei_device_frame(device, peck_ei_now(peck));
|
||||
break;
|
||||
}
|
||||
case HOLD: {
|
||||
_unref_(ei_hold) *hold = ei_device_hold_new(device, nfingers);
|
||||
ei_hold_begin(hold);
|
||||
ei_device_frame(device, peck_ei_now(peck));
|
||||
ei_hold_end(hold);
|
||||
ei_device_frame(device, peck_ei_now(peck));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
peck_dispatch_until_stable(peck);
|
||||
|
||||
with_server(peck) {
|
||||
struct eis_device *device = peck_eis_get_default_gestures(peck);
|
||||
|
||||
switch (gesture) {
|
||||
case SWIPE: {
|
||||
_unref_(eis_event) *begin = peck_eis_swipe_begin(eis);
|
||||
_unref_(eis_event) *end = peck_eis_swipe_end(eis);
|
||||
|
||||
/* Cancel after end - should be a noop */
|
||||
eis_device_swipe_cancel(device);
|
||||
break;
|
||||
}
|
||||
case PINCH: {
|
||||
_unref_(eis_event) *begin = peck_eis_pinch_begin(eis);
|
||||
_unref_(eis_event) *end = peck_eis_pinch_end(eis);
|
||||
|
||||
eis_device_pinch_cancel(device);
|
||||
break;
|
||||
}
|
||||
case HOLD: {
|
||||
_unref_(eis_event) *begin = peck_eis_hold_begin(eis);
|
||||
_unref_(eis_event) *end = peck_eis_hold_end(eis);
|
||||
|
||||
eis_device_hold_cancel(device);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
peck_dispatch_until_stable(peck);
|
||||
|
||||
with_client(peck) {
|
||||
/* No cancel event should be sent */
|
||||
peck_assert_no_ei_events(ei);
|
||||
}
|
||||
|
||||
return MUNIT_OK;
|
||||
}
|
||||
|
||||
MUNIT_TEST_WITH_PARAMS(test_eis_device_gesture_double_cancel, "@gesture", "swipe", "pinch", "hold")
|
||||
{
|
||||
enum gesture_type gesture = gesture_type_from_string(MUNIT_TEST_PARAM("@gesture"));
|
||||
_unref_(peck) *peck = peck_new();
|
||||
|
||||
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_ACCEPT_ALL);
|
||||
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_ADD_GESTURES);
|
||||
peck_enable_ei_behavior(peck, PECK_EI_BEHAVIOR_AUTODEVICES);
|
||||
peck_dispatch_until_stable(peck);
|
||||
|
||||
int nfingers = 3;
|
||||
|
||||
_unref_(ei_swipe) *swipe = NULL;
|
||||
_unref_(ei_pinch) *pinch = NULL;
|
||||
_unref_(ei_hold) *hold = NULL;
|
||||
|
||||
with_client(peck) {
|
||||
struct ei_device *device = peck_ei_get_default_gestures(peck);
|
||||
|
||||
switch (gesture) {
|
||||
case SWIPE: {
|
||||
swipe = ei_device_swipe_new(device, nfingers);
|
||||
ei_swipe_begin(swipe);
|
||||
ei_device_frame(device, peck_ei_now(peck));
|
||||
|
||||
ei_swipe_update(swipe, 1.1, 2.2);
|
||||
ei_device_frame(device, peck_ei_now(peck));
|
||||
break;
|
||||
}
|
||||
case PINCH: {
|
||||
pinch = ei_device_pinch_new(device, nfingers);
|
||||
ei_pinch_begin(pinch);
|
||||
ei_device_frame(device, peck_ei_now(peck));
|
||||
|
||||
ei_pinch_update(pinch, 1.1, 2.2, 3.3, 4.4);
|
||||
ei_device_frame(device, peck_ei_now(peck));
|
||||
break;
|
||||
}
|
||||
case HOLD: {
|
||||
hold = ei_device_hold_new(device, nfingers);
|
||||
ei_hold_begin(hold);
|
||||
ei_device_frame(device, peck_ei_now(peck));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
peck_dispatch_until_stable(peck);
|
||||
|
||||
with_server(peck) {
|
||||
struct eis_device *device = peck_eis_get_default_gestures(peck);
|
||||
_unref_(eis_event) *begin = NULL;
|
||||
_unref_(eis_event) *update = NULL;
|
||||
|
||||
switch (gesture) {
|
||||
case SWIPE: {
|
||||
begin = peck_eis_swipe_begin(eis);
|
||||
update = peck_eis_swipe_update(eis);
|
||||
eis_device_swipe_cancel(device);
|
||||
eis_device_swipe_cancel(device); /* should be a noop */
|
||||
break;
|
||||
}
|
||||
case PINCH: {
|
||||
begin = peck_eis_pinch_begin(eis);
|
||||
update = peck_eis_pinch_update(eis);
|
||||
|
||||
eis_device_pinch_cancel(device);
|
||||
eis_device_pinch_cancel(device); /* should be noop */
|
||||
break;
|
||||
}
|
||||
case HOLD: {
|
||||
begin = peck_eis_hold_begin(eis);
|
||||
|
||||
eis_device_hold_cancel(device);
|
||||
eis_device_hold_cancel(device); /* should be noop */
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
peck_dispatch_ei(peck);
|
||||
|
||||
with_client(peck) {
|
||||
_unref_(ei_event) *canceled = NULL;
|
||||
switch (gesture) {
|
||||
case SWIPE:
|
||||
canceled = peck_ei_next_event(ei, EI_EVENT_SWIPE_CANCELLED);
|
||||
break;
|
||||
case PINCH:
|
||||
canceled = peck_ei_next_event(ei, EI_EVENT_PINCH_CANCELLED);
|
||||
break;
|
||||
case HOLD:
|
||||
canceled = peck_ei_next_event(ei, EI_EVENT_HOLD_CANCELLED);
|
||||
break;
|
||||
}
|
||||
|
||||
/* Should not receive duplicate cancel event */
|
||||
peck_assert_no_ei_events(ei);
|
||||
}
|
||||
return MUNIT_OK;
|
||||
}
|
||||
|
||||
MUNIT_TEST(test_eis_device_gesture_cancel_on_non_gesture_device)
|
||||
{
|
||||
_unref_(peck) *peck = peck_new();
|
||||
|
||||
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_ACCEPT_ALL);
|
||||
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_ADD_POINTER);
|
||||
peck_enable_ei_behavior(peck, PECK_EI_BEHAVIOR_AUTODEVICES);
|
||||
peck_dispatch_until_stable(peck);
|
||||
|
||||
/* Enable log capture to verify error messages */
|
||||
peck_eis_enable_log_capture(peck);
|
||||
|
||||
with_server(peck) {
|
||||
struct eis_device *device = peck_eis_get_default_pointer(peck);
|
||||
|
||||
/* These should log errors but not crash */
|
||||
with_nonfatal_eis_bug(peck)
|
||||
{
|
||||
eis_device_swipe_cancel(device);
|
||||
eis_device_pinch_cancel(device);
|
||||
eis_device_hold_cancel(device);
|
||||
}
|
||||
}
|
||||
|
||||
/* Verify error was logged */
|
||||
with_server(peck) {
|
||||
char **logs = peck_eis_get_log_capture(peck, EIS_LOG_PRIORITY_ERROR);
|
||||
int count = 0;
|
||||
for (char **log = logs; *log; log++) {
|
||||
if (strstr(*log, "device is not a gesture device"))
|
||||
count++;
|
||||
}
|
||||
/* Should have 3 error messages, one for each cancel call */
|
||||
munit_assert_int(count, ==, 3);
|
||||
}
|
||||
|
||||
peck_eis_disable_log_capture(peck);
|
||||
|
||||
return MUNIT_OK;
|
||||
}
|
||||
|
||||
MUNIT_TEST_WITH_PARAMS(test_ei_device_gesture_no_second_gesture,
|
||||
"@gesture",
|
||||
"swipe",
|
||||
"pinch",
|
||||
"hold")
|
||||
{
|
||||
const char *gesture_param = MUNIT_TEST_PARAM("@gesture");
|
||||
enum gesture_type gesture = gesture_type_from_string(gesture_param);
|
||||
_unref_(peck) *peck = peck_new();
|
||||
|
||||
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_ACCEPT_ALL);
|
||||
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_ADD_GESTURES);
|
||||
peck_enable_ei_behavior(peck, PECK_EI_BEHAVIOR_AUTODEVICES);
|
||||
peck_dispatch_until_stable(peck);
|
||||
|
||||
peck_ei_enable_log_capture(peck);
|
||||
|
||||
int nfingers = 3;
|
||||
|
||||
with_client(peck) {
|
||||
struct ei_device *device = peck_ei_get_default_gestures(peck);
|
||||
|
||||
switch (gesture) {
|
||||
case SWIPE: {
|
||||
_unref_(ei_swipe) *swipe1 = ei_device_swipe_new(device, nfingers);
|
||||
_unref_(ei_swipe) *swipe2 = ei_device_swipe_new(device, nfingers);
|
||||
ei_swipe_begin(swipe1);
|
||||
ei_device_frame(device, peck_ei_now(peck));
|
||||
|
||||
ei_swipe_update(swipe1, 1.1, 2.2);
|
||||
ei_device_frame(device, peck_ei_now(peck));
|
||||
|
||||
with_nonfatal_ei_bug(peck)
|
||||
{
|
||||
ei_swipe_begin(swipe2);
|
||||
ei_device_frame(device, peck_ei_now(peck));
|
||||
ei_swipe_update(swipe2, 3.3, 4.4);
|
||||
ei_device_frame(device, peck_ei_now(peck));
|
||||
}
|
||||
break;
|
||||
}
|
||||
case PINCH: {
|
||||
_unref_(ei_pinch) *pinch1 = ei_device_pinch_new(device, nfingers);
|
||||
_unref_(ei_pinch) *pinch2 = ei_device_pinch_new(device, nfingers);
|
||||
ei_pinch_begin(pinch1);
|
||||
ei_device_frame(device, peck_ei_now(peck));
|
||||
|
||||
ei_pinch_update(pinch1, 1.1, 2.2, 3.3, 4.4);
|
||||
ei_device_frame(device, peck_ei_now(peck));
|
||||
|
||||
with_nonfatal_ei_bug(peck)
|
||||
{
|
||||
ei_pinch_begin(pinch2);
|
||||
ei_device_frame(device, peck_ei_now(peck));
|
||||
|
||||
ei_pinch_update(pinch2, 1.1, 2.2, 3.3, 4.4);
|
||||
ei_device_frame(device, peck_ei_now(peck));
|
||||
}
|
||||
break;
|
||||
}
|
||||
case HOLD: {
|
||||
_unref_(ei_hold) *hold1 = ei_device_hold_new(device, nfingers);
|
||||
_unref_(ei_hold) *hold2 = ei_device_hold_new(device, nfingers);
|
||||
ei_hold_begin(hold1);
|
||||
ei_device_frame(device, peck_ei_now(peck));
|
||||
with_nonfatal_ei_bug(peck)
|
||||
{
|
||||
ei_hold_begin(hold2);
|
||||
ei_device_frame(device, peck_ei_now(peck));
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
char **logs = peck_ei_get_log_capture(peck, EI_LOG_PRIORITY_ERROR);
|
||||
int count = 0;
|
||||
_cleanup_free_ char *message =
|
||||
xaprintf("a different %s gesture is already in process", gesture_param);
|
||||
for (char **log = logs; *log; log++) {
|
||||
if (strstr(*log, message))
|
||||
count++;
|
||||
}
|
||||
/* Should have 1 error message for the rejected second gesture begin */
|
||||
munit_assert_int(count, ==, 1);
|
||||
}
|
||||
|
||||
peck_dispatch_until_stable(peck);
|
||||
|
||||
return MUNIT_OK;
|
||||
}
|
||||
|
||||
MUNIT_TEST_WITH_PARAMS(test_ei_device_gesture_unref_cancels, "@gesture", "swipe", "pinch", "hold")
|
||||
{
|
||||
enum gesture_type gesture = gesture_type_from_string(MUNIT_TEST_PARAM("@gesture"));
|
||||
_unref_(peck) *peck = peck_new();
|
||||
const int nfingers = 2;
|
||||
|
||||
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_ACCEPT_ALL);
|
||||
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_ADD_GESTURES);
|
||||
peck_enable_ei_behavior(peck, PECK_EI_BEHAVIOR_AUTODEVICES);
|
||||
peck_dispatch_until_stable(peck);
|
||||
|
||||
with_client(peck) {
|
||||
struct ei_device *device = peck_ei_get_default_gestures(peck);
|
||||
|
||||
switch (gesture) {
|
||||
case SWIPE: {
|
||||
struct ei_swipe *swipe = ei_device_swipe_new(device, nfingers);
|
||||
ei_swipe_begin(swipe);
|
||||
ei_device_frame(device, peck_ei_now(peck));
|
||||
|
||||
ei_swipe_update(swipe, 1.1, 2.2);
|
||||
ei_device_frame(device, peck_ei_now(peck));
|
||||
|
||||
/* Unref while gesture is still active - should cancel */
|
||||
ei_swipe_unref(swipe);
|
||||
ei_device_frame(device, peck_ei_now(peck));
|
||||
break;
|
||||
}
|
||||
case PINCH: {
|
||||
struct ei_pinch *pinch = ei_device_pinch_new(device, nfingers);
|
||||
ei_pinch_begin(pinch);
|
||||
ei_device_frame(device, peck_ei_now(peck));
|
||||
|
||||
ei_pinch_update(pinch, 1.1, 2.2, 3.3, 4.4);
|
||||
ei_device_frame(device, peck_ei_now(peck));
|
||||
|
||||
/* Unref while gesture is still active - should cancel */
|
||||
ei_pinch_unref(pinch);
|
||||
ei_device_frame(device, peck_ei_now(peck));
|
||||
break;
|
||||
}
|
||||
case HOLD: {
|
||||
struct ei_hold *hold = ei_device_hold_new(device, nfingers);
|
||||
ei_hold_begin(hold);
|
||||
ei_device_frame(device, peck_ei_now(peck));
|
||||
|
||||
/* Unref while gesture is still active - should cancel */
|
||||
ei_hold_unref(hold);
|
||||
ei_device_frame(device, peck_ei_now(peck));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
peck_dispatch_until_stable(peck);
|
||||
|
||||
with_server(peck) {
|
||||
switch (gesture) {
|
||||
case SWIPE: {
|
||||
_unref_(eis_event) *begin = peck_eis_swipe_begin(eis);
|
||||
munit_assert_int(eis_event_swipe_get_finger_count(begin), ==, nfingers);
|
||||
|
||||
_unref_(eis_event) *update = peck_eis_swipe_update(eis);
|
||||
munit_assert_int(eis_event_swipe_get_finger_count(update), ==, nfingers);
|
||||
|
||||
_unref_(eis_event) *end = peck_eis_swipe_end(eis);
|
||||
munit_assert_int(eis_event_swipe_get_finger_count(end), ==, nfingers);
|
||||
munit_assert_true(eis_event_swipe_get_is_cancelled(end));
|
||||
break;
|
||||
}
|
||||
case PINCH: {
|
||||
_unref_(eis_event) *begin = peck_eis_pinch_begin(eis);
|
||||
munit_assert_int(eis_event_pinch_get_finger_count(begin), ==, nfingers);
|
||||
|
||||
_unref_(eis_event) *update = peck_eis_pinch_update(eis);
|
||||
munit_assert_int(eis_event_pinch_get_finger_count(update), ==, nfingers);
|
||||
|
||||
_unref_(eis_event) *end = peck_eis_pinch_end(eis);
|
||||
munit_assert_int(eis_event_pinch_get_finger_count(end), ==, nfingers);
|
||||
munit_assert_true(eis_event_pinch_get_is_cancelled(end));
|
||||
break;
|
||||
}
|
||||
case HOLD: {
|
||||
_unref_(eis_event) *begin = peck_eis_hold_begin(eis);
|
||||
munit_assert_int(eis_event_hold_get_finger_count(begin), ==, nfingers);
|
||||
|
||||
_unref_(eis_event) *end = peck_eis_hold_end(eis);
|
||||
munit_assert_int(eis_event_hold_get_finger_count(end), ==, nfingers);
|
||||
munit_assert_true(eis_event_hold_get_is_cancelled(end));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
peck_assert_no_eis_events(eis);
|
||||
}
|
||||
|
||||
return MUNIT_OK;
|
||||
}
|
||||
|
||||
MUNIT_TEST_WITH_PARAMS(test_passive_ei_device_gesture_unref_cancels,
|
||||
"@gesture",
|
||||
"swipe",
|
||||
"pinch",
|
||||
"hold")
|
||||
{
|
||||
enum gesture_type gesture = gesture_type_from_string(MUNIT_TEST_PARAM("@gesture"));
|
||||
_unref_(peck) *peck = peck_new_context("mode", PECK_EI_RECEIVER);
|
||||
const int nfingers = 2;
|
||||
|
||||
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_ACCEPT_ALL);
|
||||
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_ADD_GESTURES);
|
||||
peck_enable_ei_behavior(peck, PECK_EI_BEHAVIOR_AUTODEVICES);
|
||||
peck_dispatch_until_stable(peck);
|
||||
|
||||
uint32_t sequence = 123;
|
||||
|
||||
with_server(peck) {
|
||||
struct eis_device *device = peck_eis_get_default_gestures(peck);
|
||||
|
||||
eis_device_start_emulating(device, sequence);
|
||||
|
||||
switch (gesture) {
|
||||
case SWIPE: {
|
||||
struct eis_swipe *swipe = eis_device_swipe_new(device, nfingers);
|
||||
eis_swipe_begin(swipe);
|
||||
eis_device_frame(device, peck_eis_now(peck));
|
||||
|
||||
eis_swipe_update(swipe, 1.1, 2.2);
|
||||
eis_device_frame(device, peck_eis_now(peck));
|
||||
|
||||
/* Unref while gesture is still active - should cancel */
|
||||
eis_swipe_unref(swipe);
|
||||
eis_device_frame(device, peck_eis_now(peck));
|
||||
break;
|
||||
}
|
||||
case PINCH: {
|
||||
struct eis_pinch *pinch = eis_device_pinch_new(device, nfingers);
|
||||
eis_pinch_begin(pinch);
|
||||
eis_device_frame(device, peck_eis_now(peck));
|
||||
|
||||
eis_pinch_update(pinch, 1.1, 2.2, 3.3, 4.4);
|
||||
eis_device_frame(device, peck_eis_now(peck));
|
||||
|
||||
/* Unref while gesture is still active - should cancel */
|
||||
eis_pinch_unref(pinch);
|
||||
eis_device_frame(device, peck_eis_now(peck));
|
||||
break;
|
||||
}
|
||||
case HOLD: {
|
||||
struct eis_hold *hold = eis_device_hold_new(device, nfingers);
|
||||
eis_hold_begin(hold);
|
||||
eis_device_frame(device, peck_eis_now(peck));
|
||||
|
||||
/* Unref while gesture is still active - should cancel */
|
||||
eis_hold_unref(hold);
|
||||
eis_device_frame(device, peck_eis_now(peck));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
peck_dispatch_until_stable(peck);
|
||||
|
||||
with_client(peck) {
|
||||
_unref_(ei_event) *start = peck_ei_next_event(ei, EI_EVENT_DEVICE_START_EMULATING);
|
||||
munit_assert_uint(ei_event_emulating_get_sequence(start), ==, sequence);
|
||||
|
||||
switch (gesture) {
|
||||
case SWIPE: {
|
||||
_unref_(ei_event) *begin = peck_ei_swipe_begin(ei);
|
||||
munit_assert_int(ei_event_swipe_get_finger_count(begin), ==, nfingers);
|
||||
|
||||
_unref_(ei_event) *update = peck_ei_swipe_update(ei);
|
||||
munit_assert_int(ei_event_swipe_get_finger_count(update), ==, nfingers);
|
||||
|
||||
_unref_(ei_event) *end = peck_ei_swipe_end(ei);
|
||||
munit_assert_int(ei_event_swipe_get_finger_count(end), ==, nfingers);
|
||||
munit_assert_true(ei_event_swipe_get_is_cancelled(end));
|
||||
break;
|
||||
}
|
||||
case PINCH: {
|
||||
_unref_(ei_event) *begin = peck_ei_pinch_begin(ei);
|
||||
munit_assert_int(ei_event_pinch_get_finger_count(begin), ==, nfingers);
|
||||
|
||||
_unref_(ei_event) *update = peck_ei_pinch_update(ei);
|
||||
munit_assert_int(ei_event_pinch_get_finger_count(update), ==, nfingers);
|
||||
|
||||
_unref_(ei_event) *end = peck_ei_pinch_end(ei);
|
||||
munit_assert_int(ei_event_pinch_get_finger_count(end), ==, nfingers);
|
||||
munit_assert_true(ei_event_pinch_get_is_cancelled(end));
|
||||
break;
|
||||
}
|
||||
case HOLD: {
|
||||
_unref_(ei_event) *begin = peck_ei_hold_begin(ei);
|
||||
munit_assert_int(ei_event_hold_get_finger_count(begin), ==, nfingers);
|
||||
|
||||
_unref_(ei_event) *end = peck_ei_hold_end(ei);
|
||||
munit_assert_int(ei_event_hold_get_finger_count(end), ==, nfingers);
|
||||
munit_assert_true(ei_event_hold_get_is_cancelled(end));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
peck_assert_no_ei_events(ei);
|
||||
}
|
||||
|
||||
return MUNIT_OK;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -332,72 +332,6 @@ print_pong_event(struct ei_event *event)
|
|||
printf(" id: %#" PRIx64 "\n", ei_ping_get_id(ping));
|
||||
}
|
||||
|
||||
static void
|
||||
print_swipe_event(struct ei_event *event)
|
||||
{
|
||||
print_device(event);
|
||||
|
||||
printf(" fingers: %u\n", ei_event_swipe_get_finger_count(event));
|
||||
if (ei_event_get_type(event) == EI_EVENT_SWIPE_UPDATE)
|
||||
printf(" delta: [%.2f, %.2f]\n",
|
||||
ei_event_swipe_get_dx(event),
|
||||
ei_event_swipe_get_dy(event));
|
||||
if (ei_event_get_type(event) == EI_EVENT_SWIPE_END)
|
||||
printf(" cancelled: %s\n",
|
||||
ei_event_swipe_get_is_cancelled(event) ? "true" : "false");
|
||||
}
|
||||
|
||||
static void
|
||||
print_pinch_event(struct ei_event *event)
|
||||
{
|
||||
print_device(event);
|
||||
|
||||
printf(" fingers: %u\n", ei_event_pinch_get_finger_count(event));
|
||||
if (ei_event_get_type(event) == EI_EVENT_PINCH_UPDATE) {
|
||||
printf(" delta: [%.2f, %.2f]\n",
|
||||
ei_event_pinch_get_dx(event),
|
||||
ei_event_pinch_get_dy(event));
|
||||
printf(" scale: %.2f\n", ei_event_pinch_get_scale(event));
|
||||
printf(" rotation: %.2f\n", ei_event_pinch_get_rotation(event));
|
||||
}
|
||||
if (ei_event_get_type(event) == EI_EVENT_PINCH_END)
|
||||
printf(" cancelled: %s\n",
|
||||
ei_event_pinch_get_is_cancelled(event) ? "true" : "false");
|
||||
}
|
||||
|
||||
static void
|
||||
print_hold_event(struct ei_event *event)
|
||||
{
|
||||
print_device(event);
|
||||
|
||||
printf(" fingers: %u\n", ei_event_hold_get_finger_count(event));
|
||||
if (ei_event_get_type(event) == EI_EVENT_HOLD_END)
|
||||
printf(" cancelled: %s\n",
|
||||
ei_event_hold_get_is_cancelled(event) ? "true" : "false");
|
||||
}
|
||||
|
||||
static void
|
||||
print_gesture_cancel_event(struct ei_event *event)
|
||||
{
|
||||
print_device(event);
|
||||
const char *type = NULL;
|
||||
switch (ei_event_get_type(event)) {
|
||||
case EI_EVENT_PINCH_CANCELLED:
|
||||
type = "pinch";
|
||||
break;
|
||||
case EI_EVENT_SWIPE_CANCELLED:
|
||||
type = "swipe";
|
||||
break;
|
||||
case EI_EVENT_HOLD_CANCELLED:
|
||||
type = "hold";
|
||||
break;
|
||||
default:
|
||||
abort();
|
||||
break;
|
||||
}
|
||||
printf(" %s cancelled\n", type);
|
||||
}
|
||||
|
||||
int
|
||||
main(int argc, char **argv)
|
||||
{
|
||||
|
|
@ -568,25 +502,6 @@ main(int argc, char **argv)
|
|||
break;
|
||||
case EI_EVENT_SYNC:
|
||||
break;
|
||||
case EI_EVENT_SWIPE_BEGIN:
|
||||
case EI_EVENT_SWIPE_UPDATE:
|
||||
case EI_EVENT_SWIPE_END:
|
||||
print_swipe_event(e);
|
||||
break;
|
||||
case EI_EVENT_PINCH_BEGIN:
|
||||
case EI_EVENT_PINCH_UPDATE:
|
||||
case EI_EVENT_PINCH_END:
|
||||
print_pinch_event(e);
|
||||
break;
|
||||
case EI_EVENT_HOLD_BEGIN:
|
||||
case EI_EVENT_HOLD_END:
|
||||
print_hold_event(e);
|
||||
break;
|
||||
case EI_EVENT_PINCH_CANCELLED:
|
||||
case EI_EVENT_SWIPE_CANCELLED:
|
||||
case EI_EVENT_HOLD_CANCELLED:
|
||||
print_gesture_cancel_event(e);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -305,7 +305,6 @@ main(int argc, char **argv)
|
|||
_unref_(ei_device) *kbd = NULL;
|
||||
_unref_(ei_device) *abs = NULL;
|
||||
_unref_(ei_device) *touch = NULL;
|
||||
_unref_(ei_device) *gestures = NULL;
|
||||
_unref_(ei_device) *text = NULL;
|
||||
|
||||
bool stop = false;
|
||||
|
|
@ -313,7 +312,6 @@ main(int argc, char **argv)
|
|||
bool have_kbd = false;
|
||||
bool have_abs = false;
|
||||
bool have_touch = false;
|
||||
bool have_gestures = false;
|
||||
bool have_text = false;
|
||||
struct ei_seat *default_seat = NULL;
|
||||
|
||||
|
|
@ -353,7 +351,6 @@ main(int argc, char **argv)
|
|||
EI_DEVICE_CAP_TOUCH,
|
||||
EI_DEVICE_CAP_BUTTON,
|
||||
EI_DEVICE_CAP_SCROLL,
|
||||
EI_DEVICE_CAP_GESTURES,
|
||||
EI_DEVICE_CAP_TEXT,
|
||||
NULL);
|
||||
break;
|
||||
|
|
@ -391,12 +388,6 @@ main(int argc, char **argv)
|
|||
touch = ei_device_ref(device);
|
||||
handle_regions(device);
|
||||
}
|
||||
if (ei_device_has_capability(device, EI_DEVICE_CAP_GESTURES)) {
|
||||
colorprint("New gesture device: %s\n",
|
||||
ei_device_get_name(device));
|
||||
gestures = ei_device_ref(device);
|
||||
handle_regions(device);
|
||||
}
|
||||
if (ei_device_has_capability(device, EI_DEVICE_CAP_TEXT)) {
|
||||
colorprint("New text device: %s\n",
|
||||
ei_device_get_name(device));
|
||||
|
|
@ -428,12 +419,6 @@ main(int argc, char **argv)
|
|||
colorprint("Touch device was resumed\n");
|
||||
have_touch = true;
|
||||
}
|
||||
if (ei_event_get_device(e) == gestures) {
|
||||
if (!receiver)
|
||||
ei_device_start_emulating(gestures, ++sequence);
|
||||
colorprint("Gesture device was resumed\n");
|
||||
have_gestures = true;
|
||||
}
|
||||
if (ei_event_get_device(e) == text) {
|
||||
if (!receiver)
|
||||
ei_device_start_emulating(text, ++sequence);
|
||||
|
|
@ -541,50 +526,6 @@ main(int argc, char **argv)
|
|||
case EI_EVENT_SYNC: {
|
||||
colorprint("sync\n");
|
||||
} break;
|
||||
case EI_EVENT_SWIPE_BEGIN: {
|
||||
colorprint("swipe begin: %ufg\n",
|
||||
ei_event_swipe_get_finger_count(e));
|
||||
} break;
|
||||
case EI_EVENT_SWIPE_UPDATE: {
|
||||
colorprint("swipe update %.2f/%.2f\n",
|
||||
ei_event_swipe_get_dx(e),
|
||||
ei_event_swipe_get_dy(e));
|
||||
} break;
|
||||
case EI_EVENT_SWIPE_END: {
|
||||
colorprint("swipe end, cancelled: %s\n",
|
||||
ei_event_swipe_get_is_cancelled(e) ? "true" : "false");
|
||||
} break;
|
||||
case EI_EVENT_PINCH_BEGIN: {
|
||||
colorprint("pinch begin: %ufg\n",
|
||||
ei_event_pinch_get_finger_count(e));
|
||||
} break;
|
||||
case EI_EVENT_PINCH_UPDATE: {
|
||||
colorprint("pinch update %.2f/%.2f rotation: %.2f scale %.2f\n",
|
||||
ei_event_pinch_get_dx(e),
|
||||
ei_event_pinch_get_dy(e),
|
||||
ei_event_pinch_get_rotation(e),
|
||||
ei_event_pinch_get_scale(e));
|
||||
} break;
|
||||
case EI_EVENT_PINCH_END: {
|
||||
colorprint("pinch end, cancelled: %s\n",
|
||||
ei_event_pinch_get_is_cancelled(e) ? "true" : "false");
|
||||
} break;
|
||||
case EI_EVENT_HOLD_BEGIN: {
|
||||
colorprint("hold begin: %ufg\n", ei_event_hold_get_finger_count(e));
|
||||
} break;
|
||||
case EI_EVENT_HOLD_END: {
|
||||
colorprint("hold end, cancelled: %s\n",
|
||||
ei_event_hold_get_is_cancelled(e) ? "true" : "false");
|
||||
} break;
|
||||
case EI_EVENT_SWIPE_CANCELLED: {
|
||||
colorprint("swipe cancelled by server\n");
|
||||
} break;
|
||||
case EI_EVENT_PINCH_CANCELLED: {
|
||||
colorprint("pinch cancelled by server\n");
|
||||
} break;
|
||||
case EI_EVENT_HOLD_CANCELLED: {
|
||||
colorprint("hold cancelled by server\n");
|
||||
} break;
|
||||
default: {
|
||||
colorprint("ERROR: Unhandled event type %u (%s)\n",
|
||||
type,
|
||||
|
|
@ -666,80 +607,6 @@ main(int argc, char **argv)
|
|||
}
|
||||
}
|
||||
|
||||
if (have_gestures) {
|
||||
const int nfingers = 3;
|
||||
static int counter = 0;
|
||||
static double scale = 1.0;
|
||||
static struct ei_swipe *swipe = NULL;
|
||||
static struct ei_pinch *pinch = NULL;
|
||||
static struct ei_hold *hold = NULL;
|
||||
|
||||
switch (counter++ % 8) {
|
||||
case 0:
|
||||
swipe = ei_device_swipe_new(gestures, nfingers);
|
||||
if (swipe) {
|
||||
colorprint("sending swipe begin event\n");
|
||||
ei_swipe_begin(swipe);
|
||||
ei_device_frame(gestures, now);
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
if (swipe) {
|
||||
colorprint("sending swipe update event\n");
|
||||
ei_swipe_update(swipe, 1.5, 2.3);
|
||||
ei_device_frame(gestures, now);
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
if (swipe) {
|
||||
colorprint("sending swipe cancel event\n");
|
||||
ei_swipe_cancel(swipe);
|
||||
ei_device_frame(gestures, now);
|
||||
swipe = ei_swipe_unref(swipe);
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
pinch = ei_device_pinch_new(gestures, nfingers);
|
||||
if (pinch) {
|
||||
colorprint("sending pinch begin event\n");
|
||||
ei_pinch_begin(pinch);
|
||||
ei_device_frame(gestures, now);
|
||||
}
|
||||
break;
|
||||
case 4:
|
||||
if (pinch) {
|
||||
colorprint("sending pinch update event\n");
|
||||
ei_pinch_update(pinch, 1.5, 2.3, scale += 0.2, 1.7);
|
||||
ei_device_frame(gestures, now);
|
||||
}
|
||||
break;
|
||||
case 5:
|
||||
if (pinch) {
|
||||
colorprint("sending pinch cancel event\n");
|
||||
ei_pinch_cancel(pinch);
|
||||
ei_device_frame(gestures, now);
|
||||
pinch = ei_pinch_unref(pinch);
|
||||
}
|
||||
break;
|
||||
case 6:
|
||||
hold = ei_device_hold_new(gestures, nfingers);
|
||||
if (hold) {
|
||||
colorprint("sending hold begin event\n");
|
||||
ei_hold_begin(hold);
|
||||
ei_device_frame(gestures, now);
|
||||
}
|
||||
break;
|
||||
case 7:
|
||||
if (hold) {
|
||||
colorprint("sending hold cancel event\n");
|
||||
ei_hold_cancel(hold);
|
||||
ei_device_frame(gestures, now);
|
||||
hold = ei_hold_unref(hold);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (have_text) {
|
||||
static int key = 0;
|
||||
colorprint("sending text event\n");
|
||||
|
|
@ -768,8 +635,6 @@ main(int argc, char **argv)
|
|||
ei_device_close(abs);
|
||||
if (touch)
|
||||
ei_device_close(touch);
|
||||
if (gestures)
|
||||
ei_device_close(gestures);
|
||||
if (text)
|
||||
ei_device_close(text);
|
||||
if (default_seat) {
|
||||
|
|
|
|||
|
|
@ -50,8 +50,6 @@
|
|||
#include <string.h>
|
||||
#include <sys/mman.h>
|
||||
|
||||
#include "libeis.h"
|
||||
|
||||
#if HAVE_LIBXKBCOMMON
|
||||
#include <xkbcommon/xkbcommon.h>
|
||||
#endif
|
||||
|
|
@ -153,10 +151,6 @@ eis_demo_client_destroy(struct eis_demo_client *democlient)
|
|||
eis_device_unref(democlient->abs);
|
||||
eis_device_unref(democlient->kbd);
|
||||
eis_device_unref(democlient->touchscreen);
|
||||
eis_device_unref(democlient->gestures);
|
||||
eis_swipe_unref(democlient->swipe);
|
||||
eis_pinch_unref(democlient->pinch);
|
||||
eis_hold_unref(democlient->hold);
|
||||
eis_device_unref(democlient->text);
|
||||
}
|
||||
|
||||
|
|
@ -355,17 +349,6 @@ add_device(struct eis_demo_server *server,
|
|||
case EIS_DEVICE_CAP_SCROLL:
|
||||
/* Mixed in with pointer/abs - good enough for a demo server */
|
||||
break;
|
||||
case EIS_DEVICE_CAP_GESTURES: {
|
||||
struct eis_device *gestures = eis_seat_new_device(seat);
|
||||
eis_device_configure_name(gestures, "test gestures");
|
||||
eis_device_configure_capability(gestures, EIS_DEVICE_CAP_GESTURES);
|
||||
colorprint("Creating gestures device %s for %s\n",
|
||||
eis_device_get_name(gestures),
|
||||
eis_client_get_name(client));
|
||||
eis_device_add(gestures);
|
||||
device = steal(&gestures);
|
||||
break;
|
||||
}
|
||||
case EIS_DEVICE_CAP_TEXT: {
|
||||
struct eis_device *text = eis_seat_new_device(seat);
|
||||
eis_device_configure_name(text, "test text device");
|
||||
|
|
@ -426,7 +409,6 @@ eis_demo_server_printf_handle_event(struct eis_demo_server *server, struct eis_e
|
|||
eis_seat_configure_capability(seat, EIS_DEVICE_CAP_TOUCH);
|
||||
eis_seat_configure_capability(seat, EIS_DEVICE_CAP_BUTTON);
|
||||
eis_seat_configure_capability(seat, EIS_DEVICE_CAP_SCROLL);
|
||||
eis_seat_configure_capability(seat, EIS_DEVICE_CAP_GESTURES);
|
||||
eis_seat_configure_capability(seat, EIS_DEVICE_CAP_TEXT);
|
||||
eis_seat_add(seat);
|
||||
/* Note: we don't have a ref to this seat ourselves anywhere */
|
||||
|
|
@ -497,17 +479,6 @@ eis_demo_server_printf_handle_event(struct eis_demo_server *server, struct eis_e
|
|||
}
|
||||
}
|
||||
|
||||
if (eis_event_seat_has_capability(e, EIS_DEVICE_CAP_GESTURES)) {
|
||||
if (!democlient->gestures)
|
||||
democlient->gestures =
|
||||
add_device(server, client, seat, EIS_DEVICE_CAP_GESTURES);
|
||||
} else {
|
||||
if (democlient->gestures) {
|
||||
eis_device_remove(democlient->gestures);
|
||||
democlient->gestures = eis_device_unref(democlient->gestures);
|
||||
}
|
||||
}
|
||||
|
||||
if (eis_event_seat_has_capability(e, EIS_DEVICE_CAP_TEXT)) {
|
||||
if (!democlient->text)
|
||||
democlient->text =
|
||||
|
|
@ -525,7 +496,6 @@ eis_demo_server_printf_handle_event(struct eis_demo_server *server, struct eis_e
|
|||
!eis_event_seat_has_capability(e, EIS_DEVICE_CAP_POINTER_ABSOLUTE) &&
|
||||
!eis_event_seat_has_capability(e, EIS_DEVICE_CAP_KEYBOARD) &&
|
||||
!eis_event_seat_has_capability(e, EIS_DEVICE_CAP_TOUCH) &&
|
||||
!eis_event_seat_has_capability(e, EIS_DEVICE_CAP_GESTURES) &&
|
||||
!eis_event_seat_has_capability(e, EIS_DEVICE_CAP_TEXT))
|
||||
eis_seat_remove(seat);
|
||||
|
||||
|
|
@ -562,9 +532,6 @@ eis_demo_server_printf_handle_event(struct eis_demo_server *server, struct eis_e
|
|||
if (democlient->touchscreen == device)
|
||||
democlient->touchscreen = NULL;
|
||||
|
||||
if (democlient->gestures == device)
|
||||
democlient->gestures = NULL;
|
||||
|
||||
if (democlient->text == device)
|
||||
democlient->text = NULL;
|
||||
|
||||
|
|
@ -619,39 +586,6 @@ eis_demo_server_printf_handle_event(struct eis_demo_server *server, struct eis_e
|
|||
case EIS_EVENT_TOUCH_UP: {
|
||||
colorprint("touch up %u\n", eis_event_touch_get_id(e));
|
||||
} break;
|
||||
case EIS_EVENT_SWIPE_BEGIN: {
|
||||
colorprint("swipe begin: %ufg\n", eis_event_swipe_get_finger_count(e));
|
||||
} break;
|
||||
case EIS_EVENT_SWIPE_UPDATE: {
|
||||
colorprint("swipe update %.2f/%.2f\n",
|
||||
eis_event_swipe_get_dx(e),
|
||||
eis_event_swipe_get_dy(e));
|
||||
} break;
|
||||
case EIS_EVENT_SWIPE_END: {
|
||||
colorprint("swipe end, cancelled: %s\n",
|
||||
eis_event_swipe_get_is_cancelled(e) ? "true" : "false");
|
||||
} break;
|
||||
case EIS_EVENT_PINCH_BEGIN: {
|
||||
colorprint("pinch begin: %ufg\n", eis_event_pinch_get_finger_count(e));
|
||||
} break;
|
||||
case EIS_EVENT_PINCH_UPDATE: {
|
||||
colorprint("pinch update %.2f/%.2f rotation: %.2f scale %.2f\n",
|
||||
eis_event_pinch_get_dx(e),
|
||||
eis_event_pinch_get_dy(e),
|
||||
eis_event_pinch_get_rotation(e),
|
||||
eis_event_pinch_get_scale(e));
|
||||
} break;
|
||||
case EIS_EVENT_PINCH_END: {
|
||||
colorprint("pinch end, cancelled: %s\n",
|
||||
eis_event_pinch_get_is_cancelled(e) ? "true" : "false");
|
||||
} break;
|
||||
case EIS_EVENT_HOLD_BEGIN: {
|
||||
colorprint("hold begin: %ufg\n", eis_event_hold_get_finger_count(e));
|
||||
} break;
|
||||
case EIS_EVENT_HOLD_END: {
|
||||
colorprint("hold end, cancelled: %s\n",
|
||||
eis_event_hold_get_is_cancelled(e) ? "true" : "false");
|
||||
} break;
|
||||
case EIS_EVENT_TEXT_KEYSYM: {
|
||||
char buf[128] = { 0 };
|
||||
uint32_t keysym = eis_event_text_get_keysym(e);
|
||||
|
|
@ -855,7 +789,6 @@ main(int argc, char **argv)
|
|||
struct eis_device *kbd = democlient->kbd;
|
||||
struct eis_device *abs = democlient->abs;
|
||||
struct eis_device *touchscreen = democlient->touchscreen;
|
||||
struct eis_device *gestures = democlient->gestures;
|
||||
struct eis_device *text = democlient->text;
|
||||
if (ptr) {
|
||||
colorprint("sending motion event\n");
|
||||
|
|
@ -929,86 +862,6 @@ main(int argc, char **argv)
|
|||
break;
|
||||
}
|
||||
}
|
||||
if (gestures) {
|
||||
const int nfingers = 3;
|
||||
static int counter = 0;
|
||||
static double scale = 1.0;
|
||||
struct eis_swipe *swipe = democlient->swipe;
|
||||
struct eis_pinch *pinch = democlient->pinch;
|
||||
struct eis_hold *hold = democlient->hold;
|
||||
|
||||
switch (counter++ % 8) {
|
||||
case 0:
|
||||
swipe = eis_device_swipe_new(gestures, nfingers);
|
||||
if (swipe) {
|
||||
colorprint("sending swipe begin event\n");
|
||||
eis_swipe_begin(swipe);
|
||||
eis_device_frame(gestures, now);
|
||||
democlient->swipe = swipe;
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
if (swipe) {
|
||||
colorprint("sending swipe update event\n");
|
||||
eis_swipe_update(swipe, 1.5, 2.3);
|
||||
eis_device_frame(gestures, now);
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
if (swipe) {
|
||||
colorprint("sending swipe cancel event\n");
|
||||
eis_swipe_cancel(swipe);
|
||||
eis_device_frame(gestures, now);
|
||||
democlient->swipe = eis_swipe_unref(swipe);
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
pinch = eis_device_pinch_new(gestures, nfingers);
|
||||
if (pinch) {
|
||||
colorprint("sending pinch begin event\n");
|
||||
eis_pinch_begin(pinch);
|
||||
eis_device_frame(gestures, now);
|
||||
democlient->pinch = pinch;
|
||||
}
|
||||
break;
|
||||
case 4:
|
||||
if (pinch) {
|
||||
colorprint("sending pinch update event\n");
|
||||
eis_pinch_update(pinch,
|
||||
1.5,
|
||||
2.3,
|
||||
scale += 0.2,
|
||||
1.7);
|
||||
eis_device_frame(gestures, now);
|
||||
}
|
||||
break;
|
||||
case 5:
|
||||
if (pinch) {
|
||||
colorprint("sending pinch cancel event\n");
|
||||
eis_pinch_cancel(pinch);
|
||||
eis_device_frame(gestures, now);
|
||||
democlient->pinch = eis_pinch_unref(pinch);
|
||||
}
|
||||
break;
|
||||
case 6:
|
||||
hold = eis_device_hold_new(gestures, nfingers);
|
||||
if (hold) {
|
||||
colorprint("sending hold begin event\n");
|
||||
eis_hold_begin(hold);
|
||||
eis_device_frame(gestures, now);
|
||||
democlient->hold = hold;
|
||||
}
|
||||
break;
|
||||
case 7:
|
||||
if (hold) {
|
||||
colorprint("sending hold cancel event\n");
|
||||
eis_hold_cancel(hold);
|
||||
eis_device_frame(gestures, now);
|
||||
democlient->hold = eis_hold_unref(hold);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (text) {
|
||||
static int key = 0;
|
||||
|
|
|
|||
|
|
@ -40,11 +40,7 @@ struct eis_demo_client {
|
|||
struct eis_device *kbd;
|
||||
struct eis_device *abs;
|
||||
struct eis_device *touchscreen;
|
||||
struct eis_device *gestures;
|
||||
struct eis_touch *touch;
|
||||
struct eis_swipe *swipe;
|
||||
struct eis_pinch *pinch;
|
||||
struct eis_hold *hold;
|
||||
struct eis_device *text;
|
||||
};
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue