]> git.sesse.net Git - vlc/commitdiff
Qt4: adapt to error changes
authorRémi Denis-Courmont <remi@remlab.net>
Sat, 4 Jul 2009 21:43:35 +0000 (00:43 +0300)
committerRémi Denis-Courmont <remi@remlab.net>
Sat, 4 Jul 2009 21:50:14 +0000 (00:50 +0300)
This gets rid of the blocking queued connection for non-modal errors,
which was causing deadlocks in the audio output

Pointed-out-by: Laurent Aimar
modules/gui/qt4/dialogs/external.cpp
modules/gui/qt4/dialogs/external.hpp

index 8fee7781d76317845142978d935d582254eb30b7..5c08f622d37b7412eb99c73336d3e483c4cf1a81 100644 (file)
 
 DialogHandler::DialogHandler (intf_thread_t *intf, QObject *_parent)
     : intf (intf), QObject( _parent ),
-      message (VLC_OBJECT(intf), "dialog-fatal"),
+      critical (VLC_OBJECT(intf), "dialog-critical"),
       login (VLC_OBJECT(intf), "dialog-login"),
       question (VLC_OBJECT(intf), "dialog-question"),
       progressBar (VLC_OBJECT(intf), "dialog-progress-bar")
 {
-    connect (&message, SIGNAL(pointerChanged(vlc_object_t *, void *)),
-             SLOT(displayMessage(vlc_object_t *, void *)),
+    var_Create (intf, "dialog-error", VLC_VAR_ADDRESS);
+    var_AddCallback (intf, "dialog-error", error, this);
+    connect (this, SIGNAL(error(const QString &, const QString &)),
+             SLOT(displayError(const QString &, const QString &)));
+
+    connect (&critical, SIGNAL(pointerChanged(vlc_object_t *, void *)),
+             SLOT(displayCritical(vlc_object_t *, void *)),
              Qt::BlockingQueuedConnection);
     connect (&login, SIGNAL(pointerChanged(vlc_object_t *, void *)),
              SLOT(requestLogin(vlc_object_t *, void *)),
@@ -65,19 +70,33 @@ DialogHandler::DialogHandler (intf_thread_t *intf, QObject *_parent)
 DialogHandler::~DialogHandler (void)
 {
     dialog_Unregister (intf);
+
+    var_DelCallback (intf, "dialog-error", error, this);
+    var_Destroy (intf, "dialog-error");
 }
 
-void DialogHandler::displayMessage (vlc_object_t *, void *value)
+int DialogHandler::error (vlc_object_t *obj, const char *,
+                          vlc_value_t, vlc_value_t value, void *data)
 {
-     const dialog_fatal_t *dialog = (const dialog_fatal_t *)value;
+    const dialog_fatal_t *dialog = (const dialog_fatal_t *)value.p_address;
+    DialogHandler *self = static_cast<DialogHandler *>(data);
 
-    if (dialog->modal)
-        QMessageBox::critical (NULL, qfu(dialog->title), qfu(dialog->message),
-                               QMessageBox::Ok);
-    else
-    if (config_GetInt (intf, "qt-error-dialogs"))
-        ErrorsDialog::getInstance (intf)->addError(qfu(dialog->title),
-                                                   qfu(dialog->message));
+    if (config_GetInt (obj, "qt-error-dialogs"))
+        emit self->error (qfu(dialog->title), qfu(dialog->message));
+    return VLC_SUCCESS;
+}
+
+void DialogHandler::displayError (const QString& title, const QString& message)
+{
+    ErrorsDialog::getInstance (intf)->addError(title, message);
+}
+
+void DialogHandler::displayCritical (vlc_object_t *, void *value)
+{
+    const dialog_fatal_t *dialog = (const dialog_fatal_t *)value;
+
+    QMessageBox::critical (NULL, qfu(dialog->title), qfu(dialog->message),
+                           QMessageBox::Ok);
 }
 
 void DialogHandler::requestLogin (vlc_object_t *, void *value)
index 1e5ed5edabf955950a8d69e7a3211482409b8eb7..250842e73163561b69e50e9bf7e9b942ab405f54 100644 (file)
@@ -40,15 +40,19 @@ public:
 
 private:
     intf_thread_t *intf;
-    QVLCPointer message;
+    static int error (vlc_object_t *, const char *, vlc_value_t, vlc_value_t,
+                      void *);
+    QVLCPointer critical;
     QVLCPointer login;
     QVLCPointer question;
     QVLCPointer progressBar;
 signals:
     void progressBarDestroyed (QWidget *);
+    void error (const QString&, const QString&);
 
 private slots:
-    void displayMessage (vlc_object_t *, void *);
+    void displayError (const QString&, const QString&);
+    void displayCritical (vlc_object_t *, void *);
     void requestLogin (vlc_object_t *, void *);
     void requestAnswer (vlc_object_t *, void *);
     void startProgressBar (vlc_object_t *, void *);