diff --git a/src/plugins/debugger/debuggermanager.cpp b/src/plugins/debugger/debuggermanager.cpp index ea0e6623b067aec04e98f8b272e476c426d3da36..e2840fb718058aab2710f7b57431ae1fa0ccc8cd 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 9a5b5da37d3e2e55dc7dcf7054e7755aeecd6f27..f3d76bb531eb4865331f5d369e7c4c5e6fc71cc6 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 45eecd6514e5919d3142043353c5bb721143d5bb..7f3e42f47fa122af31fd00454dbd7ca595c141ee 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 c10a84e479513583acbc5c642f78edb7ff30f24e..0c6d979c0107f89e79ce196beb4511ac5e577abb 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 b3cee40aaf4543b64491208169ab8db838cda1eb..b979271734877ebba6b53af430adcf60d8cf9590 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 e07e6a228c39950761b53c41542f7930d2b6e459..abf920c91e9ae98ffcadf65ebb3ca873a5b80145 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 ead2799453e5722472b2508577c62fb1ed7869c3..82876e61f76b372da90ea9694331e3ee953069af 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 c6279b4c3cffd0b6da3508b1e44aa594b06808cd..374d26c97b15ea52280e047ba0d59070ea058710 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 79933d4518bddc89cf995ea2d33f1e8f3e86bb07..78214746a2ee8d0f7de68978a7c29b5c5a57cf6e 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 2e4789170a74907106f74aaca37c3ccc26d39a0b..0eeae6e8eef955d0a5dc30ee3710e03d847c6900 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 c02f21ff34b32bc597edbf25fc8e3ae669e93ae3..d34c3f2bb0e3645d0928731c72c6b1587d3e5916 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 6bda6121af66f36e9b81ccc80ea60f1469f2ac8b..674f25cd51d728f41fd45b216e3faa73ee7e6fa4 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 2d6224bbdda90745ef71dee7fa8f90e7084f4f4a..c6cb624fb86bcc68d1bac08a803dc8049de768cd 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 2c1127ff5c63b06ef201db6f6a41d4359bace26e..1d270226d1ae1c370634be30a06fcd4720f698d3 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 acc11cd932ad0bdd68495d5287ddbc9968e8ea33..0bd593c20e24c40abd388252924694f234776908 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();