From 734a185915464d2da32b6b1251c8af9a631b0f8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20Dre=C3=9Fler?= Date: Thu, 11 Feb 2021 17:34:07 +0100 Subject: [PATCH] clutter: Only pick on motion or touch update events Aside from ENTER/LEAVE, there are only two kinds of events that can move the pointer, motion events and touch update events. Everything else keeps the pointer at it's current position. The reason we pick inside _clutter_process_event_details() is that we want to set the event actor. Now if an event can't move the pointer, it also can't change the event actor (well, it can subsequently by triggering changes to the scenegraph, but that's handled elsewhere), so there's no need to pick a new event actor when we get those events. Instead, simply reuse the actor that's already associated with the current input device as the event actor for non MOTION/TOUCH_UPDATE events. Events where a device or a touchpoint goes away (like DEVICE_REMOVED or TOUCH_END/CANCEL) also affect picking, they don't need a repick, but instead the actor associated with the device/touchpoint needs to be unassociated. This is ensured by invoking remove_device_for_event() on those events and will not be affected by this change. This should improve performance while scrolling quite a bit, since scroll events come in unthrottled and we now no longer do a repick on each one of those. Part-of: --- clutter/clutter/clutter-main.c | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/clutter/clutter/clutter-main.c b/clutter/clutter/clutter-main.c index 36bcd88e5..1d62d590c 100644 --- a/clutter/clutter/clutter-main.c +++ b/clutter/clutter/clutter-main.c @@ -1701,8 +1701,18 @@ _clutter_process_event_details (ClutterActor *stage, break; } - event->any.source = - update_device_for_event (CLUTTER_STAGE (stage), event, TRUE); + if (event->type == CLUTTER_MOTION) + { + event->any.source = + update_device_for_event (CLUTTER_STAGE (stage), event, TRUE); + } + else + { + event->any.source = + clutter_stage_get_device_actor (CLUTTER_STAGE (stage), + device, + NULL); + } if (event->any.source == NULL) break; @@ -1796,8 +1806,18 @@ _clutter_process_event_details (ClutterActor *stage, break; } - event->any.source = - update_device_for_event (CLUTTER_STAGE (stage), event, TRUE); + if (event->type == CLUTTER_TOUCH_UPDATE) + { + event->any.source = + update_device_for_event (CLUTTER_STAGE (stage), event, TRUE); + } + else + { + event->any.source = + clutter_stage_get_device_actor (CLUTTER_STAGE (stage), + device, + event->touch.sequence); + } if (event->any.source == NULL) break;