diff --git a/docs/changes.txt b/docs/changes.txt index a189daf42e..e92d92064d 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -27,7 +27,9 @@ Changes in behaviour not resulting in compilation errors - Using invalid flags with wxBoxSizer or wxGridSizer items now triggers asserts when done from the code or error messages when done in XRC. These asserts are best avoided by fixing the flags, but wxSizerFlags::DisableConsistencyChecks() - can be used to globally suppress them until this can be done. + can be used to globally suppress them until this can be done. Even less + intrusively, environment variable WXSUPPRESS_SIZER_FLAGS_CHECK can be set (to + any value) to achieve the same effect. - wxWS_EX_VALIDATE_RECURSIVELY is now the default behaviour, i.e. calling Validate() or TransferData{From,To}Window() will now also call the same diff --git a/docs/doxygen/overviews/envvars.h b/docs/doxygen/overviews/envvars.h index c869bc5faa..52c8b2e3c8 100644 --- a/docs/doxygen/overviews/envvars.h +++ b/docs/doxygen/overviews/envvars.h @@ -32,5 +32,10 @@ wxWidgets programs. set it to @c "CURL" to force using libcurl-based implementation under MSW or macOS platforms where the native implementation would be chosen by default.} +@itemdef{WXSUPPRESS_SIZER_FLAGS_CHECK, + If set, disables asserts about using invalid sizer flags in the code. + This can be helpful when running older programs recompiled with + wxWidgets 3.1 or later, as these asserts are mostly harmless and can + be safely ignored if the code works as expected.} */ diff --git a/interface/wx/sizer.h b/interface/wx/sizer.h index a1f7508e94..b9aa47c65f 100644 --- a/interface/wx/sizer.h +++ b/interface/wx/sizer.h @@ -1499,6 +1499,10 @@ public: using this function, especially permanently, rather than a temporary workaround, is @e not recommended. + Notice that the same effect as calling this function can be achieved by + setting the environment variable @c WXSUPPRESS_SIZER_FLAGS_CHECK to any + value. + @since 3.1.6 */ static void DisableConsistencyChecks(); diff --git a/src/common/sizer.cpp b/src/common/sizer.cpp index 6ed7b1d46d..755ba7fd3e 100644 --- a/src/common/sizer.cpp +++ b/src/common/sizer.cpp @@ -147,7 +147,23 @@ static const int SIZER_FLAGS_MASK = namespace { -bool gs_disableFlagChecks = false; +int gs_disableFlagChecks = -1; + +// Check condition taking gs_disableFlagChecks into account. +// +// Note that because this is not a macro, the condition is always evaluated, +// even if gs_disableFlagChecks is 0, but this shouldn't matter because the +// conditions used with this function are just simple bit checks. +bool CheckSizerFlags(bool cond) +{ + // Once-only initialization: check if disabled via environment. + if ( gs_disableFlagChecks == -1 ) + { + gs_disableFlagChecks = wxGetEnv("WXSUPPRESS_SIZER_FLAGS_CHECK", NULL); + } + + return gs_disableFlagChecks || cond; +} wxString MakeFlagsCheckMessage(const char* start, const char* whatToRemove) { @@ -159,6 +175,9 @@ wxString MakeFlagsCheckMessage(const char* start, const char* whatToRemove) "please ignore this message, it is harmless, and please try " "reporting the problem to the program developers.\n" "\n" + "You may also set WXSUPPRESS_SIZER_FLAGS_CHECK environment " + "variable to suppress all such checks when running this program.\n" + "\n" "If you're the developer, simply remove %s from your code to " "avoid getting this message. You can also call " "wxSizerFlags::DisableConsistencyChecks() to globally disable " @@ -175,7 +194,7 @@ wxString MakeFlagsCheckMessage(const char* start, const char* whatToRemove) #define ASSERT_NO_IGNORED_FLAGS_IMPL(f, value, name, explanation) \ wxASSERT_MSG \ ( \ - gs_disableFlagChecks || !((f) & (value)), \ + CheckSizerFlags(!((f) & (value))), \ MakeFlagsCheckMessage \ ( \ name " will be ignored in this sizer: " explanation, \ @@ -189,7 +208,7 @@ wxString MakeFlagsCheckMessage(const char* start, const char* whatToRemove) #define ASSERT_INCOMPATIBLE_NOT_USED_IMPL(f, f1, n1, f2, n2) \ wxASSERT_MSG \ ( \ - gs_disableFlagChecks || ((f) & (f1 | f2)) != (f1 | f2), \ + CheckSizerFlags(((f) & (f1 | f2)) != (f1 | f2)), \ MakeFlagsCheckMessage \ ( \ "One of " n1 " and " n2 " will be ignored in this sizer: " \ @@ -1527,9 +1546,11 @@ wxSizerItem *wxGridSizer::DoInsert(size_t index, wxSizerItem *item) // Check that expansion will happen in at least one of the directions. wxASSERT_MSG ( - gs_disableFlagChecks || - !(flags & (wxALIGN_BOTTOM | wxALIGN_CENTRE_VERTICAL)) || - !(flags & (wxALIGN_RIGHT | wxALIGN_CENTRE_HORIZONTAL)), + CheckSizerFlags + ( + !(flags & (wxALIGN_BOTTOM | wxALIGN_CENTRE_VERTICAL)) || + !(flags & (wxALIGN_RIGHT | wxALIGN_CENTRE_HORIZONTAL)) + ), MakeFlagsCheckMessage ( "wxEXPAND flag will be overridden by alignment flags",