git: 13a36f14c8a5 - main - games/openmw: fix build against recent mygui and libc++ 19

From: Dima Panov <fluffy_at_FreeBSD.org>
Date: Tue, 17 Jun 2025 00:31:06 UTC
The branch main has been updated by fluffy:

URL: https://cgit.FreeBSD.org/ports/commit/?id=13a36f14c8a5aab2b19352e04ab52d3ce971f927

commit 13a36f14c8a5aab2b19352e04ab52d3ce971f927
Author:     Dimitry Andric <dim@FreeBSD.org>
AuthorDate: 2025-06-12 18:16:18 +0000
Commit:     Dima Panov <fluffy@FreeBSD.org>
CommitDate: 2025-06-17 00:30:43 +0000

    games/openmw: fix build against recent mygui and libc++ 19
    
    PR:     284814
---
 games/openmw/Makefile                              |  3 -
 .../files/patch-apps_openmw_mwgui_cursor.cpp       | 13 +++++
 .../patch-apps_openmw_mwgui_quickkeysmenu.cpp      | 11 ++++
 .../files/patch-apps_openmw_mwgui_resourceskin.cpp | 48 ++++++++++++++++
 .../patch-apps_openmw_mwgui_settingswindow.cpp     | 44 +++++++++++++++
 .../files/patch-apps_openmw_mwgui_tooltips.cpp     | 38 +++++++++++++
 .../files/patch-apps_openmw_mwgui_travelwindow.cpp | 20 +++++++
 .../patch-apps_openmw_mwgui_windowmanagerimp.cpp   | 11 ++++
 .../patch-components_fontloader_fontloader.cpp     | 44 +++++++++++++++
 ...h-components_myguiplatform_myguidatamanager.cpp | 11 ++++
 ...h-components_myguiplatform_myguidatamanager.hpp | 11 ++++
 ...h-components_myguiplatform_myguiloglistener.cpp | 11 ++++
 ...h-components_myguiplatform_myguiloglistener.hpp | 11 ++++
 ...components_myguiplatform_myguirendermanager.hpp | 11 ++++
 ...patch-components_myguiplatform_scalinglayer.cpp | 13 +++++
 .../patch-components_resource_imagemanager.cpp     | 29 ++++++++++
 .../patch-components_resource_imagemanager.hpp     | 11 ++++
 .../files/patch-components_to__utf8_to__utf8.cpp   | 26 +++++++++
 .../files/patch-components_to__utf8_to__utf8.hpp   | 11 ++++
 .../openmw/files/patch-components_widgets_box.cpp  | 65 ++++++++++++++++++++++
 .../openmw/files/patch-components_widgets_box.hpp  | 65 ++++++++++++++++++++++
 .../files/patch-components_widgets_fontwrapper.hpp | 20 +++++++
 .../files/patch-components_widgets_imagebutton.cpp | 11 ++++
 .../files/patch-components_widgets_imagebutton.hpp | 11 ++++
 .../openmw/files/patch-components_widgets_list.cpp | 11 ++++
 .../openmw/files/patch-components_widgets_list.hpp | 11 ++++
 26 files changed, 568 insertions(+), 3 deletions(-)

diff --git a/games/openmw/Makefile b/games/openmw/Makefile
index df46f521c1fc..652761704148 100644
--- a/games/openmw/Makefile
+++ b/games/openmw/Makefile
@@ -11,9 +11,6 @@ WWW=		https://openmw.org/
 LICENSE=	GPLv3
 LICENSE_FILE=	${WRKSRC}/LICENSE
 
-BROKEN_FreeBSD_15_aarch64=	clang crashes, see https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=276702
-BROKEN_FreeBSD_15_amd64=	clang crashes, see https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=276702
-
 LIB_DEPENDS=	libavcodec.so.60:multimedia/ffmpeg \
 		libboost_thread.so:devel/boost-libs \
 		libMyGUIEngine.so:x11-toolkits/mygui \
diff --git a/games/openmw/files/patch-apps_openmw_mwgui_cursor.cpp b/games/openmw/files/patch-apps_openmw_mwgui_cursor.cpp
new file mode 100644
index 000000000000..76328e122de7
--- /dev/null
+++ b/games/openmw/files/patch-apps_openmw_mwgui_cursor.cpp
@@ -0,0 +1,13 @@
+--- apps/openmw/mwgui/cursor.cpp.orig	2023-08-08 09:23:20 UTC
++++ apps/openmw/mwgui/cursor.cpp
+@@ -26,8 +26,8 @@ namespace MWGui
+         MyGUI::xml::ElementEnumerator info = _node->getElementEnumerator();
+         while (info.next("Property"))
+         {
+-            const std::string& key = info->findAttribute("key");
+-            const std::string& value = info->findAttribute("value");
++            const auto key = info->findAttribute("key");
++            const auto value = info->findAttribute("value");
+ 
+             if (key == "Point")
+                 mPoint = MyGUI::IntPoint::parse(value);
diff --git a/games/openmw/files/patch-apps_openmw_mwgui_quickkeysmenu.cpp b/games/openmw/files/patch-apps_openmw_mwgui_quickkeysmenu.cpp
new file mode 100644
index 000000000000..9e2e7b8a79db
--- /dev/null
+++ b/games/openmw/files/patch-apps_openmw_mwgui_quickkeysmenu.cpp
@@ -0,0 +1,11 @@
+--- apps/openmw/mwgui/quickkeysmenu.cpp.orig	2023-08-08 09:23:20 UTC
++++ apps/openmw/mwgui/quickkeysmenu.cpp
+@@ -534,7 +534,7 @@ namespace MWGui
+                     break;
+                 }
+                 case Type_Magic:
+-                    std::string spellId = button->getUserString("Spell");
++                    std::string spellId{button->getUserString("Spell")};
+                     key.mId = spellId;
+                     break;
+             }
diff --git a/games/openmw/files/patch-apps_openmw_mwgui_resourceskin.cpp b/games/openmw/files/patch-apps_openmw_mwgui_resourceskin.cpp
new file mode 100644
index 000000000000..615803e2b970
--- /dev/null
+++ b/games/openmw/files/patch-apps_openmw_mwgui_resourceskin.cpp
@@ -0,0 +1,48 @@
+--- apps/openmw/mwgui/resourceskin.cpp.orig	2023-08-08 09:23:20 UTC
++++ apps/openmw/mwgui/resourceskin.cpp
+@@ -9,11 +9,11 @@ namespace MWGui
+     void resizeSkin(MyGUI::xml::ElementPtr _node)
+     {
+         _node->setAttribute("type", "ResourceSkin");
+-        const std::string size = _node->findAttribute("size");
++        const auto size = _node->findAttribute("size");
+         if (!size.empty())
+             return;
+ 
+-        const std::string textureName = _node->findAttribute("texture");
++        const std::string textureName{_node->findAttribute("texture")};
+         if (textureName.empty())
+             return;
+ 
+@@ -30,11 +30,11 @@ namespace MWGui
+             if (basis->getName() != "BasisSkin")
+                 continue;
+ 
+-            const std::string basisSkinType = basis->findAttribute("type");
++            const auto basisSkinType = basis->findAttribute("type");
+             if (Misc::StringUtils::ciEqual(basisSkinType, "SimpleText"))
+                 continue;
+ 
+-            const std::string offset = basis->findAttribute("offset");
++            const auto offset = basis->findAttribute("offset");
+             if (!offset.empty())
+                 continue;
+ 
+@@ -45,7 +45,7 @@ namespace MWGui
+             {
+                 if (state->getName() == "State")
+                 {
+-                    const std::string stateOffset = state->findAttribute("offset");
++                    const auto stateOffset = state->findAttribute("offset");
+                     if (!stateOffset.empty())
+                         continue;
+ 
+@@ -56,7 +56,7 @@ namespace MWGui
+                         bool hasTileSize = false;
+                         while (property.next("Property"))
+                         {
+-                            const std::string key = property->findAttribute("key");
++                            const auto key = property->findAttribute("key");
+                             if (key != "TileSize")
+                                 continue;
+ 
diff --git a/games/openmw/files/patch-apps_openmw_mwgui_settingswindow.cpp b/games/openmw/files/patch-apps_openmw_mwgui_settingswindow.cpp
new file mode 100644
index 000000000000..25fd13d58bc7
--- /dev/null
+++ b/games/openmw/files/patch-apps_openmw_mwgui_settingswindow.cpp
@@ -0,0 +1,44 @@
+--- apps/openmw/mwgui/settingswindow.cpp.orig	2023-08-08 09:23:20 UTC
++++ apps/openmw/mwgui/settingswindow.cpp
+@@ -107,22 +107,22 @@ namespace
+ 
+     std::string getSettingType(MyGUI::Widget* widget)
+     {
+-        return widget->getUserString("SettingType");
++        return std::string{widget->getUserString("SettingType")};
+     }
+ 
+     std::string getSettingName(MyGUI::Widget* widget)
+     {
+-        return widget->getUserString("SettingName");
++        return std::string{widget->getUserString("SettingName")};
+     }
+ 
+     std::string getSettingCategory(MyGUI::Widget* widget)
+     {
+-        return widget->getUserString("SettingCategory");
++        return std::string{widget->getUserString("SettingCategory")};
+     }
+ 
+     std::string getSettingValueType(MyGUI::Widget* widget)
+     {
+-        return widget->getUserString("SettingValueType");
++        return std::string{widget->getUserString("SettingValueType")};
+     }
+ 
+     void getSettingMinMax(MyGUI::Widget* widget, float& min, float& max)
+@@ -220,12 +220,12 @@ namespace MWGui
+ 
+     void SettingsWindow::updateSliderLabel(MyGUI::ScrollBar *scroller, const std::string& value)
+     {
+-        std::string labelWidgetName = scroller->getUserString("SettingLabelWidget");
++        auto labelWidgetName = scroller->getUserString("SettingLabelWidget");
+         if (!labelWidgetName.empty())
+         {
+             MyGUI::TextBox* textBox;
+             getWidget(textBox, labelWidgetName);
+-            std::string labelCaption = scroller->getUserString("SettingLabelCaption");
++            std::string labelCaption{scroller->getUserString("SettingLabelCaption")};
+             labelCaption = Misc::StringUtils::format(labelCaption, value);
+             textBox->setCaptionWithReplacing(labelCaption);
+         }
diff --git a/games/openmw/files/patch-apps_openmw_mwgui_tooltips.cpp b/games/openmw/files/patch-apps_openmw_mwgui_tooltips.cpp
new file mode 100644
index 000000000000..ccc614df8923
--- /dev/null
+++ b/games/openmw/files/patch-apps_openmw_mwgui_tooltips.cpp
@@ -0,0 +1,38 @@
+--- apps/openmw/mwgui/tooltips.cpp.orig	2023-08-08 09:23:20 UTC
++++ apps/openmw/mwgui/tooltips.cpp
+@@ -168,7 +168,7 @@ namespace MWGui
+                         return;
+                 }
+ 
+-                std::string type = focus->getUserString("ToolTipType");
++                auto type = focus->getUserString("ToolTipType");
+ 
+                 if (type == "")
+                 {
+@@ -224,7 +224,7 @@ namespace MWGui
+                     ToolTipInfo info;
+ 
+                     const ESM::Spell *spell =
+-                        MWBase::Environment::get().getWorld()->getStore().get<ESM::Spell>().find(focus->getUserString("Spell"));
++                        MWBase::Environment::get().getWorld()->getStore().get<ESM::Spell>().find(std::string{focus->getUserString("Spell")});
+                     info.caption = spell->mName;
+                     Widgets::SpellEffectList effects;
+                     for (const ESM::ENAMstruct& spellEffect : spell->mEffects.mList)
+@@ -248,7 +248,7 @@ namespace MWGui
+                         int school = MWMechanics::getSpellSchool(spell, player);
+                         info.text = "#{sSchool}: " + sSchoolNames[school];
+                     }
+-                    std::string cost = focus->getUserString("SpellCost");
++                    auto cost = focus->getUserString("SpellCost");
+                     if (cost != "" && cost != "0")
+                         info.text += MWGui::ToolTips::getValueString(MWMechanics::calcSpellCost(*spell), "#{sCastCost}");
+                     info.effects = effects;
+@@ -262,7 +262,7 @@ namespace MWGui
+ 
+                     tooltip->setVisible(true);
+ 
+-                    std::map<std::string, std::string> userStrings = focus->getUserStrings();
++                    auto userStrings = focus->getUserStrings();
+                     for (auto& userStringPair : userStrings)
+                     {
+                         size_t underscorePos = userStringPair.first.find('_');
diff --git a/games/openmw/files/patch-apps_openmw_mwgui_travelwindow.cpp b/games/openmw/files/patch-apps_openmw_mwgui_travelwindow.cpp
new file mode 100644
index 000000000000..2b75b3fadc66
--- /dev/null
+++ b/games/openmw/files/patch-apps_openmw_mwgui_travelwindow.cpp
@@ -0,0 +1,20 @@
+--- apps/openmw/mwgui/travelwindow.cpp.orig	2023-08-08 09:23:20 UTC
++++ apps/openmw/mwgui/travelwindow.cpp
+@@ -144,7 +144,7 @@ namespace MWGui
+ 
+     void TravelWindow::onTravelButtonClick(MyGUI::Widget* _sender)
+     {
+-        std::istringstream iss(_sender->getUserString("price"));
++        std::istringstream iss(std::string{_sender->getUserString("price")});
+         int price;
+         iss >> price;
+ 
+@@ -170,7 +170,7 @@ namespace MWGui
+ 
+         MWBase::Environment::get().getWindowManager()->fadeScreenOut(1);
+         ESM::Position pos = *_sender->getUserData<ESM::Position>();
+-        std::string cellname = _sender->getUserString("Destination");
++        std::string cellname{_sender->getUserString("Destination")};
+         bool interior = _sender->getUserString("interior") == "y";
+         if (mPtr.getCell()->isExterior())
+         {
diff --git a/games/openmw/files/patch-apps_openmw_mwgui_windowmanagerimp.cpp b/games/openmw/files/patch-apps_openmw_mwgui_windowmanagerimp.cpp
new file mode 100644
index 000000000000..6aa09505859f
--- /dev/null
+++ b/games/openmw/files/patch-apps_openmw_mwgui_windowmanagerimp.cpp
@@ -0,0 +1,11 @@
+--- apps/openmw/mwgui/windowmanagerimp.cpp.orig	2023-08-08 09:23:20 UTC
++++ apps/openmw/mwgui/windowmanagerimp.cpp
+@@ -2148,7 +2148,7 @@ namespace MWGui
+             ResourceImageSetPointerFix* imgSetPointer = resource->castType<ResourceImageSetPointerFix>(false);
+             if (!imgSetPointer)
+                 continue;
+-            std::string tex_name = imgSetPointer->getImageSet()->getIndexInfo(0,0).texture;
++            auto tex_name = imgSetPointer->getImageSet()->getIndexInfo(0,0).texture;
+ 
+             osg::ref_ptr<osg::Image> image = mResourceSystem->getImageManager()->getImage(tex_name);
+ 
diff --git a/games/openmw/files/patch-components_fontloader_fontloader.cpp b/games/openmw/files/patch-components_fontloader_fontloader.cpp
new file mode 100644
index 000000000000..e3e20265d062
--- /dev/null
+++ b/games/openmw/files/patch-components_fontloader_fontloader.cpp
@@ -0,0 +1,44 @@
+--- components/fontloader/fontloader.cpp.orig	2023-08-08 09:23:20 UTC
++++ components/fontloader/fontloader.cpp
+@@ -37,7 +37,7 @@ namespace
+         MyGUI::xml::ElementEnumerator propertyIterator = resourceNode->getElementEnumerator();
+         while (propertyIterator.next("Property"))
+         {
+-            std::string key = propertyIterator->findAttribute("key");
++            auto key = propertyIterator->findAttribute("key");
+ 
+             if (key == propertyName)
+             {
+@@ -57,12 +57,12 @@ namespace
+         MyGUI::xml::ElementEnumerator layersIterator = root->getElementEnumerator();
+         while (layersIterator.next("Layer"))
+         {
+-            std::string name = layersIterator->findAttribute("name");
++            auto name = layersIterator->findAttribute("name");
+ 
+             if (name == "JournalBooks")
+             {
+                 MyGUI::xml::ElementPtr sizeProperty = getProperty(layersIterator.current(), "Size");
+-                const std::string& sizeValue = sizeProperty != nullptr ? sizeProperty->findAttribute("value") : std::string();
++                auto sizeValue = sizeProperty != nullptr ? sizeProperty->findAttribute("value") : std::string_view();
+                 if (!sizeValue.empty())
+                     return MyGUI::IntSize::parse(sizeValue);
+             }
+@@ -263,7 +263,7 @@ namespace Gui
+         bool valid = false;
+         if (resourceNode.next("Resource"))
+         {
+-            std::string type = resourceNode->findAttribute("type");
++            auto type = resourceNode->findAttribute("type");
+             valid = (type == "ResourceTrueTypeFont");
+         }
+ 
+@@ -571,7 +571,7 @@ namespace Gui
+         MyGUI::xml::ElementEnumerator resourceNode = _node->getElementEnumerator();
+         while (resourceNode.next("Resource"))
+         {
+-            std::string type = resourceNode->findAttribute("type");
++            auto type = resourceNode->findAttribute("type");
+ 
+             if (Misc::StringUtils::ciEqual(type, "ResourceSkin") ||
+                      Misc::StringUtils::ciEqual(type, "AutoSizedResourceSkin"))
diff --git a/games/openmw/files/patch-components_myguiplatform_myguidatamanager.cpp b/games/openmw/files/patch-components_myguiplatform_myguidatamanager.cpp
new file mode 100644
index 000000000000..38e11fad1b76
--- /dev/null
+++ b/games/openmw/files/patch-components_myguiplatform_myguidatamanager.cpp
@@ -0,0 +1,11 @@
+--- components/myguiplatform/myguidatamanager.cpp.orig	2023-08-08 09:23:20 UTC
++++ components/myguiplatform/myguidatamanager.cpp
+@@ -57,7 +57,7 @@ const MyGUI::VectorString &DataManager::getDataListNam
+     throw std::runtime_error("DataManager::getDataListNames is not implemented - VFS is used");
+ }
+ 
+-const std::string &DataManager::getDataPath(const std::string &name) const
++std::string DataManager::getDataPath(const std::string &name) const
+ {
+     static std::string result;
+     result.clear();
diff --git a/games/openmw/files/patch-components_myguiplatform_myguidatamanager.hpp b/games/openmw/files/patch-components_myguiplatform_myguidatamanager.hpp
new file mode 100644
index 000000000000..f37bd1b59ff0
--- /dev/null
+++ b/games/openmw/files/patch-components_myguiplatform_myguidatamanager.hpp
@@ -0,0 +1,11 @@
+--- components/myguiplatform/myguidatamanager.hpp.orig	2023-08-08 09:23:20 UTC
++++ components/myguiplatform/myguidatamanager.hpp
+@@ -44,7 +44,7 @@ class DataManager : public MyGUI::DataManager (public)
+         @param _name Resource name.
+         @return Return full path to specified data.
+     */
+-    const std::string& getDataPath(const std::string& _name) const override;
++    std::string getDataPath(const std::string& _name) const override;
+ 
+ private:
+     std::string mResourcePath;
diff --git a/games/openmw/files/patch-components_myguiplatform_myguiloglistener.cpp b/games/openmw/files/patch-components_myguiplatform_myguiloglistener.cpp
new file mode 100644
index 000000000000..939b73380527
--- /dev/null
+++ b/games/openmw/files/patch-components_myguiplatform_myguiloglistener.cpp
@@ -0,0 +1,11 @@
+--- components/myguiplatform/myguiloglistener.cpp.orig	2023-08-08 09:23:20 UTC
++++ components/myguiplatform/myguiloglistener.cpp
+@@ -25,7 +25,7 @@ namespace osgMyGUI
+             mStream.flush();
+     }
+ 
+-    void CustomLogListener::log(const std::string& _section, MyGUI::LogLevel _level, const struct tm* _time, const std::string& _message, const char* _file, int _line)
++    void CustomLogListener::log(std::string_view _section, MyGUI::LogLevel _level, const struct tm* _time, std::string_view _message, std::string_view _file, int _line)
+     {
+         if (mStream.is_open())
+         {
diff --git a/games/openmw/files/patch-components_myguiplatform_myguiloglistener.hpp b/games/openmw/files/patch-components_myguiplatform_myguiloglistener.hpp
new file mode 100644
index 000000000000..635c624f0140
--- /dev/null
+++ b/games/openmw/files/patch-components_myguiplatform_myguiloglistener.hpp
@@ -0,0 +1,11 @@
+--- components/myguiplatform/myguiloglistener.hpp.orig	2023-08-08 09:23:20 UTC
++++ components/myguiplatform/myguiloglistener.hpp
+@@ -28,7 +28,7 @@ namespace osgMyGUI
+         void close() override;
+         void flush() override;
+ 
+-        void log(const std::string& _section, MyGUI::LogLevel _level, const struct tm* _time, const std::string& _message, const char* _file, int _line) override;
++        void log(std::string_view _section, MyGUI::LogLevel _level, const struct tm* _time, std::string_view _message, std::string_view _file, int _line) override;
+ 
+         const std::string& getFileName() const { return mFileName; }
+ 
diff --git a/games/openmw/files/patch-components_myguiplatform_myguirendermanager.hpp b/games/openmw/files/patch-components_myguiplatform_myguirendermanager.hpp
new file mode 100644
index 000000000000..e3e0782e7b0d
--- /dev/null
+++ b/games/openmw/files/patch-components_myguiplatform_myguirendermanager.hpp
@@ -0,0 +1,11 @@
+--- components/myguiplatform/myguirendermanager.hpp.orig	2023-08-08 09:23:20 UTC
++++ components/myguiplatform/myguirendermanager.hpp
+@@ -110,7 +110,7 @@ class RenderManager : public MyGUI::RenderManager, pub
+     /** @see IRenderTarget::getInfo */
+     const MyGUI::RenderTargetInfo& getInfo() const override { return mInfo; }
+ 
+-    bool checkTexture(MyGUI::ITexture* _texture);
++    bool checkTexture(MyGUI::ITexture* _texture) override;
+ 
+     void setViewSize(int width, int height) override;
+ 
diff --git a/games/openmw/files/patch-components_myguiplatform_scalinglayer.cpp b/games/openmw/files/patch-components_myguiplatform_scalinglayer.cpp
new file mode 100644
index 000000000000..32d8549ae89f
--- /dev/null
+++ b/games/openmw/files/patch-components_myguiplatform_scalinglayer.cpp
@@ -0,0 +1,13 @@
+--- components/myguiplatform/scalinglayer.cpp.orig	2023-08-08 09:23:20 UTC
++++ components/myguiplatform/scalinglayer.cpp
+@@ -126,8 +126,8 @@ namespace osgMyGUI
+         {
+             if (info->getName() == "Property")
+             {
+-                const std::string& key = info->findAttribute("key");
+-                const std::string& value = info->findAttribute("value");
++                const auto key = info->findAttribute("key");
++                const auto value = info->findAttribute("value");
+ 
+                 if (key == "Size")
+                 {
diff --git a/games/openmw/files/patch-components_resource_imagemanager.cpp b/games/openmw/files/patch-components_resource_imagemanager.cpp
new file mode 100644
index 000000000000..5064982f2abe
--- /dev/null
+++ b/games/openmw/files/patch-components_resource_imagemanager.cpp
@@ -0,0 +1,29 @@
+--- components/resource/imagemanager.cpp.orig	2023-08-08 09:23:20 UTC
++++ components/resource/imagemanager.cpp
+@@ -58,7 +58,7 @@ namespace Resource
+ 
+     }
+ 
+-    bool checkSupported(osg::Image* image, const std::string& filename)
++    bool checkSupported(osg::Image* image)
+     {
+         switch(image->getPixelFormat())
+         {
+@@ -83,7 +83,7 @@ namespace Resource
+         return true;
+     }
+ 
+-    osg::ref_ptr<osg::Image> ImageManager::getImage(const std::string &filename, bool disableFlip)
++    osg::ref_ptr<osg::Image> ImageManager::getImage(std::string_view filename, bool disableFlip)
+     {
+         const std::string normalized = mVFS->normalizeFilename(filename);
+ 
+@@ -147,7 +147,7 @@ namespace Resource
+             osg::ref_ptr<osg::Image> image = result.getImage();
+ 
+             image->setFileName(normalized);
+-            if (!checkSupported(image, filename))
++            if (!checkSupported(image))
+             {
+                 static bool uncompress = (getenv("OPENMW_DECOMPRESS_TEXTURES") != nullptr);
+                 if (!uncompress)
diff --git a/games/openmw/files/patch-components_resource_imagemanager.hpp b/games/openmw/files/patch-components_resource_imagemanager.hpp
new file mode 100644
index 000000000000..b007c3cf7770
--- /dev/null
+++ b/games/openmw/files/patch-components_resource_imagemanager.hpp
@@ -0,0 +1,11 @@
+--- components/resource/imagemanager.hpp.orig	2023-08-08 09:23:20 UTC
++++ components/resource/imagemanager.hpp
+@@ -28,7 +28,7 @@ namespace Resource
+ 
+         /// Create or retrieve an Image
+         /// Returns the dummy image if the given image is not found.
+-        osg::ref_ptr<osg::Image> getImage(const std::string& filename, bool disableFlip = false);
++        osg::ref_ptr<osg::Image> getImage(std::string_view filename, bool disableFlip = false);
+ 
+         osg::Image* getWarningImage();
+ 
diff --git a/games/openmw/files/patch-components_to__utf8_to__utf8.cpp b/games/openmw/files/patch-components_to__utf8_to__utf8.cpp
new file mode 100644
index 000000000000..915b8e19f49a
--- /dev/null
+++ b/games/openmw/files/patch-components_to__utf8_to__utf8.cpp
@@ -0,0 +1,26 @@
+--- components/to_utf8/to_utf8.cpp.orig	2023-08-08 09:23:20 UTC
++++ components/to_utf8/to_utf8.cpp
+@@ -52,18 +52,18 @@ namespace
+         return std::find_if(input.begin(), input.end(), [] (unsigned char v) { return v == 0 || v >= 128; });
+     }
+ 
+-    std::basic_string_view<signed char> getTranslationArray(FromType sourceEncoding)
++    const signed char* getTranslationArray(FromType sourceEncoding)
+     {
+         switch (sourceEncoding)
+         {
+             case ToUTF8::WINDOWS_1252:
+-                return {ToUTF8::windows_1252, std::size(ToUTF8::windows_1252)};
++                return ToUTF8::windows_1252;
+             case ToUTF8::WINDOWS_1250:
+-                return {ToUTF8::windows_1250, std::size(ToUTF8::windows_1250)};
++                return ToUTF8::windows_1250;
+             case ToUTF8::WINDOWS_1251:
+-                return {ToUTF8::windows_1251, std::size(ToUTF8::windows_1251)};
++                return ToUTF8::windows_1251;
+             case ToUTF8::CP437:
+-                return {ToUTF8::cp437, std::size(ToUTF8::cp437)};
++                return ToUTF8::cp437;
+         }
+         throw std::logic_error("Invalid source encoding: " + std::to_string(sourceEncoding));
+     }
diff --git a/games/openmw/files/patch-components_to__utf8_to__utf8.hpp b/games/openmw/files/patch-components_to__utf8_to__utf8.hpp
new file mode 100644
index 000000000000..e5921c5604cf
--- /dev/null
+++ b/games/openmw/files/patch-components_to__utf8_to__utf8.hpp
@@ -0,0 +1,11 @@
+--- components/to_utf8/to_utf8.hpp.orig	2023-08-08 09:23:20 UTC
++++ components/to_utf8/to_utf8.hpp
+@@ -46,7 +46,7 @@ namespace ToUTF8
+             inline std::pair<std::size_t, bool> getLengthLegacyEnc(std::string_view input) const;
+             inline void copyFromArrayLegacyEnc(std::string_view::iterator& chp, std::string_view::iterator end, char* &out) const;
+ 
+-            const std::basic_string_view<signed char> mTranslationArray;
++            const signed char* mTranslationArray;
+     };
+ 
+     class Utf8Encoder
diff --git a/games/openmw/files/patch-components_widgets_box.cpp b/games/openmw/files/patch-components_widgets_box.cpp
new file mode 100644
index 000000000000..19798e7fc48a
--- /dev/null
+++ b/games/openmw/files/patch-components_widgets_box.cpp
@@ -0,0 +1,65 @@
+--- components/widgets/box.cpp.orig	2023-08-08 09:23:20 UTC
++++ components/widgets/box.cpp
+@@ -7,7 +7,7 @@ namespace Gui
+ {
+     // TODO: Since 3.4.2 MyGUI is supposed to automatically translate tags
+     // If the 3.4.2 become a required minimum version, the ComboBox class may be removed.
+-    void ComboBox::setPropertyOverride(const std::string& _key, const std::string& _value)
++    void ComboBox::setPropertyOverride(std::string_view _key, std::string_view _value)
+     {
+ #if MYGUI_VERSION >= MYGUI_DEFINE_VERSION(3,4,2)
+         MyGUI::ComboBox::setPropertyOverride (_key, _value);
+@@ -61,7 +61,7 @@ namespace Gui
+         notifySizeChange (this);
+     }
+ 
+-    void AutoSizedTextBox::setPropertyOverride(const std::string& _key, const std::string& _value)
++    void AutoSizedTextBox::setPropertyOverride(std::string_view _key, std::string_view _value)
+     {
+         if (_key == "ExpandDirection")
+         {
+@@ -123,7 +123,7 @@ namespace Gui
+         setEditStatic(true);
+     }
+ 
+-    void AutoSizedEditBox::setPropertyOverride(const std::string& _key, const std::string& _value)
++    void AutoSizedEditBox::setPropertyOverride(std::string_view _key, std::string_view _value)
+     {
+         if (_key == "ExpandDirection")
+         {
+@@ -156,7 +156,7 @@ namespace Gui
+         notifySizeChange (this);
+     }
+ 
+-    void AutoSizedButton::setPropertyOverride(const std::string& _key, const std::string& _value)
++    void AutoSizedButton::setPropertyOverride(std::string_view _key, std::string_view _value)
+     {
+         if (_key == "ExpandDirection")
+         {
+@@ -179,7 +179,7 @@ namespace Gui
+         align();
+     }
+ 
+-    bool Box::_setPropertyImpl(const std::string& _key, const std::string& _value)
++    bool Box::_setPropertyImpl(std::string_view _key, std::string_view _value)
+     {
+         if (_key == "Spacing")
+             mSpacing = MyGUI::utility::parseValue<int>(_value);
+@@ -278,7 +278,7 @@ namespace Gui
+         }
+     }
+ 
+-    void HBox::setPropertyOverride(const std::string& _key, const std::string& _value)
++    void HBox::setPropertyOverride(std::string_view _key, std::string_view _value)
+     {
+         if (!Box::_setPropertyImpl (_key, _value))
+             MyGUI::Widget::setPropertyOverride(_key, _value);
+@@ -433,7 +433,7 @@ namespace Gui
+         }
+     }
+ 
+-    void VBox::setPropertyOverride(const std::string& _key, const std::string& _value)
++    void VBox::setPropertyOverride(std::string_view _key, std::string_view _value)
+     {
+         if (!Box::_setPropertyImpl (_key, _value))
+             MyGUI::Widget::setPropertyOverride(_key, _value);
diff --git a/games/openmw/files/patch-components_widgets_box.hpp b/games/openmw/files/patch-components_widgets_box.hpp
new file mode 100644
index 000000000000..33932150339c
--- /dev/null
+++ b/games/openmw/files/patch-components_widgets_box.hpp
@@ -0,0 +1,65 @@
+--- components/widgets/box.hpp.orig	2023-08-08 09:23:20 UTC
++++ components/widgets/box.hpp
+@@ -16,7 +16,7 @@ namespace Gui
+         MYGUI_RTTI_DERIVED( ComboBox )
+ 
+     protected:
+-        void setPropertyOverride(const std::string& _key, const std::string& _value) override;
++        void setPropertyOverride(std::string_view _key, std::string_view _value) override;
+     };
+ 
+     class Button : public FontWrapper<MyGUI::Button>
+@@ -58,7 +58,7 @@ namespace Gui
+         void setCaption(const MyGUI::UString& _value) override;
+ 
+     protected:
+-        void setPropertyOverride(const std::string& _key, const std::string& _value) override;
++        void setPropertyOverride(std::string_view _key, std::string_view _value) override;
+         std::string mFontSize;
+     };
+ 
+@@ -74,7 +74,7 @@ namespace Gui
+         void initialiseOverride() override;
+ 
+     protected:
+-        void setPropertyOverride(const std::string& _key, const std::string& _value) override;
++        void setPropertyOverride(std::string_view _key, std::string_view _value) override;
+         int getWidth();
+         std::string mFontSize;
+         bool mShrink = false;
+@@ -91,7 +91,7 @@ namespace Gui
+         void setCaption(const MyGUI::UString& _value) override;
+ 
+     protected:
+-        void setPropertyOverride(const std::string& _key, const std::string& _value) override;
++        void setPropertyOverride(std::string_view _key, std::string_view _value) override;
+         std::string mFontSize;
+     };
+ 
+@@ -111,7 +111,7 @@ namespace Gui
+     protected:
+         virtual void align() = 0;
+ 
+-        virtual bool _setPropertyImpl(const std::string& _key, const std::string& _value);
++        virtual bool _setPropertyImpl(std::string_view _key, std::string_view _value);
+ 
+         int mSpacing; // how much space to put between elements
+ 
+@@ -143,7 +143,7 @@ namespace Gui
+         void align() override;
+         MyGUI::IntSize getRequestedSize() override;
+ 
+-        void setPropertyOverride(const std::string& _key, const std::string& _value) override;
++        void setPropertyOverride(std::string_view _key, std::string_view _value) override;
+ 
+         void onWidgetCreated(MyGUI::Widget* _widget) override;
+     };
+@@ -162,7 +162,7 @@ namespace Gui
+         void align() override;
+         MyGUI::IntSize getRequestedSize() override;
+ 
+-        void setPropertyOverride(const std::string& _key, const std::string& _value) override;
++        void setPropertyOverride(std::string_view _key, std::string_view _value) override;
+ 
+         void onWidgetCreated(MyGUI::Widget* _widget) override;
+     };
diff --git a/games/openmw/files/patch-components_widgets_fontwrapper.hpp b/games/openmw/files/patch-components_widgets_fontwrapper.hpp
new file mode 100644
index 000000000000..de1f6dae96db
--- /dev/null
+++ b/games/openmw/files/patch-components_widgets_fontwrapper.hpp
@@ -0,0 +1,20 @@
+--- components/widgets/fontwrapper.hpp.orig	2023-08-08 09:23:20 UTC
++++ components/widgets/fontwrapper.hpp
+@@ -11,14 +11,14 @@ namespace Gui
+     class FontWrapper : public T
+     {
+     public:
+-        void setFontName(const std::string& name) override
++        void setFontName(std::string_view _value) override
+         {
+-            T::setFontName(name);
++            T::setFontName(_value);
+             T::setPropertyOverride ("FontHeight", getFontSize());
+         }
+ 
+     protected:
+-        void setPropertyOverride(const std::string& _key, const std::string& _value) override
++        void setPropertyOverride(std::string_view _key, std::string_view _value) override
+         {
+             T::setPropertyOverride (_key, _value);
+ 
diff --git a/games/openmw/files/patch-components_widgets_imagebutton.cpp b/games/openmw/files/patch-components_widgets_imagebutton.cpp
new file mode 100644
index 000000000000..9887031881b5
--- /dev/null
+++ b/games/openmw/files/patch-components_widgets_imagebutton.cpp
@@ -0,0 +1,11 @@
+--- components/widgets/imagebutton.cpp.orig	2023-08-08 09:23:20 UTC
++++ components/widgets/imagebutton.cpp
+@@ -34,7 +34,7 @@ namespace Gui
+         updateImage();
+     }
+ 
+-    void ImageButton::setPropertyOverride(const std::string &_key, const std::string &_value)
++    void ImageButton::setPropertyOverride(std::string_view _key, std::string_view _value)
+     {
+         if (_key == "ImageHighlighted")
+             mImageHighlighted = _value;
diff --git a/games/openmw/files/patch-components_widgets_imagebutton.hpp b/games/openmw/files/patch-components_widgets_imagebutton.hpp
new file mode 100644
index 000000000000..617e49ac50ac
--- /dev/null
+++ b/games/openmw/files/patch-components_widgets_imagebutton.hpp
@@ -0,0 +1,11 @@
+--- components/widgets/imagebutton.hpp.orig	2023-08-08 09:23:20 UTC
++++ components/widgets/imagebutton.hpp
+@@ -31,7 +31,7 @@ namespace Gui
+         static bool sDefaultNeedKeyFocus;
+ 
+     protected:
+-        void setPropertyOverride(const std::string& _key, const std::string& _value) override;
++        void setPropertyOverride(std::string_view _key, std::string_view _value) override;
+         void onMouseLostFocus(MyGUI::Widget* _new) override;
+         void onMouseSetFocus(MyGUI::Widget* _old) override;
+         void onMouseButtonPressed(int _left, int _top, MyGUI::MouseButton _id) override;
diff --git a/games/openmw/files/patch-components_widgets_list.cpp b/games/openmw/files/patch-components_widgets_list.cpp
new file mode 100644
index 000000000000..a39f2a13dc5b
--- /dev/null
+++ b/games/openmw/files/patch-components_widgets_list.cpp
@@ -0,0 +1,11 @@
+--- components/widgets/list.cpp.orig	2023-08-08 09:23:20 UTC
++++ components/widgets/list.cpp
+@@ -105,7 +105,7 @@ namespace Gui
+         mScrollView->setViewOffset(MyGUI::IntPoint(0, -viewPosition));
+     }
+ 
+-    void MWList::setPropertyOverride(const std::string &_key, const std::string &_value)
++    void MWList::setPropertyOverride(std::string_view _key, std::string_view _value)
+     {
+         if (_key == "ListItemSkin")
+             mListItemSkin = _value;
diff --git a/games/openmw/files/patch-components_widgets_list.hpp b/games/openmw/files/patch-components_widgets_list.hpp
new file mode 100644
index 000000000000..d21eeb5a93b8
--- /dev/null
+++ b/games/openmw/files/patch-components_widgets_list.hpp
@@ -0,0 +1,11 @@
+--- components/widgets/list.hpp.orig	2023-08-08 09:23:20 UTC
++++ components/widgets/list.hpp
+@@ -48,7 +48,7 @@ namespace Gui
+ 
+         void scrollToTop();
+ 
+-        void setPropertyOverride(const std::string& _key, const std::string& _value) override;
++        void setPropertyOverride(std::string_view _key, std::string_view _value) override;
+ 
+     protected:
+         void initialiseOverride() override;