From 5bcc81a61ef699b1d0e33a25c69a47d5920fc332 Mon Sep 17 00:00:00 2001
From: hjk <qtc-committer@nokia.com>
Date: Thu, 7 May 2009 15:20:44 +0200
Subject: [PATCH] debugger: introduce an explicit detach action

---
 src/plugins/debugger/debuggermanager.cpp | 15 ++++------
 src/plugins/debugger/debuggermanager.h   |  1 +
 src/plugins/debugger/debuggerplugin.cpp  | 36 ++++++++++++++++++++++++
 src/plugins/debugger/debuggerplugin.h    |  3 ++
 src/plugins/debugger/gdbengine.cpp       |  9 ++++--
 src/plugins/debugger/gdbengine.h         |  1 +
 src/plugins/debugger/idebuggerengine.h   |  1 +
 7 files changed, 55 insertions(+), 11 deletions(-)

diff --git a/src/plugins/debugger/debuggermanager.cpp b/src/plugins/debugger/debuggermanager.cpp
index ea6f6fea51e..e7780922f9c 100644
--- a/src/plugins/debugger/debuggermanager.cpp
+++ b/src/plugins/debugger/debuggermanager.cpp
@@ -1245,15 +1245,6 @@ void DebuggerManager::setStatus(int status)
     const bool ready = status == DebuggerInferiorStopped
             && startMode() != AttachCore;
 
-// FIXME
-//    m_startExternalAction->setEnabled(!started && !starting);
-//    m_attachExternalAction->setEnabled(!started && !starting);
-//#ifdef Q_OS_WIN
-//    m_attachCoreAction->setEnabled(false);
-//#else
-//    m_attachCoreAction->setEnabled(!started && !starting);
-//#endif
-//    m_attachRemoteAction->setEnabled(!started && !starting);
     m_watchAction->setEnabled(ready);
     m_breakAction->setEnabled(true);
 
@@ -1316,6 +1307,12 @@ void DebuggerManager::continueExec()
         m_engine->continueInferior();
 }
 
+void DebuggerManager::detachDebugger()
+{
+    if (m_engine)
+        m_engine->detachDebugger();
+}
+
 void DebuggerManager::interruptDebuggingRequest()
 {
     if (Debugger::Constants::Internal::debug)
diff --git a/src/plugins/debugger/debuggermanager.h b/src/plugins/debugger/debuggermanager.h
index 78d73c2db2b..aeb253d030d 100644
--- a/src/plugins/debugger/debuggermanager.h
+++ b/src/plugins/debugger/debuggermanager.h
@@ -242,6 +242,7 @@ public slots:
     void stepIExec();
     void nextIExec();
     void continueExec();
+    void detachDebugger();
 
     void addToWatchWindow();
     void updateWatchModel();
diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp
index d8ac64217ad..1382b678974 100644
--- a/src/plugins/debugger/debuggerplugin.cpp
+++ b/src/plugins/debugger/debuggerplugin.cpp
@@ -100,6 +100,7 @@ const char * const STARTEXTERNAL        = "Debugger.StartExternal";
 const char * const ATTACHEXTERNAL       = "Debugger.AttachExternal";
 const char * const ATTACHCORE           = "Debugger.AttachCore";
 const char * const ATTACHREMOTE         = "Debugger.AttachRemote";
+const char * const DETACH               = "Debugger.Detach";
 
 const char * const RUN_TO_LINE          = "Debugger.RunToLine";
 const char * const RUN_TO_FUNCTION      = "Debugger.RunToFunction";
@@ -486,6 +487,11 @@ bool DebuggerPlugin::initialize(const QStringList &arguments, QString *errorMess
         this, SLOT(startRemoteApplication()));
 
 
+    m_detachAction = new QAction(this);
+    m_detachAction->setText(tr("Detach debugger"));
+    connect(m_detachAction, SIGNAL(triggered()),
+        m_manager, SLOT(detachDebugger()));
+
     Core::ActionContainer *mdebug =
         am->actionContainer(ProjectExplorer::Constants::M_DEBUG);
 
@@ -508,6 +514,11 @@ bool DebuggerPlugin::initialize(const QStringList &arguments, QString *errorMess
 
     cmd = am->registerAction(m_manager->m_continueAction,
         ProjectExplorer::Constants::DEBUG, QList<int>() << m_gdbRunningContext);
+    mdebug->addAction(cmd, Core::Constants::G_DEFAULT_ONE);
+
+    cmd = am->registerAction(m_detachAction,
+        Constants::DETACH, globalcontext);
+    mdebug->addAction(cmd, Core::Constants::G_DEFAULT_ONE);
 
     cmd = am->registerAction(m_manager->m_stopAction,
         Constants::INTERRUPT, globalcontext);
@@ -783,6 +794,9 @@ bool DebuggerPlugin::initialize(const QStringList &arguments, QString *errorMess
         this, SLOT(activatePreviousMode()));
     connect(m_manager, SIGNAL(debugModeRequested()),
         this, SLOT(activateDebugMode()));
+    connect(m_manager, SIGNAL(statusChanged(int)),
+        this, SLOT(updateActions(int)));
+
 
     connect(theDebuggerAction(SettingsDialog), SIGNAL(triggered()),
         this, SLOT(showSettingsDialog()));
@@ -1095,6 +1109,28 @@ void DebuggerPlugin::startRemoteApplication()
         runControl->start();
 }
 
+void DebuggerPlugin::updateActions(int status)
+{
+    const bool started = status == DebuggerInferiorRunning
+        || status == DebuggerInferiorRunningRequested
+        || status == DebuggerInferiorStopRequested
+        || status == DebuggerInferiorStopped;
+
+    const bool starting = status == DebuggerProcessStartingUp;
+    //const bool running = status == DebuggerInferiorRunning;
+
+    const bool ready = status == DebuggerInferiorStopped
+            && m_manager->startMode() != AttachCore;
+    m_startExternalAction->setEnabled(!started && !starting);
+    m_attachExternalAction->setEnabled(!started && !starting);
+#ifdef Q_OS_WIN
+    m_attachCoreAction->setEnabled(false);
+#else
+    m_attachCoreAction->setEnabled(!started && !starting);
+#endif
+    m_startRemoteAction->setEnabled(!started && !starting);
+    m_detachAction->setEnabled(ready);
+}
 
 #include "debuggerplugin.moc"
 
diff --git a/src/plugins/debugger/debuggerplugin.h b/src/plugins/debugger/debuggerplugin.h
index 78d228dc8e3..b9b6254d3bc 100644
--- a/src/plugins/debugger/debuggerplugin.h
+++ b/src/plugins/debugger/debuggerplugin.h
@@ -88,6 +88,8 @@ private slots:
     void setConfigValue(const QString &name, const QVariant &value);
     void requestContextMenu(TextEditor::ITextEditor *editor,
         int lineNumber, QMenu *menu);
+    void updateActions(int status);
+
 
     void resetLocation();
     void gotoLocation(const QString &fileName, int line, bool setMarker);
@@ -125,6 +127,7 @@ private:
     QAction *m_startRemoteAction;
     QAction *m_attachExternalAction;
     QAction *m_attachCoreAction;
+    QAction *m_detachAction;
 };
 
 } // namespace Internal
diff --git a/src/plugins/debugger/gdbengine.cpp b/src/plugins/debugger/gdbengine.cpp
index 8214a4d04db..583b9aa5c10 100644
--- a/src/plugins/debugger/gdbengine.cpp
+++ b/src/plugins/debugger/gdbengine.cpp
@@ -1254,7 +1254,6 @@ void GdbEngine::handleExecRun(const GdbResultRecord &response, const QVariant &)
 {
     if (response.resultClass == GdbResultRunning) {
         qq->notifyInferiorRunning();
-        q->showStatusMessage(tr("Running..."));
     } else if (response.resultClass == GdbResultError) {
         const QByteArray &msg = response.data.findChild("msg").data();
         if (msg == "Cannot find bounds of current function") {
@@ -1323,6 +1322,12 @@ void GdbEngine::shutdown()
     exitDebugger();
 }
 
+void GdbEngine::detachDebugger()
+{
+    postCommand(_("detach"));
+    postCommand(_("-gdb-exit"), CB(handleExit));
+}
+
 void GdbEngine::exitDebugger()
 {
     debugMessage(_("GDBENGINE EXITDEBUFFER: %1").arg(m_gdbProc.state()));
@@ -1340,7 +1345,7 @@ void GdbEngine::exitDebugger()
                 qDebug() << "STATUS ON EXITDEBUGGER:" << q->status());
             interruptInferior();
         }
-        if (q->startMode() == AttachExternal || q->startMode() == StartRemote)
+        if (q->startMode() == AttachExternal)
             postCommand(_("detach"));
         else
             postCommand(_("kill"));
diff --git a/src/plugins/debugger/gdbengine.h b/src/plugins/debugger/gdbengine.h
index b1750fbfd82..095c09a91e7 100644
--- a/src/plugins/debugger/gdbengine.h
+++ b/src/plugins/debugger/gdbengine.h
@@ -99,6 +99,7 @@ private:
     void setToolTipExpression(const QPoint &pos, const QString &exp);
     bool startDebugger();
     void exitDebugger();
+    void detachDebugger();
 
     void continueInferior();
     void interruptInferior();
diff --git a/src/plugins/debugger/idebuggerengine.h b/src/plugins/debugger/idebuggerengine.h
index ececbe9aa7a..9d85ebace10 100644
--- a/src/plugins/debugger/idebuggerengine.h
+++ b/src/plugins/debugger/idebuggerengine.h
@@ -52,6 +52,7 @@ public:
     virtual void setToolTipExpression(const QPoint &pos, const QString &exp) = 0;
     virtual bool startDebugger() = 0;
     virtual void exitDebugger() = 0;
+    virtual void detachDebugger() {}
     virtual void updateWatchModel() = 0;
 
     virtual void stepExec() = 0;
-- 
GitLab