]> git.sesse.net Git - vlc/blobdiff - modules/gui/qt4/extensions_manager.cpp
Merge branch 'master' into lpcm_encoder
[vlc] / modules / gui / qt4 / extensions_manager.cpp
index acca48026056e4c5220a54b984c14885f523b9e8..98e3b8f9a70372fac83b2a130eb939f6934d0dcf 100644 (file)
  *****************************************************************************/
 
 #include "extensions_manager.hpp"
+#include "input_manager.hpp"
 #include "dialogs/extensions.hpp"
 
+#include <vlc_modules.h>
 #include "assert.h"
 
 #include <QMenu>
@@ -46,11 +48,17 @@ ExtensionsManager::ExtensionsManager( intf_thread_t *_p_intf, QObject *parent )
 
     menuMapper = new QSignalMapper( this );
     CONNECT( menuMapper, mapped( int ), this, triggerMenu( int ) );
+    CONNECT( THEMIM->getIM(), statusChanged( int ), this, playingChanged( int ) );
+    DCONNECT( THEMIM, inputChanged( input_thread_t* ),
+              this, inputChanged( input_thread_t* ) );
     b_unloading = false;
+    b_failed = false;
 }
 
 ExtensionsManager::~ExtensionsManager()
 {
+    msg_Dbg( p_intf, "Killing extension dialog provider" );
+    ExtensionsDialogProvider::killInstance();
     if( p_extensions_manager )
     {
         module_unneed( p_extensions_manager, p_extensions_manager->p_module );
@@ -58,14 +66,18 @@ ExtensionsManager::~ExtensionsManager()
     }
 }
 
-void ExtensionsManager::loadExtensions()
+bool ExtensionsManager::loadExtensions()
 {
     if( !p_extensions_manager )
     {
         p_extensions_manager = ( extensions_manager_t* )
                     vlc_object_create( p_intf, sizeof( extensions_manager_t ) );
         if( !p_extensions_manager )
-            return;
+        {
+            b_failed = true;
+            emit extensionsUpdated();
+            return false;
+        }
         vlc_object_attach( p_extensions_manager, p_intf );
 
         p_extensions_manager->p_module =
@@ -74,7 +86,11 @@ void ExtensionsManager::loadExtensions()
         if( !p_extensions_manager->p_module )
         {
             msg_Err( p_intf, "Unable to load extensions module" );
-            return;
+            vlc_object_release( p_extensions_manager );
+            p_extensions_manager = NULL;
+            b_failed = true;
+            emit extensionsUpdated();
+            return false;
         }
 
         /* Initialize dialog provider */
@@ -83,10 +99,19 @@ void ExtensionsManager::loadExtensions()
         if( !p_edp )
         {
             msg_Err( p_intf, "Unable to create dialogs provider for extensions" );
-            return;
+            module_unneed( p_extensions_manager,
+                           p_extensions_manager->p_module );
+            vlc_object_release( p_extensions_manager );
+            p_extensions_manager = NULL;
+            b_failed = true;
+            emit extensionsUpdated();
+            return false;
         }
         b_unloading = false;
     }
+    b_failed = false;
+    emit extensionsUpdated();
+    return true;
 }
 
 void ExtensionsManager::unloadExtensions()
@@ -94,31 +119,31 @@ 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;
-    ExtensionsDialogProvider::killInstance();
+}
+
+void ExtensionsManager::reloadExtensions()
+{
+    unloadExtensions();
+    loadExtensions();
+    emit extensionsUpdated();
 }
 
 void ExtensionsManager::menu( QMenu *current )
 {
-    QAction *action;
     assert( current != NULL );
     if( !isLoaded() )
     {
-        // This case should not happen
-        action = current->addAction( qtr( "Extensions not loaded" ) );
-        action->setEnabled( false );
+        // This case can happen: do nothing
         return;
     }
 
-    /* Some useless message */
-    action = current->addAction( p_extensions_manager->extensions.i_size
-                                 ? qtr( "Extensions found:" )
-                                 : qtr( "No extensions found" ) );
-    action->setEnabled( false );
-    current->addSeparator();
+    vlc_mutex_lock( &p_extensions_manager->lock );
 
+    QAction *action;
     extension_t *p_ext = NULL;
     int i_ext = 0;
     FOREACH_ARRAY( p_ext, p_extensions_manager->extensions )
@@ -127,7 +152,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;
@@ -146,12 +171,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
             {
@@ -183,10 +211,7 @@ void ExtensionsManager::menu( QMenu *current )
     }
     FOREACH_END()
 
-    /* Possibility to unload the module */
-    current->addSeparator();
-    current->addAction( QIcon( ":/menu/quit" ), qtr( "Unload extensions" ),
-                        this, SLOT( unloadExtensions() ) );
+    vlc_mutex_unlock( &p_extensions_manager->lock );
 }
 
 void ExtensionsManager::triggerMenu( int id )
@@ -194,6 +219,8 @@ void ExtensionsManager::triggerMenu( int id )
     uint16_t i_ext = MENU_GET_EXTENSION( id );
     uint16_t i_action = MENU_GET_ACTION( id );
 
+    vlc_mutex_lock( &p_extensions_manager->lock );
+
     if( (int) i_ext > p_extensions_manager->extensions.i_size )
     {
         msg_Dbg( p_intf, "can't trigger extension with wrong id %d",
@@ -204,6 +231,8 @@ void ExtensionsManager::triggerMenu( int id )
     extension_t *p_ext = ARRAY_VAL( p_extensions_manager->extensions, i_ext );
     assert( p_ext != NULL);
 
+    vlc_mutex_unlock( &p_extensions_manager->lock );
+
     if( i_action == 0 )
     {
         msg_Dbg( p_intf, "activating or triggering extension '%s'",
@@ -229,3 +258,43 @@ void ExtensionsManager::triggerMenu( int id )
         extension_TriggerMenu( p_extensions_manager, p_ext, i_action );
     }
 }
+
+void ExtensionsManager::inputChanged( input_thread_t* 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;
+    FOREACH_ARRAY( p_ext, p_extensions_manager->extensions )
+    {
+        if( extension_IsActivated( p_extensions_manager, p_ext ) )
+        {
+            extension_SetInput( p_extensions_manager, p_ext, p_input );
+        }
+    }
+    FOREACH_END()
+
+    vlc_mutex_unlock( &p_extensions_manager->lock );
+}
+
+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 );
+}