Kaydet (Commit) 0d2472f0 authored tarafından Caolán McNamara's avatar Caolán McNamara

route delete-event through cancel handler if available

for sync gtk dialogs too

Change-Id: Iad40c539a663504d72f372a0d3b4427a23e717c4
Reviewed-on: https://gerrit.libreoffice.org/72626
Tested-by: Jenkins
Reviewed-by: 's avatarCaolán McNamara <caolanm@redhat.com>
Tested-by: 's avatarCaolán McNamara <caolanm@redhat.com>
üst c1816fea
...@@ -1352,14 +1352,14 @@ IMPL_LINK_NOARG(SfxTabDialogController, UserHdl, weld::Button&, void) ...@@ -1352,14 +1352,14 @@ IMPL_LINK_NOARG(SfxTabDialogController, UserHdl, weld::Button&, void)
if (RET_OK == nRet) if (RET_OK == nRet)
nRet = RET_USER; nRet = RET_USER;
else else
nRet = RET_USER_CANCEL; nRet = RET_CANCEL;
m_xDialog->response(nRet); m_xDialog->response(nRet);
} }
} }
IMPL_LINK_NOARG(SfxTabDialogController, CancelHdl, weld::Button&, void) IMPL_LINK_NOARG(SfxTabDialogController, CancelHdl, weld::Button&, void)
{ {
m_xDialog->response(RET_USER_CANCEL); m_xDialog->response(RET_CANCEL);
} }
IMPL_LINK_NOARG(SfxTabDialogController, ResetHdl, weld::Button&, void) IMPL_LINK_NOARG(SfxTabDialogController, ResetHdl, weld::Button&, void)
......
...@@ -2841,16 +2841,20 @@ namespace ...@@ -2841,16 +2841,20 @@ namespace
} }
} }
class GtkInstanceDialog;
struct DialogRunner struct DialogRunner
{ {
GtkDialog *m_pDialog; GtkDialog *m_pDialog;
GtkInstanceDialog *m_pInstance;
gint m_nResponseId; gint m_nResponseId;
GMainLoop *m_pLoop; GMainLoop *m_pLoop;
VclPtr<vcl::Window> m_xFrameWindow; VclPtr<vcl::Window> m_xFrameWindow;
int m_nModalDepth; int m_nModalDepth;
DialogRunner(GtkDialog* pDialog) DialogRunner(GtkDialog* pDialog, GtkInstanceDialog* pInstance)
: m_pDialog(pDialog) : m_pDialog(pDialog)
, m_pInstance(pInstance)
, m_nResponseId(GTK_RESPONSE_NONE) , m_nResponseId(GTK_RESPONSE_NONE)
, m_pLoop(nullptr) , m_pLoop(nullptr)
, m_nModalDepth(0) , m_nModalDepth(0)
...@@ -2871,12 +2875,7 @@ struct DialogRunner ...@@ -2871,12 +2875,7 @@ struct DialogRunner
g_main_loop_quit(m_pLoop); g_main_loop_quit(m_pLoop);
} }
static void signal_response(GtkDialog*, gint nResponseId, gpointer data) static void signal_response(GtkDialog*, gint nResponseId, gpointer data);
{
DialogRunner* pThis = static_cast<DialogRunner*>(data);
pThis->m_nResponseId = nResponseId;
pThis->loop_quit();
}
static gboolean signal_delete(GtkDialog*, GdkEventAny*, gpointer data) static gboolean signal_delete(GtkDialog*, GdkEventAny*, gpointer data)
{ {
...@@ -3017,7 +3016,10 @@ private: ...@@ -3017,7 +3016,10 @@ private:
int m_nOldEditWidthReq; // Original width request of the input field int m_nOldEditWidthReq; // Original width request of the input field
int m_nOldBorderWidth; // border width for expanded dialog int m_nOldBorderWidth; // border width for expanded dialog
void signal_close(); void signal_close()
{
close(true);
}
static void signalClose(GtkWidget*, gpointer widget) static void signalClose(GtkWidget*, gpointer widget)
{ {
...@@ -3059,7 +3061,7 @@ public: ...@@ -3059,7 +3061,7 @@ public:
GtkInstanceDialog(GtkDialog* pDialog, GtkInstanceBuilder* pBuilder, bool bTakeOwnership) GtkInstanceDialog(GtkDialog* pDialog, GtkInstanceBuilder* pBuilder, bool bTakeOwnership)
: GtkInstanceWindow(GTK_WINDOW(pDialog), pBuilder, bTakeOwnership) : GtkInstanceWindow(GTK_WINDOW(pDialog), pBuilder, bTakeOwnership)
, m_pDialog(pDialog) , m_pDialog(pDialog)
, m_aDialogRun(pDialog) , m_aDialogRun(pDialog, this)
, m_nCloseSignalId(g_signal_connect(m_pDialog, "close", G_CALLBACK(signalClose), this)) , m_nCloseSignalId(g_signal_connect(m_pDialog, "close", G_CALLBACK(signalClose), this))
, m_nResponseSignalId(0) , m_nResponseSignalId(0)
, m_nSignalDeleteId(0) , m_nSignalDeleteId(0)
...@@ -3255,6 +3257,8 @@ public: ...@@ -3255,6 +3257,8 @@ public:
present(); present();
} }
void close(bool bCloseSignal);
virtual void SetInstallLOKNotifierHdl(const Link<void*, vcl::ILibreOfficeKitNotifier*>&) override virtual void SetInstallLOKNotifierHdl(const Link<void*, vcl::ILibreOfficeKitNotifier*>&) override
{ {
//not implemented for the gtk variant //not implemented for the gtk variant
...@@ -3277,6 +3281,21 @@ public: ...@@ -3277,6 +3281,21 @@ public:
} }
}; };
void DialogRunner::signal_response(GtkDialog*, gint nResponseId, gpointer data)
{
DialogRunner* pThis = static_cast<DialogRunner*>(data);
// make GTK_RESPONSE_DELETE_EVENT act as if cancel button was pressed
if (nResponseId == GTK_RESPONSE_DELETE_EVENT)
{
pThis->m_pInstance->close(false);
return;
}
pThis->m_nResponseId = nResponseId;
pThis->loop_quit();
}
class GtkInstanceMessageDialog : public GtkInstanceDialog, public virtual weld::MessageDialog class GtkInstanceMessageDialog : public GtkInstanceDialog, public virtual weld::MessageDialog
{ {
private: private:
...@@ -4602,7 +4621,7 @@ void GtkInstanceDialog::asyncresponse(gint ret) ...@@ -4602,7 +4621,7 @@ void GtkInstanceDialog::asyncresponse(gint ret)
{ {
// make GTK_RESPONSE_DELETE_EVENT act as if cancel button was pressed // make GTK_RESPONSE_DELETE_EVENT act as if cancel button was pressed
if (ret == GTK_RESPONSE_DELETE_EVENT) if (ret == GTK_RESPONSE_DELETE_EVENT)
pClickHandler->clicked(); close(false);
return; return;
} }
...@@ -4627,16 +4646,8 @@ int GtkInstanceDialog::run() ...@@ -4627,16 +4646,8 @@ int GtkInstanceDialog::run()
help(); help();
continue; continue;
} }
else if (has_click_handler(ret))
GtkInstanceButton* pClickHandler = has_click_handler(ret);
if (pClickHandler)
{
// make GTK_RESPONSE_DELETE_EVENT act as if cancel button was pressed
if (ret == GTK_RESPONSE_DELETE_EVENT)
pClickHandler->clicked();
continue; continue;
}
break; break;
} }
hide(); hide();
...@@ -4664,14 +4675,15 @@ void GtkInstanceDialog::response(int nResponse) ...@@ -4664,14 +4675,15 @@ void GtkInstanceDialog::response(int nResponse)
gtk_dialog_response(m_pDialog, VclToGtk(nResponse)); gtk_dialog_response(m_pDialog, VclToGtk(nResponse));
} }
void GtkInstanceDialog::close(bool bCloseSignal)
void GtkInstanceDialog::signal_close()
{ {
GtkInstanceButton* pClickHandler = has_click_handler(GTK_RESPONSE_CANCEL); GtkInstanceButton* pClickHandler = has_click_handler(GTK_RESPONSE_CANCEL);
if (pClickHandler) if (pClickHandler)
{ {
g_signal_stop_emission_by_name(m_pDialog, "close"); if (bCloseSignal)
// make esc act as if cancel button was pressed g_signal_stop_emission_by_name(m_pDialog, "close");
// make esc (bCloseSignal == true) or window-delete (bCloseSignal == false)
// act as if cancel button was pressed
pClickHandler->clicked(); pClickHandler->clicked();
return; return;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment