diff --git a/src/video/opengl.cpp b/src/video/opengl.cpp --- a/src/video/opengl.cpp +++ b/src/video/opengl.cpp @@ -1053,18 +1053,20 @@ void OpenGLBackend::Paint() */ void OpenGLBackend::DrawMouseCursor() { + if (!this->cursor_in_window) return; + /* Draw cursor on screen */ _cur_dpi = &_screen; - for (uint i = 0; i < _cursor.sprite_count; ++i) { - SpriteID sprite = _cursor.sprite_seq[i].sprite; + for (uint i = 0; i < this->cursor_sprite_count; ++i) { + SpriteID sprite = this->cursor_sprite_seq[i].sprite; /* Sprites are cached by PopulateCursorCache(). */ if (this->cursor_cache.Contains(sprite)) { Sprite *spr = this->cursor_cache.Get(sprite); - this->RenderOglSprite((OpenGLSprite *)spr->data, _cursor.sprite_seq[i].pal, - _cursor.pos.x + _cursor.sprite_pos[i].x + UnScaleByZoom(spr->x_offs, ZOOM_LVL_GUI), - _cursor.pos.y + _cursor.sprite_pos[i].y + UnScaleByZoom(spr->y_offs, ZOOM_LVL_GUI), + this->RenderOglSprite((OpenGLSprite *)spr->data, this->cursor_sprite_seq[i].pal, + this->cursor_pos.x + this->cursor_sprite_pos[i].x + UnScaleByZoom(spr->x_offs, ZOOM_LVL_GUI), + this->cursor_pos.y + this->cursor_sprite_pos[i].y + UnScaleByZoom(spr->y_offs, ZOOM_LVL_GUI), ZOOM_LVL_GUI); } } @@ -1072,6 +1074,9 @@ void OpenGLBackend::DrawMouseCursor() void OpenGLBackend::PopulateCursorCache() { + static_assert(lengthof(_cursor.sprite_seq) == lengthof(this->cursor_sprite_seq)); + static_assert(lengthof(_cursor.sprite_pos) == lengthof(this->cursor_sprite_pos)); + if (this->clear_cursor_cache) { /* We have a pending cursor cache clear to do first. */ this->clear_cursor_cache = false; @@ -1085,7 +1090,13 @@ void OpenGLBackend::PopulateCursorCache( } } + this->cursor_pos = _cursor.pos; + this->cursor_sprite_count = _cursor.sprite_count; + this->cursor_in_window = _cursor.in_window; + for (uint i = 0; i < _cursor.sprite_count; ++i) { + this->cursor_sprite_seq[i] = _cursor.sprite_seq[i]; + this->cursor_sprite_pos[i] = _cursor.sprite_pos[i]; SpriteID sprite = _cursor.sprite_seq[i].sprite; if (!this->cursor_cache.Contains(sprite)) {