vlc/vlc-3.0 | branch: master | Hugo Beauzée-Luyssen <[email protected]> | Thu Jan 18 15:49:11 2018 +0100| [13bbb6d92a72f6c85f01cbc8480dc80fa5ce91a9] | committer: Jean-Baptiste Kempf
qt: actions_manager: Add/remove renderers from the UI thread (cherry picked from commit b8e04501acce3a1f6abc671c97cd07cce5d7c362) Signed-off-by: Jean-Baptiste Kempf <[email protected]> > http://git.videolan.org/gitweb.cgi/vlc/vlc-3.0.git/?a=commit;h=13bbb6d92a72f6c85f01cbc8480dc80fa5ce91a9 --- modules/gui/qt/actions_manager.cpp | 56 ++++++++++++++++++++++++++++---------- modules/gui/qt/actions_manager.hpp | 9 +++++- 2 files changed, 49 insertions(+), 16 deletions(-) diff --git a/modules/gui/qt/actions_manager.cpp b/modules/gui/qt/actions_manager.cpp index 98f42023ee..3555d4eda0 100644 --- a/modules/gui/qt/actions_manager.cpp +++ b/modules/gui/qt/actions_manager.cpp @@ -40,7 +40,12 @@ ActionsManager::ActionsManager( intf_thread_t * _p_i ) : p_intf( _p_i ) -{ } +{ + CONNECT( this, rendererItemAdded( vlc_renderer_item_t* ), + this, onRendererItemAdded( vlc_renderer_item_t* ) ); + CONNECT( this, rendererItemRemoved( vlc_renderer_item_t* ), + this, onRendererItemRemoved( vlc_renderer_item_t* ) ); +} ActionsManager::~ActionsManager() { @@ -209,21 +214,22 @@ void ActionsManager::skipBackward() THEMIM->getIM()->jumpBwd(); } -bool ActionsManager::compareRenderers( const QVariant &obj, vlc_renderer_item_t* p_item ) +vlc_renderer_item_t* ActionsManager::compareRenderers( const QVariant &obj, vlc_renderer_item_t* p_item ) { if (!obj.canConvert<QVariantHash>()) - return false; + return NULL; QVariantHash qvh = obj.value<QVariantHash>(); if (!qvh.contains( "sout" )) - return false; + return NULL; vlc_renderer_item_t* p_existing = reinterpret_cast<vlc_renderer_item_t*>( qvh["sout"].value<void*>() ); - return !strcasecmp(vlc_renderer_item_sout( p_existing ), - vlc_renderer_item_sout( p_item ) ); + if ( !strcasecmp(vlc_renderer_item_sout( p_existing ), + vlc_renderer_item_sout( p_item ) ) ) + return p_existing; + return NULL; } -void ActionsManager::renderer_event_item_added( vlc_renderer_discovery_t*, - vlc_renderer_item_t *p_item ) +void ActionsManager::onRendererItemAdded(vlc_renderer_item_t* p_item) { QAction *firstSeparator = NULL; @@ -236,14 +242,16 @@ void ActionsManager::renderer_event_item_added( vlc_renderer_discovery_t*, } QVariant v = action->data(); if (compareRenderers( action->data(), p_item )) + { + vlc_renderer_item_release( p_item ); return; /* we already have this item */ + } } QAction *action = new QAction( vlc_renderer_item_flags(p_item) & VLC_RENDERER_CAN_VIDEO ? QIcon( ":/sidebar/movie.svg" ) : QIcon( ":/sidebar/music.svg" ), vlc_renderer_item_name(p_item), VLCMenuBar::rendererMenu ); action->setCheckable(true); - vlc_renderer_item_hold( p_item ); QVariantHash data; data.insert( "sout", QVariant::fromValue( reinterpret_cast<void*>( p_item ) ) ); action->setData( data ); @@ -254,21 +262,39 @@ void ActionsManager::renderer_event_item_added( vlc_renderer_discovery_t*, } } -void ActionsManager::renderer_event_item_removed( - vlc_renderer_discovery_t *, vlc_renderer_item_t *p_item ) +void ActionsManager::onRendererItemRemoved( vlc_renderer_item_t* p_item ) { foreach (QAction* action, VLCMenuBar::rendererMenu->actions()) { if (action->isSeparator()) continue; - if (compareRenderers( action->data(), p_item )) + vlc_renderer_item_t *p_existing = compareRenderers( action->data(), p_item ); + if (p_existing) { VLCMenuBar::rendererMenu->removeAction( action ); VLCMenuBar::rendererGroup->removeAction( action ); - vlc_renderer_item_release( p_item ); - return; + vlc_renderer_item_release( p_existing ); + break; } } + // Always release the item as we acquired it before emiting the signal + vlc_renderer_item_release( p_item ); +} + +void ActionsManager::renderer_event_item_added( vlc_renderer_discovery_t* p_rd, + vlc_renderer_item_t *p_item ) +{ + ActionsManager *self = reinterpret_cast<ActionsManager*>( p_rd->owner.sys ); + vlc_renderer_item_hold( p_item ); + self->emit rendererItemAdded( p_item ); +} + +void ActionsManager::renderer_event_item_removed( vlc_renderer_discovery_t *p_rd, + vlc_renderer_item_t *p_item ) +{ + ActionsManager *self = reinterpret_cast<ActionsManager*>( p_rd->owner.sys ); + vlc_renderer_item_hold( p_item ); + self->emit rendererItemRemoved( p_item ); } void ActionsManager::ScanRendererAction(bool checked) @@ -296,7 +322,7 @@ void ActionsManager::ScanRendererAction(bool checked) struct vlc_renderer_discovery_owner owner = { - p_intf, + this, renderer_event_item_added, renderer_event_item_removed, }; diff --git a/modules/gui/qt/actions_manager.hpp b/modules/gui/qt/actions_manager.hpp index 1346462ea1..f1581b0862 100644 --- a/modules/gui/qt/actions_manager.hpp +++ b/modules/gui/qt/actions_manager.hpp @@ -81,7 +81,8 @@ private: vlc_renderer_item_t * ); static void renderer_event_item_removed( vlc_renderer_discovery_t *, vlc_renderer_item_t * ); - static bool compareRenderers( const QVariant &m_obj, vlc_renderer_item_t* p_item ); + static vlc_renderer_item_t* compareRenderers( const QVariant &m_obj, + vlc_renderer_item_t* p_item ); public slots: void toggleMuteAudio(); @@ -95,12 +96,18 @@ public slots: void RendererSelected( QAction * ); protected slots: + void onRendererItemAdded( vlc_renderer_item_t* ); + void onRendererItemRemoved( vlc_renderer_item_t* ); void fullscreen(); void snapshot(); void playlist(); void frame(); virtual void doAction( int ); + +signals: + void rendererItemAdded( vlc_renderer_item_t* ); + void rendererItemRemoved( vlc_renderer_item_t* ); }; #endif _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
