diff options
-rw-r--r-- | clutter/clutter/clutter-main.c | 238 | ||||
-rw-r--r-- | clutter/clutter/clutter-main.h | 13 | ||||
-rw-r--r-- | clutter/clutter/clutter-private.h | 4 | ||||
-rw-r--r-- | clutter/tests/interactive/test-grab.c | 28 |
4 files changed, 28 insertions, 255 deletions
diff --git a/clutter/clutter/clutter-main.c b/clutter/clutter/clutter-main.c index 0fad6c642..5de7602dd 100644 --- a/clutter/clutter/clutter-main.c +++ b/clutter/clutter/clutter-main.c @@ -1701,37 +1701,19 @@ static inline void emit_pointer_event (ClutterEvent *event, ClutterInputDevice *device) { - ClutterMainContext *context = _clutter_context_get_default (); - if (_clutter_event_process_filters (event)) return; - if (context->pointer_grab_actor == NULL && - (device == NULL || device->pointer_grab_actor == NULL)) - { - /* no grab, time to capture and bubble */ - emit_event_chain (event); - } + if (device != NULL && device->pointer_grab_actor != NULL) + clutter_actor_event (device->pointer_grab_actor, event, FALSE); else - { - if (context->pointer_grab_actor != NULL) - { - /* global grab */ - clutter_actor_event (context->pointer_grab_actor, event, FALSE); - } - else if (device != NULL && device->pointer_grab_actor != NULL) - { - /* per device grab */ - clutter_actor_event (device->pointer_grab_actor, event, FALSE); - } - } + emit_event_chain (event); } static inline void emit_crossing_event (ClutterEvent *event, ClutterInputDevice *device) { - ClutterMainContext *context = _clutter_context_get_default (); ClutterEventSequence *sequence = clutter_event_get_event_sequence (event); ClutterActor *grab_actor = NULL; @@ -1745,9 +1727,7 @@ emit_crossing_event (ClutterEvent *event, } else { - if (context->pointer_grab_actor != NULL) - grab_actor = context->pointer_grab_actor; - else if (device != NULL && device->pointer_grab_actor != NULL) + if (device != NULL && device->pointer_grab_actor != NULL) grab_actor = device->pointer_grab_actor; } @@ -1788,30 +1768,13 @@ static inline void emit_keyboard_event (ClutterEvent *event, ClutterInputDevice *device) { - ClutterMainContext *context = _clutter_context_get_default (); - if (_clutter_event_process_filters (event)) return; - if (context->keyboard_grab_actor == NULL && - (device == NULL || device->keyboard_grab_actor == NULL)) - { - /* no grab, time to capture and bubble */ - emit_event_chain (event); - } + if (device != NULL && device->keyboard_grab_actor != NULL) + clutter_actor_event (device->keyboard_grab_actor, event, FALSE); 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); - } - } + emit_event_chain (event); } static inline void @@ -2009,15 +1972,7 @@ _clutter_process_event_details (ClutterActor *stage, if (_clutter_event_process_filters (event)) break; - /* global grabs */ - if (context->pointer_grab_actor != NULL) - { - clutter_actor_event (context->pointer_grab_actor, - event, - FALSE); - break; - } - else if (device != NULL && device->pointer_grab_actor != NULL) + if (device != NULL && device->pointer_grab_actor != NULL) { clutter_actor_event (device->pointer_grab_actor, event, @@ -2384,19 +2339,6 @@ static void on_grab_actor_destroy (ClutterActor *actor, ClutterInputDevice *device) { - if (device == NULL) - { - ClutterMainContext *context = _clutter_context_get_default (); - - if (context->pointer_grab_actor == actor) - clutter_ungrab_pointer (); - - if (context->keyboard_grab_actor == actor) - clutter_ungrab_keyboard (); - - return; - } - switch (device->device_type) { case CLUTTER_POINTER_DEVICE: @@ -2413,58 +2355,6 @@ on_grab_actor_destroy (ClutterActor *actor, } /** - * clutter_grab_pointer: - * @actor: a #ClutterActor - * - * Grabs pointer events, after the grab is done all pointer related events - * (press, motion, release, enter, leave and scroll) are delivered to this - * actor directly without passing through both capture and bubble phases of - * the event delivery chain. The source set in the event will be the actor - * that would have received the event if the pointer grab was not in effect. - * - * Grabs completely override the entire event delivery chain - * done by Clutter. Pointer grabs should only be used as a last resource; - * using the #ClutterActor::captured-event signal should always be the - * preferred way to intercept event delivery to reactive actors. - * - * This function should rarely be used. - * - * If a grab is required, you are strongly encouraged to use a specific - * input device by calling clutter_input_device_grab(). - * - * Since: 0.6 - */ -void -clutter_grab_pointer (ClutterActor *actor) -{ - ClutterMainContext *context; - - g_return_if_fail (actor == NULL || CLUTTER_IS_ACTOR (actor)); - - context = _clutter_context_get_default (); - - if (context->pointer_grab_actor == actor) - return; - - if (context->pointer_grab_actor != NULL) - { - g_signal_handlers_disconnect_by_func (context->pointer_grab_actor, - G_CALLBACK (on_grab_actor_destroy), - NULL); - context->pointer_grab_actor = NULL; - } - - if (actor != NULL) - { - context->pointer_grab_actor = actor; - - g_signal_connect (context->pointer_grab_actor, "destroy", - G_CALLBACK (on_grab_actor_destroy), - NULL); - } -} - -/** * clutter_input_device_grab: * @device: a #ClutterInputDevice * @actor: a #ClutterActor @@ -2595,118 +2485,6 @@ clutter_input_device_get_grabbed_actor (ClutterInputDevice *device) } /** - * clutter_ungrab_pointer: - * - * Removes an existing grab of the pointer. - * - * Since: 0.6 - */ -void -clutter_ungrab_pointer (void) -{ - clutter_grab_pointer (NULL); -} - -/** - * clutter_get_pointer_grab: - * - * Queries the current pointer grab of clutter. - * - * Return value: (transfer none): the actor currently holding the pointer grab, or NULL if there is no grab. - * - * Since: 0.6 - */ -ClutterActor * -clutter_get_pointer_grab (void) -{ - ClutterMainContext *context; - context = _clutter_context_get_default (); - - return context->pointer_grab_actor; -} - - -/** - * clutter_grab_keyboard: - * @actor: a #ClutterActor - * - * Grabs keyboard events, after the grab is done keyboard - * events (#ClutterActor::key-press-event and #ClutterActor::key-release-event) - * are delivered to this actor directly. The source set in the event will be - * the actor that would have received the event if the keyboard grab was not - * in effect. - * - * Like pointer grabs, keyboard grabs should only be used as a last - * resource. - * - * See also clutter_stage_set_key_focus() and clutter_actor_grab_key_focus() - * to perform a "soft" key grab and assign key focus to a specific actor. - * - * Since: 0.6 - */ -void -clutter_grab_keyboard (ClutterActor *actor) -{ - ClutterMainContext *context; - - g_return_if_fail (actor == NULL || CLUTTER_IS_ACTOR (actor)); - - context = _clutter_context_get_default (); - - if (context->keyboard_grab_actor == actor) - return; - - if (context->keyboard_grab_actor != NULL) - { - g_signal_handlers_disconnect_by_func (context->keyboard_grab_actor, - G_CALLBACK (on_grab_actor_destroy), - NULL); - context->keyboard_grab_actor = NULL; - } - - if (actor != NULL) - { - context->keyboard_grab_actor = actor; - - g_signal_connect (context->keyboard_grab_actor, "destroy", - G_CALLBACK (on_grab_actor_destroy), - NULL); - } -} - -/** - * clutter_ungrab_keyboard: - * - * Removes an existing grab of the keyboard. - * - * Since: 0.6 - */ -void -clutter_ungrab_keyboard (void) -{ - clutter_grab_keyboard (NULL); -} - -/** - * clutter_get_keyboard_grab: - * - * Queries the current keyboard grab of clutter. - * - * Return value: (transfer none): the actor currently holding the keyboard grab, or NULL if there is no grab. - * - * Since: 0.6 - */ -ClutterActor * -clutter_get_keyboard_grab (void) -{ - ClutterMainContext *context; - - context = _clutter_context_get_default (); - - return context->keyboard_grab_actor; -} - -/** * clutter_get_font_map: * * Retrieves the #PangoFontMap instance used by Clutter. diff --git a/clutter/clutter/clutter-main.h b/clutter/clutter/clutter-main.h index 70e40f958..16de42bf3 100644 --- a/clutter/clutter/clutter-main.h +++ b/clutter/clutter/clutter-main.h @@ -147,19 +147,6 @@ CLUTTER_EXPORT void clutter_threads_remove_repaint_func (guint handle_id); CLUTTER_EXPORT -void clutter_grab_pointer (ClutterActor *actor); -CLUTTER_EXPORT -void clutter_ungrab_pointer (void); -CLUTTER_EXPORT -ClutterActor * clutter_get_pointer_grab (void); -CLUTTER_EXPORT -void clutter_grab_keyboard (ClutterActor *actor); -CLUTTER_EXPORT -void clutter_ungrab_keyboard (void); -CLUTTER_EXPORT -ClutterActor * clutter_get_keyboard_grab (void); - -CLUTTER_EXPORT PangoFontMap * clutter_get_font_map (void); CLUTTER_EXPORT diff --git a/clutter/clutter/clutter-private.h b/clutter/clutter/clutter-private.h index a97fd12c9..a4e69ce2b 100644 --- a/clutter/clutter/clutter-private.h +++ b/clutter/clutter/clutter-private.h @@ -142,10 +142,6 @@ struct _ClutterMainContext /* default FPS; this is only used if we cannot sync to vblank */ guint frame_rate; - /* actors with a grab on all devices */ - ClutterActor *pointer_grab_actor; - ClutterActor *keyboard_grab_actor; - /* fb bit masks for col<->id mapping in picking */ gint fb_r_mask; gint fb_g_mask; diff --git a/clutter/tests/interactive/test-grab.c b/clutter/tests/interactive/test-grab.c index 7c03a397b..cb48fe6cf 100644 --- a/clutter/tests/interactive/test-grab.c +++ b/clutter/tests/interactive/test-grab.c @@ -123,7 +123,9 @@ grab_pointer_cb (ClutterActor *actor, ClutterEvent *event, gpointer data) { - clutter_grab_pointer (actor); + ClutterInputDevice *device = clutter_event_get_device (event); + + clutter_input_device_grab (device, actor); return FALSE; } @@ -132,7 +134,9 @@ red_release_cb (ClutterActor *actor, ClutterEvent *event, gpointer data) { - clutter_ungrab_pointer (); + ClutterInputDevice *device = clutter_event_get_device (event); + + clutter_input_device_ungrab (device); return FALSE; } @@ -169,14 +173,17 @@ toggle_grab_pointer_cb (ClutterActor *actor, ClutterEvent *event, gpointer data) { + ClutterInputDevice *device = clutter_event_get_device (event); + /* we only deal with the event if the source is ourself */ if (event->button.source == actor) { - if (clutter_get_pointer_grab () != NULL) - clutter_ungrab_pointer (); + if (clutter_input_device_get_grabbed_actor (device) != NULL) + clutter_input_device_ungrab (device); else - clutter_grab_pointer (actor); + clutter_input_device_grab (device, actor); } + return FALSE; } @@ -185,10 +192,15 @@ cyan_press_cb (ClutterActor *actor, ClutterEvent *event, gpointer data) { - if (clutter_get_keyboard_grab () != NULL) - clutter_ungrab_keyboard (); + ClutterDeviceManager *dm = clutter_device_manager_get_default (); + ClutterInputDevice *device = + clutter_device_manager_get_core_device (dm, CLUTTER_KEYBOARD_DEVICE); + + if (clutter_input_device_get_grabbed_actor (device) != NULL) + clutter_input_device_ungrab (device); else - clutter_grab_keyboard (actor); + clutter_input_device_grab (device, actor); + return FALSE; } |