diff --git a/cogl/cogl-renderer-private.h b/cogl/cogl-renderer-private.h index 75ae1493f..3e2601f67 100644 --- a/cogl/cogl-renderer-private.h +++ b/cogl/cogl-renderer-private.h @@ -76,6 +76,7 @@ struct _CoglRenderer #if defined (COGL_HAS_EGL_PLATFORM_WAYLAND_SUPPORT) struct wl_display *foreign_wayland_display; + CoglBool wayland_enable_event_dispatch; #endif #ifdef COGL_HAS_SDL_SUPPORT diff --git a/cogl/cogl-renderer.c b/cogl/cogl-renderer.c index e3008db79..41b1eaa4f 100644 --- a/cogl/cogl-renderer.c +++ b/cogl/cogl-renderer.c @@ -197,6 +197,10 @@ cogl_renderer_new (void) renderer->win32_enable_event_retrieval = TRUE; #endif +#ifdef COGL_HAS_EGL_PLATFORM_WAYLAND_SUPPORT + renderer->wayland_enable_event_dispatch = TRUE; +#endif + return _cogl_renderer_object_new (renderer); } diff --git a/cogl/cogl-wayland-renderer.h b/cogl/cogl-wayland-renderer.h index 3f9e4341e..20b0b4944 100644 --- a/cogl/cogl-wayland-renderer.h +++ b/cogl/cogl-wayland-renderer.h @@ -51,6 +51,28 @@ void cogl_wayland_renderer_set_foreign_display (CoglRenderer *renderer, struct wl_display *display); +/** + * cogl_wayland_renderer_set_event_dispatch_enabled: + * @renderer: A #CoglRenderer + * @enable: The new value + * + * Sets whether Cogl should handle calling wl_display_dispatch() and + * wl_display_flush() as part of its main loop integration via + * cogl_poll_renderer_get_info() and cogl_poll_renderer_dispatch(). + * The default value is %TRUE. When it is enabled the application can + * register listeners for Wayland interfaces and the callbacks will be + * invoked during cogl_poll_renderer_dispatch(). If the application + * wants to integrate with its own code that is already handling + * reading from the Wayland display socket, it should disable this to + * avoid having competing code read from the socket. + * + * Since: 1.16 + * Stability: unstable + */ +void +cogl_wayland_renderer_set_event_dispatch_enabled (CoglRenderer *renderer, + CoglBool enable); + /** * cogl_wayland_renderer_get_display: * @renderer: A #CoglRenderer diff --git a/cogl/winsys/cogl-winsys-egl-wayland.c b/cogl/winsys/cogl-winsys-egl-wayland.c index 4b4d522fd..4b4e377e0 100644 --- a/cogl/winsys/cogl-winsys-egl-wayland.c +++ b/cogl/winsys/cogl-winsys-egl-wayland.c @@ -233,13 +233,15 @@ _cogl_winsys_renderer_connect (CoglRenderer *renderer, if (!_cogl_winsys_egl_renderer_connect_common (renderer, error)) goto error; - wayland_renderer->fd = wl_display_get_fd(wayland_renderer->wayland_display); - _cogl_poll_renderer_add_fd (renderer, - wayland_renderer->fd, - COGL_POLL_FD_EVENT_IN, - prepare_wayland_display_events, - dispatch_wayland_display_events, - renderer); + wayland_renderer->fd = wl_display_get_fd (wayland_renderer->wayland_display); + + if (renderer->wayland_enable_event_dispatch) + _cogl_poll_renderer_add_fd (renderer, + wayland_renderer->fd, + COGL_POLL_FD_EVENT_IN, + prepare_wayland_display_events, + dispatch_wayland_display_events, + renderer); return TRUE; @@ -547,6 +549,17 @@ cogl_wayland_renderer_set_foreign_display (CoglRenderer *renderer, renderer->foreign_wayland_display = display; } +void +cogl_wayland_renderer_set_event_dispatch_enabled (CoglRenderer *renderer, + CoglBool enable) +{ + _COGL_RETURN_IF_FAIL (cogl_is_renderer (renderer)); + /* NB: Renderers are considered immutable once connected */ + _COGL_RETURN_IF_FAIL (!renderer->connected); + + renderer->wayland_enable_event_dispatch = enable; +} + struct wl_display * cogl_wayland_renderer_get_display (CoglRenderer *renderer) { diff --git a/doc/reference/cogl-2.0-experimental/cogl-2.0-experimental-sections.txt b/doc/reference/cogl-2.0-experimental/cogl-2.0-experimental-sections.txt index 9b31f3a47..00ed18ffd 100644 --- a/doc/reference/cogl-2.0-experimental/cogl-2.0-experimental-sections.txt +++ b/doc/reference/cogl-2.0-experimental/cogl-2.0-experimental-sections.txt @@ -89,6 +89,7 @@ cogl_win32_renderer_set_event_retrieval_enabled cogl_wayland_renderer_set_foreign_display +cogl_wayland_renderer_set_event_dispatch_enabled cogl_wayland_renderer_get_display