diff --git a/clutter/clutter/clutter-actor.c b/clutter/clutter/clutter-actor.c index fc49fe6d12880b2370af96e8b630df037167fc37..7f6ef007b77c8c504d4a0c3a1652793bab1e9545 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; diff --git a/clutter/clutter/clutter-input-device.c b/clutter/clutter/clutter-input-device.c index e7b5bff967d05e722985fcf42793703222c5bbdb..11e717ba91ffdc5591d0807c96e3bbd299336e23 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 68b74ced8aab33844bdf2775d5a6d3ecfd743458..889cf727a4a3dd4d9803ef6e19c662754908f53f 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/clutter/clutter/clutter-main.c b/clutter/clutter/clutter-main.c index 84a10bb5d6c0b8905aac3e1a2d8799443f0b22f6..9db0809319d170e39f422107a337af32121725bd 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; diff --git a/clutter/clutter/clutter-seat.c b/clutter/clutter/clutter-seat.c index d0852fa44ba210f3dac43ed794fe29d439b16492..73672bd3611bda6b9176cf05ff2fc544ff905bed 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 @@ -634,8 +645,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) { diff --git a/clutter/clutter/clutter-seat.h b/clutter/clutter/clutter-seat.h index e12965e00ffd12b5a8ce2fc6648b8ddbd6891ed0..7818647af503fcbb7db2f7ecd9c4302b3f4dfd60 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/clutter/clutter/clutter-stage.c b/clutter/clutter/clutter-stage.c index fd40393e2e8b967533926cfac9a3ac9491f2f6ee..04ad08eb3b20b4767a5f9823ec0e38fd8fe19ac3 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); } @@ -1409,12 +1407,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 +1452,6 @@ _clutter_stage_check_updated_pointers (ClutterStage *stage) } } - g_list_free (devices); - return updating; } diff --git a/src/backends/native/meta-seat-native.c b/src/backends/native/meta-seat-native.c index ecff929bd8f678ff10c6fda09b8897fa01f31ff4..fa984fd1b3059e267925db8dfcd589582043a0dd 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 f20cac1481d02107c1dc7f1a56c10c79e271bb7b..1a29bbbac7361362114a36b98b54596918c8c1a0 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; diff --git a/src/core/window.c b/src/core/window.c index 24403b79faac2e51ce38d0138263eb8db25a776e..c660a3b0c0116534903476547be57df392ae29e8 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 d300852023121e39c35592ca127eb364e167a48a..ab2ae9315e86a615456bd38008499073023596bd 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)) {