From 15200bf68c34ddf996e077be87ca394f78dd77eb Mon Sep 17 00:00:00 2001 From: Kubat <mael.martin31@gmail.com> Date: Wed, 25 Aug 2021 13:59:15 +0200 Subject: [PATCH] UI: No more segfault when closing a script view with FakeVim --- src/UI/FakeVim/FakeVimHandler.hh | 1 + src/UI/MainWindow.cc | 1 + src/UI/ScriptDocumentView.cc | 20 ++++++++++++++++---- src/UI/ScriptDocumentView.hh | 1 + src/UI/ScriptViews/EditorProxy.cc | 8 +++++--- src/UI/ScriptViews/EditorProxy.hh | 6 ++++-- 6 files changed, 28 insertions(+), 9 deletions(-) diff --git a/src/UI/FakeVim/FakeVimHandler.hh b/src/UI/FakeVim/FakeVimHandler.hh index ca837ab5..1894680b 100644 --- a/src/UI/FakeVim/FakeVimHandler.hh +++ b/src/UI/FakeVim/FakeVimHandler.hh @@ -159,6 +159,7 @@ public: Signal<void()> tabNextRequested; public: + // Avoid weak tables class Private; private: diff --git a/src/UI/MainWindow.cc b/src/UI/MainWindow.cc index f1c656a7..31d2a7cc 100644 --- a/src/UI/MainWindow.cc +++ b/src/UI/MainWindow.cc @@ -272,6 +272,7 @@ MainWindow::closeDocument(int index) noexcept &MainWindow::documentViewActionsChanged); if (documentToClose) { + qDebug() << "Delete document view" << documentToClose->getDocumentTabName(); documentToClose->closeDocument(); delete documentToClose; } diff --git a/src/UI/ScriptDocumentView.cc b/src/UI/ScriptDocumentView.cc index f4976576..cef3678c 100644 --- a/src/UI/ScriptDocumentView.cc +++ b/src/UI/ScriptDocumentView.cc @@ -35,12 +35,18 @@ ScriptDocumentView::ScriptDocumentView(std::shared_ptr<ScriptDocument> ptr, QWid "}")); } +ScriptDocumentView::~ScriptDocumentView() +{ + setUseFakeVimEditor(false); + qDebug() << "~ScriptDocumentView"; +} + void ScriptDocumentView::setUseFakeVimEditor(bool yes) noexcept { if (yes && !isUsingFakeVim) { MainWindow *const mw = vivyApp->getMainWindow(); - handler = new FakeVimHandler(editor, this); + handler = new FakeVimHandler(editor); proxy = EditorProxy::connectSignals(handler, editor); isUsingFakeVim = true; connect(proxy, &EditorProxy::handleInput, handler, &FakeVimHandler::handleInput); @@ -54,9 +60,15 @@ ScriptDocumentView::setUseFakeVimEditor(bool yes) noexcept clearUndoRedo(editor); } - else if (!yes && isUsingFakeVim) { - delete proxy; - delete handler; + else if (!yes) { + if (handler) { + handler->disconnectFromEditor(); + delete handler; + } + + if (proxy) + delete proxy; + clearUndoRedo(editor); isUsingFakeVim = false; proxy = nullptr; diff --git a/src/UI/ScriptDocumentView.hh b/src/UI/ScriptDocumentView.hh index 1e94b676..7f2c333b 100644 --- a/src/UI/ScriptDocumentView.hh +++ b/src/UI/ScriptDocumentView.hh @@ -36,6 +36,7 @@ class ScriptDocumentView final : public AbstractDocumentView { public: explicit ScriptDocumentView(std::shared_ptr<ScriptDocument>, QWidget *parent = nullptr); + ~ScriptDocumentView() override; void closeDocument() noexcept override; void openProperties() noexcept override; diff --git a/src/UI/ScriptViews/EditorProxy.cc b/src/UI/ScriptViews/EditorProxy.cc index 07b1385c..f3294f3d 100644 --- a/src/UI/ScriptViews/EditorProxy.cc +++ b/src/UI/ScriptViews/EditorProxy.cc @@ -13,7 +13,7 @@ using namespace Vivy; Vivy::EditorProxy * EditorProxy::connectSignals(FakeVimHandler *handler, QPlainTextEdit *editor) noexcept { - EditorProxy *proxy = new EditorProxy(editor, handler); + EditorProxy *proxy = new EditorProxy(editor); handler->commandBufferChanged.connect([proxy](const QString &contents, int cursorPos, int /* anchorPos */, @@ -50,12 +50,14 @@ EditorProxy::connectSignals(FakeVimHandler *handler, QPlainTextEdit *editor) noe return proxy; } -EditorProxy::EditorProxy(QPlainTextEdit *widg, QObject *parent) noexcept - : QObject(parent) +EditorProxy::EditorProxy(QPlainTextEdit *widg) noexcept + : QObject() , widget(widg) { } +EditorProxy::~EditorProxy() { qDebug() << "~EditorProxy"; } + void EditorProxy::openFile(const QString &filename) noexcept { diff --git a/src/UI/ScriptViews/EditorProxy.hh b/src/UI/ScriptViews/EditorProxy.hh index c088b268..653b107c 100644 --- a/src/UI/ScriptViews/EditorProxy.hh +++ b/src/UI/ScriptViews/EditorProxy.hh @@ -22,13 +22,15 @@ class EditorProxy; using FakeVimHandler = FakeVim::Internal::FakeVimHandler; using ExCommand = FakeVim::Internal::ExCommand; -class EditorProxy : public QObject { +class EditorProxy final : public QObject { Q_OBJECT VIVY_UNMOVABLE_OBJECT(EditorProxy) - explicit EditorProxy(QPlainTextEdit *widget, QObject *parent = nullptr) noexcept; + explicit EditorProxy(QPlainTextEdit *widget) noexcept; public: + ~EditorProxy() override; + void openFile(const QString &fileName) noexcept; bool save(const QString &fileName) noexcept; -- GitLab