From a20a0d7a4563366d2cd29c32a1b95a59121e7bf5 Mon Sep 17 00:00:00 2001 From: Daniel van Vugt Date: Fri, 2 Nov 2018 17:44:04 +0800 Subject: [PATCH] clutter-actor: Add detail to captured-event signal The detail allows handlers to distinguish between high volume cursor motion events and everything else. This allows (most) event handlers who don't care about cursor motion to not have their power/CPU usage impacted by it. Using minimal classification is important because it allows those handlers who do want to use this optimization via 'captured-event::nonmotion' to keep supporting multiple event types without requiring any logic changes. Any handler that does want cursor motion events and others should simply remain unmodified and keep using 'captured-event'. This helps with https://gitlab.gnome.org/GNOME/mutter/issues/283 --- clutter/clutter/clutter-actor.c | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/clutter/clutter/clutter-actor.c b/clutter/clutter/clutter-actor.c index 67766eb15d..3db8b5f72b 100644 --- a/clutter/clutter/clutter-actor.c +++ b/clutter/clutter/clutter-actor.c @@ -1112,6 +1112,8 @@ static void clutter_actor_pop_in_cloned_branch (ClutterActor *self, static GQuark quark_actor_layout_info = 0; static GQuark quark_actor_transform_info = 0; static GQuark quark_actor_animation_info = 0; +static GQuark quark_motion = 0; +static GQuark quark_nonmotion = 0; G_DEFINE_TYPE_WITH_CODE (ClutterActor, clutter_actor, @@ -6325,6 +6327,8 @@ clutter_actor_class_init (ClutterActorClass *klass) quark_actor_layout_info = g_quark_from_static_string ("-clutter-actor-layout-info"); quark_actor_transform_info = g_quark_from_static_string ("-clutter-actor-transform-info"); quark_actor_animation_info = g_quark_from_static_string ("-clutter-actor-animation-info"); + quark_motion = g_quark_from_static_string ("motion"); + quark_nonmotion = g_quark_from_static_string ("nonmotion"); object_class->constructor = clutter_actor_constructor; object_class->set_property = clutter_actor_set_property; @@ -8339,7 +8343,7 @@ clutter_actor_class_init (ClutterActorClass *klass) actor_signals[CAPTURED_EVENT] = g_signal_new (I_("captured-event"), G_TYPE_FROM_CLASS (object_class), - G_SIGNAL_RUN_LAST, + G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, G_STRUCT_OFFSET (ClutterActorClass, captured_event), _clutter_boolean_handled_accumulator, NULL, _clutter_marshal_BOOLEAN__BOXED, @@ -13887,8 +13891,17 @@ clutter_actor_event (ClutterActor *actor, if (capture) { - g_signal_emit (actor, actor_signals[CAPTURED_EVENT], 0, - event, + GQuark detail; + + if (event->type == CLUTTER_MOTION) + detail = quark_motion; + else + detail = quark_nonmotion; + + g_signal_emit (actor, + actor_signals[CAPTURED_EVENT], + detail, + event, &retval); goto out; } -- GitLab