[vlc-devel] [PATCH 1/2] core: window: add a new event callback
Rémi Denis-Courmont
remi at remlab.net
Fri Nov 25 18:33:10 CET 2016
On November 25, 2016 6:39:34 PM GMT+02:00, Thomas Guillem <thomas at gllm.fr> wrote:
>vout_window_ReportSize and vout_window_ReportClose use this new
>callback.
>---
> include/vlc_vout_window.h | 26 ++++++++++++++++++++------
> src/video_output/opengl.c | 17 ++++++++++++++++-
> src/video_output/window.c | 24 +++++++++++++++++++++---
> 3 files changed, 57 insertions(+), 10 deletions(-)
>
>diff --git a/include/vlc_vout_window.h b/include/vlc_vout_window.h
>index 63351ba..c302e28 100644
>--- a/include/vlc_vout_window.h
>+++ b/include/vlc_vout_window.h
>@@ -64,6 +64,11 @@ enum {
> VOUT_WINDOW_SET_FULLSCREEN, /* int b_fullscreen */
> };
>
>+enum {
>+ VOUT_WINDOW_EVENT_RESIZED, /* unsigned width, unsigned height */
>+ VOUT_WINDOW_EVENT_CLOSED, /* void */
>+};
>+
> typedef struct vout_window_cfg_t {
> /* Window handle type */
> unsigned type;
>@@ -86,8 +91,7 @@ typedef struct vout_window_cfg_t {
>
> typedef struct vout_window_owner {
> void *sys;
>- void (*resized)(vout_window_t *, unsigned width, unsigned height);
>- void (*closed)(vout_window_t *);
>+ void (*event)(vout_window_t *, int type, va_list args);
> } vout_window_owner_t;
>
> /**
>@@ -198,17 +202,27 @@ static inline int
>vout_window_SetFullScreen(vout_window_t *window, bool full)
> return vout_window_Control(window, VOUT_WINDOW_SET_FULLSCREEN, full);
> }
>
>+static inline void vout_window_SendEvent(vout_window_t *window, int
>type, ...)
>+{
>+ if (window->owner.event != NULL)
>+ {
>+ va_list args;
>+
>+ va_start(args, type);
>+ window->owner.event(window, type, args);
>+ va_end(args);
>+ }
>+}
>+
> static inline void vout_window_ReportSize(vout_window_t *window,
> unsigned width, unsigned height)
> {
>- if (window->owner.resized != NULL)
>- window->owner.resized(window, width, height);
>+ vout_window_SendEvent(window, VOUT_WINDOW_EVENT_RESIZED, width,
>height);
> }
>
> static inline void vout_window_ReportClose(vout_window_t *window)
> {
>- if (window->owner.closed != NULL)
>- window->owner.closed(window);
>+ vout_window_SendEvent(window, VOUT_WINDOW_EVENT_CLOSED);
> }
>
> /** @} */
>diff --git a/src/video_output/opengl.c b/src/video_output/opengl.c
>index ac16c3f..1a42253 100644
>--- a/src/video_output/opengl.c
>+++ b/src/video_output/opengl.c
>@@ -106,6 +106,21 @@ static void
>vlc_gl_surface_ResizeNotify(vout_window_t *surface,
> vlc_mutex_unlock(&sys->lock);
> }
>
>+static void vlc_gl_surface_Event(vout_window_t *wnd, int type, va_list
>args)
>+{
>+ switch (type)
>+ {
>+ case VOUT_WINDOW_EVENT_RESIZED:
>+ vlc_gl_surface_ResizeNotify(wnd, va_arg(args, unsigned),
>+ va_arg(args, unsigned));
>+ break;
>+ case VOUT_WINDOW_EVENT_CLOSED:
>+ /* TODO */
>+ break;
>+ default: vlc_assert_unreachable();
>+ }
>+}
>+
> vlc_gl_t *vlc_gl_surface_Create(vlc_object_t *obj,
> const vout_window_cfg_t *cfg,
> struct vout_window_t **restrict wp)
>@@ -120,7 +135,7 @@ vlc_gl_t *vlc_gl_surface_Create(vlc_object_t *obj,
>
> vout_window_owner_t owner = {
> .sys = sys,
>- .resized = vlc_gl_surface_ResizeNotify,
>+ .event = vlc_gl_surface_Event,
> };
>
> vout_window_t *surface = vout_window_New(obj, "$window", cfg, &owner);
>diff --git a/src/video_output/window.c b/src/video_output/window.c
>index 2487668..11ed099 100644
>--- a/src/video_output/window.c
>+++ b/src/video_output/window.c
>@@ -65,7 +65,7 @@ vout_window_t *vout_window_New(vlc_object_t *obj,
>const char *module,
> if (owner != NULL)
> window->owner = *owner;
> else
>- window->owner.resized = NULL;
>+ window->owner.event = NULL;
>
> w->module = vlc_module_load(window, "vout window", module,
> module && *module,
>@@ -149,6 +149,25 @@ static void
>vout_display_window_CloseNotify(vout_window_t *window)
> vout_SendEventClose(vout);
> }
>
>+static void vout_display_window_Event(vout_window_t *window, int type,
>+ va_list args)
>+{
>+ switch (type)
>+ {
>+ case VOUT_WINDOW_EVENT_RESIZED:
>+ {
>+ unsigned width = va_arg(args, unsigned);
>+ unsigned height = va_arg(args, unsigned);
>+ vout_display_window_ResizeNotify(window, width, height);
>+ break;
>+ }
>+ case VOUT_WINDOW_EVENT_CLOSED:
>+ vout_display_window_CloseNotify(window);
>+ break;
>+ default: vlc_assert_unreachable();
>+ }
>+}
>+
> /**
> * Creates a video window, initially without any attached display.
> */
>@@ -166,8 +185,7 @@ vout_window_t
>*vout_display_window_New(vout_thread_t *vout,
>
> vout_window_owner_t owner = {
> .sys = state,
>- .resized = vout_display_window_ResizeNotify,
>- .closed = vout_display_window_CloseNotify,
>+ .event = vout_display_window_Event,
> };
> vout_window_t *window;
>
>--
>2.9.3
>
>_______________________________________________
>vlc-devel mailing list
>To unsubscribe or modify your subscription options:
>https://mailman.videolan.org/listinfo/vlc-devel
That looks backward to me. What is the benefit of muxing those events??
--
Rémi Denis-Courmont
More information about the vlc-devel
mailing list