Short description of error
Using an active tool gizmo at the same time as a custom (as in Python defined) gizmo may entirely break gizmos.
This happens when the custom gizmo sets internal gizmo properties on redraws. We basically put Blender into a redraw + reinitialize loop then.
Exact steps for others to reproduce the error
- Enter Scripting Workspace
- In Text Editor, select Templates → Python → Gizmo Custom Geometry
- Press "Run Script"
- Select the light object (custom gizmo should appear)
- Open toolbar, activate some transform gizmo
-> The transform gizmo will appear and disappear immediately. This should happen again after selecting a different object, and then the light again. The custom light gizmo won't function properly (glitchy hover highlight, dragging doesn't work).
The root cause is the gizmo properties sending a (NC_SCREEN | NA_EDITED) notifier when set.
If a custom gizmo sets any of these properties (e.g. alpha, matrix_basis, hide, etc.) in a redraw callback - something that should definitely supported -, that triggers such notifiers to be send on every redraw. While sending this notifer seems reasonable, that causes ED_screen_refresh & ED_area_initialize to be executed on every redraw too! These are not supposed to be used that way. The latter also reinitializes tools, causing a redraw which again causes the gizmo properties to send a notifier. Hence, this is a redraw + reinitialize loop.
Gizmos properties should update the UI without causing ED_screen_refresh calls. AFAICS we only need to redraw the region the gizmo is in. A few options:
- Add a new notifier type triggering a region redraw.
- Use new message bus to tag region redraw.
- Use property setter to tag region redraw.
Not sure which way we should go for fixing. I also don't have much time for this, so opening a report to ensure it's not forgotten.