From 963c7649da903b87637975e8c2d634da887d3109 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Sun, 15 Jan 2023 01:25:27 +0100 Subject: [PATCH] Use wx_ptr for the splash screen. --- src/tools/dcpomatic.cc | 15 ++++----------- src/tools/dcpomatic_editor.cc | 2 +- src/tools/dcpomatic_kdm.cc | 2 +- src/tools/dcpomatic_player.cc | 20 +++++++------------- src/wx/wx_ptr.h | 25 ++++++++++++++++++++++++- src/wx/wx_util.cc | 9 +++++---- src/wx/wx_util.h | 3 ++- 7 files changed, 44 insertions(+), 32 deletions(-) diff --git a/src/tools/dcpomatic.cc b/src/tools/dcpomatic.cc index 546306ac4..af4576fd5 100644 --- a/src/tools/dcpomatic.cc +++ b/src/tools/dcpomatic.cc @@ -1728,10 +1728,7 @@ private: } catch (exception& e) { - if (_splash) { - _splash->Destroy (); - _splash = nullptr; - } + _splash.reset(); error_dialog (nullptr, wxString::Format ("DCP-o-matic could not start."), std_to_wx(e.what())); } @@ -1843,10 +1840,7 @@ private: void close_splash () { - if (_splash) { - _splash->Destroy (); - _splash = nullptr; - } + _splash.reset(); } void config_failed_to_load (Config::LoadFailure what) @@ -1864,8 +1858,7 @@ private: /* Destroy the splash screen here, as otherwise bad things seem to happen (for reasons unknown) when we open our recreate dialog, close it, *then* try to Destroy the splash (the Destroy fails). */ - _splash->Destroy (); - _splash = nullptr; + _splash.reset(); auto config = Config::instance(); switch (reason) { @@ -1934,7 +1927,7 @@ private: } DOMFrame* _frame = nullptr; - wxSplashScreen* _splash = nullptr; + wx_ptr _splash; shared_ptr _timer; string _film_to_load; string _film_to_create; diff --git a/src/tools/dcpomatic_editor.cc b/src/tools/dcpomatic_editor.cc index 51135ef46..8e306551f 100644 --- a/src/tools/dcpomatic_editor.cc +++ b/src/tools/dcpomatic_editor.cc @@ -431,7 +431,7 @@ private: bool OnInit () override { - wxSplashScreen* splash = nullptr; + wx_ptr splash; try { wxInitAllImageHandlers (); diff --git a/src/tools/dcpomatic_kdm.cc b/src/tools/dcpomatic_kdm.cc index 87a77c626..673c54f78 100644 --- a/src/tools/dcpomatic_kdm.cc +++ b/src/tools/dcpomatic_kdm.cc @@ -770,7 +770,7 @@ private: bool OnInit () override { - wxSplashScreen* splash = nullptr; + wx_ptr splash; try { wxInitAllImageHandlers (); diff --git a/src/tools/dcpomatic_player.cc b/src/tools/dcpomatic_player.cc index 600d1c6b4..1808e86fe 100644 --- a/src/tools/dcpomatic_player.cc +++ b/src/tools/dcpomatic_player.cc @@ -898,16 +898,14 @@ private: DCPOMATIC_ASSERT (dcp); auto job = make_shared(dcp->directories()); - auto progress = new VerifyDCPProgressDialog(this, _("DCP-o-matic Player")); + auto progress = make_wx(this, _("DCP-o-matic Player")); bool const completed = progress->run (job); - progress->Destroy (); if (!completed) { return; } - auto d = new VerifyDCPDialog (this, job); + auto d = make_wx(this, job); d->ShowModal (); - d->Destroy (); } void tools_check_for_updates () @@ -918,9 +916,8 @@ private: void tools_timing () { - auto d = new TimerDisplay(this, _viewer.state_timer(), _viewer.gets()); + auto d = make_wx(this, _viewer.state_timer(), _viewer.gets()); d->ShowModal (); - d->Destroy (); } void tools_system_information () @@ -934,18 +931,16 @@ private: void help_about () { - auto d = new AboutDialog (this); + auto d = make_wx(this); d->ShowModal (); - d->Destroy (); } void help_report_a_problem () { - auto d = new ReportProblemDialog (this); + auto d = make_wx(this); if (d->ShowModal () == wxID_OK) { d->report (); } - d->Destroy (); } void update_checker_state_changed () @@ -964,9 +959,8 @@ private: } if (uc->state() == UpdateChecker::State::YES) { - auto dialog = new UpdateDialog (this, uc->stable (), uc->test ()); + auto dialog = make_wx(this, uc->stable (), uc->test ()); dialog->ShowModal (); - dialog->Destroy (); } else if (uc->state() == UpdateChecker::State::FAILED) { error_dialog (this, _("The DCP-o-matic download server could not be contacted.")); } else { @@ -1168,7 +1162,7 @@ private: bool OnInit () override { - wxSplashScreen* splash = nullptr; + wx_ptr splash; try { wxInitAllImageHandlers (); diff --git a/src/wx/wx_ptr.h b/src/wx/wx_ptr.h index 96459183e..24bccb043 100644 --- a/src/wx/wx_ptr.h +++ b/src/wx/wx_ptr.h @@ -62,11 +62,34 @@ public: } } - T* operator->() { + wx_ptr& operator=(T* ptr) + { + if (_wx) { + _wx->Destroy(); + } + _wx = ptr; + return *this; + } + + T* operator->() + { DCPOMATIC_ASSERT(_wx); return _wx; } + operator bool() const + { + return _wx != nullptr; + } + + void reset() + { + if (_wx) { + _wx->Destroy(); + _wx = nullptr; + } + } + template void reset(Args&&... args) { diff --git a/src/wx/wx_util.cc b/src/wx/wx_util.cc index d264f8b20..e600b63c8 100644 --- a/src/wx/wx_util.cc +++ b/src/wx/wx_util.cc @@ -537,10 +537,11 @@ setup_audio_channels_choice (wxChoice* choice, int minimum) } -wxSplashScreen * +wx_ptr maybe_show_splash () { - wxSplashScreen* splash = nullptr; + wx_ptr splash; + try { wxBitmap bitmap; if (bitmap.LoadFile(bitmap_path("splash.png"), wxBITMAP_TYPE_PNG)) { @@ -554,9 +555,9 @@ maybe_show_splash () } #ifdef DCPOMATIC_WINDOWS /* Having wxSTAY_ON_TOP means error dialogues hide behind the splash screen on Windows, no matter what I try */ - splash = new wxSplashScreen (bitmap, wxSPLASH_CENTRE_ON_SCREEN | wxSPLASH_NO_TIMEOUT, 0, 0, -1, wxDefaultPosition, wxDefaultSize, wxBORDER_SIMPLE | wxFRAME_NO_TASKBAR); + splash.reset(bitmap, wxSPLASH_CENTRE_ON_SCREEN | wxSPLASH_NO_TIMEOUT, 0, nullptr, -1, wxDefaultPosition, wxDefaultSize, wxBORDER_SIMPLE | wxFRAME_NO_TASKBAR); #else - splash = new wxSplashScreen (bitmap, wxSPLASH_CENTRE_ON_SCREEN | wxSPLASH_NO_TIMEOUT, 0, 0, -1); + splash.reset(bitmap, wxSPLASH_CENTRE_ON_SCREEN | wxSPLASH_NO_TIMEOUT, 0, nullptr, -1); #endif wxYield (); } diff --git a/src/wx/wx_util.h b/src/wx/wx_util.h index 5ef221b15..be3be0d1a 100644 --- a/src/wx/wx_util.h +++ b/src/wx/wx_util.h @@ -28,6 +28,7 @@ #define DCPOMATIC_WX_UTIL_H +#include "wx_ptr.h" #include "lib/config.h" #include "lib/dcpomatic_time.h" #include @@ -116,7 +117,7 @@ extern wxString context_translation (wxString); extern std::string string_client_data (wxClientData* o); extern wxString time_to_timecode (dcpomatic::DCPTime t, double fps); extern void setup_audio_channels_choice (wxChoice* choice, int minimum); -extern wxSplashScreen* maybe_show_splash (); +extern wx_ptr maybe_show_splash(); extern double calculate_mark_interval (double start); extern bool display_progress (wxString title, wxString task); extern bool report_errors_from_last_job (wxWindow* parent); -- 2.30.2