170 lines
6.9 KiB
Diff
170 lines
6.9 KiB
Diff
|
From 2aad56b949b86b4f1d0eab6d3d3b0d5491e8515b Mon Sep 17 00:00:00 2001
|
||
|
From: =?UTF-8?q?Jonas=20Dre=C3=9Fler?= <verdre@v0yd.nl>
|
||
|
Date: Sat, 5 Mar 2022 23:43:29 +0100
|
||
|
Subject: [PATCH 1/2] clutter: Pass target actor of events to event filter
|
||
|
functions
|
||
|
|
||
|
We'll need the additional context of which actor the event will be
|
||
|
emitted to in mutters event filter (see next commit), so pass that
|
||
|
target actor to the event filters that are installed.
|
||
|
|
||
|
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2321>
|
||
|
---
|
||
|
clutter/clutter/clutter-event-private.h | 3 ++-
|
||
|
clutter/clutter/clutter-event.c | 5 +++--
|
||
|
clutter/clutter/clutter-event.h | 2 ++
|
||
|
clutter/clutter/clutter-main.c | 12 +++++++++++-
|
||
|
clutter/clutter/clutter-stage.c | 6 +++---
|
||
|
src/core/events.c | 6 ++++--
|
||
|
6 files changed, 25 insertions(+), 9 deletions(-)
|
||
|
|
||
|
diff --git a/clutter/clutter/clutter-event-private.h b/clutter/clutter/clutter-event-private.h
|
||
|
index 011241ce18..69fdf24ed6 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 b1a5b6252f..0433a1ec98 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 5a8e3c116a..94595542cd 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 402ca65547..e066e5aebe 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 f34a424797..5cd09a2c44 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 8363d9a3d3..7dfd974563 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
|
||
|
--
|
||
|
2.35.1
|
||
|
|