tdf#143149 fix crash if app exits while print progress is running

dismiss the dialog if its parent goes away, but leave the print
job running

Change-Id: Ic29ee0300a7d9476ad27a2594a555312e30c74f2
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/118254
Tested-by: Jenkins
Reviewed-by: Eike Rathke <erack@redhat.com>
diff --git a/include/vcl/print.hxx b/include/vcl/print.hxx
index 631b2f5..3d50fd0 100644
--- a/include/vcl/print.hxx
+++ b/include/vcl/print.hxx
@@ -380,7 +380,7 @@ class VCL_DLLPUBLIC PrinterController
    std::unique_ptr<ImplPrinterControllerData>
                                        mpImplData;
protected:
    PrinterController(const VclPtr<Printer>&, weld::Window*);
    PrinterController(const VclPtr<Printer>&, weld::Window* pDialogParent);
public:
    struct MultiPageSetup
    {
@@ -509,6 +509,8 @@ public:
    bool                                isShowDialogs() const;
    bool                                isDirectPrint() const;

    void                                dialogsParentClosing();

    // implementation details, not usable outside vcl
    // don't use outside vcl. Some of these are exported for
    // the benefit of vcl's plugins.
diff --git a/sfx2/source/view/viewprn.cxx b/sfx2/source/view/viewprn.cxx
index 796a505..7ec660c 100644
--- a/sfx2/source/view/viewprn.cxx
+++ b/sfx2/source/view/viewprn.cxx
@@ -174,6 +174,7 @@ void SfxPrinterController::Notify( SfxBroadcaster& , const SfxHint& rHint )
    {
        EndListening(*mpViewShell);
        EndListening(*mpObjectShell);
        dialogsParentClosing();
        mpViewShell = nullptr;
        mpObjectShell = nullptr;
    }
diff --git a/vcl/source/gdi/print3.cxx b/vcl/source/gdi/print3.cxx
index 1cc0ce8..8b00e2d 100644
--- a/vcl/source/gdi/print3.cxx
+++ b/vcl/source/gdi/print3.cxx
@@ -779,6 +779,17 @@ weld::Window* PrinterController::getWindow() const
    return mpImplData->mpWindow;
}

void PrinterController::dialogsParentClosing()
{
    mpImplData->mpWindow = nullptr;
    if (mpImplData->mxProgress)
    {
        // close the dialog without doing anything, just get rid of it
        mpImplData->mxProgress->response(RET_OK);
        mpImplData->mxProgress.reset();
    }
}

void PrinterController::setPrinter( const VclPtr<Printer>& i_rPrinter )
{
    VclPtr<Printer> xPrinter = mpImplData->mxPrinter;