summaryrefslogtreecommitdiff
path: root/clutter/clutter-main.c
diff options
context:
space:
mode:
authorEmmanuele Bassi <ebassi@gnome.org>2012-06-24 09:58:12 +0100
committerEmmanuele Bassi <ebassi@gnome.org>2012-07-11 13:22:19 +0100
commit9b7287e89783c867e731f2e24864aa172e968a5a (patch)
tree68d243299d34923bf8f23b67c0b53634146641dd /clutter/clutter-main.c
parent67cbb56ab8a4e3089fe72bc7591f2dfe410c7ae9 (diff)
downloadclutter-9b7287e89783c867e731f2e24864aa172e968a5a.tar.gz
actor: Move event chain emission into ClutterActor
By moving the function that builds the event emission chain we can avoid a bunch of checks and function calls.
Diffstat (limited to 'clutter/clutter-main.c')
-rw-r--r--clutter/clutter-main.c85
1 files changed, 29 insertions, 56 deletions
diff --git a/clutter/clutter-main.c b/clutter/clutter-main.c
index 450449918..8d546e7f4 100644
--- a/clutter/clutter-main.c
+++ b/clutter/clutter-main.c
@@ -97,7 +97,7 @@
#include <glib/gi18n-lib.h>
#include <locale.h>
-#include "clutter-actor.h"
+#include "clutter-actor-private.h"
#include "clutter-backend-private.h"
#include "clutter-config.h"
#include "clutter-debug.h"
@@ -2241,14 +2241,9 @@ event_click_count_generate (ClutterEvent *event)
}
static inline void
-emit_event (ClutterEvent *event,
- gboolean is_key_event)
+emit_event_chain (ClutterEvent *event)
{
- static gboolean lock = FALSE;
-
- GPtrArray *event_tree = NULL;
- ClutterActor *actor;
- gint i = 0;
+ static gboolean lock = FALSE;
if (event->any.source == NULL)
{
@@ -2265,42 +2260,7 @@ emit_event (ClutterEvent *event,
lock = TRUE;
- event_tree = g_ptr_array_sized_new (64);
-
- actor = event->any.source;
-
- /* Build 'tree' of emitters for the event */
- while (actor)
- {
- ClutterActor *parent;
-
- parent = clutter_actor_get_parent (actor);
-
- if (clutter_actor_get_reactive (actor) ||
- parent == NULL || /* stage gets all events */
- is_key_event) /* keyboard events are always emitted */
- {
- g_ptr_array_add (event_tree, g_object_ref (actor));
- }
-
- actor = parent;
- }
-
- /* Capture */
- for (i = event_tree->len - 1; i >= 0; i--)
- if (clutter_actor_event (g_ptr_array_index (event_tree, i), event, TRUE))
- goto done;
-
- /* Bubble */
- for (i = 0; i < event_tree->len; i++)
- if (clutter_actor_event (g_ptr_array_index (event_tree, i), event, FALSE))
- goto done;
-
-done:
- for (i = 0; i < event_tree->len; i++)
- g_object_unref (g_ptr_array_index (event_tree, i));
-
- g_ptr_array_free (event_tree, TRUE);
+ _clutter_actor_handle_event (event->any.source, event);
lock = FALSE;
}
@@ -2320,7 +2280,7 @@ emit_pointer_event (ClutterEvent *event,
(device == NULL || device->pointer_grab_actor == NULL))
{
/* no grab, time to capture and bubble */
- emit_event (event, FALSE);
+ emit_event_chain (event);
}
else
{
@@ -2341,19 +2301,23 @@ static inline void
emit_touch_event (ClutterEvent *event,
ClutterInputDevice *device)
{
- ClutterActor *grab_actor;
+ ClutterActor *grab_actor = NULL;
- if ((device->sequence_grab_actors != NULL) &&
- ((grab_actor = g_hash_table_lookup (device->sequence_grab_actors,
- event->touch.sequence)) != NULL))
+ if (device->sequence_grab_actors != NULL)
{
- /* sequence grab */
+ grab_actor = g_hash_table_lookup (device->sequence_grab_actors,
+ event->touch.sequence);
+ }
+
+ if (grab_actor != NULL)
+ {
+ /* per-device sequence grab */
clutter_actor_event (grab_actor, event, FALSE);
}
else
{
/* no grab, time to capture and bubble */
- emit_event (event, FALSE);
+ emit_event_chain (event);
}
}
@@ -2366,16 +2330,19 @@ emit_keyboard_event (ClutterEvent *event,
if (context->keyboard_grab_actor == NULL &&
(device == NULL || device->keyboard_grab_actor == NULL))
{
- emit_event (event, TRUE);
+ /* no grab, time to capture and bubble */
+ emit_event_chain (event);
}
else
{
if (context->keyboard_grab_actor != NULL)
{
+ /* global key grab */
clutter_actor_event (context->keyboard_grab_actor, event, FALSE);
}
else if (device != NULL && device->keyboard_grab_actor != NULL)
{
+ /* per-device key grab */
clutter_actor_event (context->keyboard_grab_actor, event, FALSE);
}
}
@@ -2725,14 +2692,20 @@ _clutter_process_event (ClutterEvent *event)
stage = CLUTTER_ACTOR (event->any.stage);
if (stage == NULL)
- return;
-
- CLUTTER_NOTE (EVENT, "Event received");
+ {
+ CLUTTER_NOTE (EVENT, "Discarding event withou a stage set");
+ return;
+ }
+ /* keep a pointer to the event and time, so that we don't need to
+ * add an event parameter to all signals that can be emitted within
+ * an event chain
+ */
context->last_event_time = clutter_event_get_time (event);
-
context->current_event = event;
+
_clutter_process_event_details (stage, context, event);
+
context->current_event = NULL;
}