From 2af301e253f1520c56340de5b4a150187917551d Mon Sep 17 00:00:00 2001
From: Kai Koehne <kai.koehne@nokia.com>
Date: Tue, 13 Mar 2012 13:50:05 +0100
Subject: [PATCH] Debugger: Bring Qt Creator to foreground if app interrupts

Change-Id: I07795f61b79cce9687d0ae2bff3cc19534ec08d6
Reviewed-by: hjk <qthjk@ovi.com>
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@nokia.com>
---
 src/libs/utils/appmainwindow.cpp            | 17 ++++++++++++-
 src/libs/utils/appmainwindow.h              |  7 ++----
 src/plugins/debugger/commonoptionspage.cpp  |  3 +++
 src/plugins/debugger/commonoptionspage.ui   | 27 +++++++++++++--------
 src/plugins/debugger/debuggeractions.cpp    |  6 +++++
 src/plugins/debugger/debuggeractions.h      |  1 +
 src/plugins/debugger/debuggerengine.cpp     |  2 ++
 src/plugins/debugger/debuggerengine.h       |  1 +
 src/plugins/debugger/debuggermainwindow.cpp | 22 +++++++++++++++++
 src/plugins/debugger/debuggermainwindow.h   |  7 ++++++
 src/plugins/debugger/debuggerplugin.cpp     |  1 +
 11 files changed, 78 insertions(+), 16 deletions(-)

diff --git a/src/libs/utils/appmainwindow.cpp b/src/libs/utils/appmainwindow.cpp
index 5eb8f4ab194..09bb3336232 100644
--- a/src/libs/utils/appmainwindow.cpp
+++ b/src/libs/utils/appmainwindow.cpp
@@ -36,10 +36,13 @@
 #include <windows.h>
 #endif
 
-#include <QtDebug>
 #include <QEvent>
 #include <QCoreApplication>
 
+#ifdef Q_WS_X11
+#include <QX11Info>
+#endif
+
 namespace Utils {
 
 /* The notification signal is delayed by using a custom event
@@ -56,6 +59,18 @@ AppMainWindow::AppMainWindow() :
 {
 }
 
+void AppMainWindow::raiseWindow()
+{
+    setWindowState(windowState() & ~Qt::WindowMinimized);
+
+    raise();
+#ifdef Q_WS_X11
+    // work around QTBUG-24932
+    QX11Info::setAppUserTime(0);
+#endif
+    activateWindow();
+}
+
 #ifdef Q_OS_WIN
 bool AppMainWindow::event(QEvent *event)
 {
diff --git a/src/libs/utils/appmainwindow.h b/src/libs/utils/appmainwindow.h
index 928adb678dd..d773bc85517 100644
--- a/src/libs/utils/appmainwindow.h
+++ b/src/libs/utils/appmainwindow.h
@@ -38,17 +38,14 @@
 
 namespace Utils {
 
-/*!
- * This class only exists because we can't include windows.h in mainwindow.cpp
- * because windows defines an IContext...
- */
-
 class QTCREATOR_UTILS_EXPORT AppMainWindow : public QMainWindow
 {
     Q_OBJECT
 public:
     AppMainWindow();
 
+    void raiseWindow();
+
 signals:
     void deviceChange();
 
diff --git a/src/plugins/debugger/commonoptionspage.cpp b/src/plugins/debugger/commonoptionspage.cpp
index 4718a1cc9fc..98806c9784b 100644
--- a/src/plugins/debugger/commonoptionspage.cpp
+++ b/src/plugins/debugger/commonoptionspage.cpp
@@ -72,6 +72,8 @@ CommonOptionsPageWidget::CommonOptionsPageWidget
         m_ui.checkBoxCloseBuffersOnExit);
     m_group->insert(dc->action(SwitchModeOnExit),
         m_ui.checkBoxSwitchModeOnExit);
+    m_group->insert(dc->action(RaiseOnInterrupt),
+        m_ui.checkBoxBringToForegroundOnInterrrupt);
     m_group->insert(dc->action(FontSizeFollowsEditor),
         m_ui.checkBoxFontSizeFollowsEditor);
     m_group->insert(dc->action(AutoDerefPointers), 0);
@@ -120,6 +122,7 @@ QString CommonOptionsPageWidget::searchKeyWords() const
             << sep << m_ui.checkBoxCloseBuffersOnExit->text()
             << sep << m_ui.checkBoxSwitchModeOnExit->text()
             << sep << m_ui.labelMaximalStackDepth->text()
+            << sep << m_ui.checkBoxBringToForegroundOnInterrrupt->text()
                ;
     rc.remove(QLatin1Char('&'));
     return rc;
diff --git a/src/plugins/debugger/commonoptionspage.ui b/src/plugins/debugger/commonoptionspage.ui
index 8cf9ae4f0e9..b44f2f36cb4 100644
--- a/src/plugins/debugger/commonoptionspage.ui
+++ b/src/plugins/debugger/commonoptionspage.ui
@@ -65,16 +65,6 @@
         </property>
        </widget>
       </item>
-      <item row="3" column="0">
-       <widget class="QCheckBox" name="checkBoxRegisterForPostMortem">
-        <property name="toolTip">
-         <string>Register Qt Creator for debugging crashed applications.</string>
-        </property>
-        <property name="text">
-         <string>Use Qt Creator for post-mortem debugging</string>
-        </property>
-       </widget>
-      </item>
       <item row="4" column="0">
        <layout class="QHBoxLayout" name="horizontalLayout">
         <item>
@@ -130,6 +120,23 @@
         </item>
        </layout>
       </item>
+      <item row="3" column="1">
+       <widget class="QCheckBox" name="checkBoxRegisterForPostMortem">
+        <property name="toolTip">
+         <string>Register Qt Creator for debugging crashed applications.</string>
+        </property>
+        <property name="text">
+         <string>Use Qt Creator for post-mortem debugging</string>
+        </property>
+       </widget>
+      </item>
+      <item row="3" column="0">
+       <widget class="QCheckBox" name="checkBoxBringToForegroundOnInterrrupt">
+        <property name="text">
+         <string>Bring Qt Creator to foreground when application interrupts</string>
+        </property>
+       </widget>
+      </item>
      </layout>
     </widget>
    </item>
diff --git a/src/plugins/debugger/debuggeractions.cpp b/src/plugins/debugger/debuggeractions.cpp
index 0712a37124f..ffb0d1842da 100644
--- a/src/plugins/debugger/debuggeractions.cpp
+++ b/src/plugins/debugger/debuggeractions.cpp
@@ -397,6 +397,12 @@ DebuggerSettings::DebuggerSettings(QSettings *settings)
     item->setDefaultValue(false);
     insertItem(SwitchModeOnExit, item);
 
+    item = new SavedAction(this);
+    item->setSettingsKey(debugModeGroup, QLatin1String("RaiseOnInterrupt"));
+    item->setCheckable(true);
+    item->setDefaultValue(true);
+    insertItem(RaiseOnInterrupt, item);
+
     item = new SavedAction(this);
     item->setSettingsKey(debugModeGroup, QLatin1String("AutoQuit"));
     item->setText(tr("Automatically Quit Debugger"));
diff --git a/src/plugins/debugger/debuggeractions.h b/src/plugins/debugger/debuggeractions.h
index 1bdc34c496f..9da4ab1b051 100644
--- a/src/plugins/debugger/debuggeractions.h
+++ b/src/plugins/debugger/debuggeractions.h
@@ -100,6 +100,7 @@ enum DebuggerActionCode
     OperateByInstruction,
     CloseBuffersOnExit,
     SwitchModeOnExit,
+    RaiseOnInterrupt,
 
     UseDebuggingHelpers,
 
diff --git a/src/plugins/debugger/debuggerengine.cpp b/src/plugins/debugger/debuggerengine.cpp
index f90a91bf851..a335902fb0d 100644
--- a/src/plugins/debugger/debuggerengine.cpp
+++ b/src/plugins/debugger/debuggerengine.cpp
@@ -1038,6 +1038,8 @@ void DebuggerEngine::notifyInferiorSpontaneousStop()
     QTC_ASSERT(state() == InferiorRunOk, qDebug() << this << state());
     showStatusMessage(tr("Stopped."));
     setState(InferiorStopOk);
+    if (debuggerCore()->boolSetting(RaiseOnInterrupt))
+        emit raiseWindow();
 }
 
 void DebuggerEngine::notifyInferiorStopFailed()
diff --git a/src/plugins/debugger/debuggerengine.h b/src/plugins/debugger/debuggerengine.h
index f2f133dff14..4151b2dace1 100644
--- a/src/plugins/debugger/debuggerengine.h
+++ b/src/plugins/debugger/debuggerengine.h
@@ -302,6 +302,7 @@ signals:
      * a server start script should be used, but none is given.
      */
     void requestRemoteSetup();
+    void raiseWindow();
 
 protected:
     // The base notify*() function implementation should be sufficient
diff --git a/src/plugins/debugger/debuggermainwindow.cpp b/src/plugins/debugger/debuggermainwindow.cpp
index d5c1102b9e0..1f434e44dce 100644
--- a/src/plugins/debugger/debuggermainwindow.cpp
+++ b/src/plugins/debugger/debuggermainwindow.cpp
@@ -32,7 +32,9 @@
 
 #include "debuggermainwindow.h"
 #include "debuggercore.h"
+#include "debuggerengine.h"
 
+#include <utils/appmainwindow.h>
 #include <utils/styledbar.h>
 #include <utils/qtcassert.h>
 #include <utils/fancymainwindow.h>
@@ -141,6 +143,8 @@ public:
     Project *m_previousProject;
     Target *m_previousTarget;
     RunConfiguration *m_previousRunConfiguration;
+
+    DebuggerEngine *m_engine;
 };
 
 DebuggerMainWindowPrivate::DebuggerMainWindowPrivate(DebuggerMainWindow *mw)
@@ -157,6 +161,7 @@ DebuggerMainWindowPrivate::DebuggerMainWindowPrivate(DebuggerMainWindow *mw)
     , m_previousProject(0)
     , m_previousTarget(0)
     , m_previousRunConfiguration(0)
+    , m_engine(0)
 {
     createViewsMenuItems();
     addLanguage(CppLanguage, Context(C_CPPDEBUGGER));
@@ -271,6 +276,15 @@ DebuggerMainWindow::~DebuggerMainWindow()
     delete d;
 }
 
+void DebuggerMainWindow::setCurrentEngine(DebuggerEngine *engine)
+{
+    if (d->m_engine)
+        disconnect(d->m_engine, SIGNAL(raiseWindow()), this, SLOT(raiseDebuggerWindow()));
+    d->m_engine = engine;
+    if (d->m_engine)
+        connect(d->m_engine, SIGNAL(raiseWindow()), this, SLOT(raiseDebuggerWindow()));
+}
+
 DebuggerLanguages DebuggerMainWindow::activeDebugLanguages() const
 {
     return d->m_activeDebugLanguages;
@@ -559,6 +573,14 @@ void DebuggerMainWindow::writeSettings() const
     settings->endGroup();
 }
 
+void DebuggerMainWindow::raiseDebuggerWindow()
+{
+    Core::ICore *core = Core::ICore::instance();
+    Utils::AppMainWindow *appMainWindow = qobject_cast<Utils::AppMainWindow*>(core->mainWindow());
+    QTC_ASSERT(appMainWindow, return)
+    appMainWindow->raiseWindow();
+}
+
 void DebuggerMainWindow::readSettings()
 {
     QSettings *settings = ICore::settings();
diff --git a/src/plugins/debugger/debuggermainwindow.h b/src/plugins/debugger/debuggermainwindow.h
index a43ee833c58..ed82cbdd727 100644
--- a/src/plugins/debugger/debuggermainwindow.h
+++ b/src/plugins/debugger/debuggermainwindow.h
@@ -45,6 +45,8 @@ class IMode;
 
 namespace Debugger {
 
+class DebuggerEngine;
+
 namespace Internal {
 class DebuggerMainWindowPrivate;
 }
@@ -57,6 +59,8 @@ public:
     DebuggerMainWindow();
     ~DebuggerMainWindow();
 
+    void setCurrentEngine(DebuggerEngine *engine);
+
     // Debugger toolbars are registered with this function.
     void setToolBar(DebuggerLanguage language, QWidget *widget);
 
@@ -81,6 +85,9 @@ public:
     void readSettings();
     void writeSettings() const;
 
+private slots:
+    void raiseDebuggerWindow();
+
 signals:
     void activeDebugLanguagesChanged(Debugger::DebuggerLanguages);
 
diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp
index fcec00c9069..19aa868c878 100644
--- a/src/plugins/debugger/debuggerplugin.cpp
+++ b/src/plugins/debugger/debuggerplugin.cpp
@@ -2100,6 +2100,7 @@ void DebuggerPluginPrivate::connectEngine(DebuggerEngine *engine)
     engine->watchHandler()->rebuildModel();
 
     mainWindow()->setEngineDebugLanguages(engine->languages());
+    mainWindow()->setCurrentEngine(engine);
 }
 
 static void changeFontSize(QWidget *widget, qreal size)
-- 
GitLab