summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarco Trevisan (Treviño) <mail@3v1n0.net>2014-12-10 15:33:35 +0100
committerMarco Trevisan (Treviño) <mail@3v1n0.net>2014-12-10 15:33:35 +0100
commitbc83282f4fd11fac136a274009021b5b3795618f (patch)
tree8ef06103e9afcb6056874b12c9a0ee3e43582ce1
parent2872695fa7d8f29386f6461277cc2d9e9f700b53 (diff)
mir: add renderer event listener support
-rw-r--r--cogl/cogl-mir-renderer.h60
-rw-r--r--cogl/winsys/cogl-winsys-egl-mir.c50
2 files changed, 99 insertions, 11 deletions
diff --git a/cogl/cogl-mir-renderer.h b/cogl/cogl-mir-renderer.h
index f3da5ea2..d3f10feb 100644
--- a/cogl/cogl-mir-renderer.h
+++ b/cogl/cogl-mir-renderer.h
@@ -80,6 +80,66 @@ cogl_mir_renderer_set_foreign_connection (CoglRenderer *renderer,
MirConnection *
cogl_mir_renderer_get_connection (CoglRenderer *renderer);
+/*
+ * CoglMirEvent:
+ * @onscreen: pointer to a #CoglOnscreen structure
+ * @surface: pointer to a #MirSurface structure
+ * @event: pointer to a #MirEvent structure
+ */
+typedef struct
+{
+ CoglOnscreen *onscreen;
+ MirSurface *surface;
+ MirEvent *event;
+} CoglMirEvent;
+
+/*
+ * CoglMirEventCallback:
+ * @event: pointer to a CoglMirEvent structure
+ * @data: (closure): the data that was given when the filter was added
+ *
+ * A callback function that can be registered with
+ * cogl_mir_renderer_add_event_listener().
+ *
+ * Since: 1.8
+ * Stability: unstable
+ */
+typedef void (* CoglMirEventCallback) (CoglMirEvent *event,
+ void *data);
+
+/*
+ * cogl_mir_renderer_add_event_listener:
+ * @renderer: a #CoglRenderer
+ * @func: the callback function
+ * @data: user data passed to @func when called
+ *
+ * Adds a callback function that will receive all native events.
+ *
+ * Since: 1.8
+ * Stability: unstable
+ */
+void
+cogl_mir_renderer_add_event_listener (CoglRenderer *renderer,
+ CoglMirEventCallback func,
+ void *data);
+
+/*
+ * cogl_mir_renderer_remove_event_listener:
+ * @renderer: a #CoglRenderer
+ * @func: the callback function
+ * @data: user data given when the callback was installed
+ *
+ * Removes a callback that was previously added with
+ * cogl_mir_renderer_add_filter().
+ *
+ * Since: 1.8
+ * Stability: unstable
+ */
+void
+cogl_mir_renderer_remove_event_listener (CoglRenderer *renderer,
+ CoglMirEventCallback func,
+ void *data);
+
COGL_END_DECLS
#endif /* __COGL_MIR_RENDERER_H__ */
diff --git a/cogl/winsys/cogl-winsys-egl-mir.c b/cogl/winsys/cogl-winsys-egl-mir.c
index 6c0dbe3c..dba0012a 100644
--- a/cogl/winsys/cogl-winsys-egl-mir.c
+++ b/cogl/winsys/cogl-winsys-egl-mir.c
@@ -328,6 +328,7 @@ make_dummy_surface (CoglDisplay *display,
mir_display->dummy_mir_surface =
mir_connection_create_surface_sync (mir_renderer->mir_connection, &surfaceparm);
+
if (!mir_surface_is_valid (mir_display->dummy_mir_surface))
{
error_message = "Failed to create a dummy mir surface";
@@ -475,15 +476,18 @@ flush_pending_resize_notifications_idle (void *user_data)
NULL);
}
-static void _mir_surface_event_cb(MirSurface* surface, MirEvent const* event, void* data)
+static void _mir_surface_event_cb (MirSurface *surface,
+ MirEvent const *event,
+ void *data)
{
CoglOnscreen *onscreen = data;
+ CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
+ CoglContext *context = framebuffer->context;
+ CoglRenderer *renderer = context->display->renderer;
+ CoglMirEvent mir_event = { onscreen, surface, (MirEvent *) event };
if (event->type == mir_event_type_resize)
{
- CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
- CoglContext *context = framebuffer->context;
- CoglRenderer *renderer = context->display->renderer;
CoglRendererEGL *egl_renderer = renderer->winsys;
CoglOnscreenEGL *egl_onscreen = onscreen->winsys;
CoglOnscreenMir *mir_onscreen = egl_onscreen->platform;
@@ -495,16 +499,18 @@ static void _mir_surface_event_cb(MirSurface* surface, MirEvent const* event, vo
mir_onscreen->requested_height = event->resize.height;
if (!egl_renderer->resize_notify_idle)
- {
- egl_renderer->resize_notify_idle =
- _cogl_poll_renderer_add_idle (renderer,
- flush_pending_resize_notifications_idle,
- context,
- NULL);
- }
+ {
+ egl_renderer->resize_notify_idle =
+ _cogl_poll_renderer_add_idle (renderer,
+ flush_pending_resize_notifications_idle,
+ context,
+ NULL);
+ }
g_mutex_unlock (&mir_onscreen->mir_event_lock);
}
+
+ _cogl_renderer_handle_native_event (renderer, &mir_event);
}
static CoglBool
@@ -717,6 +723,28 @@ cogl_mir_renderer_get_connection (CoglRenderer *renderer)
return NULL;
}
+void
+cogl_mir_renderer_add_event_listener (CoglRenderer *renderer,
+ CoglMirEventCallback func,
+ void *data)
+{
+ _COGL_RETURN_IF_FAIL (cogl_is_renderer (renderer));
+
+ _cogl_renderer_add_native_filter (renderer,
+ (CoglNativeFilterFunc)func, data);
+}
+
+void
+cogl_mir_renderer_remove_event_listener (CoglRenderer *renderer,
+ CoglMirEventCallback func,
+ void *data)
+{
+ _COGL_RETURN_IF_FAIL (cogl_is_renderer (renderer));
+
+ _cogl_renderer_remove_native_filter (renderer,
+ (CoglNativeFilterFunc)func, data);
+}
+
CoglBool
cogl_mir_onscreen_set_foreign_surface (CoglOnscreen *onscreen,
MirSurface *surface)