Index: components/exo/wayland/server.cc |
diff --git a/components/exo/wayland/server.cc b/components/exo/wayland/server.cc |
index ee9c767265d1acfcb661942699696387bc142198..87809b4eadf7bce6f47f8a116998c2b6e654648b 100644 |
--- a/components/exo/wayland/server.cc |
+++ b/components/exo/wayland/server.cc |
@@ -108,6 +108,13 @@ void SetImplementation(wl_resource* resource, |
DestroyUserData<T>); |
} |
+// Convert a timestamp to a time value that can be used when interfacing |
+// with wayland. Note that we cast a int64_t value to uint32_t which can |
+// potentially overflow. |
+uint32_t TimeTicksToMilliseconds(base::TimeTicks ticks) { |
+ return (ticks - base::TimeTicks()).InMilliseconds(); |
+} |
+ |
// A property key containing the surface resource that is associated with |
// window. If unset, no surface resource is associated with window. |
DEFINE_WINDOW_PROPERTY_KEY(wl_resource*, kSurfaceResourceKey, nullptr); |
@@ -170,8 +177,7 @@ void surface_damage(wl_client* client, |
void HandleSurfaceFrameCallback(wl_resource* resource, |
base::TimeTicks frame_time) { |
if (!frame_time.is_null()) { |
- wl_callback_send_done(resource, |
- (frame_time - base::TimeTicks()).InMilliseconds()); |
+ wl_callback_send_done(resource, TimeTicksToMilliseconds(frame_time)); |
// TODO(reveman): Remove this potentially blocking flush and instead watch |
// the file descriptor to be ready for write without blocking. |
wl_client_flush(wl_resource_get_client(resource)); |
@@ -1727,13 +1733,13 @@ class WaylandPointerDelegate : public PointerDelegate { |
DCHECK(surface_resource); |
wl_pointer_send_leave(pointer_resource_, next_serial(), surface_resource); |
} |
- void OnPointerMotion(base::TimeDelta time_stamp, |
+ void OnPointerMotion(base::TimeTicks time_stamp, |
const gfx::PointF& location) override { |
- wl_pointer_send_motion(pointer_resource_, time_stamp.InMilliseconds(), |
- wl_fixed_from_double(location.x()), |
- wl_fixed_from_double(location.y())); |
+ wl_pointer_send_motion( |
+ pointer_resource_, TimeTicksToMilliseconds(time_stamp), |
+ wl_fixed_from_double(location.x()), wl_fixed_from_double(location.y())); |
} |
- void OnPointerButton(base::TimeDelta time_stamp, |
+ void OnPointerButton(base::TimeTicks time_stamp, |
int button_flags, |
bool pressed) override { |
struct { |
@@ -1749,15 +1755,15 @@ class WaylandPointerDelegate : public PointerDelegate { |
uint32_t serial = next_serial(); |
for (auto button : buttons) { |
if (button_flags & button.flag) { |
- wl_pointer_send_button(pointer_resource_, serial, |
- time_stamp.InMilliseconds(), button.value, |
- pressed ? WL_POINTER_BUTTON_STATE_PRESSED |
- : WL_POINTER_BUTTON_STATE_RELEASED); |
+ wl_pointer_send_button( |
+ pointer_resource_, serial, TimeTicksToMilliseconds(time_stamp), |
+ button.value, pressed ? WL_POINTER_BUTTON_STATE_PRESSED |
+ : WL_POINTER_BUTTON_STATE_RELEASED); |
} |
} |
} |
- void OnPointerScroll(base::TimeDelta time_stamp, |
+ void OnPointerScroll(base::TimeTicks time_stamp, |
const gfx::Vector2dF& offset, |
bool discrete) override { |
// Same as Weston, the reference compositor. |
@@ -1771,29 +1777,31 @@ class WaylandPointerDelegate : public PointerDelegate { |
} |
double x_value = offset.x() * kAxisStepDistance; |
- wl_pointer_send_axis(pointer_resource_, time_stamp.InMilliseconds(), |
+ wl_pointer_send_axis(pointer_resource_, TimeTicksToMilliseconds(time_stamp), |
WL_POINTER_AXIS_HORIZONTAL_SCROLL, |
wl_fixed_from_double(-x_value)); |
double y_value = offset.y() * kAxisStepDistance; |
- wl_pointer_send_axis(pointer_resource_, time_stamp.InMilliseconds(), |
+ wl_pointer_send_axis(pointer_resource_, TimeTicksToMilliseconds(time_stamp), |
WL_POINTER_AXIS_VERTICAL_SCROLL, |
wl_fixed_from_double(-y_value)); |
} |
- void OnPointerScrollCancel(base::TimeDelta time_stamp) override { |
+ void OnPointerScrollCancel(base::TimeTicks time_stamp) override { |
// Wayland doesn't know the concept of a canceling kinetic scrolling. |
// But we can send a 0 distance scroll to emulate this behavior. |
OnPointerScroll(time_stamp, gfx::Vector2dF(0, 0), false); |
OnPointerScrollStop(time_stamp); |
} |
- void OnPointerScrollStop(base::TimeDelta time_stamp) override { |
+ void OnPointerScrollStop(base::TimeTicks time_stamp) override { |
if (wl_resource_get_version(pointer_resource_) >= |
WL_POINTER_AXIS_STOP_SINCE_VERSION) { |
- wl_pointer_send_axis_stop(pointer_resource_, time_stamp.InMilliseconds(), |
+ wl_pointer_send_axis_stop(pointer_resource_, |
+ TimeTicksToMilliseconds(time_stamp), |
WL_POINTER_AXIS_HORIZONTAL_SCROLL); |
- wl_pointer_send_axis_stop(pointer_resource_, time_stamp.InMilliseconds(), |
+ wl_pointer_send_axis_stop(pointer_resource_, |
+ TimeTicksToMilliseconds(time_stamp), |
WL_POINTER_AXIS_VERTICAL_SCROLL); |
} |
} |
@@ -1904,11 +1912,11 @@ class WaylandKeyboardDelegate : public KeyboardDelegate { |
wl_keyboard_send_leave(keyboard_resource_, next_serial(), surface_resource); |
wl_client_flush(client()); |
} |
- void OnKeyboardKey(base::TimeDelta time_stamp, |
+ void OnKeyboardKey(base::TimeTicks time_stamp, |
ui::DomCode key, |
bool pressed) override { |
wl_keyboard_send_key(keyboard_resource_, next_serial(), |
- time_stamp.InMilliseconds(), DomCodeToKey(key), |
+ TimeTicksToMilliseconds(time_stamp), DomCodeToKey(key), |
pressed ? WL_KEYBOARD_KEY_STATE_PRESSED |
: WL_KEYBOARD_KEY_STATE_RELEASED); |
wl_client_flush(client()); |
@@ -2013,27 +2021,27 @@ class WaylandTouchDelegate : public TouchDelegate { |
wl_resource_get_client(surface_resource) == client(); |
} |
void OnTouchDown(Surface* surface, |
- base::TimeDelta time_stamp, |
+ base::TimeTicks time_stamp, |
int id, |
const gfx::Point& location) override { |
wl_resource* surface_resource = surface->GetProperty(kSurfaceResourceKey); |
DCHECK(surface_resource); |
wl_touch_send_down(touch_resource_, next_serial(), |
- time_stamp.InMilliseconds(), surface_resource, id, |
- wl_fixed_from_int(location.x()), |
+ TimeTicksToMilliseconds(time_stamp), surface_resource, |
+ id, wl_fixed_from_int(location.x()), |
wl_fixed_from_int(location.y())); |
wl_client_flush(client()); |
} |
- void OnTouchUp(base::TimeDelta time_stamp, int id) override { |
+ void OnTouchUp(base::TimeTicks time_stamp, int id) override { |
wl_touch_send_up(touch_resource_, next_serial(), |
- time_stamp.InMilliseconds(), id); |
+ TimeTicksToMilliseconds(time_stamp), id); |
wl_client_flush(client()); |
} |
- void OnTouchMotion(base::TimeDelta time_stamp, |
+ void OnTouchMotion(base::TimeTicks time_stamp, |
int id, |
const gfx::Point& location) override { |
- wl_touch_send_motion(touch_resource_, time_stamp.InMilliseconds(), id, |
- wl_fixed_from_int(location.x()), |
+ wl_touch_send_motion(touch_resource_, TimeTicksToMilliseconds(time_stamp), |
+ id, wl_fixed_from_int(location.x()), |
wl_fixed_from_int(location.y())); |
wl_client_flush(client()); |
} |