[Cogl] [PATCH 4/4] wayland: Add API to prevent Cogl from dispatching the wayland display

Robert Bragg robert at sixbynine.org
Tue Jul 9 05:19:26 PDT 2013


This looks good to land to me:

Reviewed-by: Robert Bragg <robert at linux.intel.com>

thanks,
- Robert

On Thu, Jul 4, 2013 at 1:46 PM, Neil Roberts <neil at linux.intel.com> wrote:
> This adds cogl_wayland_renderer_set_event_dispatch_enabled() which can
> be used to prevent Cogl from adding the socket for the Wayland display
> to its list of file descriptors to poll. This can be used in
> applications that want to integrate Cogl with existing code that is
> reading from the Wayland socket itself.
> ---
>  cogl/cogl-renderer-private.h           |  1 +
>  cogl/cogl-renderer.c                   |  4 ++++
>  cogl/cogl-wayland-renderer.h           | 22 ++++++++++++++++++++++
>  cogl/winsys/cogl-winsys-egl-wayland.c  | 27 ++++++++++++++++++++-------
>  doc/reference/cogl2/cogl2-sections.txt |  1 +
>  5 files changed, 48 insertions(+), 7 deletions(-)
>
> diff --git a/cogl/cogl-renderer-private.h b/cogl/cogl-renderer-private.h
> index dfc79c6..8b8d2bf 100644
> --- a/cogl/cogl-renderer-private.h
> +++ b/cogl/cogl-renderer-private.h
> @@ -77,6 +77,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 33e086c..265719a 100644
> --- a/cogl/cogl-renderer.c
> +++ b/cogl/cogl-renderer.c
> @@ -288,6 +288,10 @@ cogl_renderer_new (void)
>    renderer->win32_enable_event_retrieval = TRUE;
>  #endif
>
> +#ifdef COGL_HAS_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 3f9e434..20b0b49 100644
> --- a/cogl/cogl-wayland-renderer.h
> +++ b/cogl/cogl-wayland-renderer.h
> @@ -52,6 +52,28 @@ 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 fad0cae..f5a6047 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;
>
> @@ -546,6 +548,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/cogl2/cogl2-sections.txt b/doc/reference/cogl2/cogl2-sections.txt
> index 1a6feee..1a6e343 100644
> --- a/doc/reference/cogl2/cogl2-sections.txt
> +++ b/doc/reference/cogl2/cogl2-sections.txt
> @@ -89,6 +89,7 @@ cogl_win32_renderer_set_event_retrieval_enabled
>
>  <SUBSECTION>
>  cogl_wayland_renderer_set_foreign_display
> +cogl_wayland_renderer_set_event_dispatch_enabled
>  cogl_wayland_renderer_get_display
>  </SECTION>
>
> --
> 1.7.11.3.g3c3efa5
>
> _______________________________________________
> Cogl mailing list
> Cogl at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/cogl


More information about the Cogl mailing list