]> git.sesse.net Git - vlc/blobdiff - modules/gui/qt4/extensions_manager.cpp
Qt: Preferences: rename slot too
[vlc] / modules / gui / qt4 / extensions_manager.cpp
index 653627c4241ed1eeb8dbe55d886348814fc2a39d..29538dc771baab1e4e3d8e70956f3ae68f52b81a 100644 (file)
@@ -25,6 +25,7 @@
 #include "input_manager.hpp"
 #include "dialogs/extensions.hpp"
 
+#include <vlc_modules.h>
 #include "assert.h"
 
 #include <QMenu>
@@ -47,14 +48,18 @@ ExtensionsManager::ExtensionsManager( intf_thread_t *_p_intf, QObject *parent )
 
     menuMapper = new QSignalMapper( this );
     CONNECT( menuMapper, mapped( int ), this, triggerMenu( int ) );
-    CONNECT( THEMIM, inputChanged( input_thread_t* ),
-             this, inputChanged( input_thread_t* ) );
+    CONNECT( THEMIM->getIM(), playingStatusChanged( int ), this, playingChanged( int ) );
+    DCONNECT( THEMIM, inputChanged( input_thread_t* ),
+              this, inputChanged( input_thread_t* ) );
+    CONNECT( THEMIM->getIM(), metaChanged( input_item_t* ),
+             this, metaChanged( input_item_t* ) );
     b_unloading = false;
     b_failed = false;
 }
 
 ExtensionsManager::~ExtensionsManager()
 {
+    msg_Dbg( p_intf, "Killing extension dialog provider" );
     ExtensionsDialogProvider::killInstance();
     if( p_extensions_manager )
     {
@@ -75,7 +80,6 @@ bool ExtensionsManager::loadExtensions()
             emit extensionsUpdated();
             return false;
         }
-        vlc_object_attach( p_extensions_manager, p_intf );
 
         p_extensions_manager->p_module =
                 module_need( p_extensions_manager, "extension", NULL, false );
@@ -116,11 +120,10 @@ void ExtensionsManager::unloadExtensions()
     if( !p_extensions_manager )
         return;
     b_unloading = true;
+    ExtensionsDialogProvider::killInstance();
     module_unneed( p_extensions_manager, p_extensions_manager->p_module );
     vlc_object_release( p_extensions_manager );
     p_extensions_manager = NULL;
-    emit extensionsUpdated();
-    ExtensionsDialogProvider::killInstance();
 }
 
 void ExtensionsManager::reloadExtensions()
@@ -150,7 +153,7 @@ void ExtensionsManager::menu( QMenu *current )
 
         if( b_Active && extension_HasMenu( p_extensions_manager, p_ext ) )
         {
-            QMenu *submenu = new QMenu( qfu( p_ext->psz_title ) );
+            QMenu *submenu = new QMenu( qfu( p_ext->psz_title ), current );
             char **ppsz_titles = NULL;
             uint16_t *pi_ids = NULL;
             size_t i_num = 0;
@@ -169,12 +172,15 @@ void ExtensionsManager::menu( QMenu *current )
                     menuMapper->setMapping( action,
                                             MENU_MAP( pi_ids[i], i_ext ) );
                     CONNECT( action, triggered(), menuMapper, map() );
+                    free( ppsz_titles[i] );
                 }
                 if( !i_num )
                 {
                     action = submenu->addAction( qtr( "Empty" ) );
                     action->setEnabled( false );
                 }
+                free( ppsz_titles );
+                free( pi_ids );
             }
             else
             {
@@ -256,8 +262,9 @@ void ExtensionsManager::triggerMenu( int id )
 
 void ExtensionsManager::inputChanged( input_thread_t* p_input )
 {
-    if( p_input )
-        vlc_object_hold( p_input );
+    //This is unlikely, but can happen if no extension modules can be loaded.
+    if ( p_extensions_manager == NULL )
+        return ;
     vlc_mutex_lock( &p_extensions_manager->lock );
 
     extension_t *p_ext;
@@ -271,6 +278,42 @@ void ExtensionsManager::inputChanged( input_thread_t* p_input )
     FOREACH_END()
 
     vlc_mutex_unlock( &p_extensions_manager->lock );
-    if( p_input )
-        vlc_object_release( p_input );
+}
+
+void ExtensionsManager::playingChanged( int state )
+{
+    //This is unlikely, but can happen if no extension modules can be loaded.
+    if ( p_extensions_manager == NULL )
+        return ;
+    vlc_mutex_lock( &p_extensions_manager->lock );
+
+    extension_t *p_ext;
+    FOREACH_ARRAY( p_ext, p_extensions_manager->extensions )
+    {
+        if( extension_IsActivated( p_extensions_manager, p_ext ) )
+        {
+            extension_PlayingChanged( p_extensions_manager, p_ext, state );
+        }
+    }
+    FOREACH_END()
+
+    vlc_mutex_unlock( &p_extensions_manager->lock );
+}
+
+void ExtensionsManager::metaChanged( input_item_t* )
+{
+    //This is unlikely, but can happen if no extension modules can be loaded.
+    if ( p_extensions_manager == NULL )
+        return ;
+    vlc_mutex_lock( &p_extensions_manager->lock );
+    extension_t *p_ext;
+    FOREACH_ARRAY( p_ext, p_extensions_manager->extensions )
+    {
+        if( extension_IsActivated( p_extensions_manager, p_ext ) )
+        {
+            extension_MetaChanged( p_extensions_manager, p_ext );
+        }
+    }
+    FOREACH_END()
+    vlc_mutex_unlock( &p_extensions_manager->lock );
 }