From 6fd0433cd6593882eeeb899d43ca01de50b95829 Mon Sep 17 00:00:00 2001
From: hjk <qtc-committer@nokia.com>
Date: Thu, 13 Aug 2009 14:33:02 +0200
Subject: [PATCH] debugger: pop up a window when the application receives a
 signal like SIGSEGV

Just mentioning it in the status bar is often not enough to take notice.
---
 src/plugins/debugger/commonoptionspage.ui |  7 +++++++
 src/plugins/debugger/debuggeractions.cpp  | 14 +++++++++++---
 src/plugins/debugger/debuggeractions.h    |  1 +
 src/plugins/debugger/debuggerplugin.cpp   |  2 ++
 src/plugins/debugger/gdb/gdbengine.cpp    | 19 ++++++++++++++++---
 5 files changed, 37 insertions(+), 6 deletions(-)

diff --git a/src/plugins/debugger/commonoptionspage.ui b/src/plugins/debugger/commonoptionspage.ui
index 9512db33aaa..249ccaca917 100644
--- a/src/plugins/debugger/commonoptionspage.ui
+++ b/src/plugins/debugger/commonoptionspage.ui
@@ -27,6 +27,13 @@
         </property>
        </widget>
       </item>
+      <item>
+       <widget class="QCheckBox" name="checkBoxUseMessageBoxForSignals">
+        <property name="text">
+         <string>Show a message box when receiving a signal</string>
+        </property>
+       </widget>
+      </item>
       <item>
        <widget class="QCheckBox" name="checkBoxUseAlternatingRowColors">
         <property name="text">
diff --git a/src/plugins/debugger/debuggeractions.cpp b/src/plugins/debugger/debuggeractions.cpp
index 693dcf4e661..0617307ba72 100644
--- a/src/plugins/debugger/debuggeractions.cpp
+++ b/src/plugins/debugger/debuggeractions.cpp
@@ -122,13 +122,13 @@ DebuggerSettings *DebuggerSettings::instance()
     // View
     //
     item = new SavedAction(instance);
-    instance->insertItem(AdjustColumnWidths, item);
     item->setText(tr("Adjust column widths to contents"));
+    instance->insertItem(AdjustColumnWidths, item);
 
     item = new SavedAction(instance);
-    instance->insertItem(AlwaysAdjustColumnWidths, item);
     item->setText(tr("Always adjust column widths to contents"));
     item->setCheckable(true);
+    instance->insertItem(AlwaysAdjustColumnWidths, item);
 
     item = new SavedAction(instance);
     item->setText(tr("Use alternating row colors"));
@@ -138,8 +138,16 @@ DebuggerSettings *DebuggerSettings::instance()
     instance->insertItem(UseAlternatingRowColors, item);
 
     item = new SavedAction(instance);
-    item->setSettingsKey(debugModeGroup, QLatin1String("LogTimeStamps"));
+    item->setText(tr("Show a message box when receiving a signal"));
+    item->setSettingsKey(debugModeGroup, QLatin1String("UseMessageBoxForSignals"));
+    item->setCheckable(true);
+    item->setDefaultValue(true);
+    item->setValue(true);
+    instance->insertItem(UseMessageBoxForSignals, item);
+
+    item = new SavedAction(instance);
     item->setText(tr("Log time stamps"));
+    item->setSettingsKey(debugModeGroup, QLatin1String("LogTimeStamps"));
     item->setCheckable(true);
     item->setDefaultValue(false);
     instance->insertItem(LogTimeStamps, item);
diff --git a/src/plugins/debugger/debuggeractions.h b/src/plugins/debugger/debuggeractions.h
index a0ccf46c005..fa283bde6ad 100644
--- a/src/plugins/debugger/debuggeractions.h
+++ b/src/plugins/debugger/debuggeractions.h
@@ -77,6 +77,7 @@ enum DebuggerActionCode
     AdjustColumnWidths,
     AlwaysAdjustColumnWidths,
     UseAlternatingRowColors,
+    UseMessageBoxForSignals,
     AutoQuit,
     LockView,
     LogTimeStamps,
diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp
index 6b4610e49f8..d9606327583 100644
--- a/src/plugins/debugger/debuggerplugin.cpp
+++ b/src/plugins/debugger/debuggerplugin.cpp
@@ -294,6 +294,8 @@ QWidget *CommonOptionsPage::createPage(QWidget *parent)
         m_ui.checkBoxListSourceFiles);
     m_group.insert(theDebuggerAction(UseAlternatingRowColors),
         m_ui.checkBoxUseAlternatingRowColors);
+    m_group.insert(theDebuggerAction(UseMessageBoxForSignals),
+        m_ui.checkBoxUseMessageBoxForSignals);
     m_group.insert(theDebuggerAction(SkipKnownFrames),
         m_ui.checkBoxSkipKnownFrames);
     m_group.insert(theDebuggerAction(UseToolTips),
diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp
index d7ab3f59391..a327bf9ad5e 100644
--- a/src/plugins/debugger/gdb/gdbengine.cpp
+++ b/src/plugins/debugger/gdb/gdbengine.cpp
@@ -790,7 +790,7 @@ void GdbEngine::handleResultRecord(const GdbResultRecord &record)
 
     if (record.token < m_oldestAcceptableToken && (cmd.flags & Discardable)) {
         //qDebug() << "### SKIPPING OLD RESULT" << record.toString();
-        //QMessageBox::information(m_mainWindow, tr("Skipped"), "xxx");
+        //QMessageBox::information(q->mainWindow(), tr("Skipped"), "xxx");
         return;
     }
 
@@ -1186,6 +1186,19 @@ void GdbEngine::handleAsyncOutput(const GdbMi &data)
                 }
             }
 #endif
+            if (reason == "signal-received"
+                && theDebuggerBoolSetting(UseMessageBoxForSignals)) {
+                QByteArray name = data.findChild("signal-name").data();
+                QByteArray meaning = data.findChild("signal-meaning").data();
+                QString msg = tr("<p>The inferior stopped because it received a "
+                    "signal from the Operating System.<p>"
+                    "<table><tr><td>Signal name : </td><td>%1</td></tr>"
+                    "<tr><td>Signal meaning : </td><td>%2</td></tr></table>")
+                    .arg(name.isEmpty() ? tr(" <Unknown> ") : _(name))
+                    .arg(meaning.isEmpty() ? tr(" <Unknown> ") : _(meaning));
+                QMessageBox::information(q->mainWindow(), tr("Signal received"), msg);
+            }
+
             if (reason.isEmpty())
                 q->showStatusMessage(tr("Stopped."));
             else
@@ -1295,11 +1308,11 @@ void GdbEngine::handleShowVersion(const GdbResultRecord &response, const QVarian
                      "Using gdb 6.7 or later is strongly recommended.");
 #if 0
             // ugly, but 'Show again' check box...
-            static QErrorMessage *err = new QErrorMessage(m_mainWindow);
+            static QErrorMessage *err = new QErrorMessage(q->mainWindow());
             err->setMinimumSize(400, 300);
             err->showMessage(msg);
 #else
-            //QMessageBox::information(m_mainWindow, tr("Warning"), msg);
+            //QMessageBox::information(q->mainWindow(), tr("Warning"), msg);
 #endif
         } else {
             m_gdbVersion = 10000 * supported.cap(2).toInt()
-- 
GitLab