[Libreoffice-commits] core.git: include/vcl sc/source vcl/source vcl/unx
Noel Grandin (via logerrit)
logerrit at kemper.freedesktop.org
Fri May 24 14:11:19 UTC 2019
include/vcl/weld.hxx | 5 ++++-
sc/source/ui/miscdlgs/solvrdlg.cxx | 2 +-
vcl/source/app/salvtables.cxx | 7 +++++--
vcl/unx/gtk3/gtk3gtkinst.cxx | 11 +++++++----
4 files changed, 17 insertions(+), 8 deletions(-)
New commits:
commit b358bb95c04772a6ff00d7fcbb6fbef9d3dca13c
Author: Noel Grandin <noel.grandin at collabora.co.uk>
AuthorDate: Fri May 24 14:40:56 2019 +0200
Commit: Stephan Bergmann <sbergman at redhat.com>
CommitDate: Fri May 24 16:09:56 2019 +0200
cannot create a shared_ptr from an existing object
so pass in the shared_ptr we already have (and enforce that we pass in
the right one)
Change-Id: Ic481b5ec17c34ed9cba50586dedb6184505dee24
Reviewed-on: https://gerrit.libreoffice.org/72908
Tested-by: Jenkins
Reviewed-by: Stephan Bergmann <sbergman at redhat.com>
diff --git a/include/vcl/weld.hxx b/include/vcl/weld.hxx
index 71214ada80cf..af7271037a3b 100644
--- a/include/vcl/weld.hxx
+++ b/include/vcl/weld.hxx
@@ -403,7 +403,10 @@ private:
public:
virtual int run() = 0;
// Run async without a controller
- virtual bool runAsync(const std::function<void(sal_Int32)>& func) = 0;
+ // @param self - must point to this, to enforce that the dialog was created/held by a shared_ptr
+ virtual bool runAsync(std::shared_ptr<Dialog> const& rxSelf,
+ const std::function<void(sal_Int32)>& func)
+ = 0;
virtual void response(int response) = 0;
virtual void add_button(const OUString& rText, int response, const OString& rHelpId = OString())
= 0;
diff --git a/sc/source/ui/miscdlgs/solvrdlg.cxx b/sc/source/ui/miscdlgs/solvrdlg.cxx
index 551e781cbf8a..25a36c30941d 100644
--- a/sc/source/ui/miscdlgs/solvrdlg.cxx
+++ b/sc/source/ui/miscdlgs/solvrdlg.cxx
@@ -38,7 +38,7 @@ namespace
std::shared_ptr<weld::MessageDialog> xBox(Application::CreateMessageDialog(pParent,
VclMessageType::Warning, VclButtonsType::Ok,
rString));
- xBox->runAsync(func);
+ xBox->runAsync(xBox, func);
}
}
diff --git a/vcl/source/app/salvtables.cxx b/vcl/source/app/salvtables.cxx
index 5c75d2f369a2..e68e3818dcbc 100644
--- a/vcl/source/app/salvtables.cxx
+++ b/vcl/source/app/salvtables.cxx
@@ -1199,10 +1199,13 @@ public:
return m_xDialog->StartExecuteAsync(aCtx);
}
- virtual bool runAsync(const std::function<void(sal_Int32)> &rEndDialogFn) override
+ virtual bool runAsync(std::shared_ptr<Dialog> const & rxSelf, const std::function<void(sal_Int32)> &rEndDialogFn) override
{
+ assert( rxSelf.get() == this );
VclAbstractDialog::AsyncContext aCtx;
- aCtx.mxOwnerSelf.reset(this);
+ // In order to store a shared_ptr to ourself, we have to have been constructed by make_shared,
+ // which is that rxSelf enforces.
+ aCtx.mxOwnerSelf = rxSelf;
aCtx.maEndDialogFn = rEndDialogFn;
return m_xDialog->StartExecuteAsync(aCtx);
}
diff --git a/vcl/unx/gtk3/gtk3gtkinst.cxx b/vcl/unx/gtk3/gtk3gtkinst.cxx
index 39581793b406..263577731bdc 100644
--- a/vcl/unx/gtk3/gtk3gtkinst.cxx
+++ b/vcl/unx/gtk3/gtk3gtkinst.cxx
@@ -3004,7 +3004,7 @@ private:
DialogRunner m_aDialogRun;
std::shared_ptr<weld::DialogController> m_xDialogController;
// Used to keep ourself alive during a runAsync(when doing runAsync without a DialogController)
- std::shared_ptr<GtkInstanceDialog> m_xRunAsyncSelf;
+ std::shared_ptr<weld::Dialog> m_xRunAsyncSelf;
std::function<void(sal_Int32)> m_aFunc;
gulong m_nCloseSignalId;
gulong m_nResponseSignalId;
@@ -3088,11 +3088,14 @@ public:
return true;
}
- virtual bool runAsync(const std::function<void(sal_Int32)>& func) override
+ virtual bool runAsync(std::shared_ptr<Dialog> const & rxSelf, const std::function<void(sal_Int32)>& func) override
{
+ assert( rxSelf.get() == this );
assert(!m_nResponseSignalId);
- m_xRunAsyncSelf.reset(this);
+ // In order to store a shared_ptr to ourself, we have to have been constructed by make_shared,
+ // which is that rxSelf enforces.
+ m_xRunAsyncSelf = rxSelf;
m_aFunc = func;
show();
@@ -4630,7 +4633,7 @@ void GtkInstanceDialog::asyncresponse(gint ret)
m_aFunc(GtkToVcl(ret));
m_aFunc = nullptr;
// move the self pointer, otherwise it might be de-allocated by time we try to reset it
- std::shared_ptr<GtkInstanceDialog> me = std::move(m_xRunAsyncSelf);
+ std::shared_ptr<weld::Dialog> me = std::move(m_xRunAsyncSelf);
m_xDialogController.reset();
me.reset();
}
More information about the Libreoffice-commits
mailing list