UI: Skip unnecessary cursor setting

Currently, in sculpting, weight paint and vertex paint modes every cursor
movement triggers redraw of a brush. During that redraw, native cursor is set.
Under the hood, setting the cursor causes freeing of previous cursor and
allocating a new one. In most cases, in previously mentioned modes, recreating
cursor is unnecessary since cursor stays the same.

This patch adds a check which skips cursor change if requested cursor is
already set. The check could be added in pain_cursor.c, but I felt adding it
inside WM_cursor_set function would hopefully skip more unnecessary cursor
reallocations.

Differential Revision: https://developer.blender.org/D7828

Reviewed by: Julian Eisel
This commit is contained in:
Konrad Puklicki 2020-05-27 12:04:14 +02:00 committed by Julian Eisel
parent bab5fbb66c
commit e490dc4346
Notes: blender-bot 2023-02-14 02:13:08 +01:00
Referenced by commit 2b36e6bee6, Fix T80333: cursor disappears after using navigation gizmo in editmode
Referenced by issue #80363, When importing an obj the cursor icon gets stuck in progress mode
Referenced by issue #80333, Cursor not reset properly (disappears after rotating navigation gizmo, stuck after importing)
Referenced by issue #80333, Cursor not reset properly (disappears after rotating navigation gizmo, stuck after importing)
1 changed files with 10 additions and 6 deletions

View File

@ -145,6 +145,16 @@ void WM_cursor_set(wmWindow *win, int curs)
return; /* Can't set custom cursor before Window init */
}
if (curs == WM_CURSOR_DEFAULT && win->modalcursor) {
curs = win->modalcursor;
}
if (win->cursor == curs) {
return; /* Cursor is already set */
}
win->cursor = curs;
if (curs == WM_CURSOR_NONE) {
GHOST_SetCursorVisibility(win->ghostwin, 0);
return;
@ -152,12 +162,6 @@ void WM_cursor_set(wmWindow *win, int curs)
GHOST_SetCursorVisibility(win->ghostwin, 1);
if (curs == WM_CURSOR_DEFAULT && win->modalcursor) {
curs = win->modalcursor;
}
win->cursor = curs;
if (curs < 0 || curs >= WM_CURSOR_NUM) {
BLI_assert(!"Invalid cursor number");
return;