From 6bb08f1bf99c6b051dd47e9ce7b1125e00d77e65 Mon Sep 17 00:00:00 2001
From: Friedemann Kleint <Friedemann.Kleint@nokia.com>
Date: Wed, 4 May 2011 09:40:51 +0200
Subject: [PATCH] Debugger: Add setting for CDB console.

Task-number: QTCREATORBUG-4762
---
 src/plugins/debugger/cdb/cdbengine.cpp           | 11 ++++++-----
 src/plugins/debugger/cdb/cdboptions.cpp          |  9 +++++++--
 src/plugins/debugger/cdb/cdboptions.h            |  1 +
 src/plugins/debugger/cdb/cdboptionspage.cpp      |  2 ++
 src/plugins/debugger/cdb/cdboptionspagewidget.ui | 14 ++++++++++++--
 5 files changed, 28 insertions(+), 9 deletions(-)

diff --git a/src/plugins/debugger/cdb/cdbengine.cpp b/src/plugins/debugger/cdb/cdbengine.cpp
index f44cff77d01..495b116e404 100644
--- a/src/plugins/debugger/cdb/cdbengine.cpp
+++ b/src/plugins/debugger/cdb/cdbengine.cpp
@@ -200,10 +200,10 @@ Q_DECLARE_METATYPE(Debugger::Internal::ConditionalBreakPointCookie)
 namespace Debugger {
 namespace Internal {
 
-static inline bool isConsole(const DebuggerStartParameters &sp)
+static inline bool isCreatorConsole(const DebuggerStartParameters &sp, const CdbOptions &o)
 {
-    return (sp.startMode == StartInternal || sp.startMode == StartExternal)
-        && sp.useTerminal;
+    return !o.cdbConsole && sp.useTerminal
+           && (sp.startMode == StartInternal || sp.startMode == StartExternal);
 }
 
 static QMessageBox *
@@ -651,6 +651,7 @@ void CdbEngine::consoleStubProcessStarted()
     attachParameters.processArgs.clear();
     attachParameters.attachPID = m_consoleStub->applicationPID();
     attachParameters.startMode = AttachExternal;
+    attachParameters.useTerminal = false;
     showMessage(QString::fromLatin1("Attaching to %1...").arg(attachParameters.attachPID), LogMisc);
     QString errorMessage;
     if (!launchCDB(attachParameters, &errorMessage)) {
@@ -682,7 +683,7 @@ void CdbEngine::setupEngine()
     // console, too, but that immediately closes when the debuggee quits.
     // Use the Creator stub instead.
     const DebuggerStartParameters &sp = startParameters();
-    const bool launchConsole = isConsole(sp);
+    const bool launchConsole = isCreatorConsole(sp, *m_options);
     m_effectiveStartMode = launchConsole ? AttachExternal : sp.startMode;
     const bool ok = launchConsole ?
                 startConsole(startParameters(), &errorMessage) :
@@ -829,7 +830,7 @@ void CdbEngine::runEngine()
     if (debug)
         qDebug("runEngine");
     // Resume the threads frozen by the console stub.
-    if (isConsole(startParameters()))
+    if (isCreatorConsole(startParameters(), *m_options))
         postCommand("~* m", 0);
     foreach (const QString &breakEvent, m_options->breakEvents)
             postCommand(QByteArray("sxe ") + breakEvent.toAscii(), 0);
diff --git a/src/plugins/debugger/cdb/cdboptions.cpp b/src/plugins/debugger/cdb/cdboptions.cpp
index 14042eaa3dc..f4e22273b78 100644
--- a/src/plugins/debugger/cdb/cdboptions.cpp
+++ b/src/plugins/debugger/cdb/cdboptions.cpp
@@ -39,11 +39,12 @@ static const char symbolPathsKeyC[] = "SymbolPaths";
 static const char sourcePathsKeyC[] = "SourcePaths";
 static const char breakEventKeyC[] = "BreakEvent";
 static const char additionalArgumentsKeyC[] = "AdditionalArguments";
+static const char cdbConsoleKeyC[] = "CDB_Console";
 
 namespace Debugger {
 namespace Internal {
 
-CdbOptions::CdbOptions()
+CdbOptions::CdbOptions() : cdbConsole(false)
 {
 }
 
@@ -56,6 +57,7 @@ void CdbOptions::clear()
 {
     symbolPaths.clear();
     sourcePaths.clear();
+    cdbConsole = false;
 }
 
 QStringList CdbOptions::oldEngineSymbolPaths(const QSettings *s)
@@ -71,6 +73,7 @@ void CdbOptions::fromSettings(QSettings *s)
     symbolPaths = s->value(keyRoot + QLatin1String(symbolPathsKeyC), QStringList()).toStringList();
     sourcePaths = s->value(keyRoot + QLatin1String(sourcePathsKeyC), QStringList()).toStringList();
     breakEvents = s->value(keyRoot + QLatin1String(breakEventKeyC), QStringList()).toStringList();
+    cdbConsole = s->value(keyRoot + QLatin1String(cdbConsoleKeyC), QVariant(false)).toBool();
 }
 
 void CdbOptions::toSettings(QSettings *s) const
@@ -80,12 +83,14 @@ void CdbOptions::toSettings(QSettings *s) const
     s->setValue(QLatin1String(sourcePathsKeyC), sourcePaths);
     s->setValue(QLatin1String(breakEventKeyC), breakEvents);
     s->setValue(QLatin1String(additionalArgumentsKeyC), additionalArguments);
+    s->setValue(QLatin1String(cdbConsoleKeyC), QVariant(cdbConsole));
     s->endGroup();
 }
 
 bool CdbOptions::equals(const CdbOptions &rhs) const
 {
-    return additionalArguments == rhs.additionalArguments
+    return cdbConsole == rhs.cdbConsole
+            && additionalArguments == rhs.additionalArguments
             && symbolPaths == rhs.symbolPaths
             && sourcePaths == rhs.sourcePaths
             && breakEvents == rhs.breakEvents;
diff --git a/src/plugins/debugger/cdb/cdboptions.h b/src/plugins/debugger/cdb/cdboptions.h
index cc85b438938..e26a48caadc 100644
--- a/src/plugins/debugger/cdb/cdboptions.h
+++ b/src/plugins/debugger/cdb/cdboptions.h
@@ -64,6 +64,7 @@ public:
     QStringList sourcePaths;
     // Events to break on (Command 'sxe' with abbreviation and optional parameter)
     QStringList breakEvents;
+    bool cdbConsole;
 };
 
 inline bool operator==(const CdbOptions &s1, const CdbOptions &s2)
diff --git a/src/plugins/debugger/cdb/cdboptionspage.cpp b/src/plugins/debugger/cdb/cdboptionspage.cpp
index ccc75896c5b..e5f06f03b97 100644
--- a/src/plugins/debugger/cdb/cdboptionspage.cpp
+++ b/src/plugins/debugger/cdb/cdboptionspage.cpp
@@ -174,6 +174,7 @@ void CdbOptionsPageWidget::setOptions(CdbOptions &o)
     setSymbolPaths(o.symbolPaths);
     m_ui.sourcePathListEditor->setPathList(o.sourcePaths);
     m_breakEventWidget->setBreakEvents(o.breakEvents);
+    m_ui.consoleCheckBox->setChecked(o.cdbConsole);
 }
 
 CdbOptions CdbOptionsPageWidget::options() const
@@ -183,6 +184,7 @@ CdbOptions CdbOptionsPageWidget::options() const
     rc.symbolPaths = symbolPaths();
     rc.sourcePaths = m_ui.sourcePathListEditor->pathList();
     rc.breakEvents = m_breakEventWidget->breakEvents();
+    rc.cdbConsole = m_ui.consoleCheckBox->isChecked();
     return rc;
 }
 
diff --git a/src/plugins/debugger/cdb/cdboptionspagewidget.ui b/src/plugins/debugger/cdb/cdboptionspagewidget.ui
index c3a29266ee7..94f6fc12c85 100644
--- a/src/plugins/debugger/cdb/cdboptionspagewidget.ui
+++ b/src/plugins/debugger/cdb/cdboptionspagewidget.ui
@@ -6,8 +6,8 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>318</width>
-    <height>298</height>
+    <width>334</width>
+    <height>317</height>
    </rect>
   </property>
   <layout class="QVBoxLayout" name="verticalLayout">
@@ -41,6 +41,16 @@
         <item row="0" column="1">
          <widget class="QLineEdit" name="additionalArgumentsLineEdit"/>
         </item>
+        <item row="1" column="0" colspan="2">
+         <widget class="QCheckBox" name="consoleCheckBox">
+          <property name="toolTip">
+           <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Use CDB's native console instead of Qt Creator's console for console applications. The native console does not prompt on application exit. It is suitable for diagnosing cases in which the application does not start up properly in Qt Creator's console and the subsequent attach fails.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+          </property>
+          <property name="text">
+           <string>Use CDB &amp;console</string>
+          </property>
+         </widget>
+        </item>
        </layout>
       </widget>
      </item>
-- 
GitLab