From 4910cb9a1be7040142cedc0ccfb1bec2d74b3dca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= Date: Fri, 5 May 2017 14:34:51 +0100 Subject: [PATCH 4/6] rhbz#1444437 gnome-documents finalize may not occur immediately MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit when LOK Widget is destroyed, it may instead happen during GC of javascript, like in the in gnome-documents case, but "destroy" will be called promptly. So close documents and office in destroy, not finalize Reviewed-on: https://gerrit.libreoffice.org/37398 Reviewed-by: Caolán McNamara Tested-by: Caolán McNamara (cherry picked from commit c45660df336a640f0f9d4290b881548d25c9db9d) Change-Id: I1dd7b828839894cb2d87f5c087194fe458ca22f0 --- libreofficekit/source/gtk/lokdocview.cxx | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/libreofficekit/source/gtk/lokdocview.cxx b/libreofficekit/source/gtk/lokdocview.cxx index 13ae6ea..7d1ec01 100644 --- a/libreofficekit/source/gtk/lokdocview.cxx +++ b/libreofficekit/source/gtk/lokdocview.cxx @@ -2042,15 +2042,27 @@ static gboolean lok_doc_view_draw (GtkWidget* pWidget, cairo_t* pCairo) return FALSE; } -static void lok_doc_view_finalize (GObject* object) +//rhbz#1444437 finalize may not occur immediately when this widget is destroyed +//it may happen during GC of javascript, e.g. in gnome-documents but "destroy" +//will be called promptly, so close documents in destroy, not finalize +static void lok_doc_view_destroy (GtkWidget* widget) { - LOKDocView* pDocView = LOK_DOC_VIEW (object); + LOKDocView* pDocView = LOK_DOC_VIEW (widget); LOKDocViewPrivate& priv = getPrivate(pDocView); if (priv->m_pDocument) priv->m_pDocument->pClass->destroy (priv->m_pDocument); if (priv->m_pOffice) priv->m_pOffice->pClass->destroy (priv->m_pOffice); + + GTK_WIDGET_CLASS (lok_doc_view_parent_class)->destroy (widget); +} + +static void lok_doc_view_finalize (GObject* object) +{ + LOKDocView* pDocView = LOK_DOC_VIEW (object); + LOKDocViewPrivate& priv = getPrivate(pDocView); + delete priv.m_pImpl; priv.m_pImpl = nullptr; @@ -2099,6 +2111,7 @@ static void lok_doc_view_class_init (LOKDocViewClass* pClass) pWidgetClass->key_press_event = signalKey; pWidgetClass->key_release_event = signalKey; pWidgetClass->motion_notify_event = lok_doc_view_signal_motion; + pWidgetClass->destroy = lok_doc_view_destroy; /** * LOKDocView:lopath: -- 2.9.3