| Index: ui/events/platform/x11/x11_event_source.cc
|
| diff --git a/ui/events/platform/x11/x11_event_source.cc b/ui/events/platform/x11/x11_event_source.cc
|
| index 12f524c3d668d457b1fb7ff31d6438190d02f76a..03c84f8b20c0dd5a4e476f82088b331408fdd679 100644
|
| --- a/ui/events/platform/x11/x11_event_source.cc
|
| +++ b/ui/events/platform/x11/x11_event_source.cc
|
| @@ -96,6 +96,7 @@ X11EventSource::X11EventSource(X11EventSourceDelegate* delegate,
|
| : delegate_(delegate),
|
| display_(display),
|
| last_seen_server_time_(CurrentTime),
|
| + event_timestamp_(CurrentTime),
|
| dummy_initialized_(false),
|
| continue_stream_(true) {
|
| DCHECK(!instance_);
|
| @@ -184,6 +185,26 @@ Time X11EventSource::UpdateLastSeenServerTime() {
|
| return last_seen_server_time_;
|
| }
|
|
|
| +void X11EventSource::SetLastSeenServerTime(Time time) {
|
| + if (time != CurrentTime) {
|
| + int64_t event_time_64 = time;
|
| + int64_t time_difference = last_seen_server_time_ - event_time_64;
|
| + // Ignore timestamps that go backwards. However, X server time is a 32-bit
|
| + // millisecond counter, so if the time goes backwards by more than half the
|
| + // range of the 32-bit counter, treat it as a rollover.
|
| + if (time_difference < 0 || time_difference > (UINT32_MAX >> 1))
|
| + last_seen_server_time_ = time;
|
| + }
|
| +}
|
| +
|
| +Time X11EventSource::GetTimestamp() {
|
| + if (event_timestamp_ != CurrentTime) {
|
| + return event_timestamp_;
|
| + }
|
| + DVLOG(1) << "Making a round trip to get a recent server timestamp.";
|
| + return UpdateLastSeenServerTime();
|
| +}
|
| +
|
| ////////////////////////////////////////////////////////////////////////////////
|
| // X11EventSource, protected
|
|
|
| @@ -193,18 +214,15 @@ void X11EventSource::ExtractCookieDataDispatchEvent(XEvent* xevent) {
|
| XGetEventData(xevent->xgeneric.display, &xevent->xcookie)) {
|
| have_cookie = true;
|
| }
|
| - Time event_time = ExtractTimeFromXEvent(*xevent);
|
| - if (event_time != CurrentTime) {
|
| - int64_t event_time_64 = event_time;
|
| - int64_t time_difference = last_seen_server_time_ - event_time_64;
|
| - // Ignore timestamps that go backwards. However, X server time is a 32-bit
|
| - // millisecond counter, so if the time goes backwards by more than half the
|
| - // range of the 32-bit counter, treat it as a rollover.
|
| - if (time_difference < 0 || time_difference > (UINT32_MAX >> 1))
|
| - last_seen_server_time_ = event_time;
|
| - }
|
| +
|
| + event_timestamp_ = ExtractTimeFromXEvent(*xevent);
|
| + SetLastSeenServerTime(event_timestamp_);
|
| +
|
| delegate_->ProcessXEvent(xevent);
|
| PostDispatchEvent(xevent);
|
| +
|
| + event_timestamp_ = CurrentTime;
|
| +
|
| if (have_cookie)
|
| XFreeEventData(xevent->xgeneric.display, &xevent->xcookie);
|
| }
|
|
|