From 8eb71af23d55bbc07dadd552369e10d405f7c670 Mon Sep 17 00:00:00 2001 From: Emmanuele Bassi Date: Mon, 3 Oct 2011 15:25:40 +0100 Subject: [PATCH] gdk/events: Clean up the event handling code We need debugging notes, to see what's happening when handling events. We need to queue a (clipped) redraw when receiving a GDK_EXPOSE event. We need to check the device (both master and source) of the event using the GdkEvent API, and pass them to the ClutterEvent using the corresponding Clutter API. --- clutter/gdk/clutter-event-gdk.c | 93 +++++++++++++++++++++++++++------- clutter/gdk/clutter-input-device-gdk.c | 2 +- 2 files changed, 75 insertions(+), 20 deletions(-) diff --git a/clutter/gdk/clutter-event-gdk.c b/clutter/gdk/clutter-event-gdk.c index 87cf8ff..540d7d4 100644 --- a/clutter/gdk/clutter-event-gdk.c +++ b/clutter/gdk/clutter-event-gdk.c @@ -31,10 +31,12 @@ #include "clutter-backend-gdk.h" #include "clutter-device-manager-gdk.h" -#include "clutter-debug.h" -#include "clutter-main.h" +#include "clutter-actor-private.h" #include "clutter-backend-private.h" +#include "clutter-debug.h" #include "clutter-event-private.h" +#include "clutter-main.h" +#include "clutter-paint-volume-private.h" #include "clutter-stage-private.h" #include @@ -87,6 +89,8 @@ clutter_gdk_handle_event (GdkEvent *gdk_event) ClutterEvent *event = NULL; gint spin = 0; GdkFilterReturn result = GDK_FILTER_CONTINUE; + ClutterInputDevice *device, *source_device; + GdkDevice *gdk_device; backend = clutter_get_default_backend (); if (!CLUTTER_IS_BACKEND_GDK (backend)) @@ -99,6 +103,20 @@ clutter_gdk_handle_event (GdkEvent *gdk_event) stage = clutter_gdk_get_stage_from_window (gdk_event->any.window); device_manager = clutter_device_manager_get_default (); + gdk_device = gdk_event_get_device (gdk_event); + if (gdk_device != NULL) + device = _clutter_device_manager_gdk_lookup_device (device_manager, + gdk_device); + else + device = NULL; + + gdk_device = gdk_event_get_source_device (gdk_event); + if (gdk_device != NULL) + source_device = _clutter_device_manager_gdk_lookup_device (device_manager, + gdk_device); + else + source_device = NULL; + if (stage == NULL) return GDK_FILTER_CONTINUE; @@ -115,7 +133,32 @@ clutter_gdk_handle_event (GdkEvent *gdk_event) break; case GDK_EXPOSE: - clutter_redraw (stage); + { + ClutterPaintVolume clip; + ClutterVertex origin; + + CLUTTER_NOTE (EVENT, "Expose for stage '%s' [%p] { %d, %d - %d x %d }", + _clutter_actor_get_debug_name (CLUTTER_ACTOR (stage)), + stage, + gdk_event->expose.area.x, + gdk_event->expose.area.y, + gdk_event->expose.area.width, + gdk_event->expose.area.height); + + origin.x = gdk_event->expose.area.x; + origin.y = gdk_event->expose.area.y; + origin.z = 0; + + _clutter_paint_volume_init_static (&clip, CLUTTER_ACTOR (stage)); + + clutter_paint_volume_set_origin (&clip, &origin); + clutter_paint_volume_set_width (&clip, gdk_event->expose.area.width); + clutter_paint_volume_set_height (&clip, gdk_event->expose.area.height); + + _clutter_actor_queue_redraw_with_clip (CLUTTER_ACTOR (stage), 0, &clip); + + clutter_paint_volume_free (&clip); + } break; case GDK_DAMAGE: @@ -130,9 +173,11 @@ clutter_gdk_handle_event (GdkEvent *gdk_event) event->motion.axes = NULL; /* It's all X in the end, right? */ event->motion.modifier_state = gdk_event->motion.state; - event->motion.device = - _clutter_device_manager_gdk_lookup_device (device_manager, - gdk_event->motion.device); + clutter_event_set_device (event, device); + clutter_event_set_source_device (event, source_device); + CLUTTER_NOTE (EVENT, "Motion notifiy [%.2f, %.2f]", + event->motion.x, + event->motion.y); break; case GDK_BUTTON_PRESS: @@ -147,9 +192,13 @@ clutter_gdk_handle_event (GdkEvent *gdk_event) event->button.modifier_state = gdk_event->button.state; event->button.button = gdk_event->button.button; event->button.click_count = 1; - event->button.device = - _clutter_device_manager_gdk_lookup_device (device_manager, - gdk_event->button.device); + clutter_event_set_device (event, device); + clutter_event_set_source_device (event, source_device); + CLUTTER_NOTE (EVENT, "Button %d %s [%.2f, %.2f]", + event->button.button, + event->type == CLUTTER_BUTTON_PRESS ? "press" : "release", + event->button.x, + event->button.y); break; case GDK_2BUTTON_PRESS: @@ -167,6 +216,11 @@ clutter_gdk_handle_event (GdkEvent *gdk_event) event->key.keyval = gdk_event->key.keyval; event->key.hardware_keycode = gdk_event->key.hardware_keycode; event->key.unicode_value = g_utf8_get_char (gdk_event->key.string); + clutter_event_set_device (event, device); + clutter_event_set_source_device (event, source_device); + CLUTTER_NOTE (EVENT, "Key %d %s", + event->key.keyval, + event->type == CLUTTER_KEY_PRESS ? "press" : "release"); break; case GDK_ENTER_NOTIFY: @@ -175,19 +229,21 @@ clutter_gdk_handle_event (GdkEvent *gdk_event) CLUTTER_ENTER : CLUTTER_LEAVE); event->crossing.source = CLUTTER_ACTOR (stage); - event->crossing.time = gdk_event->crossing.time; + event->crossing.time = gdk_event_get_time (gdk_event); event->crossing.x = gdk_event->crossing.x; event->crossing.y = gdk_event->crossing.y; /* XXX: no better fallback here? */ - event->crossing.device = - clutter_device_manager_get_core_device (device_manager, - CLUTTER_POINTER_DEVICE); - + clutter_event_set_device (event, device); + clutter_event_set_source_device (event, source_device); if (gdk_event->type == GDK_ENTER_NOTIFY) - _clutter_stage_add_device (stage, event->crossing.device); + _clutter_stage_add_device (stage, clutter_event_get_device (event)); else - _clutter_stage_remove_device (stage, event->crossing.device); + _clutter_stage_remove_device (stage, clutter_event_get_device (event)); + CLUTTER_NOTE (EVENT, "Crossing %s [%.2f, %.2f]", + event->type == CLUTTER_ENTER ? "enter" : "leave", + event->crossing.x, + event->crossing.y); break; case GDK_FOCUS_CHANGE: @@ -223,9 +279,8 @@ clutter_gdk_handle_event (GdkEvent *gdk_event) event->scroll.modifier_state = gdk_event->scroll.state; event->scroll.axes = NULL; event->scroll.direction = gdk_event->scroll.direction; - event->scroll.device = - _clutter_device_manager_gdk_lookup_device (device_manager, - gdk_event->scroll.device); + clutter_event_set_device (event, device); + clutter_event_set_source_device (event, source_device); break; case GDK_WINDOW_STATE: diff --git a/clutter/gdk/clutter-input-device-gdk.c b/clutter/gdk/clutter-input-device-gdk.c index 9d37dbc..44150ff 100644 --- a/clutter/gdk/clutter-input-device-gdk.c +++ b/clutter/gdk/clutter-input-device-gdk.c @@ -141,8 +141,8 @@ _clutter_input_device_gdk_new (ClutterDeviceManager *manager, } if (device_type != CLUTTER_KEYBOARD_DEVICE) - /* why Gdk asserts if passed a GDK_SOURCE_KEYBOARD device? */ has_cursor = gdk_device_get_has_cursor (device); + name = gdk_device_get_name (device); clutter_device = g_object_new (CLUTTER_TYPE_INPUT_DEVICE_GDK, -- 2.7.4