[vlc-devel] [V4 PATCH 7/9] bluray: use ES_OUT_VOUT_SET_MOUSE_EVENT
Thomas Guillem
thomas at gllm.fr
Tue Jul 17 17:00:22 CEST 2018
---
modules/access/bluray.c | 47 +++++++++++++++++++----------------------
1 file changed, 22 insertions(+), 25 deletions(-)
diff --git a/modules/access/bluray.c b/modules/access/bluray.c
index 2c5b709351..80f1b6b882 100644
--- a/modules/access/bluray.c
+++ b/modules/access/bluray.c
@@ -42,6 +42,7 @@
#endif
#include <vlc_common.h>
+#include <vlc_mouse.h>
#include <vlc_plugin.h>
#include <vlc_demux.h> /* demux_t */
#include <vlc_input.h> /* Seekpoints, chapters */
@@ -183,6 +184,7 @@ typedef struct
/* */
vout_thread_t *p_vout;
+ vlc_mouse_t oldmouse;
es_out_id_t *p_dummy_video;
@@ -280,11 +282,9 @@ static int bluraySetTitle(demux_t *p_demux, int i_title);
static void blurayOverlayProc(void *ptr, const BD_OVERLAY * const overlay);
static void blurayArgbOverlayProc(void *ptr, const BD_ARGB_OVERLAY * const overlay);
-static int onMouseEvent(vlc_object_t *p_vout, const char *psz_var,
- vlc_value_t old, vlc_value_t val, void *p_data);
+static void onMouseEvent(const vlc_mouse_t *mouse, void *user_data);
static int onIntfEvent(vlc_object_t *, char const *,
vlc_value_t, vlc_value_t, void *);
-
static void blurayResetParser(demux_t *p_demux);
static void notifyDiscontinuity( demux_sys_t *p_sys );
@@ -349,9 +349,6 @@ static void blurayReleaseVout(demux_t *p_demux)
demux_sys_t *p_sys = p_demux->p_sys;
if (p_sys->p_vout != NULL) {
- var_DelCallback(p_sys->p_vout, "mouse-moved", onMouseEvent, p_demux);
- var_DelCallback(p_sys->p_vout, "mouse-clicked", onMouseEvent, p_demux);
-
for (int i = 0; i < MAX_OVERLAY; i++) {
bluray_overlay_t *p_ov = p_sys->p_overlays[i];
if (p_ov) {
@@ -423,6 +420,9 @@ static void startBackground(demux_t *p_demux)
es_out_Send(p_demux->out, p_sys->p_dummy_video, p_block);
+ es_out_Control( p_demux->out, ES_OUT_VOUT_SET_MOUSE_EVENT,
+ p_sys->p_dummy_video, onMouseEvent, p_demux );
+
out:
es_format_Clean(&fmt);
}
@@ -680,6 +680,8 @@ static int blurayOpen(vlc_object_t *object)
TAB_INIT(p_sys->i_title, p_sys->pp_title);
TAB_INIT(p_sys->i_attachments, p_sys->attachments);
+ vlc_mouse_Init(&p_sys->oldmouse);
+
vlc_mutex_init(&p_sys->pl_info_lock);
vlc_mutex_init(&p_sys->bdj_overlay_lock);
vlc_mutex_init(&p_sys->read_block_lock); /* used during bd_open_stream() */
@@ -1062,6 +1064,9 @@ static es_out_id_t *esOutAdd(es_out_t *p_out, const es_format_t *p_fmt)
}
}
}
+ if (p_es && fmt.i_cat == VIDEO_ES)
+ es_out_Control( p_demux->out, ES_OUT_VOUT_SET_MOUSE_EVENT, p_es,
+ onMouseEvent, p_demux );
es_format_Clean(&fmt);
return p_es;
}
@@ -1274,23 +1279,20 @@ static subpicture_t *bluraySubpictureCreate(bluray_overlay_t *p_ov)
/*****************************************************************************
* User input events:
*****************************************************************************/
-static int onMouseEvent(vlc_object_t *p_vout, const char *psz_var, vlc_value_t old,
- vlc_value_t val, void *p_data)
+static void onMouseEvent(const vlc_mouse_t *newmouse, void *user_data)
{
- demux_t *p_demux = (demux_t*)p_data;
+ demux_t *p_demux = user_data;
demux_sys_t *p_sys = p_demux->p_sys;
- VLC_UNUSED(old);
- VLC_UNUSED(p_vout);
- if (psz_var[6] == 'm') //Mouse moved
- bd_mouse_select(p_sys->bluray, -1, val.coords.x, val.coords.y);
- else if (psz_var[6] == 'c') {
- bd_mouse_select(p_sys->bluray, -1, val.coords.x, val.coords.y);
+ if (!newmouse)
+ vlc_mouse_Init(&p_sys->oldmouse);
+
+ if (vlc_mouse_HasMoved(&p_sys->oldmouse, newmouse))
+ bd_mouse_select(p_sys->bluray, -1, newmouse->i_x, newmouse->i_y);
+
+ if (vlc_mouse_HasPressed( &p_sys->oldmouse, newmouse, MOUSE_BUTTON_LEFT))
bd_user_input(p_sys->bluray, -1, BD_VK_MOUSE_ACTIVATE);
- } else {
- vlc_assert_unreachable();
- }
- return VLC_SUCCESS;
+ p_sys->oldmouse = *newmouse;
}
static int sendKeyEvent(demux_sys_t *p_sys, unsigned int key)
@@ -2439,13 +2441,8 @@ static void blurayHandleOverlays(demux_t *p_demux, int nread)
bool display = ov->status == ToDisplay;
vlc_mutex_unlock(&ov->lock);
if (display) {
- if (p_sys->p_vout == NULL) {
+ if (p_sys->p_vout == NULL)
p_sys->p_vout = input_GetVout(p_demux->p_input);
- if (p_sys->p_vout != NULL) {
- var_AddCallback(p_sys->p_vout, "mouse-moved", onMouseEvent, p_demux);
- var_AddCallback(p_sys->p_vout, "mouse-clicked", onMouseEvent, p_demux);
- }
- }
/* NOTE: we might want to enable background video always when there's no video stream playing.
Now, with some discs, there are perioids (even seconds) during which the video window
--
2.18.0
More information about the vlc-devel
mailing list