summaryrefslogtreecommitdiff
path: root/clutter/clutter/clutter-stage.c
diff options
context:
space:
mode:
Diffstat (limited to 'clutter/clutter/clutter-stage.c')
-rw-r--r--clutter/clutter/clutter-stage.c49
1 files changed, 10 insertions, 39 deletions
diff --git a/clutter/clutter/clutter-stage.c b/clutter/clutter/clutter-stage.c
index 748d21790..3c1980b5a 100644
--- a/clutter/clutter/clutter-stage.c
+++ b/clutter/clutter/clutter-stage.c
@@ -910,58 +910,29 @@ GSList *
clutter_stage_find_updated_devices (ClutterStage *stage)
{
ClutterStagePrivate *priv = stage->priv;
- ClutterBackend *backend;
- ClutterSeat *seat;
GSList *updating = NULL;
- const GList *l, *devices;
- graphene_point_t point;
+ GHashTableIter iter;
+ gpointer value;
if (!priv->needs_update_devices)
return NULL;
priv->needs_update_devices = FALSE;
- backend = clutter_get_default_backend ();
- seat = clutter_backend_get_default_seat (backend);
- devices = clutter_seat_peek_devices (seat);
-
- for (l = devices; l; l = l->next)
+ g_hash_table_iter_init (&iter, priv->pointer_devices);
+ while (g_hash_table_iter_next (&iter, NULL, &value))
{
- ClutterInputDevice *dev = l->data;
+ PointerDeviceEntry *entry = value;
ClutterStageView *view;
const cairo_region_t *clip;
- if (clutter_input_device_get_device_mode (dev) !=
- CLUTTER_INPUT_MODE_LOGICAL)
+ view = clutter_stage_get_view_at (stage, entry->coords.x, entry->coords.y);
+ if (!view)
continue;
- switch (clutter_input_device_get_device_type (dev))
- {
- case CLUTTER_POINTER_DEVICE:
- case CLUTTER_TABLET_DEVICE:
- case CLUTTER_PEN_DEVICE:
- case CLUTTER_ERASER_DEVICE:
- case CLUTTER_CURSOR_DEVICE:
- if (!clutter_seat_query_state (seat, dev, NULL,
- &point, NULL))
- continue;
-
- view = clutter_stage_get_view_at (stage, point.x, point.y);
- if (!view)
- continue;
-
- clip = clutter_stage_view_peek_redraw_clip (view);
- if (!clip || cairo_region_contains_point (clip, point.x, point.y))
- updating = g_slist_prepend (updating, dev);
- break;
- default:
- /* Any other devices don't need checking, either because they
- * don't have x/y coordinates, or because they're implicitly
- * grabbed on an actor by default as it's the case of
- * touch(screens).
- */
- break;
- }
+ clip = clutter_stage_view_peek_redraw_clip (view);
+ if (!clip || cairo_region_contains_point (clip, entry->coords.x, entry->coords.y))
+ updating = g_slist_prepend (updating, entry->device);
}
return updating;