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