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)
if (RET_OK == nRet)
nRet = RET_USER;
else
nRet = RET_USER_CANCEL;
nRet = RET_CANCEL;
m_xDialog->response(nRet);
}
}
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)
......
......@@ -2841,16 +2841,20 @@ namespace
}
}
class GtkInstanceDialog;
struct DialogRunner
{
GtkDialog *m_pDialog;
GtkInstanceDialog *m_pInstance;
gint m_nResponseId;
GMainLoop *m_pLoop;
VclPtr<vcl::Window> m_xFrameWindow;
int m_nModalDepth;
DialogRunner(GtkDialog* pDialog)
DialogRunner(GtkDialog* pDialog, GtkInstanceDialog* pInstance)
: m_pDialog(pDialog)
, m_pInstance(pInstance)
, m_nResponseId(GTK_RESPONSE_NONE)
, m_pLoop(nullptr)
, m_nModalDepth(0)
......@@ -2871,12 +2875,7 @@ struct DialogRunner
g_main_loop_quit(m_pLoop);
}
static void signal_response(GtkDialog*, gint nResponseId, gpointer data)
{
DialogRunner* pThis = static_cast<DialogRunner*>(data);
pThis->m_nResponseId = nResponseId;
pThis->loop_quit();
}
static void signal_response(GtkDialog*, gint nResponseId, gpointer data);
static gboolean signal_delete(GtkDialog*, GdkEventAny*, gpointer data)
{
......@@ -3017,7 +3016,10 @@ private:
int m_nOldEditWidthReq; // Original width request of the input field
int m_nOldBorderWidth; // border width for expanded dialog
void signal_close();
void signal_close()
{
close(true);
}
static void signalClose(GtkWidget*, gpointer widget)
{
......@@ -3059,7 +3061,7 @@ public:
GtkInstanceDialog(GtkDialog* pDialog, GtkInstanceBuilder* pBuilder, bool bTakeOwnership)
: GtkInstanceWindow(GTK_WINDOW(pDialog), pBuilder, bTakeOwnership)
, m_pDialog(pDialog)
, m_aDialogRun(pDialog)
, m_aDialogRun(pDialog, this)
, m_nCloseSignalId(g_signal_connect(m_pDialog, "close", G_CALLBACK(signalClose), this))
, m_nResponseSignalId(0)
, m_nSignalDeleteId(0)
......@@ -3255,6 +3257,8 @@ public:
present();
}
void close(bool bCloseSignal);
virtual void SetInstallLOKNotifierHdl(const Link<void*, vcl::ILibreOfficeKitNotifier*>&) override
{
//not implemented for the gtk variant
......@@ -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
{
private:
......@@ -4602,7 +4621,7 @@ void GtkInstanceDialog::asyncresponse(gint ret)
{
// make GTK_RESPONSE_DELETE_EVENT act as if cancel button was pressed
if (ret == GTK_RESPONSE_DELETE_EVENT)
pClickHandler->clicked();
close(false);
return;
}
......@@ -4627,16 +4646,8 @@ int GtkInstanceDialog::run()
help();
continue;
}
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();
else if (has_click_handler(ret))
continue;
}
break;
}
hide();
......@@ -4664,14 +4675,15 @@ void GtkInstanceDialog::response(int nResponse)
gtk_dialog_response(m_pDialog, VclToGtk(nResponse));
}
void GtkInstanceDialog::signal_close()
void GtkInstanceDialog::close(bool bCloseSignal)
{
GtkInstanceButton* pClickHandler = has_click_handler(GTK_RESPONSE_CANCEL);
if (pClickHandler)
{
g_signal_stop_emission_by_name(m_pDialog, "close");
// make esc act as if cancel button was pressed
if (bCloseSignal)
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();
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