forked from Mirrorlandia_minetest/minetest
Remove m_ext_ptr in GUIFormSpecMenu, replaced by refcount mechanism
This commit is contained in:
parent
73bf791fe1
commit
b49e5cfc70
26
src/game.cpp
26
src/game.cpp
@ -944,9 +944,16 @@ static inline void create_formspec_menu(GUIFormSpecMenu** cur_formspec,
|
|||||||
|
|
||||||
if (*cur_formspec == 0) {
|
if (*cur_formspec == 0) {
|
||||||
*cur_formspec = new GUIFormSpecMenu(device, guiroot, -1, &g_menumgr,
|
*cur_formspec = new GUIFormSpecMenu(device, guiroot, -1, &g_menumgr,
|
||||||
invmgr, gamedef, tsrc, fs_src, txt_dest, cur_formspec, client);
|
invmgr, gamedef, tsrc, fs_src, txt_dest, client);
|
||||||
(*cur_formspec)->doPause = false;
|
(*cur_formspec)->doPause = false;
|
||||||
(*cur_formspec)->drop();
|
|
||||||
|
/*
|
||||||
|
Caution: do not call (*cur_formspec)->drop() here --
|
||||||
|
the reference might outlive the menu, so we will
|
||||||
|
periodically check if *cur_formspec is the only
|
||||||
|
remaining reference (i.e. the menu was removed)
|
||||||
|
and delete it in that case.
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
(*cur_formspec)->setFormSource(fs_src);
|
(*cur_formspec)->setFormSource(fs_src);
|
||||||
@ -3417,11 +3424,17 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
make sure menu is on top
|
1. Delete formspec menu reference if menu was removed
|
||||||
|
2. Else, make sure formspec menu is on top
|
||||||
*/
|
*/
|
||||||
if ((!noMenuActive()) && (current_formspec)) {
|
if (current_formspec) {
|
||||||
|
if (current_formspec->getReferenceCount() == 1) {
|
||||||
|
current_formspec->drop();
|
||||||
|
current_formspec = NULL;
|
||||||
|
} else if (!noMenuActive()) {
|
||||||
guiroot->bringToFront(current_formspec);
|
guiroot->bringToFront(current_formspec);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Drawing begins
|
Drawing begins
|
||||||
@ -3509,6 +3522,11 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
|
|||||||
g_menumgr.m_stack.front()->setVisible(false);
|
g_menumgr.m_stack.front()->setVisible(false);
|
||||||
g_menumgr.deletingMenu(g_menumgr.m_stack.front());
|
g_menumgr.deletingMenu(g_menumgr.m_stack.front());
|
||||||
}
|
}
|
||||||
|
if (current_formspec) {
|
||||||
|
current_formspec->drop();
|
||||||
|
current_formspec = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Draw a "shutting down" screen, which will be shown while the map
|
Draw a "shutting down" screen, which will be shown while the map
|
||||||
generator and other stuff quits
|
generator and other stuff quits
|
||||||
|
@ -190,7 +190,7 @@ GUIEngine::GUIEngine( irr::IrrlichtDevice* dev,
|
|||||||
m_texture_source,
|
m_texture_source,
|
||||||
m_formspecgui,
|
m_formspecgui,
|
||||||
m_buttonhandler,
|
m_buttonhandler,
|
||||||
NULL, NULL);
|
NULL);
|
||||||
|
|
||||||
m_menu->allowClose(false);
|
m_menu->allowClose(false);
|
||||||
m_menu->lockSize(true,v2u32(800,600));
|
m_menu->lockSize(true,v2u32(800,600));
|
||||||
@ -220,8 +220,7 @@ GUIEngine::GUIEngine( irr::IrrlichtDevice* dev,
|
|||||||
}
|
}
|
||||||
|
|
||||||
m_menu->quitMenu();
|
m_menu->quitMenu();
|
||||||
m_menu->remove();
|
m_menu->drop();
|
||||||
delete m_menu;
|
|
||||||
m_menu = NULL;
|
m_menu = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -68,12 +68,11 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||||||
/*
|
/*
|
||||||
GUIFormSpecMenu
|
GUIFormSpecMenu
|
||||||
*/
|
*/
|
||||||
|
|
||||||
GUIFormSpecMenu::GUIFormSpecMenu(irr::IrrlichtDevice* dev,
|
GUIFormSpecMenu::GUIFormSpecMenu(irr::IrrlichtDevice* dev,
|
||||||
gui::IGUIElement* parent, s32 id, IMenuManager *menumgr,
|
gui::IGUIElement* parent, s32 id, IMenuManager *menumgr,
|
||||||
InventoryManager *invmgr, IGameDef *gamedef,
|
InventoryManager *invmgr, IGameDef *gamedef,
|
||||||
ISimpleTextureSource *tsrc, IFormSource* fsrc, TextDest* tdst,
|
ISimpleTextureSource *tsrc, IFormSource* fsrc, TextDest* tdst,
|
||||||
GUIFormSpecMenu** ext_ptr, Client* client) :
|
Client* client) :
|
||||||
GUIModalMenu(dev->getGUIEnvironment(), parent, id, menumgr),
|
GUIModalMenu(dev->getGUIEnvironment(), parent, id, menumgr),
|
||||||
m_device(dev),
|
m_device(dev),
|
||||||
m_invmgr(invmgr),
|
m_invmgr(invmgr),
|
||||||
@ -89,7 +88,6 @@ GUIFormSpecMenu::GUIFormSpecMenu(irr::IrrlichtDevice* dev,
|
|||||||
m_lock(false),
|
m_lock(false),
|
||||||
m_form_src(fsrc),
|
m_form_src(fsrc),
|
||||||
m_text_dst(tdst),
|
m_text_dst(tdst),
|
||||||
m_ext_ptr(ext_ptr),
|
|
||||||
m_font(dev->getGUIEnvironment()->getSkin()->getFont()),
|
m_font(dev->getGUIEnvironment()->getSkin()->getFont()),
|
||||||
m_formspec_version(0)
|
m_formspec_version(0)
|
||||||
#ifdef __ANDROID__
|
#ifdef __ANDROID__
|
||||||
@ -130,11 +128,6 @@ GUIFormSpecMenu::~GUIFormSpecMenu()
|
|||||||
if (m_text_dst != NULL) {
|
if (m_text_dst != NULL) {
|
||||||
delete m_text_dst;
|
delete m_text_dst;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_ext_ptr != NULL) {
|
|
||||||
assert(*m_ext_ptr == this);
|
|
||||||
*m_ext_ptr = NULL;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void GUIFormSpecMenu::removeChildren()
|
void GUIFormSpecMenu::removeChildren()
|
||||||
|
@ -210,7 +210,6 @@ public:
|
|||||||
ISimpleTextureSource *tsrc,
|
ISimpleTextureSource *tsrc,
|
||||||
IFormSource* fs_src,
|
IFormSource* fs_src,
|
||||||
TextDest* txt_dst,
|
TextDest* txt_dst,
|
||||||
GUIFormSpecMenu** ext_ptr,
|
|
||||||
Client* client
|
Client* client
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -346,7 +345,6 @@ protected:
|
|||||||
private:
|
private:
|
||||||
IFormSource *m_form_src;
|
IFormSource *m_form_src;
|
||||||
TextDest *m_text_dst;
|
TextDest *m_text_dst;
|
||||||
GUIFormSpecMenu **m_ext_ptr;
|
|
||||||
gui::IGUIFont *m_font;
|
gui::IGUIFont *m_font;
|
||||||
unsigned int m_formspec_version;
|
unsigned int m_formspec_version;
|
||||||
|
|
||||||
|
@ -96,6 +96,8 @@ public:
|
|||||||
|
|
||||||
WARNING: THIS DEALLOCATES THE MENU FROM MEMORY. Return
|
WARNING: THIS DEALLOCATES THE MENU FROM MEMORY. Return
|
||||||
immediately if you call this from the menu itself.
|
immediately if you call this from the menu itself.
|
||||||
|
|
||||||
|
(More precisely, this decrements the reference count.)
|
||||||
*/
|
*/
|
||||||
void quitMenu()
|
void quitMenu()
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user