diff --git a/clutter/clutter/clutter-event-private.h b/clutter/clutter/clutter-event-private.h index 011241ce1..69fdf24ed 100644 --- a/clutter/clutter/clutter-event-private.h +++ b/clutter/clutter/clutter-event-private.h @@ -14,7 +14,8 @@ CLUTTER_EXPORT void _clutter_process_event (ClutterEvent *event); CLUTTER_EXPORT -gboolean _clutter_event_process_filters (ClutterEvent *event); +gboolean _clutter_event_process_filters (ClutterEvent *event, + ClutterActor *event_actor); /* clears the event queue inside the main context */ void _clutter_clear_events_queue (void); diff --git a/clutter/clutter/clutter-event.c b/clutter/clutter/clutter-event.c index b1a5b6252..0433a1ec9 100644 --- a/clutter/clutter/clutter-event.c +++ b/clutter/clutter/clutter-event.c @@ -1772,7 +1772,8 @@ clutter_event_is_pointer_emulated (const ClutterEvent *event) } gboolean -_clutter_event_process_filters (ClutterEvent *event) +_clutter_event_process_filters (ClutterEvent *event, + ClutterActor *event_actor) { ClutterMainContext *context = _clutter_context_get_default (); GList *l, *next; @@ -1789,7 +1790,7 @@ _clutter_event_process_filters (ClutterEvent *event) if (event_filter->stage && event_filter->stage != event->any.stage) continue; - if (event_filter->func (event, event_filter->user_data) == CLUTTER_EVENT_STOP) + if (event_filter->func (event, event_actor, event_filter->user_data) == CLUTTER_EVENT_STOP) return CLUTTER_EVENT_STOP; } diff --git a/clutter/clutter/clutter-event.h b/clutter/clutter/clutter-event.h index 5a8e3c116..94595542c 100644 --- a/clutter/clutter/clutter-event.h +++ b/clutter/clutter/clutter-event.h @@ -615,6 +615,7 @@ union _ClutterEvent /** * ClutterEventFilterFunc: * @event: the event that is going to be emitted + * @event_actor: the current device actor of the events device * @user_data: the data pointer passed to clutter_event_add_filter() * * A function pointer type used by event filters that are added with @@ -628,6 +629,7 @@ union _ClutterEvent * Since: 1.18 */ typedef gboolean (* ClutterEventFilterFunc) (const ClutterEvent *event, + ClutterActor *event_actor, gpointer user_data); CLUTTER_EXPORT diff --git a/clutter/clutter/clutter-main.c b/clutter/clutter/clutter-main.c index 402ca6554..e066e5aeb 100644 --- a/clutter/clutter/clutter-main.c +++ b/clutter/clutter/clutter-main.c @@ -741,6 +741,8 @@ update_device_for_event (ClutterStage *stage, void clutter_do_event (ClutterEvent *event) { + ClutterActor *event_actor = NULL; + /* we need the stage for the event */ if (event->any.stage == NULL) { @@ -765,7 +767,15 @@ clutter_do_event (ClutterEvent *event) break; } - if (_clutter_event_process_filters (event)) + if (event->any.type != CLUTTER_DEVICE_ADDED && + event->any.type != CLUTTER_DEVICE_REMOVED && + event->any.type != CLUTTER_NOTHING && + event->any.type != CLUTTER_EVENT_LAST) + { + event_actor = clutter_stage_get_event_actor (event->any.stage, event); + } + + if (_clutter_event_process_filters (event, event_actor)) return; /* Instead of processing events when received, we queue them up to diff --git a/clutter/clutter/clutter-stage.c b/clutter/clutter/clutter-stage.c index f34a42479..5cd09a2c4 100644 --- a/clutter/clutter/clutter-stage.c +++ b/clutter/clutter/clutter-stage.c @@ -3478,7 +3478,7 @@ clutter_stage_update_device (ClutterStage *stage, CLUTTER_EVENT_NONE, old_actor, new_actor, point, time_ms); - if (!_clutter_event_process_filters (event)) + if (!_clutter_event_process_filters (event, old_actor)) _clutter_actor_handle_event (old_actor, root, event); clutter_event_free (event); @@ -3492,7 +3492,7 @@ clutter_stage_update_device (ClutterStage *stage, CLUTTER_EVENT_NONE, new_actor, old_actor, point, time_ms); - if (!_clutter_event_process_filters (event)) + if (!_clutter_event_process_filters (event, new_actor)) _clutter_actor_handle_event (new_actor, root, event); clutter_event_free (event); @@ -3676,7 +3676,7 @@ clutter_stage_notify_grab_on_pointer_entry (ClutterStage *stage, grab_actor : old_grab_actor, entry->coords, CLUTTER_CURRENT_TIME); - if (!_clutter_event_process_filters (event)) + if (!_clutter_event_process_filters (event, entry->current_actor)) _clutter_actor_handle_event (deepmost, topmost, event); clutter_event_free (event); } diff --git a/src/core/events.c b/src/core/events.c index 8363d9a3d..7dfd97456 100644 --- a/src/core/events.c +++ b/src/core/events.c @@ -213,7 +213,8 @@ maybe_unfreeze_pointer_events (MetaBackend *backend, static gboolean meta_display_handle_event (MetaDisplay *display, - const ClutterEvent *event) + const ClutterEvent *event, + ClutterActor *event_actor) { MetaBackend *backend = meta_get_backend (); MetaWindow *window = NULL; @@ -540,11 +541,12 @@ meta_display_handle_event (MetaDisplay *display, static gboolean event_callback (const ClutterEvent *event, + ClutterActor *event_actor, gpointer data) { MetaDisplay *display = data; - return meta_display_handle_event (display, event); + return meta_display_handle_event (display, event, event_actor); } void