summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGiovanni Campagna <gcampagn@redhat.com>2013-09-04 15:28:27 +0200
committerGiovanni Campagna <gcampagna@src.gnome.org>2013-10-03 21:11:12 +0200
commit00a73c5bdc6f38a36a5d4f1eeb813a6aebe21861 (patch)
tree0f47ccc183a612d7ba2860ec2e0944cc2aca7ab2
parent20cd02f086df9fc2cb74939cafc7929c55e5e773 (diff)
downloadmutter-00a73c5bdc6f38a36a5d4f1eeb813a6aebe21861.tar.gz
display: shortcut get_time_roundtrip() when running as a wayland compositor
In wayland, we can make some assumptions about the behavior and configuration of the X server (which is Xwayland), including on the time it uses, and that way avoiding a roundtrip (potentially deadly, if by chance the X server is also blocking on us or needs us to flush the wayland socket buffer). Note that we bypass get_current_time() entirely, as it is assumed the function is called always to translated CurrentTime into a real value. https://bugzilla.gnome.org/show_bug.cgi?id=707466
-rw-r--r--src/core/display.c33
1 files changed, 20 insertions, 13 deletions
diff --git a/src/core/display.c b/src/core/display.c
index b7a6929f9..48087a90c 100644
--- a/src/core/display.c
+++ b/src/core/display.c
@@ -1515,20 +1515,27 @@ guint32
meta_display_get_current_time_roundtrip (MetaDisplay *display)
{
guint32 timestamp;
-
- timestamp = meta_display_get_current_time (display);
- if (timestamp == CurrentTime)
+
+ if (meta_is_wayland_compositor ())
{
- XEvent property_event;
-
- XChangeProperty (display->xdisplay, display->timestamp_pinging_window,
- display->atom__MUTTER_TIMESTAMP_PING,
- XA_STRING, 8, PropModeAppend, NULL, 0);
- XIfEvent (display->xdisplay,
- &property_event,
- find_timestamp_predicate,
- (XPointer) display);
- timestamp = property_event.xproperty.time;
+ timestamp = g_get_monotonic_time () / 1000;
+ }
+ else
+ {
+ timestamp = meta_display_get_current_time (display);
+ if (timestamp == CurrentTime)
+ {
+ XEvent property_event;
+
+ XChangeProperty (display->xdisplay, display->timestamp_pinging_window,
+ display->atom__MUTTER_TIMESTAMP_PING,
+ XA_STRING, 8, PropModeAppend, NULL, 0);
+ XIfEvent (display->xdisplay,
+ &property_event,
+ find_timestamp_predicate,
+ (XPointer) display);
+ timestamp = property_event.xproperty.time;
+ }
}
sanity_check_timestamps (display, timestamp);