gtkgesture: Apply gesture group state after setting up sequence
When a new sequence is added to a GtkGesture, its state is looked in other gestures in the same group, and made to match in this gesture. This however happened a bit too early, before the gesture touchpoint was fully set up. As this may result in signal emission and whatnot, it's a good idea to make it happen with a fully set up touchpoint. Fixes: https://gitlab.gnome.org/GNOME/gtk/-/issues/3946 (Cherry-picked from commit 53df32e6cf1e2a7cbec8dd8d3b3acd4ddae2b9bf)
This commit is contained in:
@ -585,8 +585,6 @@ _gtk_gesture_update_point (GtkGesture *gesture,
|
|||||||
NULL, (gpointer *) &data);
|
NULL, (gpointer *) &data);
|
||||||
if (!existed)
|
if (!existed)
|
||||||
{
|
{
|
||||||
GtkEventSequenceState group_state;
|
|
||||||
|
|
||||||
if (!add)
|
if (!add)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
@ -599,9 +597,6 @@ _gtk_gesture_update_point (GtkGesture *gesture,
|
|||||||
|
|
||||||
data = g_new0 (PointData, 1);
|
data = g_new0 (PointData, 1);
|
||||||
g_hash_table_insert (priv->points, sequence, data);
|
g_hash_table_insert (priv->points, sequence, data);
|
||||||
|
|
||||||
group_state = gtk_gesture_get_group_state (gesture, sequence);
|
|
||||||
gtk_gesture_set_sequence_state (gesture, sequence, group_state);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (data->event)
|
if (data->event)
|
||||||
@ -611,13 +606,24 @@ _gtk_gesture_update_point (GtkGesture *gesture,
|
|||||||
_update_touchpad_deltas (data);
|
_update_touchpad_deltas (data);
|
||||||
_update_widget_coordinates (gesture, data);
|
_update_widget_coordinates (gesture, data);
|
||||||
|
|
||||||
/* Deny the sequence right away if the expected
|
if (!existed)
|
||||||
* number of points is exceeded, so this sequence
|
{
|
||||||
* can be tracked with gtk_gesture_handles_sequence().
|
GtkEventSequenceState state;
|
||||||
*/
|
|
||||||
if (!existed && _gtk_gesture_get_n_physical_points (gesture, FALSE) > priv->n_points)
|
/* Deny the sequence right away if the expected
|
||||||
gtk_gesture_set_sequence_state (gesture, sequence,
|
* number of points is exceeded, so this sequence
|
||||||
GTK_EVENT_SEQUENCE_DENIED);
|
* can be tracked with gtk_gesture_handles_sequence().
|
||||||
|
*
|
||||||
|
* Otherwise, make the sequence inherit the same state
|
||||||
|
* from other gestures in the same group.
|
||||||
|
*/
|
||||||
|
if (_gtk_gesture_get_n_physical_points (gesture, FALSE) > priv->n_points)
|
||||||
|
state = GTK_EVENT_SEQUENCE_DENIED;
|
||||||
|
else
|
||||||
|
state = gtk_gesture_get_group_state (gesture, sequence);
|
||||||
|
|
||||||
|
gtk_gesture_set_sequence_state (gesture, sequence, state);
|
||||||
|
}
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user