xwayland: Prevent nested iteration over frame callback list
It could happen with the following call path:
frame_callback
xwl_present_frame_callback
xwl_present_msc_bump
xwl_present_execute
xwl_present_flip
xwl_window_create_frame_callback
The nested loop called xwl_present_reset_timer
, which may end up calling
xorg_list_del
for the entry after the one frame_callback
started the
chain for. This resulted in the outer loop never terminating, because
its next element wasn't hooked up to the list anymore.
We avoid this by calling xwl_present_reset_timer
as needed in
frame_callback
, and bailing from xwl_window_create_frame_callback
if it
was called from the former.
We also catch nested calls and FatalError
if they ever happen again due
to another bug.
Closes: #1442 (closed)