From d4457d1f7fbc1decaf413ee1446b1c560037c39d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20Dre=C3=9Fler?= Date: Fri, 29 May 2020 22:41:05 +0200 Subject: [PATCH 1/7] clutter/seat: Fix a typo in an introspection doc Make sure that function is actually skipped, gobject-introspection should probably complain about that function which can't be found. https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1275 --- clutter/clutter/clutter-seat.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/clutter/clutter/clutter-seat.c b/clutter/clutter/clutter-seat.c index d0852fa44ba..a641aae9929 100644 --- a/clutter/clutter/clutter-seat.c +++ b/clutter/clutter/clutter-seat.c @@ -634,8 +634,8 @@ clutter_seat_create_virtual_device (ClutterSeat *seat, } /** - * clutter_seat_supported_virtual_device_types: (skip) - */ + * clutter_seat_get_supported_virtual_device_types: (skip) + **/ ClutterVirtualDeviceType clutter_seat_get_supported_virtual_device_types (ClutterSeat *seat) { -- GitLab From 45c14f74b4521b47519fd3de950219dc26186fe0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20Dre=C3=9Fler?= Date: Tue, 3 Mar 2020 10:47:25 +0100 Subject: [PATCH 2/7] clutter/seat: Add private method to peek list of input devices Add a method to ClutterSeat that allows peeking the list of input devices and allow looping through devices a bit faster. The API left is private so we can make use of peeking the GList internally, but don't have to expose any details to the outside, which means we'd have to eventually stick with a GList forever to avoid breaking API. Since we now have the peek_devices() API internally, we can implement ClutterSeats public list_devices() API using g_list_copy() on the list returned by peek_devices(). https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1275 --- clutter/clutter/clutter-seat.c | 13 ++++++++++++- clutter/clutter/clutter-seat.h | 3 ++- src/backends/native/meta-seat-native.c | 13 ++++--------- src/backends/x11/meta-seat-x11.c | 12 ++++-------- 4 files changed, 22 insertions(+), 19 deletions(-) diff --git a/clutter/clutter/clutter-seat.c b/clutter/clutter/clutter-seat.c index a641aae9929..73672bd3611 100644 --- a/clutter/clutter/clutter-seat.c +++ b/clutter/clutter/clutter-seat.c @@ -354,6 +354,17 @@ clutter_seat_get_keyboard (ClutterSeat *seat) return CLUTTER_SEAT_GET_CLASS (seat)->get_keyboard (seat); } +/** + * clutter_seat_peek_devices: (skip) + **/ +const GList * +clutter_seat_peek_devices (ClutterSeat *seat) +{ + g_return_val_if_fail (CLUTTER_IS_SEAT (seat), NULL); + + return CLUTTER_SEAT_GET_CLASS (seat)->peek_devices (seat); +} + /** * clutter_seat_list_devices: * @seat: a #ClutterSeat @@ -370,7 +381,7 @@ clutter_seat_list_devices (ClutterSeat *seat) { g_return_val_if_fail (CLUTTER_IS_SEAT (seat), NULL); - return CLUTTER_SEAT_GET_CLASS (seat)->list_devices (seat); + return g_list_copy ((GList *)clutter_seat_peek_devices (seat)); } void diff --git a/clutter/clutter/clutter-seat.h b/clutter/clutter/clutter-seat.h index e12965e00ff..7818647af50 100644 --- a/clutter/clutter/clutter-seat.h +++ b/clutter/clutter/clutter-seat.h @@ -96,7 +96,7 @@ struct _ClutterSeatClass ClutterInputDevice * (* get_pointer) (ClutterSeat *seat); ClutterInputDevice * (* get_keyboard) (ClutterSeat *seat); - GList * (* list_devices) (ClutterSeat *seat); + const GList * (* peek_devices) (ClutterSeat *seat); void (* bell_notify) (ClutterSeat *seat); @@ -133,6 +133,7 @@ CLUTTER_EXPORT ClutterInputDevice * clutter_seat_get_keyboard (ClutterSeat *seat); CLUTTER_EXPORT GList * clutter_seat_list_devices (ClutterSeat *seat); +const GList * clutter_seat_peek_devices (ClutterSeat *seat); CLUTTER_EXPORT void clutter_seat_bell_notify (ClutterSeat *seat); diff --git a/src/backends/native/meta-seat-native.c b/src/backends/native/meta-seat-native.c index ecff929bd8f..fa984fd1b30 100644 --- a/src/backends/native/meta-seat-native.c +++ b/src/backends/native/meta-seat-native.c @@ -2636,17 +2636,12 @@ meta_seat_native_get_keyboard (ClutterSeat *seat) return seat_native->core_keyboard; } -static GList * -meta_seat_native_list_devices (ClutterSeat *seat) +static const GList * +meta_seat_native_peek_devices (ClutterSeat *seat) { MetaSeatNative *seat_native = META_SEAT_NATIVE (seat); - GList *devices = NULL; - GSList *l; - - for (l = seat_native->devices; l; l = l->next) - devices = g_list_prepend (devices, l->data); - return devices; + return (const GList *) seat_native->devices; } static void @@ -2771,7 +2766,7 @@ meta_seat_native_class_init (MetaSeatNativeClass *klass) seat_class->get_pointer = meta_seat_native_get_pointer; seat_class->get_keyboard = meta_seat_native_get_keyboard; - seat_class->list_devices = meta_seat_native_list_devices; + seat_class->peek_devices = meta_seat_native_peek_devices; seat_class->bell_notify = meta_seat_native_bell_notify; seat_class->get_keymap = meta_seat_native_get_keymap; seat_class->copy_event_data = meta_seat_native_copy_event_data; diff --git a/src/backends/x11/meta-seat-x11.c b/src/backends/x11/meta-seat-x11.c index f20cac1481d..1a29bbbac73 100644 --- a/src/backends/x11/meta-seat-x11.c +++ b/src/backends/x11/meta-seat-x11.c @@ -1471,16 +1471,12 @@ meta_seat_x11_get_keyboard (ClutterSeat *seat) return seat_x11->core_keyboard; } -static GList * -meta_seat_x11_list_devices (ClutterSeat *seat) +static const GList * +meta_seat_x11_peek_devices (ClutterSeat *seat) { MetaSeatX11 *seat_x11 = META_SEAT_X11 (seat); - GList *retval = NULL, *l; - for (l = seat_x11->devices; l; l = l->next) - retval = g_list_prepend (retval, l->data); - - return retval; + return (const GList *) seat_x11->devices; } static void @@ -1565,7 +1561,7 @@ meta_seat_x11_class_init (MetaSeatX11Class *klass) seat_class->get_pointer = meta_seat_x11_get_pointer; seat_class->get_keyboard = meta_seat_x11_get_keyboard; - seat_class->list_devices = meta_seat_x11_list_devices; + seat_class->peek_devices = meta_seat_x11_peek_devices; seat_class->bell_notify = meta_seat_x11_bell_notify; seat_class->get_keymap = meta_seat_x11_get_keymap; seat_class->copy_event_data = meta_seat_x11_copy_event_data; -- GitLab From 8de91f1053d3584b6cd1df513837cc7ecec67b01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20Dre=C3=9Fler?= Date: Fri, 29 May 2020 22:47:00 +0200 Subject: [PATCH 3/7] clutter/stage: Switch to clutter_seat_peek_devices() Switch from clutter_seat_list_devices() to the new peek_devices() method of ClutterSeat in cases where we're only looping through the returned list without manipulating it. This way we don't have to unnecessarily copy around the list of devices. https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1275 --- clutter/clutter/clutter-stage.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/clutter/clutter/clutter-stage.c b/clutter/clutter/clutter-stage.c index fd40393e2e8..425980ab8a3 100644 --- a/clutter/clutter/clutter-stage.c +++ b/clutter/clutter/clutter-stage.c @@ -1409,12 +1409,12 @@ _clutter_stage_check_updated_pointers (ClutterStage *stage) ClutterBackend *backend; ClutterSeat *seat; GSList *updating = NULL; - GList *l, *devices; + const GList *l, *devices; graphene_point_t point; backend = clutter_get_default_backend (); seat = clutter_backend_get_default_seat (backend); - devices = clutter_seat_list_devices (seat); + devices = clutter_seat_peek_devices (seat); for (l = devices; l; l = l->next) { @@ -1454,8 +1454,6 @@ _clutter_stage_check_updated_pointers (ClutterStage *stage) } } - g_list_free (devices); - return updating; } -- GitLab From 7539de2320b930b6b57ecbfdfd5b004f2066d4f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20Dre=C3=9Fler?= Date: Tue, 3 Mar 2020 12:02:29 +0100 Subject: [PATCH 4/7] clutter/input-device: Make clutter_input_device_get_actor() public Make the clutter_input_device_get_actor() API public and remove clutter_input_device_get_pointer_actor() in favour of the new function. This allows also getting the "pointer" actor for a given touch sequence, not only for real pointer input devices like mice. https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1275 --- clutter/clutter/clutter-input-device.c | 43 ++++++++++++-------------- clutter/clutter/clutter-input-device.h | 3 +- src/core/window.c | 2 +- src/wayland/meta-wayland-pointer.c | 2 +- 4 files changed, 24 insertions(+), 26 deletions(-) diff --git a/clutter/clutter/clutter-input-device.c b/clutter/clutter/clutter-input-device.c index e7b5bff967d..11e717ba91f 100644 --- a/clutter/clutter/clutter-input-device.c +++ b/clutter/clutter/clutter-input-device.c @@ -692,20 +692,6 @@ _clutter_input_device_free_touch_info (gpointer data) g_slice_free (ClutterTouchInfo, data); } -static ClutterActor * -_clutter_input_device_get_actor (ClutterInputDevice *device, - ClutterEventSequence *sequence) -{ - ClutterTouchInfo *info; - - if (sequence == NULL) - return device->cursor_actor; - - info = g_hash_table_lookup (device->touch_sequences_info, sequence); - - return info->actor; -} - static void _clutter_input_device_associate_actor (ClutterInputDevice *device, ClutterEventSequence *sequence, @@ -815,7 +801,7 @@ _clutter_input_device_set_actor (ClutterInputDevice *device, ClutterActor *actor, gboolean emit_crossing) { - ClutterActor *old_actor = _clutter_input_device_get_actor (device, sequence); + ClutterActor *old_actor = clutter_input_device_get_actor (device, sequence); if (old_actor == actor) return; @@ -850,7 +836,7 @@ _clutter_input_device_set_actor (ClutterInputDevice *device, } /* processing the event might have destroyed the actor */ - tmp_old_actor = _clutter_input_device_get_actor (device, sequence); + tmp_old_actor = clutter_input_device_get_actor (device, sequence); _clutter_input_device_unassociate_actor (device, old_actor, tmp_old_actor == NULL); @@ -1054,7 +1040,7 @@ clutter_input_device_update (ClutterInputDevice *device, clutter_input_device_get_coords (device, sequence, &point); - old_cursor_actor = _clutter_input_device_get_actor (device, sequence); + old_cursor_actor = clutter_input_device_get_actor (device, sequence); new_cursor_actor = _clutter_stage_do_pick (stage, point.x, point.y, CLUTTER_PICK_REACTIVE); @@ -1085,22 +1071,33 @@ clutter_input_device_update (ClutterInputDevice *device, } /** - * clutter_input_device_get_pointer_actor: - * @device: a #ClutterInputDevice of type %CLUTTER_POINTER_DEVICE + * clutter_input_device_get_actor: + * @device: a #ClutterInputDevice + * @sequence: (allow-none): an optional #ClutterEventSequence * - * Retrieves the #ClutterActor underneath the pointer of @device + * Retrieves the #ClutterActor underneath the pointer or touchpoint + * of @device and @sequence. * * Return value: (transfer none): a pointer to the #ClutterActor or %NULL * * Since: 1.2 */ ClutterActor * -clutter_input_device_get_pointer_actor (ClutterInputDevice *device) +clutter_input_device_get_actor (ClutterInputDevice *device, + ClutterEventSequence *sequence) { + ClutterTouchInfo *info; + g_return_val_if_fail (CLUTTER_IS_INPUT_DEVICE (device), NULL); - g_return_val_if_fail (device->device_type == CLUTTER_POINTER_DEVICE, NULL); - return device->cursor_actor; + if (sequence == NULL) + return device->cursor_actor; + + info = g_hash_table_lookup (device->touch_sequences_info, sequence); + + g_return_val_if_fail (info != NULL, NULL); + + return info->actor; } /** diff --git a/clutter/clutter/clutter-input-device.h b/clutter/clutter/clutter-input-device.h index 68b74ced8aa..889cf727a4a 100644 --- a/clutter/clutter/clutter-input-device.h +++ b/clutter/clutter/clutter-input-device.h @@ -92,7 +92,8 @@ gboolean clutter_input_device_get_coords (ClutterInputDevi CLUTTER_EXPORT ClutterModifierType clutter_input_device_get_modifier_state (ClutterInputDevice *device); CLUTTER_EXPORT -ClutterActor * clutter_input_device_get_pointer_actor (ClutterInputDevice *device); +ClutterActor * clutter_input_device_get_actor (ClutterInputDevice *device, + ClutterEventSequence *sequence); CLUTTER_EXPORT ClutterStage * clutter_input_device_get_pointer_stage (ClutterInputDevice *device); CLUTTER_EXPORT diff --git a/src/core/window.c b/src/core/window.c index 24403b79faa..c660a3b0c01 100644 --- a/src/core/window.c +++ b/src/core/window.c @@ -8135,7 +8135,7 @@ window_has_pointer_wayland (MetaWindow *window) seat = clutter_backend_get_default_seat (clutter_get_default_backend ()); dev = clutter_seat_get_pointer (seat); - pointer_actor = clutter_input_device_get_pointer_actor (dev); + pointer_actor = clutter_input_device_get_actor (dev, NULL); window_actor = CLUTTER_ACTOR (meta_window_get_compositor_private (window)); return pointer_actor && clutter_actor_contains (window_actor, pointer_actor); diff --git a/src/wayland/meta-wayland-pointer.c b/src/wayland/meta-wayland-pointer.c index d3008520231..ab2ae9315e8 100644 --- a/src/wayland/meta-wayland-pointer.c +++ b/src/wayland/meta-wayland-pointer.c @@ -621,7 +621,7 @@ repick_for_event (MetaWaylandPointer *pointer, if (for_event) actor = clutter_event_get_source (for_event); else - actor = clutter_input_device_get_pointer_actor (pointer->device); + actor = clutter_input_device_get_actor (pointer->device, NULL); if (META_IS_SURFACE_ACTOR_WAYLAND (actor)) { -- GitLab From b36cfb5bdcfe6c176cdee9b053d2426d8d0586c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20Dre=C3=9Fler?= Date: Mon, 18 May 2020 11:35:11 +0200 Subject: [PATCH 5/7] clutter/stage: Don't update modifier state when queuing event The modifier state of the input device is supposed to be set to the newest state, while the modifier state detail of the event is set to the last state before the event (so not including the changes triggered by the event). So since the modifier state of the event is the last state anyway, the state of the ClutterInputDevice is supposed to be set by the backend and not by the stage while queuing the event, so stop setting the state here. https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1275 --- clutter/clutter/clutter-stage.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/clutter/clutter/clutter-stage.c b/clutter/clutter/clutter-stage.c index 425980ab8a3..04ad08eb3b2 100644 --- a/clutter/clutter/clutter-stage.c +++ b/clutter/clutter/clutter-stage.c @@ -1129,7 +1129,6 @@ _clutter_stage_queue_event (ClutterStage *stage, event->type != CLUTTER_PROXIMITY_IN && event->type != CLUTTER_PROXIMITY_OUT) { - ClutterModifierType event_state = clutter_event_get_state (event); ClutterEventSequence *sequence = clutter_event_get_event_sequence (event); guint32 event_time = clutter_event_get_time (event); gfloat event_x, event_y; @@ -1137,7 +1136,6 @@ _clutter_stage_queue_event (ClutterStage *stage, clutter_event_get_coords (event, &event_x, &event_y); _clutter_input_device_set_coords (device, sequence, event_x, event_y, stage); - _clutter_input_device_set_state (device, event_state); _clutter_input_device_set_time (device, event_time); } -- GitLab From cb0cc42651dcc6366dc88b37ff38eac1eef99e35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20Dre=C3=9Fler?= Date: Tue, 3 Mar 2020 21:50:45 +0100 Subject: [PATCH 6/7] clutter: Also remove event sequences on TOUCH_CANCEL events We don't want to leave event sequences around when touches are cancelled, so also remove those from the ClutterInputDevice's hashtable. https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1275 --- clutter/clutter/clutter-main.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/clutter/clutter/clutter-main.c b/clutter/clutter/clutter-main.c index 84a10bb5d6c..9db0809319d 100644 --- a/clutter/clutter/clutter-main.c +++ b/clutter/clutter/clutter-main.c @@ -2049,7 +2049,8 @@ _clutter_process_event_details (ClutterActor *stage, emit_touch_event (event, device); - if (event->type == CLUTTER_TOUCH_END) + if (event->type == CLUTTER_TOUCH_END || + event->type == CLUTTER_TOUCH_CANCEL) _clutter_input_device_remove_event_sequence (device, event); break; @@ -2084,7 +2085,8 @@ _clutter_process_event_details (ClutterActor *stage, emit_touch_event (event, device); - if (event->type == CLUTTER_TOUCH_END) + if (event->type == CLUTTER_TOUCH_END || + event->type == CLUTTER_TOUCH_CANCEL) _clutter_input_device_remove_event_sequence (device, event); break; -- GitLab From 0ab1a9fa44e6eb24504dfcbfd535616426c3d01a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20Dre=C3=9Fler?= Date: Tue, 17 Dec 2019 22:03:26 +0100 Subject: [PATCH 7/7] clutter/actor: Clean up clutter_actor_event() We can easily do without the goto statement and use only one switch statement in this function, so tidy it up a bit. https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1275 --- clutter/clutter/clutter-actor.c | 201 ++++++++++++++------------------ 1 file changed, 85 insertions(+), 116 deletions(-) diff --git a/clutter/clutter/clutter-actor.c b/clutter/clutter/clutter-actor.c index fc49fe6d128..7f6ef007b77 100644 --- a/clutter/clutter/clutter-actor.c +++ b/clutter/clutter/clutter-actor.c @@ -13679,138 +13679,107 @@ clutter_actor_set_child_at_index (ClutterActor *self, gboolean clutter_actor_event (ClutterActor *actor, const ClutterEvent *event, - gboolean capture) + gboolean capture) { gboolean retval = FALSE; gint signal_num = -1; + GQuark detail = 0; g_return_val_if_fail (CLUTTER_IS_ACTOR (actor), FALSE); g_return_val_if_fail (event != NULL, FALSE); g_object_ref (actor); - if (capture) + switch (event->type) { - GQuark detail = 0; - - switch (event->type) - { - case CLUTTER_NOTHING: - break; - case CLUTTER_KEY_PRESS: - case CLUTTER_KEY_RELEASE: - detail = quark_key; - break; - case CLUTTER_MOTION: - detail = quark_motion; - break; - case CLUTTER_ENTER: - case CLUTTER_LEAVE: - detail = quark_pointer_focus; - break; - case CLUTTER_BUTTON_PRESS: - case CLUTTER_BUTTON_RELEASE: - detail = quark_button; - break; - case CLUTTER_SCROLL: - detail = quark_scroll; - break; - case CLUTTER_STAGE_STATE: - detail = quark_stage; - break; - case CLUTTER_DESTROY_NOTIFY: - detail = quark_destroy; - break; - case CLUTTER_CLIENT_MESSAGE: - detail = quark_client; - break; - case CLUTTER_DELETE: - detail = quark_delete; - break; - case CLUTTER_TOUCH_BEGIN: - case CLUTTER_TOUCH_UPDATE: - case CLUTTER_TOUCH_END: - case CLUTTER_TOUCH_CANCEL: - detail = quark_touch; - break; - case CLUTTER_TOUCHPAD_PINCH: - case CLUTTER_TOUCHPAD_SWIPE: - detail = quark_touchpad; - break; - case CLUTTER_PROXIMITY_IN: - case CLUTTER_PROXIMITY_OUT: - detail = quark_proximity; - break; - case CLUTTER_PAD_BUTTON_PRESS: - case CLUTTER_PAD_BUTTON_RELEASE: - case CLUTTER_PAD_STRIP: - case CLUTTER_PAD_RING: - detail = quark_pad; - break; - case CLUTTER_EVENT_LAST: /* Just keep compiler warnings quiet */ - break; - } - - g_signal_emit (actor, - actor_signals[CAPTURED_EVENT], - detail, - event, - &retval); - goto out; + case CLUTTER_NOTHING: + break; + case CLUTTER_BUTTON_PRESS: + signal_num = BUTTON_PRESS_EVENT; + detail = quark_button; + break; + case CLUTTER_BUTTON_RELEASE: + signal_num = BUTTON_RELEASE_EVENT; + detail = quark_button; + break; + case CLUTTER_SCROLL: + signal_num = SCROLL_EVENT; + detail = quark_scroll; + break; + case CLUTTER_KEY_PRESS: + signal_num = KEY_PRESS_EVENT; + detail = quark_key; + break; + case CLUTTER_KEY_RELEASE: + signal_num = KEY_RELEASE_EVENT; + detail = quark_key; + break; + case CLUTTER_MOTION: + signal_num = MOTION_EVENT; + detail = quark_motion; + break; + case CLUTTER_ENTER: + signal_num = ENTER_EVENT; + detail = quark_pointer_focus; + break; + case CLUTTER_LEAVE: + signal_num = LEAVE_EVENT; + detail = quark_pointer_focus; + break; + case CLUTTER_TOUCH_BEGIN: + case CLUTTER_TOUCH_END: + case CLUTTER_TOUCH_UPDATE: + case CLUTTER_TOUCH_CANCEL: + signal_num = TOUCH_EVENT; + detail = quark_touch; + break; + case CLUTTER_TOUCHPAD_PINCH: + case CLUTTER_TOUCHPAD_SWIPE: + signal_num = -1; + detail = quark_touchpad; + break; + case CLUTTER_PROXIMITY_IN: + case CLUTTER_PROXIMITY_OUT: + signal_num = -1; + detail = quark_proximity; + break; + case CLUTTER_PAD_BUTTON_PRESS: + case CLUTTER_PAD_BUTTON_RELEASE: + case CLUTTER_PAD_STRIP: + case CLUTTER_PAD_RING: + signal_num = -1; + detail = quark_pad; + break; + case CLUTTER_DELETE: + signal_num = -1; + detail = quark_delete; + break; + case CLUTTER_DESTROY_NOTIFY: + signal_num = -1; + detail = quark_destroy; + break; + case CLUTTER_CLIENT_MESSAGE: + signal_num = -1; + detail = quark_client; + break; + case CLUTTER_STAGE_STATE: + signal_num = -1; + detail = quark_stage; + break; + case CLUTTER_EVENT_LAST: /* Just keep compiler warnings quiet */ + break; } - g_signal_emit (actor, actor_signals[EVENT], 0, event, &retval); - - if (!retval) + if (capture) + g_signal_emit (actor, actor_signals[CAPTURED_EVENT], detail, event, &retval); + else { - switch (event->type) - { - case CLUTTER_NOTHING: - break; - case CLUTTER_BUTTON_PRESS: - signal_num = BUTTON_PRESS_EVENT; - break; - case CLUTTER_BUTTON_RELEASE: - signal_num = BUTTON_RELEASE_EVENT; - break; - case CLUTTER_SCROLL: - signal_num = SCROLL_EVENT; - break; - case CLUTTER_KEY_PRESS: - signal_num = KEY_PRESS_EVENT; - break; - case CLUTTER_KEY_RELEASE: - signal_num = KEY_RELEASE_EVENT; - break; - case CLUTTER_MOTION: - signal_num = MOTION_EVENT; - break; - case CLUTTER_ENTER: - signal_num = ENTER_EVENT; - break; - case CLUTTER_LEAVE: - signal_num = LEAVE_EVENT; - break; - case CLUTTER_TOUCH_BEGIN: - case CLUTTER_TOUCH_END: - case CLUTTER_TOUCH_UPDATE: - case CLUTTER_TOUCH_CANCEL: - signal_num = TOUCH_EVENT; - break; - case CLUTTER_DELETE: - case CLUTTER_DESTROY_NOTIFY: - case CLUTTER_CLIENT_MESSAGE: - default: - signal_num = -1; - break; - } + g_signal_emit (actor, actor_signals[EVENT], 0, event, &retval); - if (signal_num != -1) - g_signal_emit (actor, actor_signals[signal_num], 0, - event, &retval); + if (!retval && signal_num != -1) + g_signal_emit (actor, actor_signals[signal_num], 0, event, &retval); } -out: g_object_unref (actor); return retval; -- GitLab