* Additional, better freeing.

* Position remembering when going up a level.
This commit is contained in:
toasterbabe 2017-04-29 16:40:07 +01:00
parent 605580358d
commit 881f5e70ce
3 changed files with 30 additions and 18 deletions

View File

@ -293,7 +293,7 @@ size_t menudepthleft = 20;
char **dirmenu; char **dirmenu;
size_t sizedirmenu; size_t sizedirmenu;
size_t dir_on; size_t dir_on[20];
#if defined (_XBOX) && defined (_MSC_VER) #if defined (_XBOX) && defined (_MSC_VER)
filestatus_t filesearch(char *filename, const char *startpath, const UINT8 *wantedmd5sum, filestatus_t filesearch(char *filename, const char *startpath, const UINT8 *wantedmd5sum,
@ -483,16 +483,14 @@ boolean preparefilemenu(void)
DIR *dirhandle; DIR *dirhandle;
struct dirent *dent; struct dirent *dent;
struct stat fsstat; struct stat fsstat;
size_t pos, folderpos = 0, numfolders = 0; size_t pos = 0, folderpos = 0, numfolders = 0;
for (pos = 0; pos < sizedirmenu; pos++) for (; sizedirmenu > 0; sizedirmenu--)
{ {
Z_Free(dirmenu[pos]); Z_Free(dirmenu[sizedirmenu-1]);
dirmenu[pos] = NULL; dirmenu[sizedirmenu-1] = NULL;
} }
sizedirmenu = dir_on = pos = 0;
dirhandle = opendir(menupath); dirhandle = opendir(menupath);
if (dirhandle == NULL) if (dirhandle == NULL)

View File

@ -31,7 +31,7 @@ extern size_t menudepthleft;
extern char **dirmenu; extern char **dirmenu;
extern size_t sizedirmenu; extern size_t sizedirmenu;
extern size_t dir_on; extern size_t dir_on[20];
boolean preparefilemenu(void); boolean preparefilemenu(void);

View File

@ -4459,6 +4459,8 @@ static void M_Addons(INT32 choice)
M_StartMessage(M_GetText("No files/folders found.\n\n(Press a key)\n"),NULL,MM_NOTHING); M_StartMessage(M_GetText("No files/folders found.\n\n(Press a key)\n"),NULL,MM_NOTHING);
return; return;
} }
else
dir_on[menudepthleft] = 0;
MISC_AddonsDef.prevMenu = currentMenu; MISC_AddonsDef.prevMenu = currentMenu;
M_SetupNextMenu(&MISC_AddonsDef); M_SetupNextMenu(&MISC_AddonsDef);
@ -4476,7 +4478,7 @@ static void M_DrawAddons(void)
V_DrawString(x, y, 0, menupath); V_DrawString(x, y, 0, menupath);
y += 2*SMALLLINEHEIGHT; y += 2*SMALLLINEHEIGHT;
for (i = dir_on; i < sizedirmenu; i++) for (i = dir_on[menudepthleft]; i < sizedirmenu; i++)
{ {
if (y > BASEVIDHEIGHT) break; if (y > BASEVIDHEIGHT) break;
V_DrawString(x, y, 0, dirmenu[i]+2); V_DrawString(x, y, 0, dirmenu[i]+2);
@ -4491,21 +4493,21 @@ static void M_HandleAddons(INT32 choice)
switch (choice) switch (choice)
{ {
case KEY_DOWNARROW: case KEY_DOWNARROW:
if (dir_on < sizedirmenu-1) if (dir_on[menudepthleft] < sizedirmenu-1)
dir_on++; dir_on[menudepthleft]++;
S_StartSound(NULL, sfx_menu1); S_StartSound(NULL, sfx_menu1);
break; break;
case KEY_UPARROW: case KEY_UPARROW:
if (dir_on) if (dir_on[menudepthleft])
dir_on--; dir_on[menudepthleft]--;
S_StartSound(NULL, sfx_menu1); S_StartSound(NULL, sfx_menu1);
break; break;
case KEY_ENTER: case KEY_ENTER:
if (dirmenu[dir_on][0] == 0) // folder if (dirmenu[dir_on[menudepthleft]][0] == 0) // folder
{ {
S_StartSound(NULL, sfx_strpst); S_StartSound(NULL, sfx_strpst);
strcpy(&menupath[menupathindex[menudepthleft--]],dirmenu[dir_on]+2); strcpy(&menupath[menupathindex[menudepthleft]],dirmenu[dir_on[menudepthleft]]+2);
menupathindex[menudepthleft] = strlen(menupath); menupathindex[--menudepthleft] = strlen(menupath);
menupath[menupathindex[menudepthleft]] = 0; menupath[menupathindex[menudepthleft]] = 0;
if (!preparefilemenu()) if (!preparefilemenu())
@ -4519,11 +4521,13 @@ static void M_HandleAddons(INT32 choice)
return; return;
} }
} }
else
dir_on[menudepthleft] = 0;
} }
else if (dirmenu[dir_on][0] >= 3) // wad/soc/lua else if (dirmenu[dir_on[menudepthleft]][0] >= 3) // wad/soc/lua
{ {
S_StartSound(NULL, sfx_strpst); S_StartSound(NULL, sfx_strpst);
COM_BufAddText(va("addfile %s%s", menupath, dirmenu[dir_on]+2)); COM_BufAddText(va("addfile %s%s", menupath, dirmenu[dir_on[menudepthleft]]+2));
} }
else else
S_StartSound(NULL, sfx_lose); S_StartSound(NULL, sfx_lose);
@ -4540,6 +4544,7 @@ static void M_HandleAddons(INT32 choice)
} }
break; break;
} }
// intentional fallthrough
case KEY_ESCAPE: case KEY_ESCAPE:
exitmenu = true; exitmenu = true;
break; break;
@ -4549,6 +4554,15 @@ static void M_HandleAddons(INT32 choice)
} }
if (exitmenu) if (exitmenu)
{ {
for (; sizedirmenu > 0; sizedirmenu--)
{
Z_Free(dirmenu[sizedirmenu-1]);
dirmenu[sizedirmenu-1] = NULL;
}
Z_Free(dirmenu);
dirmenu = NULL;
if (currentMenu->prevMenu) if (currentMenu->prevMenu)
M_SetupNextMenu(currentMenu->prevMenu); M_SetupNextMenu(currentMenu->prevMenu);
else else