mirror of
https://github.com/brl/mutter.git
synced 2025-02-10 18:34:09 +00:00
x11: Iterate over selections in a safer manner for event handling
It might be the case that handling an event induces the stream to trigger completion, hence removing itself from the list. In that case we would operate on the no longer valid list element to fetch the next one. Keep a pointer to the next element beforehand, so we can tiptoe over streams that did remove themselves. https://gitlab.gnome.org/GNOME/mutter/merge_requests/869 (cherry picked from commit 45a8806e652346523cb66fb4777e15b63aa90c2a)
This commit is contained in:
parent
4d0a331cfe
commit
156dd576f4
@ -1734,11 +1734,21 @@ process_selection_event (MetaX11Display *x11_display,
|
||||
|
||||
handled |= meta_x11_selection_handle_event (x11_display, event);
|
||||
|
||||
for (l = x11_display->selection.input_streams; l && !handled; l = l->next)
|
||||
handled |= meta_x11_selection_input_stream_xevent (l->data, event);
|
||||
for (l = x11_display->selection.input_streams; l && !handled;)
|
||||
{
|
||||
GList *next = l->next;
|
||||
|
||||
for (l = x11_display->selection.output_streams; l && !handled; l = l->next)
|
||||
handled |= meta_x11_selection_output_stream_xevent (l->data, event);
|
||||
handled |= meta_x11_selection_input_stream_xevent (l->data, event);
|
||||
l = next;
|
||||
}
|
||||
|
||||
for (l = x11_display->selection.output_streams; l && !handled;)
|
||||
{
|
||||
GList *next = l->next;
|
||||
|
||||
handled |= meta_x11_selection_output_stream_xevent (l->data, event);
|
||||
l = next;
|
||||
}
|
||||
|
||||
return handled;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user