]> git.sesse.net Git - vlc/commitdiff
Final fix for extensions+Qt unload issues
authorJean-Philippe André <jpeg@videolan.org>
Thu, 4 Feb 2010 01:51:00 +0000 (02:51 +0100)
committerJean-Philippe André <jpeg@videolan.org>
Thu, 4 Feb 2010 02:08:41 +0000 (03:08 +0100)
Well... I hope it is final :)

modules/gui/qt4/dialogs/extensions.cpp
modules/gui/qt4/dialogs/extensions.hpp
modules/gui/qt4/extensions_manager.cpp

index e1740d91aaf339dceeb2d0f23c57af065e7986b8..b0b8dbff0408c672150e59f2030c378552f387b0 100644 (file)
@@ -37,6 +37,7 @@
 #include <QListWidget>
 #include <QComboBox>
 #include <QCloseEvent>
+#include <QCoreApplication>
 
 ExtensionsDialogProvider *ExtensionsDialogProvider::instance = NULL;
 
@@ -113,6 +114,7 @@ ExtensionDialog* ExtensionsDialogProvider::UpdateExtDialog(
     {
         dialog = CreateExtDialog( p_dialog );
         dialog->setVisible( !p_dialog->b_hide );
+        dialog->has_lock = false;
     }
     else if( !p_dialog->b_kill && dialog )
     {
@@ -172,11 +174,11 @@ ExtensionDialog::ExtensionDialog( intf_thread_t *_p_intf,
                                   extensions_manager_t *p_mgr,
                                   extension_dialog_t *_p_dialog )
          : QDialog( NULL ), p_intf( _p_intf ), p_extensions_manager( p_mgr )
-         , p_dialog( _p_dialog ), has_lock(false)
+         , p_dialog( _p_dialog ), has_lock(true)
 {
     assert( p_dialog );
     CONNECT( ExtensionsDialogProvider::getInstance(), destroyed(),
-             this, deleteLater() );
+             this, parentDestroyed() );
 
     msg_Dbg( p_intf, "Creating a new dialog: '%s'", p_dialog->psz_title );
 #if HAS_QT45
@@ -661,6 +663,12 @@ void ExtensionDialog::closeEvent( QCloseEvent *event )
     msg_Dbg( p_intf, "Dialog '%s' received a closeEvent",
              p_dialog->psz_title );
     extension_DialogClosed( p_dialog );
-    p_dialog->p_sys_intf = NULL;
 }
 
+void ExtensionDialog::parentDestroyed()
+{
+    msg_Dbg( p_intf, "About to destroy dialog '%s'", p_dialog->psz_title );
+    deleteLater(); // May not work at this point (event loop can be ended)
+    p_dialog->p_sys_intf = NULL;
+    vlc_cond_signal( &p_dialog->cond );
+}
index 0313b46f6971a41b29c90ca48990abe02aefc814..d71a5a00245afeed266e6948cb2511032c137cb6 100644 (file)
@@ -112,6 +112,7 @@ private slots:
     int TriggerClick( QObject *object );
     void SyncInput( QObject *object );
     void SyncSelection( QObject *object );
+    void parentDestroyed();
 
 signals:
     void destroyDialog( extension_dialog_t *p_dialog );
index 653627c4241ed1eeb8dbe55d886348814fc2a39d..bc7911c45198e9c2be9b2bf59b2720a05c537183 100644 (file)
@@ -55,6 +55,7 @@ ExtensionsManager::ExtensionsManager( intf_thread_t *_p_intf, QObject *parent )
 
 ExtensionsManager::~ExtensionsManager()
 {
+    msg_Dbg( p_intf, "Killing extension dialog provider" );
     ExtensionsDialogProvider::killInstance();
     if( p_extensions_manager )
     {