event: Add distance and angle accessors
Let's start using ClutterPoint in the API.
This commit is contained in:
parent
d021cc7c02
commit
695621f5ea
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user