Move all picking-related operations inside InputDevice

The InputDevice objects stores pointer coordinates, state, stage and
the actor under the cursor, so if the current backend provides us with
one attached to the Event structure then we want the InputDevice itself
to update its state and give us the ClutterActor underneath the
pointer's cursor.
This commit is contained in:
Emmanuele Bassi
2010-01-08 17:51:00 +00:00
parent 1f87cac069
commit 9506510d1c
9 changed files with 225 additions and 100 deletions

View File

@ -110,13 +110,13 @@ clutter_input_device_init (ClutterInputDevice *self)
void
_clutter_input_device_set_coords (ClutterInputDevice *device,
gfloat x,
gfloat y)
gint x,
gint y)
{
g_return_if_fail (CLUTTER_IS_INPUT_DEVICE (device));
device->previous_x = floorf (x) + 0.5;
device->previous_y = floorf (y) + 0.5;
device->previous_x = x;
device->previous_y = y;
}
void
@ -137,6 +137,45 @@ _clutter_input_device_set_time (ClutterInputDevice *device,
device->previous_time = time_;
}
void
_clutter_input_device_set_stage (ClutterInputDevice *device,
ClutterStage *stage)
{
g_return_if_fail (CLUTTER_IS_INPUT_DEVICE (device));
device->stage = stage;
}
static void
cursor_weak_unref (gpointer user_data,
GObject *object_pointer)
{
ClutterInputDevice *device = user_data;
device->cursor_actor = NULL;
}
void
_clutter_input_device_set_actor (ClutterInputDevice *device,
ClutterActor *actor)
{
g_return_if_fail (CLUTTER_IS_INPUT_DEVICE (device));
if (device->cursor_actor != NULL)
{
_clutter_actor_set_has_pointer (device->cursor_actor, FALSE);
g_object_weak_unref (G_OBJECT (device->cursor_actor),
cursor_weak_unref,
device);
}
device->cursor_actor = actor;
g_object_weak_ref (G_OBJECT (device->cursor_actor),
cursor_weak_unref,
device);
_clutter_actor_set_has_pointer (device->cursor_actor, TRUE);
}
/**
* clutter_input_device_get_device_type:
* @device: a #ClutterInputDevice
@ -173,3 +212,47 @@ clutter_input_device_get_device_id (ClutterInputDevice *device)
return device->id;
}
void
clutter_input_device_get_device_coords (ClutterInputDevice *device,
gint *x,
gint *y)
{
g_return_if_fail (CLUTTER_IS_INPUT_DEVICE (device));
if (x)
*x = device->previous_x;
if (y)
*y = device->previous_y;
}
ClutterActor *
_clutter_input_device_update (ClutterInputDevice *device)
{
ClutterStage *stage;
ClutterActor *new_cursor_actor;
ClutterActor *old_cursor_actor;
gint x, y;
clutter_input_device_get_device_coords (device, &x, &y);
stage = device->stage;
old_cursor_actor = device->cursor_actor;
new_cursor_actor = _clutter_do_pick (stage, x, y, CLUTTER_PICK_REACTIVE);
if (new_cursor_actor == NULL)
new_cursor_actor = CLUTTER_ACTOR (stage);
CLUTTER_NOTE (EVENT,
"Actor under cursor (device %d, at %d, %d): %s",
clutter_input_device_get_device_id (device),
x, y,
clutter_actor_get_name (new_cursor_actor) != NULL
? clutter_actor_get_name (new_cursor_actor)
: G_OBJECT_TYPE_NAME (new_cursor_actor));
_clutter_input_device_set_actor (device, new_cursor_actor);
return device->cursor_actor;
}