summaryrefslogtreecommitdiff
path: root/libreofficekit/source
diff options
context:
space:
mode:
authorMike Kaganski <mike.kaganski@collabora.com>2022-10-28 13:04:00 +0300
committerMike Kaganski <mike.kaganski@collabora.com>2022-10-28 13:59:36 +0200
commit616e95c7044e8ea4fe3396dfa22c4ef7e9d4cd32 (patch)
tree4e589b50d42a5bd6fc211da00e4781667d7f2682 /libreofficekit/source
parent8db9337f35829d8592545055d03718ba0a204950 (diff)
lok: You can't assume that destroyView would only destroy one view
In case you have some in-place clients (e.g., Math in-place editing is active), destroying the parent view would also destroy children, and then both numberOfViewsChanged (called from doc_destroyView) must tolerate 0 as a valid input, and lok_doc_view_destroy must make sure to destroy the document after the last views had gone. Change-Id: I32370fea49da0969e1fbbf971a397c4d657ec8f9 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/141963 Reviewed-by: Michael Meeks <michael.meeks@collabora.com> Tested-by: Jenkins
Diffstat (limited to 'libreofficekit/source')
-rw-r--r--libreofficekit/source/gtk/lokdocview.cxx16
1 files changed, 6 insertions, 10 deletions
diff --git a/libreofficekit/source/gtk/lokdocview.cxx b/libreofficekit/source/gtk/lokdocview.cxx
index f52330bcbd56..451a373d416b 100644
--- a/libreofficekit/source/gtk/lokdocview.cxx
+++ b/libreofficekit/source/gtk/lokdocview.cxx
@@ -2771,17 +2771,13 @@ static void lok_doc_view_destroy (GtkWidget* widget)
if (priv->m_pDocument)
{
- if (priv->m_pDocument->pClass->getViewsCount(priv->m_pDocument) > 1)
+ // This call may drop several views - e.g., embedded OLE in-place clients
+ priv->m_pDocument->pClass->destroyView(priv->m_pDocument, priv->m_nViewId);
+ if (priv->m_pDocument->pClass->getViewsCount(priv->m_pDocument) == 0)
{
- priv->m_pDocument->pClass->destroyView(priv->m_pDocument, priv->m_nViewId);
- }
- else
- {
- if (priv->m_pDocument)
- {
- priv->m_pDocument->pClass->destroy (priv->m_pDocument);
- priv->m_pDocument = nullptr;
- }
+ // Last view(s) gone
+ priv->m_pDocument->pClass->destroy (priv->m_pDocument);
+ priv->m_pDocument = nullptr;
if (priv->m_pOffice)
{
priv->m_pOffice->pClass->destroy (priv->m_pOffice);