1
#include "gtest_grail_backend.h"
5
Regression test for bug LP#1045785
6
https://bugs.launchpad.net/geis/+bug/1045785
8
Steps to reproduce the issue:
9
1 - create a subscription, set some configuration options
10
(geis_subscription_set_configuration) and activate it.
11
2 - connect a new multitouch device to your computer (e.g. pair an Apple
15
Gestures from that new multitouch device follow the configurations set by
19
class ConfigureNewDevice : public Geis2GrailBackendBase
24
virtual void OnEventInitComplete(GeisEvent event);
25
virtual void OnEventClassAvailable(GeisEvent event);
26
virtual void OnEventGestureBegin(GeisEvent event);
28
void CreateSubscription();
29
void SendXInput2Events();
31
/* signals that a new device has been added */
32
void SendXIDeviceAddedEvent();
34
GeisSubscription _subscription;
35
GeisGestureClass _drag_class;
38
ConfigureNewDevice::ConfigureNewDevice()
39
: _subscription(nullptr),
44
void ConfigureNewDevice::OnEventInitComplete(GeisEvent event)
48
/* The new device comes only after the subscription has been created and
50
CreateXMockTouchScreenDevice();
51
SendXIDeviceAddedEvent();
56
void ConfigureNewDevice::OnEventClassAvailable(GeisEvent event)
58
GeisAttr attr = geis_event_attr_by_name(event, GEIS_EVENT_ATTRIBUTE_CLASS);
59
GeisGestureClass gesture_class =
60
reinterpret_cast<GeisGestureClass>(geis_attr_value_to_pointer(attr));
62
if (strcmp(geis_gesture_class_name(gesture_class), GEIS_GESTURE_DRAG) == 0)
64
_drag_class = gesture_class;
65
geis_gesture_class_ref(gesture_class);
69
void ConfigureNewDevice::OnEventGestureBegin(GeisEvent event)
71
/* There should be no drag gesture since we set a huge drag threshold. */
73
GeisAttr attr = geis_event_attr_by_name(event, GEIS_EVENT_ATTRIBUTE_GROUPSET);
74
GeisGroupSet group_set =
75
reinterpret_cast<GeisGroupSet>(geis_attr_value_to_pointer(attr));
76
GeisGroup group = geis_groupset_group(group_set, 0);
77
GeisFrame frame = geis_group_frame(group, 0);
79
ASSERT_NE(nullptr, _drag_class);
80
GeisBoolean is_drag = geis_frame_is_class(frame, _drag_class);
81
ASSERT_FALSE(is_drag);
84
void ConfigureNewDevice::CreateSubscription()
86
GeisStatus status = GEIS_STATUS_UNKNOWN_ERROR;
87
GeisFilter filter = nullptr;
89
_subscription = geis_subscription_new(_geis, "2-fingers drag",
90
GEIS_SUBSCRIPTION_NONE);
92
filter = geis_filter_new(_geis, "filter");
93
ASSERT_NE(nullptr, filter);
95
status = geis_filter_add_term(filter,
97
GEIS_CLASS_ATTRIBUTE_NAME, GEIS_FILTER_OP_EQ, GEIS_GESTURE_DRAG,
98
GEIS_GESTURE_ATTRIBUTE_TOUCHES, GEIS_FILTER_OP_EQ, 2,
100
ASSERT_EQ(GEIS_STATUS_SUCCESS, status);
102
status = geis_filter_add_term(filter,
104
GEIS_REGION_ATTRIBUTE_WINDOWID, GEIS_FILTER_OP_EQ,
105
DefaultRootWindow(xmock_display),
107
ASSERT_EQ(GEIS_STATUS_SUCCESS, status);
109
status = geis_subscription_add_filter(_subscription, filter);
110
ASSERT_EQ(GEIS_STATUS_SUCCESS, status);
112
/* Set a huge threshold (in meters) so that no drag can be recognized */
113
GeisFloat drag_threshold = 1000.0f;
114
status = geis_subscription_set_configuration(_subscription,
115
GEIS_CONFIG_DRAG_THRESHOLD, &drag_threshold);
116
ASSERT_EQ(GEIS_STATUS_SUCCESS, status);
118
status = geis_subscription_activate(_subscription);
119
ASSERT_EQ(GEIS_STATUS_SUCCESS, status);
122
void ConfigureNewDevice::SendXInput2Events()
124
/* Emulate a simple 2 fingers drag */
126
/* event type, touch id, X and Y */
127
SendTouchEvent(XI_TouchBegin, 1, 10.0f, 10.0f);
128
SendTouchEvent(XI_TouchBegin, 2, 20.0f, 10.0f);
130
xmock_server_time += 2;
133
SendTouchOwnershipEvent(1);
134
SendTouchOwnershipEvent(2);
136
xmock_server_time += 20;
138
SendTouchEvent(XI_TouchUpdate, 1, 10.0f, 25.0f);
139
SendTouchEvent(XI_TouchUpdate, 2, 20.0f, 25.0f);
141
xmock_server_time += 20;
143
SendTouchEvent(XI_TouchUpdate, 1, 10.0f, 35.0f);
144
SendTouchEvent(XI_TouchUpdate, 2, 20.0f, 35.0f);
146
xmock_server_time += 20;
148
SendTouchEvent(XI_TouchEnd, 1, 10.0f, 50.0f);
149
SendTouchEvent(XI_TouchEnd, 2, 20.0f, 50.0f);
152
void ConfigureNewDevice::SendXIDeviceAddedEvent()
155
XGenericEventCookie *xcookie = 0;
156
XIHierarchyEvent *hierarchy_event;
157
XIHierarchyInfo *info;
159
info = (XIHierarchyInfo*)calloc(1, sizeof(XIHierarchyInfo));
160
info->deviceid = xmock_devices[0].deviceid;
161
info->enabled = True;
162
info->flags = XISlaveAdded;
164
hierarchy_event = (XIHierarchyEvent*)calloc(1, sizeof(XIHierarchyEvent));
165
hierarchy_event->type = GenericEvent;
166
hierarchy_event->serial = _xevent_serial_number++;
167
hierarchy_event->display = xmock_display;
168
hierarchy_event->extension = xmock_xi2_opcode;
169
hierarchy_event->evtype = XI_HierarchyChanged;
170
hierarchy_event->time = xmock_server_time;
171
hierarchy_event->flags = XISlaveAdded;
172
hierarchy_event->num_info = 1;
173
hierarchy_event->info = info;
175
event.type = GenericEvent;
176
xcookie = &event.xcookie;
177
xcookie->extension = xmock_xi2_opcode;
178
xcookie->evtype = XI_HierarchyChanged;
179
xcookie->data = hierarchy_event;
180
xmock_add_to_event_queue(&event);
183
TEST_F(ConfigureNewDevice, Test)
185
_geis = geis_new(GEIS_INIT_GRAIL_BACKEND,
186
GEIS_INIT_NO_ATOMIC_GESTURES,
188
ASSERT_NE(nullptr, _geis);
193
geis_subscription_delete(_subscription);
196
geis_gesture_class_unref(_drag_class);
200
DestroyXMockDevices();