[x11] Add backend-specific get_current_event_time()
authorEmmanuele Bassi <ebassi@linux.intel.com>
Wed, 18 Feb 2009 09:45:26 +0000 (09:45 +0000)
committerEmmanuele Bassi <ebassi@linux.intel.com>
Wed, 18 Feb 2009 10:07:12 +0000 (10:07 +0000)
The clutter_get_current_event_time() function will return the event
timestamp coming from a Clutter event. Clutter might synthesize or
throttle events, so the function cannot be used when dealing with
backend-specific use cases.

The X11 backend is the only backend supported by Clutter that makes
use of timestamps, so it's altogether fitting that it should come
with a specific function to deal with the timestamps of the X events.

clutter/x11/clutter-backend-x11.c
clutter/x11/clutter-backend-x11.h
clutter/x11/clutter-event-x11.c
clutter/x11/clutter-x11.h

index 412bb77..3039ce4 100644 (file)
@@ -355,6 +355,8 @@ clutter_backend_x11_init (ClutterBackendX11 *backend_x11)
   clutter_backend_set_double_click_time (backend, 250);
   clutter_backend_set_double_click_distance (backend, 5);
   clutter_backend_set_resolution (backend, 96.0);
+
+  backend_x11->last_event_time = CurrentTime;
 }
 
 static int
index d14cccf..3b51e12 100644 (file)
@@ -84,6 +84,7 @@ struct _ClutterBackendX11
   gboolean    have_xinput;
 #endif
 
+  Time last_event_time;
 };
 
 struct _ClutterBackendX11Class
index 634a3c7..6aec05f 100644 (file)
@@ -205,6 +205,50 @@ _clutter_backend_x11_events_uninit (ClutterBackend *backend)
 }
 
 static void
+update_last_event_time (ClutterBackendX11 *backend_x11,
+                        XEvent            *xevent)
+{
+  Time current_time = CurrentTime;
+  Time last_time = backend_x11->last_event_time;
+
+  switch (xevent->type)
+    {
+    case KeyPress:
+    case KeyRelease:
+      current_time = xevent->xkey.time;
+      break;
+
+    case ButtonPress:
+    case ButtonRelease:
+      current_time = xevent->xbutton.time;
+      break;
+
+    case MotionNotify:
+      current_time = xevent->xmotion.time;
+      break;
+
+    case EnterNotify:
+    case LeaveNotify:
+      current_time = xevent->xcrossing.time;
+      break;
+
+    case PropertyNotify:
+      current_time = xevent->xproperty.time;
+      break;
+
+    default:
+      break;
+    }
+
+  /* only change the current event time if it's after the previous event
+   * time, or if it is at least 30 seconds earlier - in case the system
+   * clock was changed
+   */
+  if (current_time > last_time || (last_time - current_time > (30 * 1000)))
+    backend_x11->last_event_time = current_time;
+}
+
+static void
 set_user_time (ClutterBackendX11 *backend_x11,
                Window            *xwindow,
                long               timestamp)
@@ -419,9 +463,10 @@ event_translate (ClutterBackend *backend,
 
   event->any.stage = stage;
 
-
   res = TRUE;
 
+  update_last_event_time (backend_x11, xevent);
+
   switch (xevent->type)
     {
     case ConfigureNotify:
@@ -1002,3 +1047,23 @@ clutter_event_dispatch (GSource     *source,
 
   return TRUE;
 }
+
+/**
+ * clutter_x11_get_current_event_time:
+ *
+ * Retrieves the timestamp of the last X11 event processed by
+ * Clutter. This might be different from the timestamp returned
+ * by clutter_get_current_event_time(), as Clutter may synthesize
+ * or throttle events.
+ *
+ * Return value: a timestamp, in milliseconds
+ *
+ * Since: 1.0
+ */
+Time
+clutter_x11_get_current_event_time (void)
+{
+  ClutterBackend *backend = clutter_get_default_backend ();
+
+  return CLUTTER_BACKEND_X11 (backend)->last_event_time;
+}
index ca58a2b..806c213 100644 (file)
@@ -132,6 +132,8 @@ gboolean clutter_x11_has_xinput (void);
 
 gboolean clutter_x11_has_composite_extension (void);
 
+Time clutter_x11_get_current_event_time (void);
+
 G_END_DECLS
 
 #endif /* __CLUTTER_X11_H__ */