On mar, 2014-03-04 at 00:55 +0100, Carlos Garnacho wrote:
> Hey everyone,
> 
> In the past days I've been hacking again on the gestures branch, and
> it's reaching an state where I feel it's getting quite solid, so I would
> like to get discussion started, tentatively aiming to get this included
> early in 3.13.

The most important...
https://git.gnome.org/browse/gtk+/log/?h=gestures

> 
> Overview
> ========
> 
> The two object types this relies on are GtkEventController and
> GtkGesture. GtkEventController is a very lowlevel abstraction for
> something that just "handles events". GtkGesture is a subclass very
> centered around handling single or multiple sequences of
> press/update.../release events, by default it's restricted to handling
> touch events, although can be made to listen to mouse events, either
> though API or through the GTK_TEST_TOUCHSCREEN envvar (a NULL
> GdkEventSequence is used in those cases).
> 
> Multiple GtkGesture implementations are offered in the branch:
> 
>       * Drag: keeps track of drags, reporting the offset from the drag
>         start point.
>       * Swipe: reports x/y velocity at the end of a begin/update/end
>         sequence.
>       * LongPress: reports long presses, or those being canceled after
>         threshold/timeout excess.
>       * MultiPress: reports multiple presses, as long as they're within
>         double click threshold/timeout
>       * Rotate: reports angle changes from two touch sequences
>       * Zoom: reports distance changes from to touch sequences as a
>         factor of the initial distance.
> 
> Integration with GtkWidget
> ==========================
> 
> This is all mostly exposed through gtk_widget_add_controller() to the
> upper layers. This function lets a widget manage the controller, so the
> controllers will be hooked to the bubble/capture propagation phase as
> specified by the enum argument in that function.
> 
> But GtkGestures remain useful as separate entities, callers are free to
> feed those events manually, generally non-containers could get away with
> just that, although should only remain preferable for not-so-GtkWidget
> usage.
> 
> Gestures over the widget hierarchy
> ==================================
> 
> And here's the gory details. First of all, the way captured events has
> changed so it's not capped from the top by the grab widget, running
> invariably now from the toplevel even with ongoing GTK+ grabs. This
> allows for more or less sane integration of gestures with the classic
> event handling/grabbing approach.
> 
> Users of GtkGesture can set sequences on those in 3 states:
> 
>       * None: the gesture handles events to construct possibly useful
>         output, but event delivery is not blocked.
>       * Claimed: the gesture handles the event and blocks delivery.
>       * Denied: The gesture ignores the sequence to every external
>         effect.
> 
> State can't be changed freely though, it's constrained to the following
> life cycles:
>       * None
>       * None->Claimed
>       * None->Denied
>       * None->Claimed->Denied
> 
> If the widget helper functions are used, this results in
> GtkWidget::sequence-state-changed emitted, first on the caller widget,
> and then sequentially from the event widget to the toplevel. The default
> implementation does enforce the state policy over the hierarchy:
> 
>       * On the caller widget, it sets the sequence to the same state on
>         all attached gestures. 
>       * If the sequence was claimed on the caller widget, all widgets
>         underneath get the sequence canceled. 
>       * If a sequence that was previously claimed is suddenly denied,
>         all widgets beneath the caller widget towards the event widget
>         will be able to receive events again. If the button/touch press
>         was consumed, that event will be emulated to keep these widgets
>         coherent event-wise.
> 
> So far in the branch this is exercised in a "gestures" demo in gtk3-demo
> that should react to most of the added gestures, and GtkScrolledWindow
> has been wired up to make kinetic scrolling event handling consist of 3
> GtkGestureDrag/Swipe/LongPress gestures, if it works as always, that's
> good news :).
> 
> So, comments are appreciated. Concerns or observable flaws?
> 
> Cheers,
>   Carlos


_______________________________________________
gtk-devel-list mailing list
gtk-devel-list@gnome.org
https://mail.gnome.org/mailman/listinfo/gtk-devel-list

Reply via email to