diff options
author | Caolán McNamara <caolanm@redhat.com> | 2019-11-01 11:39:13 +0000 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2019-11-01 16:10:07 +0100 |
commit | 60692ba238c6c5c003722ccaa52702e9ef3ade13 (patch) | |
tree | 83ae6c8765c2f75e706595b8bda043d688355f41 /vcl | |
parent | 72bb0696122aad9a3c3cb9777214acb8538ad300 (diff) |
the label sync button will relaunch itself from its close handler
so rearrange things so that runAsync can survive that
Change-Id: I7d40637fb861ceb64ce32f0e9ecb3451c0d17bad
Reviewed-on: https://gerrit.libreoffice.org/81884
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Tested-by: Caolán McNamara <caolanm@redhat.com>
Diffstat (limited to 'vcl')
-rw-r--r-- | vcl/unx/gtk3/gtk3gtkinst.cxx | 43 |
1 files changed, 22 insertions, 21 deletions
diff --git a/vcl/unx/gtk3/gtk3gtkinst.cxx b/vcl/unx/gtk3/gtk3gtkinst.cxx index 6c318ce0bb91..1c225335753a 100644 --- a/vcl/unx/gtk3/gtk3gtkinst.cxx +++ b/vcl/unx/gtk3/gtk3gtkinst.cxx @@ -4117,7 +4117,7 @@ public: return; if (GTK_IS_DIALOG(m_pDialog)) sort_native_button_order(GTK_BOX(gtk_dialog_get_action_area(GTK_DIALOG(m_pDialog)))); - gtk_widget_show(m_pWidget); + GtkInstanceWindow::show(); } virtual void set_modal(bool bModal) override @@ -6030,29 +6030,30 @@ void GtkInstanceDialog::asyncresponse(gint ret) if (get_modal()) m_aDialogRun.dec_modal_count(); hide(); - m_aFunc(GtkToVcl(ret)); - if (m_nResponseSignalId) - { - g_signal_handler_disconnect(m_pDialog, m_nResponseSignalId); - m_nResponseSignalId = 0; - } - if (m_nCancelSignalId) - { - g_signal_handler_disconnect(m_pDialog, m_nCancelSignalId); - m_nCancelSignalId = 0; - } + // move the self pointer, otherwise it might be de-allocated by time we try to reset it + auto xRunAsyncSelf = std::move(m_xRunAsyncSelf); + auto xDialogController = std::move(m_xDialogController); + auto aFunc = std::move(m_aFunc); + + auto nResponseSignalId = m_nResponseSignalId; + auto nCancelSignalId = m_nCancelSignalId; + auto nSignalDeleteId = m_nSignalDeleteId; + m_nResponseSignalId = 0; + m_nCancelSignalId = 0; + m_nSignalDeleteId = 0; + + aFunc(GtkToVcl(ret)); + + if (nResponseSignalId) + g_signal_handler_disconnect(m_pDialog, nResponseSignalId); + if (nCancelSignalId) + g_signal_handler_disconnect(m_pDialog, nCancelSignalId); if (m_nSignalDeleteId) - { - g_signal_handler_disconnect(m_pDialog, m_nSignalDeleteId); - m_nSignalDeleteId = 0; - } + g_signal_handler_disconnect(m_pDialog, nSignalDeleteId); - m_aFunc = nullptr; - // move the self pointer, otherwise it might be de-allocated by time we try to reset it - std::shared_ptr<weld::Dialog> me = std::move(m_xRunAsyncSelf); - m_xDialogController.reset(); - me.reset(); + xDialogController.reset(); + xRunAsyncSelf.reset(); } int GtkInstanceDialog::run() |