From db486eae2e0743677a3849f858198a20b984d0a1 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Fri, 11 Nov 2022 00:32:26 +0100 Subject: [PATCH 1/7] Replace StateEventProcessor used in wxWebRequest code with lambda No real changes, just simplify the code now that we can use C++11. This commit is best viewed with Git --color-moved option. --- include/wx/private/webrequest.h | 17 ++++++++--------- src/common/webrequest.cpp | 27 ++++----------------------- 2 files changed, 12 insertions(+), 32 deletions(-) diff --git a/include/wx/private/webrequest.h b/include/wx/private/webrequest.h index 4f502b9af5..88f2ed1fef 100644 --- a/include/wx/private/webrequest.h +++ b/include/wx/private/webrequest.h @@ -106,15 +106,6 @@ public: wxEvtHandler* GetHandler() const { return m_handler; } - // Called to notify about the state change in the main thread by SetState() - // (which can itself be called from a different one). - // - // It also releases a reference added when switching to the active state by - // SetState() when leaving it. - // - // TODO-C++11: make private when we don't need StateEventProcessor any more. - void ProcessStateEvent(wxWebRequest::State state, const wxString& failMsg); - protected: wxString m_method; wxWebRequest::Storage m_storage; @@ -138,6 +129,14 @@ private: // Called from public Cancel() at most once per object. virtual void DoCancel() = 0; + // Called to notify about the state change in the main thread by SetState() + // (which can itself be called from a different one). + // + // It also releases a reference added when switching to the active state by + // SetState() when leaving it. + void ProcessStateEvent(wxWebRequest::State state, const wxString& failMsg); + + wxWebSession& m_session; wxEvtHandler* const m_handler; const int m_id; diff --git a/src/common/webrequest.cpp b/src/common/webrequest.cpp index ef54507f80..ccb1c22dd7 100644 --- a/src/common/webrequest.cpp +++ b/src/common/webrequest.cpp @@ -165,28 +165,6 @@ wxFileOffset wxWebRequestImpl::GetBytesExpectedToReceive() const namespace { -// Functor used with CallAfter() below. -// -// TODO-C++11: Replace with a lambda. -struct StateEventProcessor -{ - StateEventProcessor(wxWebRequestImpl& request, - wxWebRequest::State state, - const wxString& failMsg) - : m_request(request), m_state(state), m_failMsg(failMsg) - { - } - - void operator()() - { - m_request.ProcessStateEvent(m_state, m_failMsg); - } - - wxWebRequestImpl& m_request; - const wxWebRequest::State m_state; - const wxString m_failMsg; -}; - #if wxUSE_LOG_TRACE // Tiny helper to log states as strings rather than meaningless numbers. @@ -242,7 +220,10 @@ void wxWebRequestImpl::SetState(wxWebRequest::State state, const wxString & fail } else { - m_handler->CallAfter(StateEventProcessor(*this, state, failMsg)); + m_handler->CallAfter([this, state, failMsg]() + { + ProcessStateEvent(state, failMsg); + }); } } From 16473d9b1990c741b2f94f2d54c792ded1ab1171 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Fri, 11 Nov 2022 00:34:40 +0100 Subject: [PATCH 2/7] Make class used as template parameter local now that we can Address a minor TODO-C++11 comment in the dialogs sample by moving the class declaration into the function using it, now that we don't have to keep it outside it. This commit is best viewed with Git --color-moved option. --- samples/dialogs/dialogs.cpp | 49 ++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 28 deletions(-) diff --git a/samples/dialogs/dialogs.cpp b/samples/dialogs/dialogs.cpp index 8a69f341e6..8caebd18e3 100644 --- a/samples/dialogs/dialogs.cpp +++ b/samples/dialogs/dialogs.cpp @@ -3062,34 +3062,6 @@ wxBEGIN_EVENT_TABLE(TestDefaultActionDialog, wxDialog) EVT_TEXT_ENTER(wxID_ANY, TestDefaultActionDialog::OnTextEnter) wxEND_EVENT_TABLE() -// TODO-C++11: We can't declare this class inside TestDefaultActionDialog -// itself when using C++98, so we have to do it here instead. -namespace -{ - -// We have to define a new class in order to actually handle pressing -// Enter, if we didn't do it, pressing it would still close the dialog. -class EnterHandlingTextCtrl : public wxTextCtrl -{ -public: - EnterHandlingTextCtrl(wxWindow* parent, int id, const wxString& value) - : wxTextCtrl(parent, id, value, - wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER) - { - Bind(wxEVT_TEXT_ENTER, &EnterHandlingTextCtrl::OnEnter, this); - - SetInitialSize(GetSizeFromTextSize(GetTextExtent(value).x)); - } - -private: - void OnEnter(wxCommandEvent& WXUNUSED(event)) - { - wxLogMessage("Enter pressed"); - } -}; - -} // anonymous namespace - TestDefaultActionDialog::TestDefaultActionDialog( wxWindow *parent ) : wxDialog( parent, -1, "Test default action" ) { @@ -3117,6 +3089,27 @@ TestDefaultActionDialog::TestDefaultActionDialog( wxWindow *parent ) : grid_sizer->Add(new wxStaticText(this, wxID_ANY, "wxTextCtrl without wxTE_PROCESS_ENTER"), wxSizerFlags().CentreVertical()); + // We have to define a new class in order to actually handle pressing + // Enter, if we didn't do it, pressing it would still close the dialog. + class EnterHandlingTextCtrl : public wxTextCtrl + { + public: + EnterHandlingTextCtrl(wxWindow* parent, int id, const wxString& value) + : wxTextCtrl(parent, id, value, + wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER) + { + Bind(wxEVT_TEXT_ENTER, &EnterHandlingTextCtrl::OnEnter, this); + + SetInitialSize(GetSizeFromTextSize(GetTextExtent(value).x)); + } + + private: + void OnEnter(wxCommandEvent& WXUNUSED(event)) + { + wxLogMessage("Enter pressed"); + } + }; + grid_sizer->Add(new EnterHandlingTextCtrl(this, wxID_ANY, "Enter here is handled by the application"), wxSizerFlags().CentreVertical()); grid_sizer->Add(new wxStaticText(this, wxID_ANY, "wxTextCtrl with wxTE_PROCESS_ENTER"), From 128b2a4e907bbb446d7258615418407017a18fa5 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Fri, 11 Nov 2022 00:40:07 +0100 Subject: [PATCH 3/7] Use variadic templates in custom wxFileDialog controls code This gets rid of a hack with unnecessary TextCtrlImpl ctor argument and allows to reuse AddToLayoutAndReturn() for ChoiceImpl, requiring 2 arguments and not (at most) 1, as all the other classes, too. No real changes, this is just a simplification/prettification. --- src/common/fldlgcmn.cpp | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/src/common/fldlgcmn.cpp b/src/common/fldlgcmn.cpp index d1a0833d2b..32449fbdbe 100644 --- a/src/common/fldlgcmn.cpp +++ b/src/common/fldlgcmn.cpp @@ -553,9 +553,7 @@ private: class TextCtrlImpl : public ControlImplBase { public: - // The dummy argument is there just for consistency with the other classes - // and allows to keep the code simple even without vararg templates support. - explicit TextCtrlImpl(wxWindow* parent, const wxString& WXUNUSED(dummy)) + explicit TextCtrlImpl(wxWindow* parent) : ControlImplBase ( new wxTextCtrl(parent, wxID_ANY) @@ -668,13 +666,7 @@ public: { m_lastWasRadio = false; - // TODO-C++11: Can't use AddToLayoutAndReturn() here easily without - // variadic templates. - ChoiceImpl* const impl = new ChoiceImpl(this, n, strings); - - AddToLayout(impl->m_win); - - return impl; + return AddToLayoutAndReturn(n, strings); } @@ -703,10 +695,11 @@ private: GetSizer()->Add(win, wxSizerFlags().Center().Border(wxRIGHT)); } - template - T* AddToLayoutAndReturn(const wxString& label = wxString()) + // Function arguments are used to construct T. + template + T* AddToLayoutAndReturn(Args... args) { - T* const controlImpl = new T(this, label); + T* const controlImpl = new T(this, args...); AddToLayout(controlImpl->m_win); From abd1fd990dc65a68880d4baee2f8285e81243c3e Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Fri, 11 Nov 2022 00:44:38 +0100 Subject: [PATCH 4/7] Use std::modf() instead of computing fractional part manually No real changes, just a simplification. --- src/common/spinctrlcmn.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/common/spinctrlcmn.cpp b/src/common/spinctrlcmn.cpp index 956fcbf212..b1b12efc8c 100644 --- a/src/common/spinctrlcmn.cpp +++ b/src/common/spinctrlcmn.cpp @@ -144,9 +144,8 @@ bool wxSpinCtrlImpl::IsBaseCompatibleWithRange(int minVal, int maxVal, int base) unsigned wxSpinCtrlImpl::DetermineDigits(double inc) { - // TODO-C++11: Use std::modf() to get the fractional part. - inc = fabs(inc); - inc -= static_cast(inc); + double ipart; + inc = std::abs(std::modf(inc, &ipart)); if ( inc > 0.0 ) { return wxMin(SPINCTRLDBL_MAX_DIGITS, -static_cast(floor(log10(inc)))); From cf01a2827b7eabbef8c9da1f783206f648ad502b Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Fri, 11 Nov 2022 01:15:58 +0100 Subject: [PATCH 5/7] Use lambdas with wxImage::ApplyToAllPixels() This makes the code simpler, as it avoids the need for packing/unpacking the operation parameters into helper classes and allows to remove WeightValue completely, and potentially more efficient, as the calls should be inlined now instead of being performed via a function pointer. No real changes otherwise. --- include/wx/image.h | 9 +-- src/common/image.cpp | 130 +++++++++++++++++-------------------------- 2 files changed, 57 insertions(+), 82 deletions(-) diff --git a/include/wx/image.h b/include/wx/image.h index e5bc53decc..f07af0a971 100644 --- a/include/wx/image.h +++ b/include/wx/image.h @@ -606,13 +606,14 @@ protected: virtual wxObjectRefData* CreateRefData() const override; virtual wxObjectRefData* CloneRefData(const wxObjectRefData* data) const override; - // Helper function used internally by wxImage class only. - template - void ApplyToAllPixels(void (*filter)(wxImage *, unsigned char *, T), T value); - private: friend class WXDLLIMPEXP_FWD_CORE wxImageHandler; + // Helper function used internally by wxImage class only: it applies the + // given functor, which is passed the pixel data for each image pixel. + template + void ApplyToAllPixels(const F& func); + // Possible values for MakeEmptyClone() flags. enum { diff --git a/src/common/image.cpp b/src/common/image.cpp index 056a1e3377..6360f5a447 100644 --- a/src/common/image.cpp +++ b/src/common/image.cpp @@ -1847,45 +1847,18 @@ wxImage wxImage::ConvertToGreyscale() const return ConvertToGreyscale(0.299, 0.587, 0.114); } -namespace -{ - -// red, green and blue are doubles in the range [0.0..1.0], they are used -// internally by DoMakeGrey() only. -class WeightValue -{ -public: - WeightValue(double r = 0.0, double g = 0.0, double b = 0.0) - : red(r), green(g), blue(b) {} - double red; - double green; - double blue; -}; - -} // anonymous namespace - -// TODO-C++11: Replace with a lambda function. -static void DoMakeGrey(wxImage *image, unsigned char *rgb, WeightValue weight) -{ - if ( !image->HasMask() || rgb[0] != image->GetMaskRed() || - rgb[1] != image->GetMaskGreen() || rgb[2] != image->GetMaskBlue() ) - wxColour::MakeGrey(rgb, rgb + 1, rgb + 2, weight.red, weight.green, weight.blue); -} - wxImage wxImage::ConvertToGreyscale(double weight_r, double weight_g, double weight_b) const { wxImage image = *this; - image.ApplyToAllPixels(&DoMakeGrey, WeightValue(weight_r, weight_g, weight_b)); + image.ApplyToAllPixels([&image, weight_r, weight_g, weight_b](unsigned char *rgb) + { + if ( !image.HasMask() || rgb[0] != image.GetMaskRed() || + rgb[1] != image.GetMaskGreen() || rgb[2] != image.GetMaskBlue() ) + wxColour::MakeGrey(rgb, rgb + 1, rgb + 2, weight_r, weight_g, weight_b); + }); return image; } -// TODO-C++11: Replace with a lambda function. -static void DoMakeMono(wxImage *WXUNUSED(image), unsigned char *rgb, wxImage::RGBValue rgbValue) -{ - const bool on = (rgb[0] == rgbValue.red) && (rgb[1] == rgbValue.green) && (rgb[2] == rgbValue.blue); - wxColour::MakeMono(rgb, rgb + 1, rgb + 2, on); -} - wxImage wxImage::ConvertToMono(unsigned char r, unsigned char g, unsigned char b) const { wxImage image = *this; @@ -1898,38 +1871,36 @@ wxImage wxImage::ConvertToMono(unsigned char r, unsigned char g, unsigned char b image.SetMaskColour(0, 0, 0); } - image.ApplyToAllPixels(&DoMakeMono, RGBValue(r, g, b)); + image.ApplyToAllPixels([r, g, b](unsigned char *rgb) + { + const bool on = (rgb[0] == r) && (rgb[1] == g) && (rgb[2] == b); + wxColour::MakeMono(rgb, rgb + 1, rgb + 2, on); + }); return image; } -// TODO-C++11: Replace with a lambda function. -static void DoMakeDisabled(wxImage *image, unsigned char *rgb, unsigned char brightness) -{ - if ( !image->HasMask() || rgb[0] != image->GetMaskRed() || - rgb[1] != image->GetMaskGreen() || rgb[2] != image->GetMaskBlue() ) - wxColour::MakeDisabled(rgb, rgb + 1, rgb + 2, brightness); -} - wxImage wxImage::ConvertToDisabled(unsigned char brightness) const { wxImage image = *this; - image.ApplyToAllPixels(&DoMakeDisabled, brightness); + image.ApplyToAllPixels([&image, brightness](unsigned char *rgb) + { + if ( !image.HasMask() || rgb[0] != image.GetMaskRed() || + rgb[1] != image.GetMaskGreen() || rgb[2] != image.GetMaskBlue() ) + wxColour::MakeDisabled(rgb, rgb + 1, rgb + 2, brightness); + }); return image; } -// TODO-C++11: Replace with a lambda function. -static void DoChangeLightness(wxImage *image, unsigned char *rgb, int alpha) -{ - if ( !image->HasMask() || rgb[0] != image->GetMaskRed() || - rgb[1] != image->GetMaskGreen() || rgb[2] != image->GetMaskBlue() ) - wxColour::ChangeLightness(rgb, rgb + 1, rgb + 2, alpha); -} - wxImage wxImage::ChangeLightness(int alpha) const { wxASSERT(alpha >= 0 && alpha <= 200); wxImage image = *this; - image.ApplyToAllPixels(&DoChangeLightness, alpha); + image.ApplyToAllPixels([&image, alpha](unsigned char *rgb) + { + if ( !image.HasMask() || rgb[0] != image.GetMaskRed() || + rgb[1] != image.GetMaskGreen() || rgb[2] != image.GetMaskBlue() ) + wxColour::ChangeLightness(rgb, rgb + 1, rgb + 2, alpha); + }); return image; } @@ -3313,8 +3284,7 @@ wxImage::RGBValue wxImage::HSVtoRGB(const HSVValue& hsv) (unsigned char)wxRound(blue * 255.0)); } -// TODO-C++11: Replace with a lambda function. -static void DoRotateHue(wxImage *WXUNUSED(image), unsigned char *rgb, double angle) +static void DoRotateHue(unsigned char *rgb, double angle) { wxImage::RGBValue rgbValue(rgb[0], rgb[1], rgb[2]); wxImage::HSVValue hsvValue = wxImage::RGBtoHSV(rgbValue); @@ -3341,11 +3311,13 @@ void wxImage::RotateHue(double angle) return; wxASSERT(angle >= -1.0 && angle <= 1.0); - ApplyToAllPixels(&DoRotateHue, angle); + ApplyToAllPixels([angle](unsigned char *rgb) + { + DoRotateHue(rgb, angle); + }); } -// TODO-C++11: Replace with a lambda function. -static void DoChangeSaturation(wxImage *WXUNUSED(image), unsigned char *rgb, double factor) +static void DoChangeSaturation(unsigned char *rgb, double factor) { wxImage::RGBValue rgbValue(rgb[0], rgb[1], rgb[2]); wxImage::HSVValue hsvValue = wxImage::RGBtoHSV(rgbValue); @@ -3372,11 +3344,13 @@ void wxImage::ChangeSaturation(double factor) return; wxASSERT(factor >= -1.0 && factor <= 1.0); - ApplyToAllPixels(&DoChangeSaturation, factor); + ApplyToAllPixels([factor](unsigned char *rgb) + { + DoChangeSaturation(rgb, factor); + }); } -// TODO-C++11: Replace with a lambda function. -static void DoChangeBrightness(wxImage *WXUNUSED(image), unsigned char *rgb, double factor) +static void DoChangeBrightness(unsigned char *rgb, double factor) { wxImage::RGBValue rgbValue(rgb[0], rgb[1], rgb[2]); wxImage::HSVValue hsvValue = wxImage::RGBtoHSV(rgbValue); @@ -3403,20 +3377,10 @@ void wxImage::ChangeBrightness(double factor) return; wxASSERT(factor >= -1.0 && factor <= 1.0); - ApplyToAllPixels(&DoChangeBrightness, factor); -} - -// TODO-C++11: Replace with a lambda function. -static void DoChangeHSV(wxImage *image, unsigned char *rgb, wxImage::HSVValue hsvValue) -{ - if ( !wxIsNullDouble(hsvValue.hue) ) - DoRotateHue(image, rgb, hsvValue.hue); - - if ( !wxIsNullDouble(hsvValue.saturation) ) - DoChangeSaturation(image, rgb, hsvValue.saturation); - - if ( !wxIsNullDouble(hsvValue.value) ) - DoChangeBrightness(image, rgb, hsvValue.value); + ApplyToAllPixels([factor](unsigned char *rgb) + { + DoChangeBrightness(rgb, factor); + }); } // Changes the hue, the saturation and the brightness (value) of each pixel in @@ -3432,7 +3396,17 @@ void wxImage::ChangeHSV(double angleH, double factorS, double factorV) wxASSERT(angleH >= -1.0 && angleH <= 1.0 && factorS >= -1.0 && factorS <= 1.0 && factorV >= -1.0 && factorV <= 1.0); - ApplyToAllPixels(&DoChangeHSV, HSVValue(angleH, factorS, factorV)); + ApplyToAllPixels([angleH, factorS, factorV](unsigned char *rgb) + { + if ( !wxIsNullDouble(angleH) ) + DoRotateHue(rgb, angleH); + + if ( !wxIsNullDouble(factorS) ) + DoChangeSaturation(rgb, factorS); + + if ( !wxIsNullDouble(factorV) ) + DoChangeBrightness(rgb, factorV); + }); } //----------------------------------------------------------------------------- @@ -3895,8 +3869,8 @@ wxImage wxImage::Rotate(double angle, } // Helper function used internally by wxImage class only. -template -void wxImage::ApplyToAllPixels(void (*filter)(wxImage *, unsigned char *, T), T value) +template +void wxImage::ApplyToAllPixels(const F& func) { AllocExclusive(); @@ -3905,7 +3879,7 @@ void wxImage::ApplyToAllPixels(void (*filter)(wxImage *, unsigned char *, T), T for ( size_t i = 0; i < size; i++, data += 3 ) { - (*filter)(this, data, value); + func(data); } } From 0f6c54cdb68e9a228aef5b1b2e3c85a9103251fa Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Fri, 11 Nov 2022 01:19:35 +0100 Subject: [PATCH 6/7] Define __WXFUNCTION__ as __func__ and don't use it any more Use __func__ without checking if the compiler supports it, it's part of C++11 and so should be supported by all compilers. Also use __func__ instead of __WXFUNCTION__ in our own code. No real changes. --- include/wx/cpp.h | 12 ++---------- include/wx/debug.h | 5 ++--- include/wx/log.h | 2 +- include/wx/qt/private/utils.h | 2 +- include/wx/testing.h | 6 +++--- interface/wx/cpp.h | 8 ++++---- samples/fswatcher/fswatcher.cpp | 2 +- 7 files changed, 14 insertions(+), 23 deletions(-) diff --git a/include/wx/cpp.h b/include/wx/cpp.h index 5f467378b7..3347c1cca4 100644 --- a/include/wx/cpp.h +++ b/include/wx/cpp.h @@ -108,18 +108,10 @@ #define wxDO_IF(condition) wxDO_IF_HELPER(wxMAKE_UNIQUE_NAME(wxdoif), condition) /* - Define __WXFUNCTION__ which is like standard __FUNCTION__ but defined as - nullptr for the compilers which don't support the latter. + This macro is obsolete, use standard __func__ instead. */ #ifndef __WXFUNCTION__ - #if defined(__GNUC__) || \ - defined(__VISUALC__) || \ - defined(__FUNCTION__) - #define __WXFUNCTION__ __FUNCTION__ - #else - /* still define __WXFUNCTION__ to avoid #ifdefs elsewhere */ - #define __WXFUNCTION__ (nullptr) - #endif + #define __WXFUNCTION__ __func__ #endif /* __WXFUNCTION__ already defined */ diff --git a/include/wx/debug.h b/include/wx/debug.h index c82ff5de24..ad38b19959 100644 --- a/include/wx/debug.h +++ b/include/wx/debug.h @@ -15,7 +15,6 @@ #include // for CHAR_BIT used below #include "wx/chartype.h" // for __TFILE__ and wxChar -#include "wx/cpp.h" // for __WXFUNCTION__ #include "wx/dlimpexp.h" // for WXDLLIMPEXP_FWD_BASE class WXDLLIMPEXP_FWD_BASE wxString; @@ -284,7 +283,7 @@ extern WXDLLIMPEXP_BASE void wxOnAssert(const char *file, // A version asserting at the current location. #define wxASSERT_MSG(cond, msg) \ - wxASSERT_MSG_AT(cond, msg, __FILE__, __LINE__, __WXFUNCTION__) + wxASSERT_MSG_AT(cond, msg, __FILE__, __LINE__, __func__) // a version without any additional message, don't use unless condition // itself is fully self-explanatory @@ -307,7 +306,7 @@ extern WXDLLIMPEXP_BASE void wxOnAssert(const char *file, wxFAIL_COND_MSG_AT("Assert failure", msg, file, line, func) #define wxFAIL_COND_MSG(cond, msg) \ - wxFAIL_COND_MSG_AT(cond, msg, __FILE__, __LINE__, __WXFUNCTION__) + wxFAIL_COND_MSG_AT(cond, msg, __FILE__, __LINE__, __func__) #define wxFAIL_MSG(msg) wxFAIL_COND_MSG("Assert failure", msg) #define wxFAIL wxFAIL_MSG((const char*)nullptr) diff --git a/include/wx/log.h b/include/wx/log.h index 0e66721d56..57f1ed89ce 100644 --- a/include/wx/log.h +++ b/include/wx/log.h @@ -1158,7 +1158,7 @@ WXDLLIMPEXP_BASE wxString wxSysErrorMsgStr(unsigned long nErrCode = 0); // creates wxLogger object for the current location #define wxMAKE_LOGGER(level) \ - wxLogger(wxLOG_##level, __FILE__, __LINE__, __WXFUNCTION__, wxLOG_COMPONENT) + wxLogger(wxLOG_##level, __FILE__, __LINE__, __func__, wxLOG_COMPONENT) // this macro generates the expression which logs whatever follows it in // parentheses at the level specified as argument diff --git a/include/wx/qt/private/utils.h b/include/wx/qt/private/utils.h index a91f03bd7d..fecc700ce8 100644 --- a/include/wx/qt/private/utils.h +++ b/include/wx/qt/private/utils.h @@ -22,6 +22,6 @@ void wxMissingImplementation( const char fileName[], unsigned lineNumber, wxMissingImplementation( __FILE__, __LINE__, feature ) #define wxMISSING_FUNCTION() \ - wxMISSING_IMPLEMENTATION( __WXFUNCTION__ ) + wxMISSING_IMPLEMENTATION( __func__ ) #endif // _WX_QT_UTILS_H_ diff --git a/include/wx/testing.h b/include/wx/testing.h index cc9304bf8d..803f0654b8 100644 --- a/include/wx/testing.h +++ b/include/wx/testing.h @@ -429,7 +429,7 @@ protected: wxFAIL_MSG_AT( msg, m_file ? m_file : __FILE__, m_line ? m_line : __LINE__, - m_func ? m_func : __WXFUNCTION__ ); + m_func ? m_func : __func__ ); #else // !__WXDEBUG__ // We still need to report the failure somehow when wx asserts are // disabled. @@ -437,7 +437,7 @@ protected: msg, wxASCII_STR(m_file ? m_file : __FILE__), m_line ? m_line : __LINE__, - wxASCII_STR(m_func ? m_func : __WXFUNCTION__)); + wxASCII_STR(m_func ? m_func : __func__)); #endif // __WXDEBUG__/!__WXDEBUG__ } @@ -517,7 +517,7 @@ private: */ #define wxTEST_DIALOG(codeToRun, ...) \ { \ - wxTEST_DIALOG_HOOK_CLASS wx_hook(__FILE__, __LINE__, __WXFUNCTION__); \ + wxTEST_DIALOG_HOOK_CLASS wx_hook(__FILE__, __LINE__, __func__); \ wxCALL_FOR_EACH(WX_TEST_IMPL_ADD_EXPECTATION, __VA_ARGS__) \ codeToRun; \ wx_hook.CheckUnmetExpectations(); \ diff --git a/interface/wx/cpp.h b/interface/wx/cpp.h index 60f9a1edbb..5a1252aa10 100644 --- a/interface/wx/cpp.h +++ b/interface/wx/cpp.h @@ -48,13 +48,13 @@ #define wxSTRINGIZE_T(x) /** - This macro expands to the name of the current function if the compiler - supports any of @c \__FUNCTION__, @c \__func__ or equivalent variables or - macros or to @NULL if none of them is available. + This obsolete macro is the same as the standard @c \__func__ constant. + + Please use the standard macro instead. @header{wx/cpp.h} */ -#define __WXFUNCTION__ +#define __WXFUNCTION__ __func__ ///@} diff --git a/samples/fswatcher/fswatcher.cpp b/samples/fswatcher/fswatcher.cpp index 85aaeeeed4..818239e4f9 100644 --- a/samples/fswatcher/fswatcher.cpp +++ b/samples/fswatcher/fswatcher.cpp @@ -319,7 +319,7 @@ void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event)) void MyFrame::OnWatch(wxCommandEvent& event) { - wxLogDebug("%s start=%d", __WXFUNCTION__, event.IsChecked()); + wxLogDebug("%s start=%d", __func__, event.IsChecked()); if (event.IsChecked()) { From 699042a2726a64dbd8bc5262808e055fa9e98333 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Fri, 11 Nov 2022 13:58:18 +0100 Subject: [PATCH 7/7] Remove EnterHandlingTextCtrl class from the dialogs sample This code was simplified by 16473d9b19 (Make class used as template parameter local now that we can, 2022-11-11) but we can simplify it even more by just getting rid of this class completely and using a small lambda as the event handler. No real changes. --- samples/dialogs/dialogs.cpp | 30 +++++++++++------------------- 1 file changed, 11 insertions(+), 19 deletions(-) diff --git a/samples/dialogs/dialogs.cpp b/samples/dialogs/dialogs.cpp index 8caebd18e3..bd12a400fd 100644 --- a/samples/dialogs/dialogs.cpp +++ b/samples/dialogs/dialogs.cpp @@ -3089,28 +3089,20 @@ TestDefaultActionDialog::TestDefaultActionDialog( wxWindow *parent ) : grid_sizer->Add(new wxStaticText(this, wxID_ANY, "wxTextCtrl without wxTE_PROCESS_ENTER"), wxSizerFlags().CentreVertical()); - // We have to define a new class in order to actually handle pressing - // Enter, if we didn't do it, pressing it would still close the dialog. - class EnterHandlingTextCtrl : public wxTextCtrl - { - public: - EnterHandlingTextCtrl(wxWindow* parent, int id, const wxString& value) - : wxTextCtrl(parent, id, value, - wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER) - { - Bind(wxEVT_TEXT_ENTER, &EnterHandlingTextCtrl::OnEnter, this); - - SetInitialSize(GetSizeFromTextSize(GetTextExtent(value).x)); - } - - private: - void OnEnter(wxCommandEvent& WXUNUSED(event)) + wxTextCtrl* textHandlingEnter = + new wxTextCtrl(this, wxID_ANY, "Enter here is handled by the application", + wxDefaultPosition, + wxSize(50*GetCharWidth(), -1), // big enough + wxTE_PROCESS_ENTER); + textHandlingEnter->Bind(wxEVT_TEXT_ENTER, + [](wxCommandEvent& WXUNUSED(event)) { wxLogMessage("Enter pressed"); - } - }; - grid_sizer->Add(new EnterHandlingTextCtrl(this, wxID_ANY, "Enter here is handled by the application"), + // Don't skip the event here, otherwise the dialog would close. + } + ); + grid_sizer->Add(textHandlingEnter, wxSizerFlags().CentreVertical()); grid_sizer->Add(new wxStaticText(this, wxID_ANY, "wxTextCtrl with wxTE_PROCESS_ENTER"), wxSizerFlags().CentreVertical());