From 72b6a105b7b01f29bdce06709e5029ed6748364a Mon Sep 17 00:00:00 2001
From: Oswald Buddenhagen <oswald.buddenhagen@nokia.com>
Date: Thu, 15 Jan 2009 14:30:49 +0100
Subject: [PATCH] app output window reorga

- drop prefix magic
- avoid inserting stray newlines

this also fixes the overquoting of app output.
---
 src/plugins/debugger/debuggermanager.cpp        |  4 ++--
 src/plugins/debugger/debuggermanager.h          |  6 +++---
 src/plugins/debugger/debuggerrunner.cpp         | 11 ++++-------
 src/plugins/debugger/debuggerrunner.h           |  2 +-
 src/plugins/debugger/gdbengine.cpp              | 10 +++++-----
 src/plugins/debugger/gdbengine.h                |  2 +-
 .../projectexplorer/applicationlauncher.h       |  8 ++++++++
 .../projectexplorer/applicationlauncher_win.cpp |  5 +----
 .../projectexplorer/applicationlauncher_x11.cpp | 11 ++++-------
 .../applicationrunconfiguration.cpp             |  2 +-
 src/plugins/projectexplorer/outputwindow.cpp    | 17 ++++++++++++++++-
 src/plugins/projectexplorer/outputwindow.h      |  2 ++
 src/plugins/projectexplorer/projectexplorer.cpp |  7 +++++++
 src/plugins/projectexplorer/projectexplorer.h   |  1 +
 src/plugins/projectexplorer/runconfiguration.h  |  1 +
 15 files changed, 57 insertions(+), 32 deletions(-)

diff --git a/src/plugins/debugger/debuggermanager.cpp b/src/plugins/debugger/debuggermanager.cpp
index ea0e6623b06..e2840fb7180 100644
--- a/src/plugins/debugger/debuggermanager.cpp
+++ b/src/plugins/debugger/debuggermanager.cpp
@@ -590,9 +590,9 @@ void DebuggerManager::notifyInferiorPidChanged(int pid)
     emit inferiorPidChanged(pid);
 }
 
-void DebuggerManager::showApplicationOutput(const QString &prefix, const QString &str)
+void DebuggerManager::showApplicationOutput(const QString &str)
 {
-     emit applicationOutputAvailable(prefix, str);
+     emit applicationOutputAvailable(str);
 }
 
 void DebuggerManager::shutdown()
diff --git a/src/plugins/debugger/debuggermanager.h b/src/plugins/debugger/debuggermanager.h
index 9a5b5da37d3..f3d76bb531e 100644
--- a/src/plugins/debugger/debuggermanager.h
+++ b/src/plugins/debugger/debuggermanager.h
@@ -166,7 +166,7 @@ private:
     virtual ThreadsHandler *threadsHandler() = 0;
     virtual WatchHandler *watchHandler() = 0;
 
-    virtual void showApplicationOutput(const QString &prefix, const QString &data) = 0;
+    virtual void showApplicationOutput(const QString &data) = 0;
     //virtual QAction *useCustomDumpersAction() const = 0;
     //virtual QAction *debugDumpersAction() const = 0;
     virtual bool skipKnownFrames() const = 0;
@@ -285,7 +285,7 @@ public slots:
 private slots:
     void showDebuggerOutput(const QString &prefix, const QString &msg);
     void showDebuggerInput(const QString &prefix, const QString &msg);
-    void showApplicationOutput(const QString &prefix, const QString &msg);
+    void showApplicationOutput(const QString &data);
 
     void reloadDisassembler();
     void disassemblerDockToggled(bool on);
@@ -365,7 +365,7 @@ signals:
     void setSessionValueRequested(const QString &name, const QVariant &value);
     void configValueRequested(const QString &name, QVariant *value);
     void setConfigValueRequested(const QString &name, const QVariant &value);
-    void applicationOutputAvailable(const QString &prefix, const QString &msg);
+    void applicationOutputAvailable(const QString &output);
 
 public:
     // FIXME: make private
diff --git a/src/plugins/debugger/debuggerrunner.cpp b/src/plugins/debugger/debuggerrunner.cpp
index 45eecd6514e..7f3e42f47fa 100644
--- a/src/plugins/debugger/debuggerrunner.cpp
+++ b/src/plugins/debugger/debuggerrunner.cpp
@@ -108,8 +108,8 @@ DebuggerRunControl::DebuggerRunControl(DebuggerManager *manager,
 {
     connect(m_manager, SIGNAL(debuggingFinished()),
             this, SLOT(debuggingFinished()));
-    connect(m_manager, SIGNAL(applicationOutputAvailable(QString, QString)),
-            this, SLOT(slotAddToOutputWindow(QString, QString)));
+    connect(m_manager, SIGNAL(applicationOutputAvailable(QString)),
+            this, SLOT(slotAddToOutputWindowInline(QString)));
     connect(m_manager, SIGNAL(inferiorPidChanged(qint64)),
             this, SLOT(bringApplicationToForeground(qint64)));
 }
@@ -138,12 +138,9 @@ void DebuggerRunControl::start()
         debuggingFinished();
 }
 
-void DebuggerRunControl::slotAddToOutputWindow(const QString &prefix, const QString &line)
+void DebuggerRunControl::slotAddToOutputWindowInline(const QString &data)
 {  
-    Q_UNUSED(prefix);
-    foreach (const QString &l, line.split('\n'))
-        emit addToOutputWindow(this, prefix + Qt::escape(l));
-    //emit addToOutputWindow(this, prefix + Qt::escape(line));
+    emit addToOutputWindowInline(this, data);
 }
 
 void DebuggerRunControl::stop()
diff --git a/src/plugins/debugger/debuggerrunner.h b/src/plugins/debugger/debuggerrunner.h
index c10a84e4795..0c6d979c010 100644
--- a/src/plugins/debugger/debuggerrunner.h
+++ b/src/plugins/debugger/debuggerrunner.h
@@ -84,7 +84,7 @@ public:
 
 private slots:
     void debuggingFinished();
-    void slotAddToOutputWindow(const QString &prefix, const QString &line);
+    void slotAddToOutputWindowInline(const QString &output);
 
 private:
     DebuggerManager *m_manager;
diff --git a/src/plugins/debugger/gdbengine.cpp b/src/plugins/debugger/gdbengine.cpp
index b3cee40aaf4..b9792717348 100644
--- a/src/plugins/debugger/gdbengine.cpp
+++ b/src/plugins/debugger/gdbengine.cpp
@@ -275,8 +275,8 @@ void GdbEngine::init()
     connect(this, SIGNAL(gdbInputAvailable(QString,QString)),
         q, SLOT(showDebuggerInput(QString,QString)),
         Qt::QueuedConnection);
-    connect(this, SIGNAL(applicationOutputAvailable(QString,QString)),
-        q, SLOT(showApplicationOutput(QString,QString)),
+    connect(this, SIGNAL(applicationOutputAvailable(QString)),
+        q, SLOT(showApplicationOutput(QString)),
         Qt::QueuedConnection);
 }
 
@@ -419,7 +419,7 @@ void GdbEngine::handleResponse()
             //s += '\n';
 
             m_inbuffer = QByteArray(from, to - from);
-            emit applicationOutputAvailable("app-stdout: ", s);
+            emit applicationOutputAvailable(s);
             continue;
         }
 
@@ -591,7 +591,7 @@ static void fixMac(QByteArray &out)
 void GdbEngine::readGdbStandardError()
 {
     QByteArray err = m_gdbProc.readAllStandardError();
-    emit applicationOutputAvailable("app-stderr:", err);
+    emit applicationOutputAvailable(err);
 }
 
 void GdbEngine::readGdbStandardOutput()
@@ -1078,7 +1078,7 @@ void GdbEngine::handleStreamOutput(const QString &data, char code)
             // On Windows, the contents seem to depend on the debugger
             // version and/or OS version used.
             if (data.startsWith("warning:"))
-                qq->showApplicationOutput(QString(), data);
+                qq->showApplicationOutput(data);
             break;
     }
 
diff --git a/src/plugins/debugger/gdbengine.h b/src/plugins/debugger/gdbengine.h
index e07e6a228c3..abf920c91e9 100644
--- a/src/plugins/debugger/gdbengine.h
+++ b/src/plugins/debugger/gdbengine.h
@@ -93,7 +93,7 @@ signals:
     void gdbResponseAvailable();
     void gdbInputAvailable(const QString &prefix, const QString &msg);
     void gdbOutputAvailable(const QString &prefix, const QString &msg);
-    void applicationOutputAvailable(const QString &prefix, const QString &msg);
+    void applicationOutputAvailable(const QString &output);
 
 private:
     //
diff --git a/src/plugins/projectexplorer/applicationlauncher.h b/src/plugins/projectexplorer/applicationlauncher.h
index ead2799453e..82876e61f76 100644
--- a/src/plugins/projectexplorer/applicationlauncher.h
+++ b/src/plugins/projectexplorer/applicationlauncher.h
@@ -37,6 +37,9 @@
 #include <QtCore/QObject>
 #include <QtCore/QStringList>
 #include <QtCore/QProcess>
+#ifndef Q_OS_WIN
+#include <QtCore/QTextCodec>
+#endif
 
 namespace ProjectExplorer {
 namespace Internal {
@@ -88,7 +91,12 @@ private:
     ConsoleProcess *m_consoleProcess;
     Mode m_currentMode;
 
+#ifdef Q_OS_WIN
     WinGuiProcess *m_winGuiProcess;
+#else
+    QTextCodec *m_outputCodec;
+    QTextCodec::ConverterState m_outputCodecState;
+#endif
 };
 
 } // namespace Internal
diff --git a/src/plugins/projectexplorer/applicationlauncher_win.cpp b/src/plugins/projectexplorer/applicationlauncher_win.cpp
index c6279b4c3cf..374d26c97b1 100644
--- a/src/plugins/projectexplorer/applicationlauncher_win.cpp
+++ b/src/plugins/projectexplorer/applicationlauncher_win.cpp
@@ -116,10 +116,7 @@ qint64 ApplicationLauncher::applicationPID() const
 
 void ApplicationLauncher::readWinDebugOutput(const QString &output)
 {
-    QString s = output;
-    if (s.endsWith(QLatin1Char('\n')))
-            s.chop(1);
-    emit appendOutput(s);
+    emit appendOutput(output);
 }
 
 void ApplicationLauncher::processStopped()
diff --git a/src/plugins/projectexplorer/applicationlauncher_x11.cpp b/src/plugins/projectexplorer/applicationlauncher_x11.cpp
index 79933d4518b..78214746a2e 100644
--- a/src/plugins/projectexplorer/applicationlauncher_x11.cpp
+++ b/src/plugins/projectexplorer/applicationlauncher_x11.cpp
@@ -41,6 +41,7 @@ using namespace ProjectExplorer::Internal;
 ApplicationLauncher::ApplicationLauncher(QObject *parent)
     : QObject(parent)
 {
+    m_outputCodec = QTextCodec::codecForLocale();
     m_currentMode = Gui;
     m_guiProcess = new QProcess(this);
     m_guiProcess->setReadChannelMode(QProcess::MergedChannels);
@@ -132,13 +133,9 @@ void ApplicationLauncher::guiProcessError()
 
 void ApplicationLauncher::readStandardOutput()
 {
-    m_guiProcess->setReadChannel(QProcess::StandardOutput);
-    while (m_guiProcess->canReadLine()) {
-        QString line = QString::fromLocal8Bit(m_guiProcess->readLine());
-        if (line.endsWith(QLatin1Char('\n')))
-            line.chop(1);
-        emit appendOutput(line);
-    }
+    QByteArray data = m_guiProcess->readAllStandardOutput();
+    emit appendOutput(m_outputCodec->toUnicode(
+            data.constData(), data.length(), &m_outputCodecState));
 }
 
 void ApplicationLauncher::processStopped()
diff --git a/src/plugins/projectexplorer/applicationrunconfiguration.cpp b/src/plugins/projectexplorer/applicationrunconfiguration.cpp
index 2e4789170a7..0eeae6e8eef 100644
--- a/src/plugins/projectexplorer/applicationrunconfiguration.cpp
+++ b/src/plugins/projectexplorer/applicationrunconfiguration.cpp
@@ -162,7 +162,7 @@ void ApplicationRunControl::slotError(const QString & err)
 
 void ApplicationRunControl::slotAddToOutputWindow(const QString &line)
 {
-    emit addToOutputWindow(this, Qt::escape(line));
+    emit addToOutputWindowInline(this, line);
 }
 
 void ApplicationRunControl::processExited(int exitCode)
diff --git a/src/plugins/projectexplorer/outputwindow.cpp b/src/plugins/projectexplorer/outputwindow.cpp
index c02f21ff34b..d34c3f2bb0e 100644
--- a/src/plugins/projectexplorer/outputwindow.cpp
+++ b/src/plugins/projectexplorer/outputwindow.cpp
@@ -215,6 +215,12 @@ void OutputPane::appendOutput(RunControl *rc, const QString &out)
     ow->appendOutput(out);
 }
 
+void OutputPane::appendOutputInline(RunControl *rc, const QString &out)
+{
+    OutputWindow *ow = m_outputWindows.value(rc);
+    ow->appendOutputInline(out);
+}
+
 void OutputPane::showTabFor(RunControl *rc)
 {
     OutputWindow *ow = m_outputWindows.value(rc);
@@ -318,7 +324,16 @@ OutputWindow::~OutputWindow()
 
 void OutputWindow::appendOutput(const QString &out)
 {
-    appendPlainText(out);
+    if (out.endsWith('\n'))
+        appendPlainText(out);
+    else
+        appendPlainText(out + '\n');
+}
+
+void OutputWindow::appendOutputInline(const QString &out)
+{
+    moveCursor(QTextCursor::End);
+    insertPlainText(out);
 }
 
 void OutputWindow::insertLine()
diff --git a/src/plugins/projectexplorer/outputwindow.h b/src/plugins/projectexplorer/outputwindow.h
index 6bda6121af6..674f25cd51d 100644
--- a/src/plugins/projectexplorer/outputwindow.h
+++ b/src/plugins/projectexplorer/outputwindow.h
@@ -83,6 +83,7 @@ public:
     // ApplicationOutputspecifics
     void createNewOutputWindow(RunControl *rc);
     void appendOutput(RunControl *rc, const QString &out);
+    void appendOutputInline(RunControl *rc, const QString &out);
     void showTabFor(RunControl *rc);
     
 public slots:
@@ -119,6 +120,7 @@ public:
     ~OutputWindow();
 
     void appendOutput(const QString &out);
+    void appendOutputInline(const QString &out);
     void insertLine();
 };
 
diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp
index 2d6224bbdda..c6cb624fb86 100644
--- a/src/plugins/projectexplorer/projectexplorer.cpp
+++ b/src/plugins/projectexplorer/projectexplorer.cpp
@@ -1084,6 +1084,8 @@ void ProjectExplorerPlugin::buildQueueFinished(bool success)
 
             connect(control, SIGNAL(addToOutputWindow(RunControl *, const QString &)),
                     this, SLOT(addToApplicationOutputWindow(RunControl *, const QString &)));
+            connect(control, SIGNAL(addToOutputWindowInline(RunControl *, const QString &)),
+                    this, SLOT(addToApplicationOutputWindowInline(RunControl *, const QString &)));
             connect(control, SIGNAL(error(RunControl *, const QString &)),
                     this, SLOT(addErrorToApplicationOutputWindow(RunControl *, const QString &)));
             connect(control, SIGNAL(finished()),
@@ -1379,6 +1381,11 @@ void ProjectExplorerPlugin::addToApplicationOutputWindow(RunControl *rc, const Q
     m_outputPane->appendOutput(rc, line);
 }
 
+void ProjectExplorerPlugin::addToApplicationOutputWindowInline(RunControl *rc, const QString &line)
+{
+    m_outputPane->appendOutputInline(rc, line);
+}
+
 void ProjectExplorerPlugin::addErrorToApplicationOutputWindow(RunControl *rc, const QString &error)
 {
     m_outputPane->appendOutput(rc, error);
diff --git a/src/plugins/projectexplorer/projectexplorer.h b/src/plugins/projectexplorer/projectexplorer.h
index 2c1127ff5c6..1d270226d1a 100644
--- a/src/plugins/projectexplorer/projectexplorer.h
+++ b/src/plugins/projectexplorer/projectexplorer.h
@@ -180,6 +180,7 @@ private slots:
     void updateRunAction();
 
     void addToApplicationOutputWindow(RunControl *, const QString &line);
+    void addToApplicationOutputWindowInline(RunControl *, const QString &line);
     void addErrorToApplicationOutputWindow(RunControl *, const QString &error);
     void updateTaskActions();
 
diff --git a/src/plugins/projectexplorer/runconfiguration.h b/src/plugins/projectexplorer/runconfiguration.h
index acc11cd932a..0bd593c20e2 100644
--- a/src/plugins/projectexplorer/runconfiguration.h
+++ b/src/plugins/projectexplorer/runconfiguration.h
@@ -143,6 +143,7 @@ public:
     QSharedPointer<RunConfiguration> runConfiguration();
 signals:
     void addToOutputWindow(RunControl *, const QString &line);
+    void addToOutputWindowInline(RunControl *, const QString &line);
     void error(RunControl *, const QString &error);
     void started();
     void finished();
-- 
GitLab