diff --git a/src/backends/native/meta-cursor-renderer-native.c b/src/backends/native/meta-cursor-renderer-native.c index 2105d610f..f4ea8d2a9 100644 --- a/src/backends/native/meta-cursor-renderer-native.c +++ b/src/backends/native/meta-cursor-renderer-native.c @@ -63,6 +63,7 @@ static GQuark quark_cursor_sprite = 0; struct _MetaCursorRendererNativePrivate { + gboolean hw_state_invalidated; gboolean has_hw_cursor; MetaCursorSprite *last_cursor; @@ -159,8 +160,7 @@ set_pending_cursor_sprite_gbm_bo (MetaCursorSprite *cursor_sprite, static void set_crtc_cursor (MetaCursorRendererNative *native, MetaCRTC *crtc, - MetaCursorSprite *cursor_sprite, - gboolean force) + MetaCursorSprite *cursor_sprite) { MetaCursorRendererNativePrivate *priv = meta_cursor_renderer_native_get_instance_private (native); @@ -177,7 +177,7 @@ set_crtc_cursor (MetaCursorRendererNative *native, else bo = get_active_cursor_sprite_gbm_bo (cursor_sprite); - if (!force && bo == crtc->cursor_renderer_private) + if (!priv->hw_state_invalidated && bo == crtc->cursor_renderer_private) return; crtc->cursor_renderer_private = bo; @@ -197,7 +197,7 @@ set_crtc_cursor (MetaCursorRendererNative *native, } else { - if (force || crtc->cursor_renderer_private != NULL) + if (priv->hw_state_invalidated || crtc->cursor_renderer_private != NULL) { drmModeSetCursor2 (priv->drm_fd, crtc->crtc_id, 0, 0, 0, 0, 0); crtc->cursor_renderer_private = NULL; @@ -207,8 +207,7 @@ set_crtc_cursor (MetaCursorRendererNative *native, static void update_hw_cursor (MetaCursorRendererNative *native, - MetaCursorSprite *cursor_sprite, - gboolean force) + MetaCursorSprite *cursor_sprite) { MetaCursorRendererNativePrivate *priv = meta_cursor_renderer_native_get_instance_private (native); MetaCursorRenderer *renderer = META_CURSOR_RENDERER (native); @@ -241,7 +240,7 @@ update_hw_cursor (MetaCursorRendererNative *native, else crtc_cursor = NULL; - set_crtc_cursor (native, &crtcs[i], crtc_cursor, force); + set_crtc_cursor (native, &crtcs[i], crtc_cursor); if (crtc_cursor) { @@ -252,6 +251,8 @@ update_hw_cursor (MetaCursorRendererNative *native, } } + priv->hw_state_invalidated = FALSE; + if (painted) meta_cursor_renderer_emit_painted (renderer, cursor_sprite); } @@ -394,7 +395,7 @@ meta_cursor_renderer_native_update_cursor (MetaCursorRenderer *renderer, meta_cursor_renderer_native_trigger_frame (native, cursor_sprite); priv->has_hw_cursor = should_have_hw_cursor (renderer, cursor_sprite); - update_hw_cursor (native, cursor_sprite, FALSE); + update_hw_cursor (native, cursor_sprite); return priv->has_hw_cursor; } @@ -648,8 +649,11 @@ static void force_update_hw_cursor (MetaCursorRendererNative *native) { MetaCursorRenderer *renderer = META_CURSOR_RENDERER (native); + MetaCursorRendererNativePrivate *priv = + meta_cursor_renderer_native_get_instance_private (native); - update_hw_cursor (native, meta_cursor_renderer_get_cursor (renderer), TRUE); + priv->hw_state_invalidated = TRUE; + update_hw_cursor (native, meta_cursor_renderer_get_cursor (renderer)); } static void @@ -670,6 +674,8 @@ meta_cursor_renderer_native_init (MetaCursorRendererNative *native) g_signal_connect_object (monitors, "monitors-changed", G_CALLBACK (on_monitors_changed), native, 0); + priv->hw_state_invalidated = TRUE; + #if defined(CLUTTER_WINDOWING_EGL) if (clutter_check_windowing_backend (CLUTTER_WINDOWING_EGL)) {