diff --git a/src/filesrch.c b/src/filesrch.c index d622cd096..6be21ab16 100644 --- a/src/filesrch.c +++ b/src/filesrch.c @@ -327,7 +327,8 @@ char menupath[1024]; size_t menupathindex[menudepth]; size_t menudepthleft = menudepth; -char menusearch[MAXSTRINGLENGTH+1]; +char menusearchbuf[MAXSTRINGLENGTH+1]; +textinput_t menusearch; char **dirmenu, **coredirmenu; // core only local for this file size_t sizedirmenu, sizecoredirmenu; // ditto @@ -516,7 +517,7 @@ static boolean filemenucmp(char *haystack, char *needle) strupr(localhaystack); if (cv_addons_search_type.value) return (strstr(localhaystack, needle) != 0); - return (!strncmp(localhaystack, needle, menusearch[0])); + return (!strncmp(localhaystack, needle, menusearch.length)); } void closefilemenu(boolean validsize) @@ -582,7 +583,7 @@ void searchfilemenu(char *tempname) first = (((UINT8)(coredirmenu[0][DIR_TYPE]) == EXT_UP) ? 1 : 0); // skip UP... - if (!menusearch[0]) + if (!menusearch.length) { if (dirmenu) Z_Free(dirmenu); @@ -609,7 +610,7 @@ void searchfilemenu(char *tempname) return; } - strcpy(localmenusearch, menusearch+1); + strcpy(localmenusearch, menusearch.buffer); if (!cv_addons_search_case.value) strupr(localmenusearch); @@ -671,7 +672,7 @@ boolean preparefilemenu(boolean samedepth, boolean replayhut) tempname = Z_StrDup(dirmenu[dir_on[menudepthleft]]+DIR_STRING); // don't need to I_Error if can't make - not important, just QoL } else - menusearch[0] = menusearch[1] = 0; // clear search + M_TextInputInit(&menusearch, menusearchbuf, MAXSTRINGLENGTH+1); if (!(dirhandle = opendir(menupath))) // get directory { diff --git a/src/filesrch.h b/src/filesrch.h index 8d36689fb..bcf624ed5 100644 --- a/src/filesrch.h +++ b/src/filesrch.h @@ -7,6 +7,7 @@ #include "doomdef.h" #include "d_netfil.h" #include "m_menu.h" // MAXSTRINGLENGTH +#include "m_textinput.h" #ifdef __cplusplus extern "C" { @@ -38,7 +39,8 @@ extern char menupath[1024]; extern size_t menupathindex[menudepth]; extern size_t menudepthleft; -extern char menusearch[MAXSTRINGLENGTH+1]; +extern char menusearchbuf[MAXSTRINGLENGTH+1]; +extern textinput_t menusearch; extern char **dirmenu; extern size_t sizedirmenu; diff --git a/src/m_menu.c b/src/m_menu.c index 573442ded..6360c6219 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -3519,16 +3519,14 @@ void MD_DrawAddons(void) y = BASEVIDHEIGHT - currentMenu->y + 1; M_DrawTextBox(x - (21 + 5), y, MAXSTRINGLENGTH, 1); - if (menusearch[0]) - V_DrawString(x - 18, y + 8, V_ALLOWLOWERCASE, menusearch+1); + + if (menusearch.length) + M_DrawTextInput(x - 18, y + 8, &menusearch, 0); else V_DrawString(x - 18, y + 8, V_ALLOWLOWERCASE|V_TRANSLUCENT, "Type to search..."); - if (skullAnimCounter < 4) - V_DrawCharacter(x - 18 + V_StringWidth(menusearch+1, 0), y + 8, - '_' | 0x80, false); x -= (21 + 5 + 16); - V_DrawSmallScaledPatch(x, y + 4, (menusearch[0] ? 0 : V_TRANSLUCENT), addonsp[NUM_EXT+3]); + V_DrawSmallScaledPatch(x, y + 4, (menusearch.length ? 0 : V_TRANSLUCENT), addonsp[NUM_EXT+3]); x = BASEVIDWIDTH - x - 16; V_DrawSmallScaledPatch(x, y + 4, ((!majormods) ? 0 : V_TRANSLUCENT), addonsp[NUM_EXT+4]); @@ -3546,48 +3544,12 @@ static void M_AddonExec(INT32 ch) COM_BufAddText(va("exec \"%s%s\"", menupath, dirmenu[dir_on[menudepthleft]]+DIR_STRING)); } -#define len menusearch[0] -static boolean M_ChangeStringAddons(INT32 choice) -{ - if (shiftdown && choice >= 32 && choice <= 127) - choice = shiftxform[choice]; - - switch (choice) - { - case KEY_DEL: - if (len) - { - len = menusearch[1] = 0; - return true; - } - break; - case KEY_BACKSPACE: - if (len) - { - menusearch[1+--len] = 0; - return true; - } - break; - default: - if (choice >= 32 && choice <= 127) - { - if (len < MAXSTRINGLENGTH - 1) - { - menusearch[1+len++] = (char)choice; - menusearch[1+len] = 0; - return true; - } - } - break; - } - return false; -} -#undef len - INT32 MR_HandleAddons(INT32 choice) { - if (M_ChangeStringAddons(choice)) + if (M_TextInputHandle(&menusearch, choice)) { + S_StartSound(NULL,sfx_menu1); + char *tempname = NULL; if (dirmenu && dirmenu[dir_on[menudepthleft]]) tempname = Z_StrDup(dirmenu[dir_on[menudepthleft]]+DIR_STRING); // don't need to I_Error if can't make - not important, just QoL