]> git.sesse.net Git - vlc/blobdiff - modules/gui/qt4/dialogs/messages.cpp
Merge branch 1.0-bugfix (early part) into master
[vlc] / modules / gui / qt4 / dialogs / messages.cpp
index 46aa53b7aa5a89cdb7710d8813f872beb09602c7..11a9fef9d6059463514e19e26ea21dffaf84ef1a 100644 (file)
@@ -25,9 +25,7 @@
 #endif
 
 #include "dialogs/messages.hpp"
-#include "dialogs_provider.hpp"
 
-#include <QSpacerItem>
 #include <QSpinBox>
 #include <QLabel>
 #include <QTextEdit>
 #include <QHeaderView>
 #include <QMutex>
 
+#include <assert.h>
+
 MessagesDialog *MessagesDialog::instance = NULL;
 
+enum {
+    MsgEvent_Type = QEvent::User + MsgEventType + 1,
+};
+
+class MsgEvent : public QEvent
+{
+public:
+    MsgEvent( msg_item_t *msg )
+        : QEvent( (QEvent::Type)MsgEvent_Type ), msg(msg)
+    {
+        msg_Hold( msg );
+    }
+    virtual ~MsgEvent()
+    {
+        msg_Release( msg );
+    }
+
+    msg_item_t *msg;
+};
+
 struct msg_cb_data_t
 {
     MessagesDialog *self;
-    QMutex          lock; /**< protects MessagesDialog::messages */
 };
+static void MsgCallback( msg_cb_data_t *, msg_item_t *, unsigned );
 
 MessagesDialog::MessagesDialog( intf_thread_t *_p_intf)
                : QVLCFrame( _p_intf )
@@ -68,6 +88,7 @@ MessagesDialog::MessagesDialog( intf_thread_t *_p_intf)
     messages->setReadOnly( true );
     messages->setGeometry( 0, 0, 440, 600 );
     messages->setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOff );
+    messages->setTextInteractionFlags( Qt::TextSelectableByMouse );
 
     msgLayout->addWidget( messages, 0, 0, 1, 0 );
     mainTab->addTab( msgWidget, qtr( "Messages" ) );
@@ -118,16 +139,16 @@ MessagesDialog::MessagesDialog( intf_thread_t *_p_intf)
 
 
     /* Hook up to LibVLC messaging */
-    cb_data = new msg_cb_data_t;
-    cb_data->self = this;
-    sub = msg_Subscribe (_p_intf->p_libvlc, sinkMessage, cb_data);
+    cbData = new msg_cb_data_t;
+    cbData->self = this;
+    sub = msg_Subscribe( p_intf->p_libvlc, MsgCallback, cbData );
 }
 
-MessagesDialog::~MessagesDialog ()
+MessagesDialog::~MessagesDialog()
 {
-    writeSettings( "messages" );
-    msg_Unsubscribe (sub);
-    delete cb_data;
+    writeSettings( "Messages" );
+    msg_Unsubscribe( sub );
+    delete cbData;
 };
 
 void MessagesDialog::updateTab( int index )
@@ -151,22 +172,21 @@ void MessagesDialog::updateTab( int index )
     }
 }
 
-void MessagesDialog::sinkMessage (msg_cb_data_t *data, msg_item_t *item,
-                                  unsigned overruns)
-{
-    MessagesDialog *self = data->self;
-    QMutexLocker locker (&data->lock);
-
-    self->sinkMessage (item, overruns);
-}
-
-void MessagesDialog::sinkMessage (msg_item_t *item, unsigned)
+void MessagesDialog::sinkMessage( msg_item_t *item )
 {
     if ((item->i_type == VLC_MSG_WARN && verbosityBox->value() < 1)
      || (item->i_type == VLC_MSG_DBG && verbosityBox->value() < 2 ))
         return;
 
-    messages->textCursor().movePosition( QTextCursor::End );
+    /* Copy selected text to the clipboard */
+    if( messages->textCursor().hasSelection() )
+        messages->copy();
+
+    /* Fix selected text bug */
+    if( !messages->textCursor().atEnd() ||
+         messages->textCursor().anchor() != messages->textCursor().position() )
+         messages->moveCursor( QTextCursor::End );
+
     messages->setFontItalic( true );
     messages->setTextColor( "darkBlue" );
     messages->insertPlainText( qfu( item->psz_module ) );
@@ -200,30 +220,12 @@ void MessagesDialog::sinkMessage (msg_item_t *item, unsigned)
     messages->ensureCursorVisible();
 }
 
-void MessagesDialog::buildTree( QTreeWidgetItem *parentItem,
-                                vlc_object_t *p_obj )
+void MessagesDialog::customEvent( QEvent *event )
 {
-    QTreeWidgetItem *item;
-
-    if( parentItem )
-        item = new QTreeWidgetItem( parentItem );
-    else
-        item = new QTreeWidgetItem( modulesTree );
+    MsgEvent *msge = static_cast<MsgEvent *>(event);
 
-    if( p_obj->psz_object_name )
-        item->setText( 0, qfu( p_obj->psz_object_type ) + " \"" +
-                       qfu( p_obj->psz_object_name ) + "\" (" +
-                       QString::number((uintptr_t)p_obj) + ")" );
-    else
-        item->setText( 0, qfu( p_obj->psz_object_type ) + " (" +
-                       QString::number((uintptr_t)p_obj) + ")" );
-
-    item->setExpanded( true );
-
-    vlc_list_t *l = vlc_list_children( p_obj );
-    for( int i=0; i < l->i_count; i++ )
-        buildTree( item, l->p_values[i].p_object );
-    vlc_list_release( l );
+    assert( msge );
+    sinkMessage( msge->msg );
 }
 
 void MessagesDialog::clearOrUpdate()
@@ -234,15 +236,8 @@ void MessagesDialog::clearOrUpdate()
         clear();
 }
 
-void MessagesDialog::updateTree()
-{
-    modulesTree->clear();
-    buildTree( NULL, VLC_OBJECT( p_intf->p_libvlc ) );
-}
-
 void MessagesDialog::clear()
 {
-    QMutexLocker locker (&cb_data->lock);
     messages->clear();
 }
 
@@ -265,10 +260,51 @@ bool MessagesDialog::save()
         }
 
         QTextStream out( &file );
-        QMutexLocker locker (&cb_data->lock);
         out << messages->toPlainText() << "\n";
 
         return true;
     }
     return false;
 }
+
+void MessagesDialog::buildTree( QTreeWidgetItem *parentItem,
+                                vlc_object_t *p_obj )
+{
+    QTreeWidgetItem *item;
+
+    if( parentItem )
+        item = new QTreeWidgetItem( parentItem );
+    else
+        item = new QTreeWidgetItem( modulesTree );
+
+    if( p_obj->psz_object_name )
+        item->setText( 0, qfu( p_obj->psz_object_type ) + " \"" +
+                       qfu( p_obj->psz_object_name ) + "\" (" +
+                       QString::number((uintptr_t)p_obj) + ")" );
+    else
+        item->setText( 0, qfu( p_obj->psz_object_type ) + " (" +
+                       QString::number((uintptr_t)p_obj) + ")" );
+
+    item->setExpanded( true );
+
+    vlc_list_t *l = vlc_list_children( p_obj );
+    for( int i=0; i < l->i_count; i++ )
+        buildTree( item, l->p_values[i].p_object );
+    vlc_list_release( l );
+}
+
+void MessagesDialog::updateTree()
+{
+    modulesTree->clear();
+    buildTree( NULL, VLC_OBJECT( p_intf->p_libvlc ) );
+}
+
+static void MsgCallback( msg_cb_data_t *data, msg_item_t *item, unsigned )
+{
+    int canc = vlc_savecancel();
+
+    QApplication::postEvent( data->self, new MsgEvent( item ) );
+
+    vlc_restorecancel( canc );
+}
+