Handle wl_surface destruction in SurfaceCursorSource
Wine/Wayland hides the cursor as follows:
[ 853107.473] -> wl_pointer@15.set_cursor(172832, wl_surface@38, 0, 0)
...
[ 858989.757] -> wl_surface@38.destroy()
[ 858989.759] -> wl_pointer@15.set_cursor(172832, nil, 0, 0)
i.e. it destroys the cursor surface, then calls wl_pointer.set_cursor().
SurfaceCursorSource stores the wl_surface in a QPointer, furthermore it is going to emit the changed signal, which is needed to force the CursorItem to update its content, only if either a new hotspot or a surface has been passed to SurfaceCursorSource::update(). So what happens is the following:
- The SurfaceInterface object is destroyed and the QPointer resets its value to nullptr
- SurfaceCursorSource::update(nullptr, QPointF(0, 0)) gets called in response to wl_pointer@15.set_cursor(nil, 0, 0)
- but since m_surface has been implicitly reset to nullptr, no changed signal is going to be emitted
This change addresses the issue by making the SurfaceCursorSource track the SurfaceInterface's destroyed signal.
Edited by Vlad Zahorodnii