Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(266)

Side by Side Diff: ui/events/ozone/evdev/gestures/gesture_interpreter_libevdev_cros.cc

Issue 193813003: ozone: evdev: Add libgestures bindings for touchpad & mouse support (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "ui/events/ozone/evdev/gestures/gesture_interpreter_libevdev_cros.h"
6
7 #include <gestures/gestures.h>
8 #include <libevdev/libevdev.h>
9
10 #include "base/strings/stringprintf.h"
11 #include "base/timer/timer.h"
12 #include "ui/events/event.h"
13 #include "ui/events/ozone/evdev/cursor_delegate_evdev.h"
14 #include "ui/events/ozone/evdev/event_modifiers_evdev.h"
15 #include "ui/events/ozone/evdev/gestures/gesture_property_provider.h"
16 #include "ui/events/ozone/evdev/gestures/gesture_timer_provider.h"
17 #include "ui/gfx/geometry/point_f.h"
18
19 namespace ui {
20
21 namespace {
22
23 // Convert libevdev device class to libgestures device class.
24 GestureInterpreterDeviceClass GestureDeviceClass(Evdev* evdev) {
25 switch (evdev->info.evdev_class) {
26 case EvdevClassMouse:
27 return GESTURES_DEVCLASS_MOUSE;
28 case EvdevClassMultitouchMouse:
29 return GESTURES_DEVCLASS_MULTITOUCH_MOUSE;
30 case EvdevClassTouchpad:
31 return GESTURES_DEVCLASS_TOUCHPAD;
32 case EvdevClassTouchscreen:
33 return GESTURES_DEVCLASS_TOUCHSCREEN;
34 default:
35 return GESTURES_DEVCLASS_UNKNOWN;
36 }
37 }
38
39 // Convert libevdev state to libgestures hardware properties.
40 HardwareProperties GestureHardwareProperties(Evdev* evdev) {
41 HardwareProperties hwprops;
42 hwprops.left = Event_Get_Left(evdev);
43 hwprops.top = Event_Get_Top(evdev);
44 hwprops.right = Event_Get_Right(evdev);
45 hwprops.bottom = Event_Get_Bottom(evdev);
46 hwprops.res_x = Event_Get_Res_X(evdev);
47 hwprops.res_y = Event_Get_Res_Y(evdev);
48 hwprops.screen_x_dpi = 133;
49 hwprops.screen_y_dpi = 133;
50 hwprops.orientation_minimum = Event_Get_Orientation_Minimum(evdev);
51 hwprops.orientation_maximum = Event_Get_Orientation_Maximum(evdev);
52 hwprops.max_finger_cnt = Event_Get_Slot_Count(evdev);
53 hwprops.max_touch_cnt = Event_Get_Touch_Count_Max(evdev);
54 hwprops.supports_t5r2 = Event_Get_T5R2(evdev);
55 hwprops.support_semi_mt = Event_Get_Semi_MT(evdev);
56 /* buttonpad means a physical button under the touch surface */
57 hwprops.is_button_pad = Event_Get_Button_Pad(evdev);
58 return hwprops;
59 }
60
61 // Callback from libgestures when a gesture is ready.
62 void OnGestureReadyHelper(void* client_data, const Gesture* gesture) {
63 GestureInterpreterLibevdevCros* interpreter =
64 static_cast<GestureInterpreterLibevdevCros*>(client_data);
65 interpreter->OnGestureReady(gesture);
66 }
67
68 // Convert gestures timestamp (stime_t) to ui::Event timestamp.
69 base::TimeDelta StimeToTimedelta(stime_t timestamp) {
70 return base::TimeDelta::FromMicroseconds(timestamp *
71 base::Time::kMicrosecondsPerSecond);
72 }
73
74 // Number of fingers for scroll gestures.
75 const int kGestureScrollFingerCount = 2;
76
77 } // namespace
78
79 GestureInterpreterLibevdevCros::GestureInterpreterLibevdevCros(
80 EventModifiersEvdev* modifiers,
81 CursorDelegateEvdev* cursor,
82 const EventDispatchCallback& callback)
83 : modifiers_(modifiers), cursor_(cursor), dispatch_callback_(callback) {}
84
85 GestureInterpreterLibevdevCros::~GestureInterpreterLibevdevCros() {}
86
87 void GestureInterpreterLibevdevCros::OnLibEvdevCrosOpen(
88 Evdev* evdev,
89 EventStateRec* evstate) {
90 CHECK(evdev->info.is_monotonic) << "libevdev must use monotonic timestamps";
91 VLOG(9) << "HACK DO NOT REMOVE OR LINK WILL FAIL" << (void*)gestures_log;
92
93 HardwareProperties hwprops = GestureHardwareProperties(evdev);
94 GestureInterpreterDeviceClass devclass = GestureDeviceClass(evdev);
95
96 // Create & initialize GestureInterpreter.
97 interpreter_ = make_scoped_ptr(NewGestureInterpreter());
98 interpreter_->SetPropProvider(
99 const_cast<GesturesPropProvider*>(&kGesturePropertyProvider), this);
100 interpreter_->Initialize(devclass);
101 interpreter_->SetHardwareProperties(hwprops);
102 interpreter_->SetTimerProvider(
103 const_cast<GesturesTimerProvider*>(&kGestureTimerProvider), this);
104 interpreter_->set_callback(OnGestureReadyHelper, this);
105 }
106
107 void GestureInterpreterLibevdevCros::OnLibEvdevCrosEvent(Evdev* evdev,
108 EventStateRec* evstate,
109 const timeval& time) {
110 HardwareState hwstate;
111 memset(&hwstate, 0, sizeof(hwstate));
112 hwstate.timestamp = StimeFromTimeval(&time);
113
114 // Mouse.
115 hwstate.rel_x = evstate->rel_x;
116 hwstate.rel_y = evstate->rel_y;
117 hwstate.rel_wheel = evstate->rel_wheel;
118 hwstate.rel_hwheel = evstate->rel_hwheel;
119
120 // Touch.
121 FingerState fingers[Event_Get_Slot_Count(evdev)];
122 memset(&fingers, 0, sizeof(fingers));
123 int current_finger = 0;
124 for (int i = 0; i < evstate->slot_count; i++) {
125 MtSlotPtr slot = &evstate->slots[i];
126 if (slot->tracking_id == -1)
127 continue;
128 fingers[current_finger].touch_major = slot->touch_major;
129 fingers[current_finger].touch_minor = slot->touch_minor;
130 fingers[current_finger].width_major = slot->width_major;
131 fingers[current_finger].width_minor = slot->width_minor;
132 fingers[current_finger].pressure = slot->pressure;
133 fingers[current_finger].orientation = slot->orientation;
134 fingers[current_finger].position_x = slot->position_x;
135 fingers[current_finger].position_y = slot->position_y;
136 fingers[current_finger].tracking_id = slot->tracking_id;
137 current_finger++;
138 }
139 hwstate.touch_cnt = Event_Get_Touch_Count(evdev);
140 hwstate.finger_cnt = current_finger;
141 hwstate.fingers = fingers;
142
143 // Buttons.
144 if (Event_Get_Button_Left(evdev))
145 hwstate.buttons_down |= GESTURES_BUTTON_LEFT;
146 if (Event_Get_Button_Middle(evdev))
147 hwstate.buttons_down |= GESTURES_BUTTON_MIDDLE;
148 if (Event_Get_Button_Right(evdev))
149 hwstate.buttons_down |= GESTURES_BUTTON_RIGHT;
150
151 GestureInterpreterPushHardwareState(interpreter_.get(), &hwstate);
152 }
153
154 void GestureInterpreterLibevdevCros::OnGestureReady(const Gesture* gesture) {
155 switch (gesture->type) {
156 case kGestureTypeMove:
157 OnGestureMove(gesture, &gesture->details.move);
158 break;
159 case kGestureTypeScroll:
160 OnGestureScroll(gesture, &gesture->details.scroll);
161 break;
162 case kGestureTypeButtonsChange:
163 OnGestureButtonsChange(gesture, &gesture->details.buttons);
164 break;
165 case kGestureTypeContactInitiated:
166 case kGestureTypeFling:
167 case kGestureTypeSwipe:
168 case kGestureTypeSwipeLift:
169 case kGestureTypePinch:
170 case kGestureTypeMetrics:
171 // TODO(spang): Support remaining gestures.
172 NOTIMPLEMENTED();
173 break;
174 default:
175 LOG(WARNING) << base::StringPrintf("Unrecognized gesture type (%u)",
176 gesture->type);
177 break;
178 }
179 }
180
181 void GestureInterpreterLibevdevCros::OnGestureMove(const Gesture* gesture,
182 const GestureMove* move) {
183 DVLOG(3) << base::StringPrintf("Gesture Move: (%f, %f) [%f, %f]",
184 move->dx,
185 move->dy,
186 move->ordinal_dx,
187 move->ordinal_dy);
188 if (!cursor_)
189 return; // No cursor!
190 cursor_->MoveCursor(gfx::Vector2dF(move->dx, move->dy));
191 // TODO(spang): Use move->ordinal_dx, move->ordinal_dy
192 // TODO(spang): Use move->start_time, move->end_time
193 Dispatch(new MouseEvent(ET_MOUSE_MOVED,
194 cursor_->location(),
195 cursor_->location(),
196 modifiers_->GetModifierFlags(),
197 /* changed_button_flags */ 0));
198 }
199
200 void GestureInterpreterLibevdevCros::OnGestureScroll(
201 const Gesture* gesture,
202 const GestureScroll* scroll) {
203 DVLOG(3) << base::StringPrintf("Gesture Scroll: (%f, %f) [%f, %f]",
204 scroll->dx,
205 scroll->dy,
206 scroll->ordinal_dx,
207 scroll->ordinal_dy);
208 // TODO(spang): Support SetNaturalScroll
209 // TODO(spang): Use scroll->start_time
210 Dispatch(new ScrollEvent(ET_SCROLL,
211 cursor_->location(),
212 StimeToTimedelta(gesture->end_time),
213 modifiers_->GetModifierFlags(),
214 scroll->dx,
215 scroll->dy,
216 scroll->ordinal_dx,
217 scroll->ordinal_dy,
218 kGestureScrollFingerCount));
219 }
220
221 void GestureInterpreterLibevdevCros::OnGestureButtonsChange(
222 const Gesture* gesture,
223 const GestureButtonsChange* buttons) {
224 DVLOG(3) << base::StringPrintf("Gesture Button Change: down=0x%02x up=0x%02x",
225 buttons->down,
226 buttons->up);
227 // TODO(spang): Use buttons->start_time, buttons->end_time
228 if (buttons->down & GESTURES_BUTTON_LEFT)
229 DispatchMouseButton(EVDEV_MODIFIER_LEFT_MOUSE_BUTTON, true);
230 if (buttons->down & GESTURES_BUTTON_MIDDLE)
231 DispatchMouseButton(EVDEV_MODIFIER_MIDDLE_MOUSE_BUTTON, true);
232 if (buttons->down & GESTURES_BUTTON_RIGHT)
233 DispatchMouseButton(EVDEV_MODIFIER_RIGHT_MOUSE_BUTTON, true);
234 if (buttons->up & GESTURES_BUTTON_LEFT)
235 DispatchMouseButton(EVDEV_MODIFIER_LEFT_MOUSE_BUTTON, false);
236 if (buttons->up & GESTURES_BUTTON_MIDDLE)
237 DispatchMouseButton(EVDEV_MODIFIER_MIDDLE_MOUSE_BUTTON, false);
238 if (buttons->up & GESTURES_BUTTON_RIGHT)
239 DispatchMouseButton(EVDEV_MODIFIER_RIGHT_MOUSE_BUTTON, false);
240 }
241
242 void GestureInterpreterLibevdevCros::Dispatch(Event* event) {
243 dispatch_callback_.Run(make_scoped_ptr(event));
244 }
245
246 void GestureInterpreterLibevdevCros::DispatchMouseButton(unsigned int modifier,
247 bool down) {
248 const gfx::PointF& loc = cursor_->location();
249 int flag = modifiers_->GetEventFlagFromModifier(modifier);
250 EventType type = (down ? ET_MOUSE_PRESSED : ET_MOUSE_RELEASED);
251 modifiers_->UpdateModifier(modifier, down);
252 Dispatch(new MouseEvent(
253 type, loc, loc, modifiers_->GetModifierFlags() | flag, flag));
254 }
255
256 } // namespace ui
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698