| 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 0319da91b56843494f6c487d3876f316098142fd..81179416641795242f6e78ae1a90a4ea5a65d8e0 100644
|
| --- a/ui/events/platform/x11/x11_event_source.cc
|
| +++ b/ui/events/platform/x11/x11_event_source.cc
|
| @@ -4,10 +4,12 @@
|
|
|
| #include "ui/events/platform/x11/x11_event_source.h"
|
|
|
| +#include <X11/Xatom.h>
|
| #include <X11/XKBlib.h>
|
| #include <X11/Xlib.h>
|
|
|
| #include "base/logging.h"
|
| +#include "base/metrics/histogram_macros.h"
|
| #include "ui/events/devices/x11/device_data_manager_x11.h"
|
| #include "ui/events/event_utils.h"
|
| #include "ui/events/platform/platform_event_dispatcher.h"
|
| @@ -70,6 +72,14 @@ Time ExtractTimeFromXEvent(const XEvent& xevent) {
|
| return CurrentTime;
|
| }
|
|
|
| +Bool IsPropertyNotifyForTimestamp(Display* display,
|
| + XEvent* event,
|
| + XPointer arg) {
|
| + return event->type == PropertyNotify &&
|
| + event->xproperty.window == DefaultRootWindow(display) &&
|
| + event->xproperty.atom == *(Atom*)arg;
|
| +}
|
| +
|
| } // namespace
|
|
|
| X11EventSource* X11EventSource::instance_ = nullptr;
|
| @@ -126,6 +136,37 @@ void X11EventSource::BlockUntilWindowMapped(XID window) {
|
| } while (event.type != MapNotify);
|
| }
|
|
|
| +Time X11EventSource::UpdateLastSeenServerTime() {
|
| + base::TimeTicks start = base::TimeTicks::Now();
|
| +
|
| + const char kAtomStr[] = "X11_EVENT_SOURCE_UPDATE_SERVER_TIME_DUMMY_ATOM";
|
| +
|
| + DCHECK(display_);
|
| + Window window = DefaultRootWindow(display_);
|
| + const unsigned char dummy_data = 0;
|
| + Atom dummy_atom = XInternAtom(display_, kAtomStr, False);
|
| +
|
| + // Make a no-op property change on the root window.
|
| + XSelectInput(display_, window, PropertyChangeMask);
|
| + XChangeProperty(display_, window, dummy_atom, XA_INTEGER, 8, PropModeReplace,
|
| + &dummy_data, 1);
|
| +
|
| + // Observe the resulting PropertyChange to obtain the timestamp.
|
| + XEvent event;
|
| + XIfEvent(display_, &event, IsPropertyNotifyForTimestamp,
|
| + (XPointer)&dummy_atom);
|
| +
|
| + // Clean up: don't leave a dummy property in the root window.
|
| + XDeleteProperty(display_, window, dummy_atom);
|
| + XFlush(display_);
|
| +
|
| + last_seen_server_time_ = event.xproperty.time;
|
| +
|
| + UMA_HISTOGRAM_TIMES("Event.Latency.X11EventSource.UpdateServerTime",
|
| + base::TimeTicks::Now() - start);
|
| + return last_seen_server_time_;
|
| +}
|
| +
|
| ////////////////////////////////////////////////////////////////////////////////
|
| // X11EventSource, protected
|
|
|
|
|