[vlc-devel] [PATCH 1/2] core: window: add a new event callback
Thomas Guillem
thomas at gllm.fr
Fri Nov 25 17:39:34 CET 2016
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
More information about the vlc-devel
mailing list