From 29cf39bfd6424364eeefd07e65cc0c613848ced2 Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Fri, 23 Jun 2017 15:19:00 +0200 Subject: [PATCH] ProjectExplorer: Fix crash in AppOutputPane The RunControl owns the Formatter set on the OutputWindow. Make sure the OutputWindow is deleted before the RunControl and avoid some useless setting of the Formatter. Task-number: QTCREATORBUG-18428 Change-Id: I40c8f032bb04c484957a35a6bbc0fda7b6491c51 Reviewed-by: Eike Ziller --- src/plugins/projectexplorer/appoutputpane.cpp | 20 +++++++++---------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/src/plugins/projectexplorer/appoutputpane.cpp b/src/plugins/projectexplorer/appoutputpane.cpp index b7189bbb1ca..a9a46974bbc 100644 --- a/src/plugins/projectexplorer/appoutputpane.cpp +++ b/src/plugins/projectexplorer/appoutputpane.cpp @@ -149,7 +149,10 @@ void TabWidget::slotContextMenuRequested(const QPoint &pos) AppOutputPane::RunControlTab::RunControlTab(RunControl *rc, Core::OutputWindow *w) : runControl(rc), window(w) -{ } +{ + if (rc && w) + w->setFormatter(rc->outputFormatter()); +} AppOutputPane::AppOutputPane() : m_mainWidget(new QWidget), @@ -262,7 +265,7 @@ AppOutputPane::~AppOutputPane() qDebug() << "OutputPane::~OutputPane: Entries left" << m_runControlTabs.size(); foreach (const RunControlTab &rt, m_runControlTabs) { - rt.window->setFormatter(nullptr); + delete rt.window; delete rt.runControl; } delete m_mainWidget; @@ -416,13 +419,14 @@ void AppOutputPane::createNewOutputWindow(RunControl *rc) RunControlTab &tab = m_runControlTabs[tabIndex]; // Reuse this tab delete tab.runControl; - handleOldOutput(tab.window); tab.runControl = rc; + tab.window->setFormatter(rc ? rc->outputFormatter() : nullptr); + + handleOldOutput(tab.window); // Update the title. m_tabWidget->setTabText(tabIndex, rc->displayName()); - tab.window->setFormatter(nullptr); tab.window->scrollToBottom(); if (debug) qDebug() << "OutputPane::createNewOutputWindow: Reusing tab" << tabIndex << " for " << rc; @@ -435,7 +439,6 @@ void AppOutputPane::createNewOutputWindow(RunControl *rc) Core::OutputWindow *ow = new Core::OutputWindow(context, m_tabWidget); ow->setWindowTitle(tr("Application Output Window")); ow->setWindowIcon(Icons::WINDOW.icon()); - ow->setFormatter(nullptr); ow->setWordWrapEnabled(ProjectExplorerPlugin::projectExplorerSettings().wrapAppOutput); ow->setMaxLineCount(ProjectExplorerPlugin::projectExplorerSettings().maxAppOutputLines); ow->setWheelZoomEnabled(TextEditor::TextEditorSettings::behaviorSettings().m_scrollWheelZooming); @@ -592,9 +595,8 @@ bool AppOutputPane::closeTab(int tabIndex, CloseTabMode closeTabMode) } m_tabWidget->removeTab(tabIndex); - m_runControlTabs[index].window->setFormatter(nullptr); - delete m_runControlTabs[index].runControl; delete m_runControlTabs[index].window; + delete m_runControlTabs[index].runControl; m_runControlTabs.removeAt(index); updateCloseActions(); @@ -708,10 +710,6 @@ void AppOutputPane::contextMenuRequested(const QPoint &pos, int index) void AppOutputPane::slotRunControlStarted() { RunControl *current = currentRunControl(); - const int rcIndex = indexOf(current); - if (rcIndex >= 0 && m_runControlTabs.at(rcIndex).window) - m_runControlTabs.at(rcIndex).window->setFormatter(current->outputFormatter()); - if (current && current == sender()) enableButtons(current, true); // RunControl::isRunning() cannot be trusted in signal handler. emit runControlStarted(current);