diff --git a/src/libs/utils/appmainwindow.cpp b/src/libs/utils/appmainwindow.cpp index 5eb8f4ab194e0be889d880ae9ab2a706ef39c4bf..09bb33362323b4a93de3ffb39cc55b948dab3abb 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 928adb678ddb147d9902e83ce7316fce47eb023c..d773bc8551792d71f76b0eb9660cc480f32d07a5 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 4718a1cc9fc094e7b96ff05cbe4cde2e5df6f372..98806c9784b86ea6922195e20f61a588baba8c4f 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 8cf9ae4f0e96c17048c41cd6ae3f0def06c2012c..b44f2f36cb421d52ea6265ed5bea438cefea0218 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 0712a37124fa9392bd58cb3c65ea901d707fc6f4..ffb0d1842da55910dd25c1e015df06c3f364c2aa 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 1bdc34c496fec4df59cfa622956d50a72a1533fe..9da4ab1b051ae7f8d85ccfadb830f43bddbec2db 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 f90a91bf85182b7c150b317525e2d0ddd29e3eda..a335902fb0dac026e94207a071e11cd4d31e2c67 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 f2f133dff14437bf9b1814b0118823470237ae60..4151b2dace1a9eb60dda0030525d6f1da95cbb16 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 d5c1102b9e0496da10f7fb4174e9bf1d2fca296b..1f434e44dceb7cc86171fc6d5897a36e9f665266 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 a43ee833c587bd852562ef5e91b14d8acc393485..ed82cbdd7275c4860960e8d04cb52f16f9db4a66 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 fcec00c90697f6108113a52c7127fc090b778f52..19aa868c8784bae889fce292fa7e191a10a3b036 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)