diff options
author | Giovanni Campagna <gcampagn@redhat.com> | 2013-09-04 15:28:27 +0200 |
---|---|---|
committer | Giovanni Campagna <gcampagna@src.gnome.org> | 2013-10-03 21:11:12 +0200 |
commit | 00a73c5bdc6f38a36a5d4f1eeb813a6aebe21861 (patch) | |
tree | 0f47ccc183a612d7ba2860ec2e0944cc2aca7ab2 | |
parent | 20cd02f086df9fc2cb74939cafc7929c55e5e773 (diff) | |
download | mutter-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.c | 33 |
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); |