From 867befc5aed42f9b3e57231e14a6a0aa430c5591 Mon Sep 17 00:00:00 2001 From: Aaron Barany Date: Sat, 8 Dec 2018 00:01:42 -0800 Subject: [PATCH] Debugger: Fix switching to previous mode on exit This behavior was broken with refactoring done in commit 3b5ecac238b87615b44b27375cef0b4f1d4637e4. This has two main components: 1. Perspective::select() needs to call EngineManager::activateDebugMode() in order to save the previous mode. 2. The contents of the previous function DebuggerPluginPrivate::activatePreviousMode() was placed in EngineManager::deactivateDebugMode() and is called in doFinishDebugger(). Task-number: QTCREATORBUG-21415 Change-Id: Ibca188ba740027769c497e25ea695af8e218ea4e Reviewed-by: hjk --- src/plugins/debugger/debuggerengine.cpp | 2 ++ src/plugins/debugger/debuggermainwindow.cpp | 3 ++- src/plugins/debugger/enginemanager.cpp | 12 ++++++++++++ src/plugins/debugger/enginemanager.h | 1 + 4 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/plugins/debugger/debuggerengine.cpp b/src/plugins/debugger/debuggerengine.cpp index eaafa9b9d3f..8ced94f4ba3 100644 --- a/src/plugins/debugger/debuggerengine.cpp +++ b/src/plugins/debugger/debuggerengine.cpp @@ -418,6 +418,8 @@ public: m_watchHandler.cleanup(); m_engine->showMessage(tr("Debugger finished."), StatusBar); m_engine->setState(DebuggerFinished); // Also destroys views. + if (boolSetting(SwitchModeOnExit)) + EngineManager::deactivateDebugMode(); } void scheduleResetLocation() diff --git a/src/plugins/debugger/debuggermainwindow.cpp b/src/plugins/debugger/debuggermainwindow.cpp index 18cfd421f03..2607c1fbd0b 100644 --- a/src/plugins/debugger/debuggermainwindow.cpp +++ b/src/plugins/debugger/debuggermainwindow.cpp @@ -26,6 +26,7 @@ #include "debuggermainwindow.h" #include "debuggerconstants.h" #include "debuggerinternalconstants.h" +#include "enginemanager.h" #include #include @@ -696,7 +697,7 @@ void Perspective::addWindow(QWidget *widget, void Perspective::select() { - ModeManager::activateMode(Debugger::Constants::MODE_DEBUG); + Debugger::Internal::EngineManager::activateDebugMode(); if (Perspective::currentPerspective() == this) return; theMainWindow->d->selectPerspective(this); diff --git a/src/plugins/debugger/enginemanager.cpp b/src/plugins/debugger/enginemanager.cpp index 68f800c5b1e..8bb62ede9db 100644 --- a/src/plugins/debugger/enginemanager.cpp +++ b/src/plugins/debugger/enginemanager.cpp @@ -421,6 +421,18 @@ void EngineManager::activateDebugMode() } } +void EngineManager::deactivateDebugMode() +{ + if (ModeManager::currentModeId() == Constants::MODE_DEBUG && d->m_previousMode.isValid()) { + // If stopping the application also makes Qt Creator active (as the + // "previously active application"), doing the switch synchronously + // leads to funny effects with floating dock widgets + const Core::Id mode = d->m_previousMode; + QTimer::singleShot(0, d, [mode]() { ModeManager::activateMode(mode); }); + d->m_previousMode = Id(); + } +} + bool EngineManager::isLastOf(const QString &type) { int count = 0; diff --git a/src/plugins/debugger/enginemanager.h b/src/plugins/debugger/enginemanager.h index a41f13183aa..a1ee76c60b9 100644 --- a/src/plugins/debugger/enginemanager.h +++ b/src/plugins/debugger/enginemanager.h @@ -49,6 +49,7 @@ public: static void unregisterEngine(DebuggerEngine *engine); static void activateEngine(DebuggerEngine *engine); static void activateDebugMode(); + static void deactivateDebugMode(); static bool isLastOf(const QString &type); static QList > engines();