diff --git a/src/misc_gui.cpp b/src/misc_gui.cpp index 06c6eae7a9..f905cb049e 100644 --- a/src/misc_gui.cpp +++ b/src/misc_gui.cpp @@ -1352,6 +1352,7 @@ static WindowDesc _query_desc( static void RemoveExistingQueryWindow(Window *parent, QueryCallbackProc *callback) { + if (!HaveWindowByClass(WC_CONFIRM_POPUP_QUERY)) return; for (Window *w : Window::IterateFromBack()) { if (w->window_class != WC_CONFIRM_POPUP_QUERY) continue; diff --git a/src/timetable_gui.cpp b/src/timetable_gui.cpp index a4e0b3ce07..3db35ca2ab 100644 --- a/src/timetable_gui.cpp +++ b/src/timetable_gui.cpp @@ -1256,6 +1256,12 @@ void ShowTimetableWindow(const Vehicle *v) void SetTimetableWindowsDirty(const Vehicle *v, SetTimetableWindowsDirtyFlags flags) { + if (!(HaveWindowByClass(WC_VEHICLE_TIMETABLE) || + ((flags & STWDF_SCHEDULED_DISPATCH) && HaveWindowByClass(WC_SCHDISPATCH_SLOTS)) || + ((flags & STWDF_ORDERS) && HaveWindowByClass(WC_VEHICLE_ORDERS)))) { + return; + } + v = v->FirstShared(); for (Window *w : Window::Iterate()) { if (w->window_class == WC_VEHICLE_TIMETABLE || diff --git a/src/vehicle_gui.cpp b/src/vehicle_gui.cpp index 7f908403d4..f71b5c29f3 100644 --- a/src/vehicle_gui.cpp +++ b/src/vehicle_gui.cpp @@ -2751,6 +2751,7 @@ void DirtyVehicleListWindowForVehicle(const Vehicle *v) { WindowClass cls = static_cast(WC_TRAINS_LIST + v->type); WindowClass cls2 = (v->type == VEH_TRAIN) ? WC_TRACE_RESTRICT_SLOTS : cls; + if (!HaveWindowByClass(cls) && !HaveWindowByClass(cls2)) return; for (Window *w : Window::Iterate()) { if (w->window_class == cls || w->window_class == cls2) { BaseVehicleListWindow *listwin = static_cast(w); diff --git a/src/window.cpp b/src/window.cpp index 2845c18348..aecb230139 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -88,7 +88,7 @@ bool _mouse_hovering; ///< The mouse is hovering over the same point. SpecialMouseMode _special_mouse_mode; ///< Mode of the mouse. -static std::bitset _present_window_types; +std::bitset _present_window_types; /** * List of all WindowDescs. @@ -1105,6 +1105,8 @@ void Window::SetShaded(bool make_shaded) */ static Window *FindChildWindow(const Window *w, WindowClass wc) { + if (wc < WC_END && !_present_window_types[wc]) return nullptr; + for (Window *v : Window::IterateFromBack()) { if ((wc == WC_INVALID || wc == v->window_class) && v->parent == w) return v; } diff --git a/src/window_func.h b/src/window_func.h index 770b3137b3..e209702cce 100644 --- a/src/window_func.h +++ b/src/window_func.h @@ -14,6 +14,8 @@ #include "company_type.h" #include "core/geometry_type.hpp" +#include + Window *FindWindowById(WindowClass cls, WindowNumber number); Window *FindWindowByClass(WindowClass cls); Window *GetMainWindow(); @@ -61,6 +63,12 @@ void CloseWindowByClass(WindowClass cls); bool FocusWindowById(WindowClass cls, WindowNumber number); +inline bool HaveWindowByClass(WindowClass wc) +{ + extern std::bitset _present_window_types; + return wc < WC_END && _present_window_types[wc]; +} + bool EditBoxInGlobalFocus(); bool FocusedWindowIsConsole(); Point GetCaretPosition();