[clutter/master-next: 11/43] event: Add distance and angle accessors
- From: Emmanuele Bassi <ebassi src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [clutter/master-next: 11/43] event: Add distance and angle accessors
- Date: Fri, 20 Apr 2012 17:31:15 +0000 (UTC)
commit b90ac03535b09df52c545968146c2b177985c98e
Author: Emmanuele Bassi <ebassi linux intel com>
Date: Thu Apr 19 12:16:54 2012 +0100
event: Add distance and angle accessors
Let's start using ClutterPoint in the API.
clutter/clutter-event.c | 115 ++++++++++++++++++++++++++++++++++++++++-------
clutter/clutter-event.h | 9 ++++
clutter/clutter.symbols | 7 ++-
3 files changed, 112 insertions(+), 19 deletions(-)
---
diff --git a/clutter/clutter-event.c b/clutter/clutter-event.c
index fb5587e..c878b5e 100644
--- a/clutter/clutter-event.c
+++ b/clutter/clutter-event.c
@@ -33,6 +33,8 @@
#include "clutter-keysyms.h"
#include "clutter-private.h"
+#include <math.h>
+
/**
* SECTION:clutter-event
* @short_description: User and window system events
@@ -278,11 +280,34 @@ clutter_event_get_coords (const ClutterEvent *event,
gfloat *x,
gfloat *y)
{
- gfloat event_x, event_y;
+ ClutterPoint coords;
g_return_if_fail (event != NULL);
- event_x = event_y = 0;
+ clutter_event_get_position (event, &coords);
+
+ if (x != NULL)
+ *x = coords.x;
+
+ if (y != NULL)
+ *y = coords.y;
+}
+
+/**
+ * clutter_event_get_position:
+ * @event: a #ClutterEvent
+ * @position: a #ClutterPoint
+ *
+ * Retrieves the event coordinates as a #ClutterPoint.
+ *
+ * Since: 1.12
+ */
+void
+clutter_event_get_position (const ClutterEvent *event,
+ ClutterPoint *position)
+{
+ g_return_if_fail (event != NULL);
+ g_return_if_fail (position != NULL);
switch (event->type)
{
@@ -294,44 +319,35 @@ clutter_event_get_coords (const ClutterEvent *event,
case CLUTTER_CLIENT_MESSAGE:
case CLUTTER_DELETE:
case CLUTTER_EVENT_LAST:
+ clutter_point_init (position, 0.f, 0.f);
break;
case CLUTTER_ENTER:
case CLUTTER_LEAVE:
- event_x = event->crossing.x;
- event_y = event->crossing.y;
+ clutter_point_init (position, event->crossing.x, event->crossing.y);
break;
case CLUTTER_BUTTON_PRESS:
case CLUTTER_BUTTON_RELEASE:
- event_x = event->button.x;
- event_y = event->button.y;
+ clutter_point_init (position, event->button.x, event->button.y);
break;
case CLUTTER_MOTION:
- event_x = event->motion.x;
- event_y = event->motion.y;
+ clutter_point_init (position, event->motion.x, event->motion.y);
break;
case CLUTTER_TOUCH_BEGIN:
case CLUTTER_TOUCH_UPDATE:
case CLUTTER_TOUCH_END:
case CLUTTER_TOUCH_CANCEL:
- event_x = event->touch.x;
- event_y = event->touch.y;
+ clutter_point_init (position, event->touch.x, event->touch.y);
break;
case CLUTTER_SCROLL:
- event_x = event->scroll.x;
- event_y = event->scroll.y;
+ clutter_point_init (position, event->scroll.x, event->scroll.y);
break;
}
- if (x)
- *x = event_x;
-
- if (y)
- *y = event_y;
}
/**
@@ -1513,3 +1529,68 @@ clutter_event_get_axes (const ClutterEvent *event,
return retval;
}
+
+/**
+ * clutter_event_get_distance:
+ * @source: a #ClutterEvent
+ * @target: a #ClutterEvent
+ *
+ * Retrieves the distance between two events, a @source and a @target.
+ *
+ * Return value: the distance between two #ClutterEvent
+ *
+ * Since: 1.12
+ */
+float
+clutter_event_get_distance (const ClutterEvent *source,
+ const ClutterEvent *target)
+{
+ ClutterPoint p0, p1;
+
+ clutter_event_get_position (source, &p0);
+ clutter_event_get_position (source, &p1);
+
+ return clutter_point_distance (&p0, &p1, NULL, NULL);
+}
+
+/**
+ * clutter_event_get_angle:
+ * @source: a #ClutterEvent
+ * @target: a #ClutterEvent
+ *
+ * Retrieves the angle relative from @source to @target.
+ *
+ * The direction of the angle is from the position X axis towards
+ * the positive Y axis.
+ *
+ * Return value: the angle between two #ClutterEvent
+ *
+ * Since: 1.12
+ */
+double
+clutter_event_get_angle (const ClutterEvent *source,
+ const ClutterEvent *target)
+{
+ ClutterPoint p0, p1;
+ float x_distance, y_distance;
+ double angle;
+
+ clutter_event_get_position (source, &p0);
+ clutter_event_get_position (target, &p1);
+
+ if (clutter_point_equals (&p0, &p1))
+ return 0;
+
+ clutter_point_distance (&p0, &p1, &x_distance, &y_distance);
+
+ angle = atan2 (x_distance, y_distance);
+
+ /* invert the angle, and shift it by 90 degrees */
+ angle = (2.0 * G_PI) - angle;
+ angle += G_PI / 2.0;
+
+ /* keep the angle within the [ 0, 360 ] interval */
+ angle = fmod (angle, 2.0 * G_PI);
+
+ return angle;
+}
diff --git a/clutter/clutter-event.h b/clutter/clutter-event.h
index cb96257..b56da54 100644
--- a/clutter/clutter-event.h
+++ b/clutter/clutter-event.h
@@ -445,6 +445,15 @@ void clutter_event_set_coords (ClutterEvent
void clutter_event_get_coords (const ClutterEvent *event,
gfloat *x,
gfloat *y);
+CLUTTER_AVAILABLE_IN_1_12
+void clutter_event_get_position (const ClutterEvent *event,
+ ClutterPoint *position);
+CLUTTER_AVAILABLE_IN_1_12
+float clutter_event_get_distance (const ClutterEvent *source,
+ const ClutterEvent *target);
+CLUTTER_AVAILABLE_IN_1_12
+double clutter_event_get_angle (const ClutterEvent *source,
+ const ClutterEvent *target);
gdouble * clutter_event_get_axes (const ClutterEvent *event,
guint *n_axes);
diff --git a/clutter/clutter.symbols b/clutter/clutter.symbols
index 14f9937..2349829 100644
--- a/clutter/clutter.symbols
+++ b/clutter/clutter.symbols
@@ -619,6 +619,8 @@ clutter_effect_queue_repaint
clutter_events_pending
clutter_event_copy
clutter_event_flags_get_type
+clutter_event_free
+clutter_event_get_angle
clutter_event_get_axes
clutter_event_get_button
clutter_event_get_click_count
@@ -626,13 +628,13 @@ clutter_event_get_coords
clutter_event_get_device
clutter_event_get_device_id
clutter_event_get_device_type
+clutter_event_get_distance
clutter_event_get_event_sequence
clutter_event_get_flags
-clutter_event_free
-clutter_event_get
clutter_event_get_key_code
clutter_event_get_key_symbol
clutter_event_get_key_unicode
+clutter_event_get_position
clutter_event_get_related
clutter_event_get_scroll_delta
clutter_event_get_scroll_direction
@@ -642,6 +644,7 @@ clutter_event_get_stage
clutter_event_get_state
clutter_event_get_type
clutter_event_get_time
+clutter_event_get
clutter_event_new
clutter_event_peek
clutter_event_put
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]