From a716b4aa28e1c2ca619677f3b507865ea80d2306 Mon Sep 17 00:00:00 2001 From: Ted John Date: Sat, 16 Jun 2018 00:04:52 +0100 Subject: [PATCH] Remove use of window list in Viewport.cpp --- src/openrct2-ui/WindowManager.cpp | 12 ++++++++++++ src/openrct2/interface/Viewport.cpp | 16 ++++++++++------ src/openrct2/ui/DummyWindowManager.cpp | 1 + src/openrct2/ui/WindowManager.h | 1 + 4 files changed, 24 insertions(+), 6 deletions(-) diff --git a/src/openrct2-ui/WindowManager.cpp b/src/openrct2-ui/WindowManager.cpp index b1adeb7e0e..6ca8fb032d 100644 --- a/src/openrct2-ui/WindowManager.cpp +++ b/src/openrct2-ui/WindowManager.cpp @@ -502,6 +502,18 @@ public: { window_all_wheel_input(); } + + rct_window* GetOwner(const rct_viewport* viewport) override + { + for (auto w = g_window_list; w < gWindowNextSlot; w++) + { + if (w->viewport == viewport) + { + return w; + } + } + return nullptr; + } }; IWindowManager * OpenRCT2::Ui::CreateWindowManager() diff --git a/src/openrct2/interface/Viewport.cpp b/src/openrct2/interface/Viewport.cpp index 9ed18a5248..e271c3bb0c 100644 --- a/src/openrct2/interface/Viewport.cpp +++ b/src/openrct2/interface/Viewport.cpp @@ -24,11 +24,15 @@ #include "../world/Climate.h" #include "../world/Map.h" #include "../world/Sprite.h" +#include "../ui/UiContext.h" +#include "../ui/WindowManager.h" #include "Colour.h" #include "Viewport.h" #include "Window.h" #include "Window_internal.h" +using namespace OpenRCT2; + //#define DEBUG_SHOW_DIRTY_BOX uint8 gShowGridLinesRefCount; uint8 gShowLandRightsRefCount; @@ -1538,14 +1542,14 @@ void viewport_invalidate(rct_viewport *viewport, sint32 left, sint32 top, sint32 // if unknown viewport visibility, use the containing window to discover the status if (viewport->visibility == VC_UNKNOWN) { - for (rct_window *w = g_window_list; w < gWindowNextSlot; w++) + auto windowManager = GetContext()->GetUiContext()->GetWindowManager(); + auto owner = windowManager->GetOwner(viewport); + if (owner != nullptr && owner->classification != WC_MAIN_WINDOW) { - if (w->classification != WC_MAIN_WINDOW && w->viewport != nullptr && w->viewport == viewport) + // note, window_is_visible will update viewport->visibility, so this should have a low hit count + if (!window_is_visible(owner)) { - // note, window_is_visible will update viewport->visibility, so this should have a low hit count - if (!window_is_visible(w)) { - return; - } + return; } } } diff --git a/src/openrct2/ui/DummyWindowManager.cpp b/src/openrct2/ui/DummyWindowManager.cpp index 870bbbb4e7..e11946d89b 100644 --- a/src/openrct2/ui/DummyWindowManager.cpp +++ b/src/openrct2/ui/DummyWindowManager.cpp @@ -27,6 +27,7 @@ namespace OpenRCT2::Ui std::string GetKeyboardShortcutString(sint32 /*shortcut*/) override { return std::string(); } void SetMainView(sint32 x, sint32 y, sint32 zoom, sint32 rotation) override { } void UpdateMouseWheel() override { } + rct_window* GetOwner(const rct_viewport* viewport) override { return nullptr; } }; IWindowManager * CreateDummyWindowManager() diff --git a/src/openrct2/ui/WindowManager.h b/src/openrct2/ui/WindowManager.h index 61a5cd52d5..567f6d02e3 100644 --- a/src/openrct2/ui/WindowManager.h +++ b/src/openrct2/ui/WindowManager.h @@ -37,6 +37,7 @@ namespace OpenRCT2::Ui virtual std::string GetKeyboardShortcutString(sint32 shortcut) abstract; virtual void SetMainView(sint32 x, sint32 y, sint32 zoom, sint32 rotation) abstract; virtual void UpdateMouseWheel() abstract; + virtual rct_window* GetOwner(const rct_viewport* viewport) abstract; }; IWindowManager * CreateDummyWindowManager();