diff --git a/source/src/menus.cpp b/source/src/menus.cpp index 032aaee1..8748762e 100644 --- a/source/src/menus.cpp +++ b/source/src/menus.cpp @@ -8,10 +8,14 @@ gmenu *curmenu = NULL, *lastmenu = NULL; vector menustack; -void menuset(void *m) +void menuset(void *m, bool save) { if(curmenu==m) return; - if(curmenu) curmenu->close(); + if(curmenu) + { + if(save) menustack.add(curmenu); + else curmenu->close(); + } if((curmenu = (gmenu *)m)) curmenu->open(); } @@ -38,7 +42,7 @@ void closemenu(const char *name) { gmenu *m = menus.access(name); if(!m) return; - if(curmenu==m) menuset(menustack.empty() ? NULL : menustack.pop()); + if(curmenu==m) menuset(menustack.empty() ? NULL : menustack.pop(), false); else loopv(menustack) { if(menustack[i]==m) @@ -98,11 +102,7 @@ void drawarrow(int dir, int x, int y, int size, float r = 1.0f, float g = 1.0f, bool menuvisible() { - if(!curmenu) - { - menustack.setsize(0); - return false; - } + if(!curmenu) return false; return true; } @@ -157,11 +157,15 @@ struct mitemmanual : mitem { if(action && action[0]) { - menustack.add(curmenu); - menuset(NULL); + int oldstack = menustack.length(); push("arg1", text); execute(action); pop("arg1"); + if(menustack.length() <= oldstack) + { + menuset(NULL, false); + menustack.setsize(0); + } } } virtual const char *getdesc() { return desc; } @@ -601,7 +605,7 @@ bool menukey(int code, bool isdown, int unicode) break; case SDLK_ESCAPE: case -3: - menuset(menustack.empty() ? NULL : menustack.pop()); + menuset(menustack.empty() ? NULL : menustack.pop(), false); return true; break; case SDLK_UP: @@ -661,7 +665,7 @@ bool menukey(int code, bool isdown, int unicode) void rendermenumdl() { - if(!curmenu) { menustack.setsize(0); return; } + if(!curmenu) return; gmenu &m = *curmenu; if(!m.mdl) return; diff --git a/source/src/protos.h b/source/src/protos.h index 849888d3..d10a5f35 100644 --- a/source/src/protos.h +++ b/source/src/protos.h @@ -100,7 +100,7 @@ extern void menuheader(void *menu, char *header = NULL, char *footer = NULL); extern bool menukey(int code, bool isdown, int unicode); extern void *addmenu(const char *name, const char *title = NULL, bool allowinput = true, void (__cdecl *refreshfunc)(void *, bool) = NULL, bool hotkeys = false, bool forwardkeys = false); extern void rendermenumdl(); -extern void menuset(void *m); +extern void menuset(void *m, bool save = true); extern void menuselect(void *menu, int sel); extern void showmenu(const char *name); extern void closemenu(const char *name);