diff --git a/src/menu/colorpickermenu.cpp b/src/menu/colorpickermenu.cpp index 6ace5bd704..df96b37a02 100644 --- a/src/menu/colorpickermenu.cpp +++ b/src/menu/colorpickermenu.cpp @@ -89,6 +89,10 @@ public: desc->mItems[mStartItem+5] = new DOptionMenuItemStaticText(" ", false); desc->mItems[mStartItem+6] = new DOptionMenuItemCommand("Undo changes", "undocolorpic"); desc->mItems[mStartItem+7] = new DOptionMenuItemStaticText(" ", false); + for (auto &p : desc->mItems) + { + GC::WriteBarrier(p); + } desc->mSelectedItem = mStartItem + 2; Init(parent, desc); desc->mIndent = 0; diff --git a/src/menu/joystickmenu.cpp b/src/menu/joystickmenu.cpp index 702a6b09f0..21bb370b4a 100644 --- a/src/menu/joystickmenu.cpp +++ b/src/menu/joystickmenu.cpp @@ -322,6 +322,10 @@ FOptionMenuDescriptor *UpdateJoystickConfigMenu(IJoystickConfig *joy) opt->mItems.Push(it); } } + for (auto &p : opt->mItems) + { + GC::WriteBarrier(p); + } opt->mScrollPos = 0; opt->mSelectedItem = -1; opt->mIndent = 0; @@ -402,6 +406,10 @@ void UpdateJoystickMenu(IJoystickConfig *selected) if (i == itemnum) opt->mSelectedItem = opt->mItems.Size(); } } + for (auto &p : opt->mItems) + { + GC::WriteBarrier(p); + } if (opt->mSelectedItem >= (int)opt->mItems.Size()) { opt->mSelectedItem = opt->mItems.Size() - 1; diff --git a/src/menu/listmenu.cpp b/src/menu/listmenu.cpp index 4605246bd9..020a540c54 100644 --- a/src/menu/listmenu.cpp +++ b/src/menu/listmenu.cpp @@ -44,6 +44,10 @@ IMPLEMENT_CLASS(DListMenu, false, false) +IMPLEMENT_POINTERS_START(DListMenu) +IMPLEMENT_POINTER(mFocusControl) +IMPLEMENT_POINTERS_END + //============================================================================= // // diff --git a/src/menu/menu.h b/src/menu/menu.h index e789604a82..23a4e87187 100644 --- a/src/menu/menu.h +++ b/src/menu/menu.h @@ -520,6 +520,7 @@ public: class DListMenu : public DMenu { DECLARE_CLASS(DListMenu, DMenu) + HAS_OBJECT_POINTERS; protected: FListMenuDescriptor *mDesc; @@ -609,6 +610,7 @@ extern FOptionMap OptionValues; class DOptionMenu : public DMenu { DECLARE_CLASS(DOptionMenu, DMenu) + HAS_OBJECT_POINTERS; bool CanScrollUp; bool CanScrollDown; diff --git a/src/menu/menudef.cpp b/src/menu/menudef.cpp index 08e44fbabc..efb444d5c2 100644 --- a/src/menu/menudef.cpp +++ b/src/menu/menudef.cpp @@ -475,6 +475,10 @@ static void ParseListMenuBody(FScanner &sc, FListMenuDescriptor *desc) sc.ScriptError("Unknown keyword '%s'", sc.String); } } + for (auto &p : desc->mItems) + { + GC::WriteBarrier(p); + } } //============================================================================= @@ -927,6 +931,10 @@ static void ParseOptionMenuBody(FScanner &sc, FOptionMenuDescriptor *desc) sc.ScriptError("Unknown keyword '%s'", sc.String); } } + for (auto &p : desc->mItems) + { + GC::WriteBarrier(p); + } } //============================================================================= @@ -1101,6 +1109,10 @@ static void BuildEpisodeMenu() ld->mAutoselect = ld->mSelectedItem; } success = true; + for (auto &p : ld->mItems) + { + GC::WriteBarrier(p); + } } } } @@ -1125,6 +1137,7 @@ static void BuildEpisodeMenu() { DOptionMenuItemSubmenu *it = new DOptionMenuItemSubmenu(AllEpisodes[i].mEpisodeName, "Skillmenu", i); od->mItems.Push(it); + GC::WriteBarrier(it); } } } @@ -1230,6 +1243,10 @@ static void BuildPlayerclassMenu() } } success = true; + for (auto &p : ld->mItems) + { + GC::WriteBarrier(p); + } } } } @@ -1261,11 +1278,13 @@ static void BuildPlayerclassMenu() { DOptionMenuItemSubmenu *it = new DOptionMenuItemSubmenu(pname, "Episodemenu", i); od->mItems.Push(it); + GC::WriteBarrier(it); } } } DOptionMenuItemSubmenu *it = new DOptionMenuItemSubmenu("Random", "Episodemenu", -1); od->mItems.Push(it); + GC::WriteBarrier(it); } } @@ -1355,6 +1374,10 @@ static void InitKeySections() menu->mItems.Push(item); } } + for (auto &p : menu->mItems) + { + GC::WriteBarrier(p); + } } } } @@ -1488,6 +1511,7 @@ void M_StartupSkillMenu(FGameStartup *gs) pItemText? *pItemText : skill.MenuName, ld->mFont, color,ld->mFontColor2, action, i); } ld->mItems.Push(li); + GC::WriteBarrier(li); y += ld->mLinespacing; } if (AllEpisodes[gs->Episode].mNoSkill || AllSkills.Size() == 1) @@ -1541,6 +1565,7 @@ fail: } li = new DOptionMenuItemSubmenu(pItemText? *pItemText : skill.MenuName, action, i); od->mItems.Push(li); + GC::WriteBarrier(li); if (!done) { done = true; diff --git a/src/menu/optionmenu.cpp b/src/menu/optionmenu.cpp index f6e129ebca..e27ae20a2b 100644 --- a/src/menu/optionmenu.cpp +++ b/src/menu/optionmenu.cpp @@ -66,6 +66,10 @@ void M_DrawConText (int color, int x, int y, const char *str) IMPLEMENT_CLASS(DOptionMenu, false, false) +IMPLEMENT_POINTERS_START(DOptionMenu) +IMPLEMENT_POINTER(mFocusControl) +IMPLEMENT_POINTERS_END + //============================================================================= // //