Skip to content
  • Jonas Dreßler's avatar
    clutter/gesture: Cancel other gestures when moving to RECOGNIZING · 63cc4da4
    Jonas Dreßler authored
    Quite often there are situations where multiple gestures try to
    recognize, keeping track of the same set of points (for example an edge
    drag gesture on the stage and a click gesture somewhere in the
    scenegraph). Usually what's wanted here is that the first gesture to
    move to RECOGNIZING wins over all other active gestures and "claims" the
    point for itself.
    
    We implement this by introducing a concept called "influencing". It
    works by making all gestures operating on a shared set of points aware
    of each other using ClutterAction->register_sequence().
    ClutterGesture uses this vfunc to keep track of all other
    ClutterGestures that are potentially conflicting, and keeps a list
    (priv->cancel_on_recognizing) of those. As soon as the move to
    RECOGNIZING happens, all gestures inside this list get moved to
    CANCELLED.
    
    To allow fine-grained control over this behavior, two APIs are
    introduced:
    
    1) on the implementation level (should_influence() and
    should_be_influenced_by()): This is a vfunc that gets called as soon as
    a potential conflict is detected. It's helpful when a specific gesture
    always behaves the same towards another gesture, for example to make
    sure a LongPress gesture never cancels a DragGesture.
    
    2) on the gesture user level, clutter_gesture_can_not_cancel() is
    introduced: This allows control for the user of a gesture to specify
    that a specific instance of a gesture won't cancel another gesture.
    Calling this twice so that both gestures can't cancel each other allows
    for things like simultaneous recognition of a pinch-to-zoom and rotate
    gesture.
    
    Part-of: <GNOME/mutter!2389>
    63cc4da4