diff options
author | Carlos Garnacho <carlos@lanedo.com> | 2012-10-08 10:09:20 (GMT) |
---|---|---|
committer | Simon Schampijer <simon@laptop.org> | 2012-10-08 11:03:15 (GMT) |
commit | c546aaaf7cab3a912c5245e024356a8d789feaa2 (patch) | |
tree | 4f548f570ef3d810c58b29a5e2f31ab569043d98 | |
parent | 31d6e6dd1eed4732d277cc0e0514f4cff7d73e32 (diff) |
gestures: Add remove() call to SugarGestureGrabber
Signed-off-by: Carlos Garnacho <carlos@lanedo.com>
Acked-by: Simon Schampijer <simon@laptop.org>
-rw-r--r-- | src/sugar3/sugar-gesture-grabber.c | 53 | ||||
-rw-r--r-- | src/sugar3/sugar-gesture-grabber.h | 2 |
2 files changed, 55 insertions, 0 deletions
diff --git a/src/sugar3/sugar-gesture-grabber.c b/src/sugar3/sugar-gesture-grabber.c index b1d28db..211e637 100644 --- a/src/sugar3/sugar-gesture-grabber.c +++ b/src/sugar3/sugar-gesture-grabber.c @@ -366,6 +366,32 @@ sugar_gesture_grabber_new (void) return g_object_new (SUGAR_TYPE_GESTURE_GRABBER, NULL); } +static ControllerData * +_sugar_gesture_grabber_find_controller (SugarGestureGrabber *grabber, + SugarEventController *controller, + gint *pos) +{ + SugarGestureGrabberPriv *priv; + guint i; + + priv = grabber->_priv; + + for (i = 0; i < priv->controllers->len; i++) { + ControllerData *data; + + data = &g_array_index (priv->controllers, ControllerData, i); + + if (data->controller == controller) { + if (pos) + *pos = i; + + return data; + } + } + + return NULL; +} + void sugar_gesture_grabber_add (SugarGestureGrabber *grabber, SugarEventController *controller, @@ -377,9 +403,36 @@ sugar_gesture_grabber_add (SugarGestureGrabber *grabber, g_return_if_fail (SUGAR_IS_GESTURE_GRABBER (grabber)); g_return_if_fail (SUGAR_IS_EVENT_CONTROLLER (controller)); + if (_sugar_gesture_grabber_find_controller (grabber, controller, NULL)) { + g_warning ("Controller is already on the gesture grabber" + " list. Controllers can only be added once."); + return; + } + priv = grabber->_priv; data.controller = g_object_ref (controller); data.rect = *rect; g_array_append_val (priv->controllers, data); } + +void +sugar_gesture_grabber_remove (SugarGestureGrabber *grabber, + SugarEventController *controller) +{ + SugarGestureGrabberPriv *priv; + ControllerData *data; + gint pos; + + g_return_if_fail (SUGAR_IS_GESTURE_GRABBER (grabber)); + g_return_if_fail (SUGAR_IS_EVENT_CONTROLLER (controller)); + + priv = grabber->_priv; + data = _sugar_gesture_grabber_find_controller (grabber, controller, &pos); + + if (data) { + g_array_remove_index_fast (priv->controllers, pos); + sugar_event_controller_reset (data->controller); + g_object_unref (data->controller); + } +} diff --git a/src/sugar3/sugar-gesture-grabber.h b/src/sugar3/sugar-gesture-grabber.h index 2d956a3..d6c8c4b 100644 --- a/src/sugar3/sugar-gesture-grabber.h +++ b/src/sugar3/sugar-gesture-grabber.h @@ -51,6 +51,8 @@ SugarGestureGrabber * sugar_gesture_grabber_new (void); void sugar_gesture_grabber_add (SugarGestureGrabber *grabber, SugarEventController *controller, const GdkRectangle *rect); +void sugar_gesture_grabber_remove (SugarGestureGrabber *grabber, + SugarEventController *controller); G_END_DECLS |