From 04ca40fce80f2e19509907e80700277c1d4c8fa3 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Fri, 20 Jan 2012 22:11:32 +0000 Subject: [PATCH] Destroy modeless wxGenericAboutDialog when it is closed. Don't leave the wxGenericAboutDialog object alive when non-modal about dialog (as can be used under GTK and OS X) is closed. This is wasteful and, worse, resulted in the program not exiting after such a dialog was shown because it counted as a remaining open top level window. This also fixes the same bug in wxGTK when using GTK+ 2.4. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@70413 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/generic/aboutdlgg.h | 16 ++++++++++++++++ src/generic/aboutdlgg.cpp | 27 ++++++++++++++++++++++++++- 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/include/wx/generic/aboutdlgg.h b/include/wx/generic/aboutdlgg.h index e45fc24d0d..9ad4a77e41 100644 --- a/include/wx/generic/aboutdlgg.h +++ b/include/wx/generic/aboutdlgg.h @@ -21,6 +21,16 @@ class WXDLLIMPEXP_FWD_ADV wxAboutDialogInfo; class WXDLLIMPEXP_FWD_CORE wxSizer; class WXDLLIMPEXP_FWD_CORE wxSizerFlags; +// Under GTK and OS X "About" dialogs are not supposed to be modal, unlike MSW +// and, presumably, all the other platforms. +#ifndef wxUSE_MODAL_ABOUT_DIALOG + #if defined(__WXGTK__) || defined(__WXMAC__) + #define wxUSE_MODAL_ABOUT_DIALOG 0 + #else + #define wxUSE_MODAL_ABOUT_DIALOG 1 + #endif +#endif // wxUSE_MODAL_ABOUT_DIALOG not defined + // ---------------------------------------------------------------------------- // wxGenericAboutDialog: generic "About" dialog implementation // ---------------------------------------------------------------------------- @@ -73,6 +83,12 @@ private: // common part of all ctors void Init() { m_sizerText = NULL; } +#if !wxUSE_MODAL_ABOUT_DIALOG + // An explicit handler for deleting the dialog when it's closed is needed + // when we show it non-modally. + void OnCloseWindow(wxCloseEvent& event); + void OnOK(wxCommandEvent& event); +#endif // !wxUSE_MODAL_ABOUT_DIALOG wxSizer *m_sizerText; }; diff --git a/src/generic/aboutdlgg.cpp b/src/generic/aboutdlgg.cpp index ee338f01ba..ba95a1cc74 100644 --- a/src/generic/aboutdlgg.cpp +++ b/src/generic/aboutdlgg.cpp @@ -220,6 +220,13 @@ bool wxGenericAboutDialog::Create(const wxAboutDialogInfo& info, wxWindow* paren CentreOnParent(); +#if !wxUSE_MODAL_ABOUT_DIALOG + Connect(wxEVT_CLOSE_WINDOW, + wxCloseEventHandler(wxGenericAboutDialog::OnCloseWindow)); + Connect(wxID_OK, wxEVT_COMMAND_BUTTON_CLICKED, + wxCommandEventHandler(wxGenericAboutDialog::OnOK)); +#endif // !wxUSE_MODAL_ABOUT_DIALOG + return true; } @@ -265,13 +272,31 @@ void wxGenericAboutDialog::AddCollapsiblePane(const wxString& title, m_sizerText->Add(pane, wxSizerFlags(0).Expand().Border(wxBOTTOM)); } +#if !wxUSE_MODAL_ABOUT_DIALOG + +void wxGenericAboutDialog::OnCloseWindow(wxCloseEvent& event) +{ + Destroy(); + + event.Skip(); +} + +void wxGenericAboutDialog::OnOK(wxCommandEvent& WXUNUSED(event)) +{ + // By default a modeless dialog would be just hidden, destroy this one + // instead. + Destroy(); +} + +#endif // !wxUSE_MODAL_ABOUT_DIALOG + // ---------------------------------------------------------------------------- // public functions // ---------------------------------------------------------------------------- void wxGenericAboutBox(const wxAboutDialogInfo& info, wxWindow* parent) { -#if !defined(__WXGTK__) && !defined(__WXMAC__) +#if wxUSE_MODAL_ABOUT_DIALOG wxGenericAboutDialog dlg(info, parent); dlg.ShowModal(); #else -- 2.45.2