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