[vlc-commits] demux: mkv: use ES_OUT_VOUT_SET_MOUSE_EVENT
Filip Roséen
git at videolan.org
Fri Jul 20 09:37:39 CEST 2018
vlc | branch: master | Filip Roséen <filip at atch.se> | Thu Jul 19 19:53:21 2018 +0200| [19b4ae52e7233f7aaa8d7f30efa564e1577896e1] | committer: Thomas Guillem
demux: mkv: use ES_OUT_VOUT_SET_MOUSE_EVENT
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=19b4ae52e7233f7aaa8d7f30efa564e1577896e1
---
modules/demux/mkv/events.cpp | 121 ++++++++++++++-----------------------------
modules/demux/mkv/events.hpp | 27 +++++++---
2 files changed, 59 insertions(+), 89 deletions(-)
diff --git a/modules/demux/mkv/events.cpp b/modules/demux/mkv/events.cpp
index 483d98fe56..ba9718522d 100644
--- a/modules/demux/mkv/events.cpp
+++ b/modules/demux/mkv/events.cpp
@@ -91,22 +91,20 @@ void event_thread_t::ResetPci()
vlc_join( thread, NULL );
is_running = false;
}
-int event_thread_t::EventMouse( vlc_object_t *p_this, char const *psz_var,
- vlc_value_t, vlc_value_t, void *p_data )
+
+void event_thread_t::EventMouse( vlc_mouse_t const* new_state, void* userdata )
{
- event_thread_t *p_ev = (event_thread_t *) p_data;
- vlc_mutex_lock( &p_ev->lock );
- if( psz_var[6] == 'c' )
- {
- p_ev->b_clicked = true;
- msg_Dbg( p_this, "Event Mouse: clicked");
- }
- else if( psz_var[6] == 'm' )
- p_ev->b_moved = true;
- vlc_cond_signal( &p_ev->wait );
- vlc_mutex_unlock( &p_ev->lock );
+ ESInfo* info = static_cast<ESInfo*>( userdata );
+ vlc_mutex_locker lock_guard( &info->owner.lock );
- return VLC_SUCCESS;
+ if( !new_state )
+ return vlc_mouse_Init( &info->mouse_state );
+
+ info->owner.pending_events.push_back(
+ EventInfo( info, info->mouse_state, *new_state ) );
+
+ vlc_cond_signal( &info->owner.wait );
+ info->mouse_state = *new_state;
}
int event_thread_t::EventKey( vlc_object_t *p_this, char const *,
@@ -122,43 +120,20 @@ int event_thread_t::EventKey( vlc_object_t *p_this, char const *,
return VLC_SUCCESS;
}
-int event_thread_t::EventInput( vlc_object_t *p_this, char const *,
- vlc_value_t, vlc_value_t newval, void *p_data )
-{
- VLC_UNUSED( p_this );
- event_thread_t *p_ev = (event_thread_t *) p_data;
- vlc_mutex_lock( &p_ev->lock );
- if( newval.i_int == INPUT_EVENT_VOUT )
- {
- p_ev->b_vout |= true;
- vlc_cond_signal( &p_ev->wait );
- }
- vlc_mutex_unlock( &p_ev->lock );
-
- return VLC_SUCCESS;
-}
-
void event_thread_t::EventThread()
{
- demux_sys_t *p_sys = (demux_sys_t *)p_demux->p_sys;
- vlc_object_t *p_vout = NULL;
int canc = vlc_savecancel ();
- b_moved = false;
- b_clicked = false;
i_key_action = 0;
- b_vout = true;
/* catch all key event */
var_AddCallback( p_demux->obj.libvlc, "key-action", EventKey, this );
- /* catch input event */
- var_AddCallback( p_demux->p_input, "intf-event", EventInput, this );
/* main loop */
for( ;; )
{
vlc_mutex_lock( &lock );
- while( !b_abort && !i_key_action && !b_moved && !b_clicked && !b_vout)
+ while( !b_abort && !i_key_action && pending_events.empty() )
vlc_cond_wait( &wait, &lock );
if( b_abort )
@@ -171,42 +146,24 @@ void event_thread_t::EventThread()
if( i_key_action )
HandleKeyEvent();
- /* MOUSE part */
- if( p_vout && ( b_moved || b_clicked ) )
- HandleMouseEvent( p_vout );
-
while( !pending_events.empty() )
{
- /* TODO: handle events here */
- pending_events.pop_front();
- }
-
-
- b_vout = false;
- vlc_mutex_unlock( &lock );
+ EventInfo const& ev = pending_events.front();
- /* Always check vout */
- if( p_vout == NULL )
- {
- p_vout = (vlc_object_t*) input_GetVout(p_demux->p_input);
- if( p_vout)
+ switch( ev.type )
{
- var_AddCallback( p_vout, "mouse-moved", EventMouse, this );
- var_AddCallback( p_vout, "mouse-clicked", EventMouse, this );
+ case EventInfo::ESMouseEvent:
+ HandleMouseEvent( ev );
+ break;
}
+
+ pending_events.pop_front();
}
- }
- /* Release callback */
- if( p_vout )
- {
- var_DelCallback( p_vout, "mouse-moved", EventMouse, this );
- var_DelCallback( p_vout, "mouse-clicked", EventMouse, this );
- vlc_object_release( p_vout );
+ vlc_mutex_unlock( &lock );
}
- var_DelCallback( p_demux->p_input, "intf-event", EventInput, this );
- var_DelCallback( p_demux->obj.libvlc, "key-action", EventKey, this );
+ var_DelCallback( p_demux->obj.libvlc, "key-action", EventKey, this );
vlc_restorecancel (canc);
}
@@ -340,15 +297,16 @@ void event_thread_t::HandleKeyEvent()
i_key_action = 0;
}
-void event_thread_t::HandleMouseEvent( vlc_object_t* p_vout )
+void event_thread_t::HandleMouseEvent( EventInfo const& event )
{
demux_sys_t* p_sys = (demux_sys_t*)p_demux->p_sys;
- int x, y;
+ int x = event.mouse.state_new.i_x;
+ int y = event.mouse.state_new.i_y;
- var_GetCoords( p_vout, "mouse-moved", &x, &y );
pci_t *pci = &pci_packet;
- if( b_clicked )
+ if( vlc_mouse_HasPressed( &event.mouse.state_old, &event.mouse.state_new,
+ MOUSE_BUTTON_LEFT ) )
{
int32_t button;
int32_t best,dist,d;
@@ -438,28 +396,29 @@ void event_thread_t::HandleMouseEvent( vlc_object_t* p_vout )
vlc_mutex_lock( &lock );
}
}
- else if( b_moved )
+ else if( vlc_mouse_HasMoved( &event.mouse.state_old, &event.mouse.state_new ) )
{
// dvdnav_mouse_select( NULL, pci, x, y );
}
-
- b_moved = false;
- b_clicked = false;
}
void event_thread_t::AddES( es_out_id_t* es, int category )
{
vlc_mutex_locker lock_guard( &lock );
- es_list.push_back( ESInfo( es, category, *this ) );
- es_list_t::reverse_iterator info = es_list.rbegin();
+ es_list.push_front( ESInfo( es, category, *this ) );
+ es_list_t::iterator info = es_list.begin();
- /* TODO:
- * - subscribe to events if required,
- * - use &*info as callback data if necessary
- **/
-
- VLC_UNUSED( info );
+ if( category == VIDEO_ES )
+ {
+ if( es_out_Control( p_demux->out, ES_OUT_VOUT_SET_MOUSE_EVENT,
+ es, EventMouse, static_cast<void*>( &*info ) ) )
+ {
+ msg_Warn( p_demux, "Unable to subscribe to mouse events" );
+ es_list.erase( info );
+ return;
+ }
+ }
}
void event_thread_t::DelES( es_out_id_t* es )
diff --git a/modules/demux/mkv/events.hpp b/modules/demux/mkv/events.hpp
index 1a94a13cc2..2800d0f09d 100644
--- a/modules/demux/mkv/events.hpp
+++ b/modules/demux/mkv/events.hpp
@@ -27,6 +27,7 @@
#include <vlc_common.h>
#include <vlc_threads.h>
+#include <vlc_mouse.h>
#include "dvd_types.hpp"
@@ -63,27 +64,40 @@ private:
es_out_id_t* es;
int category;
event_thread_t& owner;
+ vlc_mouse_t mouse_state;
};
struct EventInfo {
enum {
- /* XXX: event type */
+ ESMouseEvent,
+ ActionEvent,
} type;
+ EventInfo( ESInfo* info, vlc_mouse_t state_old, vlc_mouse_t state_new )
+ : type( ESMouseEvent )
+ {
+ mouse.es_info = info;
+ mouse.state_old = state_old;
+ mouse.state_new = state_new;
+ }
+
union {
- /* XXX: event specific data */
+ struct {
+ ESInfo* es_info;
+ vlc_mouse_t state_old;
+ vlc_mouse_t state_new;
+ } mouse;
};
};
void EventThread();
static void *EventThread(void *);
- static int EventMouse( vlc_object_t *, char const *, vlc_value_t, vlc_value_t, void * );
+ static void EventMouse( vlc_mouse_t const* state, void* userdata );
static int EventKey( vlc_object_t *, char const *, vlc_value_t, vlc_value_t, void * );
- static int EventInput( vlc_object_t *, char const *, vlc_value_t, vlc_value_t, void * );
void HandleKeyEvent();
- void HandleMouseEvent( vlc_object_t* p_vout );
+ void HandleMouseEvent( EventInfo const& );
demux_t *p_demux;
@@ -93,10 +107,7 @@ private:
vlc_mutex_t lock;
vlc_cond_t wait;
bool b_abort;
- bool b_moved;
- bool b_clicked;
int i_key_action;
- bool b_vout;
pci_t pci_packet;
typedef std::list<ESInfo> es_list_t;
More information about the vlc-commits
mailing list