summaryrefslogtreecommitdiff
path: root/src/backends/meta-cursor-renderer.c
diff options
context:
space:
mode:
authorJonas Ådahl <jadahl@gmail.com>2018-09-13 11:28:51 +0200
committerJonas Ådahl <jadahl@gmail.com>2019-01-16 17:09:51 +0000
commit79d99cbe3feda7b609c67a3d1fc46c289ac23bfc (patch)
tree67e6ba04d84d28d0f98f36fc44cf00218231d16c /src/backends/meta-cursor-renderer.c
parent328eff735294e39b4eaeafa9711d8d4d0c31e39f (diff)
downloadmutter-79d99cbe3feda7b609c67a3d1fc46c289ac23bfc.tar.gz
cursor-renderer: Add API to allow inhibiting HW cursor
There may be reasons to temporarly inhibit the HW cursor under certain circumstances. Allow adding such inhibitations by adding API to the cursor renderer to allow API users to add generic inhibitors with whatever logic is deemed necessary. https://gitlab.gnome.org/GNOME/mutter/merge_requests/357
Diffstat (limited to 'src/backends/meta-cursor-renderer.c')
-rw-r--r--src/backends/meta-cursor-renderer.c62
1 files changed, 62 insertions, 0 deletions
diff --git a/src/backends/meta-cursor-renderer.c b/src/backends/meta-cursor-renderer.c
index 1f76206f8..34a7f91d8 100644
--- a/src/backends/meta-cursor-renderer.c
+++ b/src/backends/meta-cursor-renderer.c
@@ -34,6 +34,9 @@
#include "meta/meta-backend.h"
#include "meta/util.h"
+G_DEFINE_INTERFACE (MetaHwCursorInhibitor, meta_hw_cursor_inhibitor,
+ G_TYPE_OBJECT)
+
struct _MetaCursorRendererPrivate
{
float current_x;
@@ -43,6 +46,8 @@ struct _MetaCursorRendererPrivate
MetaOverlay *stage_overlay;
gboolean handled_by_backend;
guint post_paint_func_id;
+
+ GList *hw_cursor_inhibitors;
};
typedef struct _MetaCursorRendererPrivate MetaCursorRendererPrivate;
@@ -54,6 +59,21 @@ static guint signals[LAST_SIGNAL];
G_DEFINE_TYPE_WITH_PRIVATE (MetaCursorRenderer, meta_cursor_renderer, G_TYPE_OBJECT);
+static gboolean
+meta_hw_cursor_inhibitor_is_cursor_sprite_inhibited (MetaHwCursorInhibitor *inhibitor,
+ MetaCursorSprite *cursor_sprite)
+{
+ MetaHwCursorInhibitorInterface *iface =
+ META_HW_CURSOR_INHIBITOR_GET_IFACE (inhibitor);
+
+ return iface->is_cursor_sprite_inhibited (inhibitor, cursor_sprite);
+}
+
+static void
+meta_hw_cursor_inhibitor_default_init (MetaHwCursorInhibitorInterface *iface)
+{
+}
+
void
meta_cursor_renderer_emit_painted (MetaCursorRenderer *renderer,
MetaCursorSprite *cursor_sprite)
@@ -282,3 +302,45 @@ meta_cursor_renderer_get_cursor (MetaCursorRenderer *renderer)
return priv->displayed_cursor;
}
+
+void
+meta_cursor_renderer_add_hw_cursor_inhibitor (MetaCursorRenderer *renderer,
+ MetaHwCursorInhibitor *inhibitor)
+{
+ MetaCursorRendererPrivate *priv =
+ meta_cursor_renderer_get_instance_private (renderer);
+
+ priv->hw_cursor_inhibitors = g_list_prepend (priv->hw_cursor_inhibitors,
+ inhibitor);
+}
+
+void
+meta_cursor_renderer_remove_hw_cursor_inhibitor (MetaCursorRenderer *renderer,
+ MetaHwCursorInhibitor *inhibitor)
+{
+ MetaCursorRendererPrivate *priv =
+ meta_cursor_renderer_get_instance_private (renderer);
+
+ priv->hw_cursor_inhibitors = g_list_remove (priv->hw_cursor_inhibitors,
+ inhibitor);
+}
+
+gboolean
+meta_cursor_renderer_is_hw_cursors_inhibited (MetaCursorRenderer *renderer,
+ MetaCursorSprite *cursor_sprite)
+{
+ MetaCursorRendererPrivate *priv =
+ meta_cursor_renderer_get_instance_private (renderer);
+ GList *l;
+
+ for (l = priv->hw_cursor_inhibitors; l; l = l->next)
+ {
+ MetaHwCursorInhibitor *inhibitor = l->data;
+
+ if (meta_hw_cursor_inhibitor_is_cursor_sprite_inhibited (inhibitor,
+ cursor_sprite))
+ return TRUE;
+ }
+
+ return FALSE;
+}