summaryrefslogtreecommitdiff
path: root/sfx2
diff options
context:
space:
mode:
authorCaolán McNamara <caolan.mcnamara@collabora.com>2023-06-08 20:53:16 +0100
committerMichael Meeks <michael.meeks@collabora.com>2023-06-09 09:11:54 +0200
commit770df258bc0a66ee7551a59807d79cebcdcbb85e (patch)
tree3228593de1147ad58ac0651cf15fdc81c5592106 /sfx2
parent61e2022110d3088bc1653713dc270beaacae4c74 (diff)
restore, not clear, existing interaction handler after save
put things back the way they were found. In this case I want it back to the original state, because a) lok sets its own interaction handler on load b) at framework/source/loadenv/loadenv.cxx:1137 Because that handler supports XInitialization we show the window early c) that happens to be before the menubar is set d) so the menubar changes the size of the window after it is shown e) so Window::ImplPosSizeWindow calls ImplInvalidateFrameRegion(nullptr, InvalidateFlags::Children) f) which sets ImplPaintFlags::PaintAllChildren on the PaintFlags of the workwindow g) which means that when a SwEditWin calls PaintImmediately vcl sees that flag on its WorkWindow grandparent and calls ImplCallPaint with the grandparent, not the SwEditWin. It happens that the grandparent has no LokId so that does nothing. if we clear this interaction on save, then the next joiner instead has no interaction so gets the default one which does not support XInitialization, so the window is not shown before menubar is added, so when it is shown it is already at the final size, so there is no ImplInvalidateFrameRegion and so no ImplPaintFlags::PaintAllChildren bits on the WorkWindow, so PaintImmediately on SwEditWin calls that Invalidate, which is special cased to broadcast the invalidation as a real thing Change-Id: Ie3fde4c53476aada2b1fdabb1dc70b08485074b7 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/152772 Tested-by: Jenkins Reviewed-by: Michael Meeks <michael.meeks@collabora.com> (cherry picked from commit 2768d6042539e628216d72423c7972da8b42d621) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/152764 Tested-by: Michael Meeks <michael.meeks@collabora.com>
Diffstat (limited to 'sfx2')
-rw-r--r--sfx2/source/doc/objstor.cxx10
1 files changed, 9 insertions, 1 deletions
diff --git a/sfx2/source/doc/objstor.cxx b/sfx2/source/doc/objstor.cxx
index 9ef664d1cb2f..7f8401cc2ee8 100644
--- a/sfx2/source/doc/objstor.cxx
+++ b/sfx2/source/doc/objstor.cxx
@@ -2609,10 +2609,15 @@ bool SfxObjectShell::DoSave_Impl( const SfxItemSet* pArgs )
// an interaction handler here can acquire only in case of GUI Saving
// and should be removed after the saving is done
+ Any aOriginalInteract;
css::uno::Reference< XInteractionHandler > xInteract;
const SfxUnoAnyItem* pxInteractionItem = SfxItemSet::GetItem<SfxUnoAnyItem>(pArgs, SID_INTERACTIONHANDLER, false);
if ( pxInteractionItem && ( pxInteractionItem->GetValue() >>= xInteract ) && xInteract.is() )
+ {
+ if (const SfxUnoAnyItem *pItem = pMediumTmp->GetItemSet()->GetItemIfSet(SID_INTERACTIONHANDLER, false))
+ aOriginalInteract = pItem->GetValue();
pMediumTmp->GetItemSet()->Put( SfxUnoAnyItem( SID_INTERACTIONHANDLER, Any( xInteract ) ) );
+ }
const SfxBoolItem* pNoFileSync = pArgs->GetItem<SfxBoolItem>(SID_NO_FILE_SYNC, false);
if (pNoFileSync && pNoFileSync->GetValue())
@@ -2625,7 +2630,10 @@ bool SfxObjectShell::DoSave_Impl( const SfxItemSet* pArgs )
if( pMediumTmp->GetItemSet() )
{
- pMediumTmp->GetItemSet()->ClearItem( SID_INTERACTIONHANDLER );
+ if (aOriginalInteract.hasValue())
+ pMediumTmp->GetItemSet()->Put(SfxUnoAnyItem(SID_INTERACTIONHANDLER, aOriginalInteract));
+ else
+ pMediumTmp->GetItemSet()->ClearItem(SID_INTERACTIONHANDLER);
pMediumTmp->GetItemSet()->ClearItem( SID_PROGRESS_STATUSBAR_CONTROL );
}