From e9d764eaa6a212f8a04252c7deb6263fe07e6874 Mon Sep 17 00:00:00 2001 From: GenericHeroGuy Date: Fri, 6 Jun 2025 02:02:53 +0200 Subject: [PATCH] Move keyhandler from menuitems to menu (and clean up event handling) Also make empty menus work --- src/deh_soc.c | 27 +++- src/deh_tables.c | 4 +- src/m_menu.c | 394 ++++++++++++++++++++--------------------------- src/m_menu.h | 10 +- 4 files changed, 193 insertions(+), 242 deletions(-) diff --git a/src/deh_soc.c b/src/deh_soc.c index 934109f46..9bff11545 100644 --- a/src/deh_soc.c +++ b/src/deh_soc.c @@ -1926,8 +1926,6 @@ static void readmenuitem(MYFILE *f, menuitem_t *menuitem) flags = IT_HEADERTEXT; else if (fastcmp(word+4, "WHITE")) flags = IT_WHITESTRING; - else if (fastcmp(word+4, "2")) - flags = IT_STRING2; else if (word[4]) { WARN("unknown word '%s'", word); @@ -1997,7 +1995,7 @@ static void readmenuitem(MYFILE *f, menuitem_t *menuitem) status |= IT_SUBMENU; menuitem->itemaction.submenu = mn; } - else if (fastncmp(word, "CALL", 4) || fastcmp(word, "KEYHANDLER") || fastcmp(word, "ARROWS")) + else if (fastncmp(word, "CALL", 4) || fastcmp(word, "ARROWS")) { UINT16 flags; if (word[0] == 'C') @@ -2011,8 +2009,6 @@ static void readmenuitem(MYFILE *f, menuitem_t *menuitem) continue; } } - else if (word[0] == 'K') - flags = IT_KEYHANDLER; else if (word[0] == 'A') flags = IT_ARROWS; else @@ -2033,6 +2029,17 @@ static void readmenuitem(MYFILE *f, menuitem_t *menuitem) status |= flags; menuitem->itemaction.routine = routine; } + else if (fastcmp(word, "DUMMY")) + { + if (actionset) + { + WARN0("action already set!"); + continue; + } + actionset = true; + status |= IT_DUMMY; + menuitem->itemaction.routine = NULL; + } else WARN("unknown word '%s'", word); } @@ -2299,6 +2306,16 @@ void readmenu(MYFILE *f, INT32 num) } menudef->quitroutine = routine; } + else if (fastcmp(word, "KEYHANDLER")) + { + menufunc_f *routine = get_menuroutine(word2); + if (!routine) + { + WARN("unknown key handler '%s'", word2); + continue; + } + menudef->keyhandler = routine; + } else WARN("unknown word '%s'", word); } diff --git a/src/deh_tables.c b/src/deh_tables.c index dd1d48840..1ac54a351 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -693,15 +693,15 @@ struct menu_routine_s const MENU_ROUTINES[] = { { "REPLAYTIMEATTACK", &MR_ReplayTimeAttack }, { "TIMEATTACKPRESET", &MR_TimeAttackPreset }, { "HANDLESTAFFREPLAY", &MR_HandleStaffReplay }, - { "SETUPMULTIHANDLER", &MR_SetupMultiHandler }, + { "HANDLEMPMAINMENU", &MR_HandleMPMainMenu }, { "HANDLESETUPMULTIPLAYER", &MR_HandleSetupMultiPlayer }, { "QUITMULTIPLAYERMENU", &MR_QuitMultiPlayerMenu }, { "STARTSERVERMENU", &MR_StartServerMenu }, { "STARTSERVER", &MR_StartServer }, { "CONNECTMENUMODCHECKS", &MR_ConnectMenuModChecks }, - { "HANDLECONNECTIP", &MR_HandleConnectIP }, { "CANCELCONNECT", &MR_CancelConnect }, { "SETUPCONTROLSMENU", &MR_SetupControlsMenu }, + { "HANDLECONTROLSMENU", &MR_HandleControlsMenu }, { "HANDLESERVERPAGE", &MR_HandleServerPage }, { "REFRESH", &MR_Refresh }, { "CONNECT", &MR_Connect }, diff --git a/src/m_menu.c b/src/m_menu.c index d5e5b2f62..c27be5c27 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -883,13 +883,70 @@ static void Command_Manual_f(void) itemOn = 0; } +// arbitrary keyboard shortcuts because fuck you +static boolean M_DemoBinds(INT32 ch) +{ + switch (ch) + { + case '\'': // toggle freecam + MR_PlaybackToggleFreecam(0); + break; + + case ']': // ffw / advance frame (depends on if paused or not) + if (paused) + MR_PlaybackAdvance(0); + else + MR_PlaybackFastForward(0); + break; + + case '[': // rewind /backupframe, uses the same function + MR_PlaybackRewind(0); + return false; + + case '\\': // pause + MR_PlaybackPause(0); + break; + + // viewpoints, an annoyance (tm) + case '-': // viewpoint minus + MR_PlaybackSetViews(-1); // yeah lol. + break; + + case '=': // viewpoint plus + MR_PlaybackSetViews(1); // yeah lol. + break; + + // switch viewpoints: + case '1': // viewpoint for p1 (also f12) + // maximum laziness: + if (!demo.freecam) + G_AdjustView(1, 1, true); + return false; + case '2': // viewpoint for p2 + if (!demo.freecam) + G_AdjustView(2, 1, true); + return false; + case '3': // viewpoint for p3 + if (!demo.freecam) + G_AdjustView(3, 1, true); + return false; + case '4': // viewpoint for p4 + if (!demo.freecam) + G_AdjustView(4, 1, true); + return false; + + default: + return false; + } + return true; +} + // // M_Responder // boolean M_Responder(event_t *ev) { INT32 ch = -1; -// INT32 i; static tic_t joywait = 0, mousewait = 0; static INT32 pmousex = 0, pmousey = 0; static INT32 lastx = 0, lasty = 0; @@ -1136,23 +1193,23 @@ boolean M_Responder(event_t *ev) return false; } - routine = currentMenu->menuitems[itemOn].itemaction.routine; - // Handle menuitems which need a specific key handling - if (routine && (currentMenu->menuitems[itemOn].status & IT_TYPE) == IT_KEYHANDLER) + if (currentMenu->keyhandler) { if (shiftdown && ch >= 32 && ch <= 127) ch = shiftxform[ch]; - if (routine(ch)) + if (currentMenu->keyhandler(ch)) return true; } // BP: one of the more big hack i have never made - if (routine && (currentMenu->menuitems[itemOn].status & IT_TYPE) == IT_CVAR) + // G: not so hacky anymore...? + UINT16 itemtype = currentMenu->numitems ? currentMenu->menuitems[itemOn].status & IT_TYPE : 0; + switch (itemtype) { + case IT_CVAR: if ((currentMenu->menuitems[itemOn].status & IT_ACTION) == IT_CV_STRING) { - if (shiftdown && ch >= 32 && ch <= 127) ch = shiftxform[ch]; if (M_ChangeStringCvar(ch)) @@ -1162,11 +1219,21 @@ boolean M_Responder(event_t *ev) } else routine = M_ChangeCvar; + break; + case IT_CALL: + case IT_ARROWS: + routine = currentMenu->menuitems[itemOn].itemaction.routine; + break; + default: + routine = NULL; + break; } if (menustack[0] == MN_PLAYBACK && !con_destlines) { playback_last_menu_interaction_leveltime = leveltime; + M_DemoBinds(ch); + // Flip left/right with up/down for the playback menu, since it's a horizontal icon row. switch (ch) { @@ -1175,55 +1242,6 @@ boolean M_Responder(event_t *ev) case KEY_RIGHTARROW: ch = KEY_DOWNARROW; break; case KEY_DOWNARROW: ch = KEY_LEFTARROW; break; - // arbitrary keyboard shortcuts because fuck you - - case '\'': // toggle freecam - MR_PlaybackToggleFreecam(0); - break; - - case ']': // ffw / advance frame (depends on if paused or not) - if (paused) - MR_PlaybackAdvance(0); - else - MR_PlaybackFastForward(0); - break; - - case '[': // rewind /backupframe, uses the same function - MR_PlaybackRewind(0); - break; - - case '\\': // pause - MR_PlaybackPause(0); - break; - - // viewpoints, an annoyance (tm) - case '-': // viewpoint minus - MR_PlaybackSetViews(-1); // yeah lol. - break; - - case '=': // viewpoint plus - MR_PlaybackSetViews(1); // yeah lol. - break; - - // switch viewpoints: - case '1': // viewpoint for p1 (also f12) - // maximum laziness: - if (!demo.freecam) - G_AdjustView(1, 1, true); - break; - case '2': // viewpoint for p2 - if (!demo.freecam) - G_AdjustView(2, 1, true); - break; - case '3': // viewpoint for p3 - if (!demo.freecam) - G_AdjustView(3, 1, true); - break; - case '4': // viewpoint for p4 - if (!demo.freecam) - G_AdjustView(4, 1, true); - break; - default: break; } } @@ -1234,6 +1252,9 @@ boolean M_Responder(event_t *ev) switch (ch) { case KEY_DOWNARROW: + if (!currentMenu->numitems) + return true; + do if (++itemOn >= currentMenu->numitems) itemOn = 0; while (oldItemOn != itemOn && !M_ItemSelectable(¤tMenu->menuitems[itemOn])); @@ -1242,6 +1263,9 @@ boolean M_Responder(event_t *ev) return true; case KEY_UPARROW: + if (!currentMenu->numitems) + return true; + do if (--itemOn < 0) itemOn = currentMenu->numitems - 1; while (oldItemOn != itemOn && !M_ItemSelectable(¤tMenu->menuitems[itemOn])); @@ -1250,8 +1274,7 @@ boolean M_Responder(event_t *ev) return true; case KEY_LEFTARROW: - if (routine && ((currentMenu->menuitems[itemOn].status & IT_TYPE) == IT_ARROWS - || (currentMenu->menuitems[itemOn].status & IT_TYPE) == IT_CVAR)) + if (itemtype == IT_ARROWS || itemtype == IT_CVAR) { if (menustack[0] != MN_OP_SOUND || itemOn > 3) S_StartSound(NULL, sfx_menu1); @@ -1260,8 +1283,7 @@ boolean M_Responder(event_t *ev) return true; case KEY_RIGHTARROW: - if (routine && ((currentMenu->menuitems[itemOn].status & IT_TYPE) == IT_ARROWS - || (currentMenu->menuitems[itemOn].status & IT_TYPE) == IT_CVAR)) + if (itemtype == IT_ARROWS || itemtype == IT_CVAR) { if (menustack[0] != MN_OP_SOUND || itemOn > 3) S_StartSound(NULL, sfx_menu1); @@ -1281,28 +1303,28 @@ boolean M_Responder(event_t *ev) playback_enterheld = 3; } - if (routine) + switch (itemtype) { + case IT_CVAR: + case IT_ARROWS: S_StartSound(NULL, sfx_menu1); - switch (currentMenu->menuitems[itemOn].status & IT_TYPE) - { - case IT_CVAR: - case IT_ARROWS: - routine(1); // right arrow - break; - case IT_CALL: - routine(currentMenu->menuitems[itemOn].argument); - break; - case IT_SUBMENU: - currentMenu->lastOn = itemOn; - M_EnterMenu(currentMenu->menuitems[itemOn].itemaction.submenu, true, currentMenu->menuitems[itemOn].argument); - break; - } + routine(1); // right arrow + break; + case IT_CALL: + S_StartSound(NULL, sfx_menu1); + routine(currentMenu->menuitems[itemOn].argument); + break; + case IT_SUBMENU: + S_StartSound(NULL, sfx_menu1); + currentMenu->lastOn = itemOn; + M_EnterMenu(currentMenu->menuitems[itemOn].itemaction.submenu, true, currentMenu->menuitems[itemOn].argument); + break; + default: + break; } return true; case KEY_ESCAPE: - //case KEY_JOY1 + 2: noFurtherInput = true; currentMenu->lastOn = itemOn; @@ -1318,16 +1340,7 @@ boolean M_Responder(event_t *ev) return true; case KEY_BACKSPACE: - if ((currentMenu->menuitems[itemOn].status) == (IT_STRING2|IT_CALL)) - { - // detach any keys associated with the game control - G_ClearControlKeys(setupcontrols, currentMenu->menuitems[itemOn].argument); - S_StartSound(NULL, sfx_shldls); - return true; - } - - if (routine && ((currentMenu->menuitems[itemOn].status & IT_TYPE) == IT_ARROWS - || (currentMenu->menuitems[itemOn].status & IT_TYPE) == IT_CVAR)) + if (itemtype == IT_CVAR) { consvar_t *cv = currentMenu->menuitems[itemOn].itemaction.cvar; @@ -1343,21 +1356,17 @@ boolean M_Responder(event_t *ev) return true; } - return false; + return true; default: CON_Responder(ev); - break; + return true; } - - return true; } // special responder for demos boolean M_DemoResponder(event_t *ev) { - - INT32 ch = -1; // cur event data boolean eatinput = false; // :omnom: //should be accounted for beforehand but just to be safe... @@ -1372,69 +1381,8 @@ boolean M_DemoResponder(event_t *ev) } else if (ev->type == ev_keydown && !con_destlines) // not while the console is on please { - ch = ev->data1; // since this is ONLY for demos, there isn't MUCH for us to do. - // mirrored from m_responder - - switch (ch) - { - // arbitrary keyboard shortcuts because fuck you - - case '\'': // toggle freecam - MR_PlaybackToggleFreecam(0); - eatinput = true; - break; - - case ']': // ffw / advance frame (depends on if paused or not) - if (paused) - MR_PlaybackAdvance(0); - else - MR_PlaybackFastForward(0); - eatinput = true; - break; - - case '[': // rewind /backupframe, uses the same function - MR_PlaybackRewind(0); - break; - - case '\\': // pause - MR_PlaybackPause(0); - eatinput = true; - break; - - // viewpoints, an annoyance (tm) - case '-': // viewpoint minus - MR_PlaybackSetViews(-1); // yeah lol. - eatinput = true; - break; - - case '=': // viewpoint plus - MR_PlaybackSetViews(1); // yeah lol. - eatinput = true; - break; - - // switch viewpoints: - case '1': // viewpoint for p1 (also f12) - // maximum laziness: - if (!demo.freecam) - G_AdjustView(1, 1, true); - break; - case '2': // viewpoint for p2 - if (!demo.freecam) - G_AdjustView(2, 1, true); - break; - case '3': // viewpoint for p3 - if (!demo.freecam) - G_AdjustView(3, 1, true); - break; - case '4': // viewpoint for p4 - if (!demo.freecam) - G_AdjustView(4, 1, true); - break; - - default: break; - } - + eatinput = M_DemoBinds(ev->data1); } return eatinput; } @@ -1624,6 +1572,11 @@ static void M_SetupNextMenu(menutype_t menunum, boolean callexit) currentMenu = menudef; itemOn = currentMenu->lastOn; + hidetitlemap = false; + + if (!currentMenu->numitems) + return; + // in case of... if (itemOn >= currentMenu->numitems) itemOn = currentMenu->numitems - 1; @@ -1641,8 +1594,6 @@ static void M_SetupNextMenu(menutype_t menunum, boolean callexit) } } } - - hidetitlemap = false; } // pop the active menu from the stack @@ -2155,10 +2106,6 @@ void M_DrawGenericMenu(void) } y += STRINGHEIGHT; break; - case IT_STRING2: - V_DrawString(x, y, MENUCAPS, currentMenu->menuitems[i].text); - y += SMALLLINEHEIGHT; - break; case IT_HEADERTEXT: // draws 16 pixels to the left, in yellow text if (currentMenu->menuitems[i].y) y = currentMenu->y+currentMenu->menuitems[i].y; @@ -2240,7 +2187,6 @@ void M_DrawGenericScrollMenu(void) switch (currentMenu->menuitems[i].status & IT_DISPLAY) { case IT_PATCH: - case IT_STRING2: default: // unsupported break; @@ -2430,10 +2376,6 @@ void M_DrawCenteredMenu(void) } y += STRINGHEIGHT; break; - case IT_STRING2: - V_DrawCenteredString(x, y, MENUCAPS, currentMenu->menuitems[i].text); - y += SMALLLINEHEIGHT; - break; } } @@ -3752,7 +3694,6 @@ void M_DrawReplayHut(void) { INT32 x, y, cursory = 0; INT16 i; - INT16 replaylistitem = currentMenu->numitems-2; boolean processed_one_this_frame = false; static UINT16 replayhutmenuy = 0; @@ -3764,57 +3705,21 @@ void M_DrawReplayHut(void) x = currentMenu->x; y = currentMenu->y; - if (itemOn > replaylistitem) - { - itemOn = replaylistitem; - dir_on[menudepthleft] = sizedirmenu-1; - replayScrollTitle = 0; replayScrollDelay = TICRATE; replayScrollDir = 1; - } - else if (itemOn < replaylistitem) - { - dir_on[menudepthleft] = 0; - replayScrollTitle = 0; replayScrollDelay = TICRATE; replayScrollDir = 1; - } + INT32 maxy; + // Scroll menu items if needed + cursory = y + dir_on[menudepthleft]*10; + maxy = y + sizedirmenu*10; - if (itemOn == replaylistitem) - { - INT32 maxy; - // Scroll menu items if needed - cursory = y + currentMenu->menuitems[replaylistitem].y + dir_on[menudepthleft]*10; - maxy = y + currentMenu->menuitems[replaylistitem].y + sizedirmenu*10; + if (cursory > maxy - 20) + cursory = maxy - 20; - if (cursory > maxy - 20) - cursory = maxy - 20; - - if (cursory - replayhutmenuy > SCALEDVIEWHEIGHT-50) - replayhutmenuy += (cursory-SCALEDVIEWHEIGHT-replayhutmenuy + 51)/2; - else if (cursory - replayhutmenuy < 110) - replayhutmenuy += (max(0, cursory-110)-replayhutmenuy - 1)/2; - } - else - replayhutmenuy /= 2; + if (cursory - replayhutmenuy > SCALEDVIEWHEIGHT-50) + replayhutmenuy += (cursory-SCALEDVIEWHEIGHT-replayhutmenuy + 51)/2; + else if (cursory - replayhutmenuy < 110) + replayhutmenuy += (max(0, cursory-110)-replayhutmenuy - 1)/2; y -= replayhutmenuy; - // Draw static menu items - for (i = 0; i < replaylistitem; i++) - { - INT32 localy = y + currentMenu->menuitems[i].y; - - if (localy < 65) - continue; - - if (i == itemOn) - cursory = localy; - - if ((currentMenu->menuitems[i].status & IT_DISPLAY)==IT_STRING) - V_DrawString(x, localy, MENUCAPS|V_SNAPTOTOP|V_SNAPTOLEFT, currentMenu->menuitems[i].text); - else - V_DrawString(x, localy, MENUCAPS|V_SNAPTOTOP|V_SNAPTOLEFT|highlightflags, currentMenu->menuitems[i].text); - } - - y += currentMenu->menuitems[replaylistitem].y; - for (i = 0; i < (INT16)sizedirmenu; i++) { INT32 localy = y+i*10; @@ -3837,7 +3742,7 @@ void M_DrawReplayHut(void) V_DrawScaledPatch(x - 4, localy, V_SNAPTOTOP|V_SNAPTOLEFT, W_CachePatchName(dirmenu[i][DIR_TYPE] == EXT_UP ? "M_RBACK" : "M_RFLDR", PU_CACHE)); } - if (itemOn == replaylistitem && i == (INT16)dir_on[menudepthleft]) + if (i == (INT16)dir_on[menudepthleft]) { cursory = localy; @@ -3871,7 +3776,7 @@ void M_DrawReplayHut(void) } // Draw scrollbar - y = sizedirmenu*10 + currentMenu->menuitems[replaylistitem].y + 30; + y = sizedirmenu*10 + 30; if (y > SCALEDVIEWHEIGHT-80) { V_DrawFill(BASEVIDWIDTH-4, 75, 4, SCALEDVIEWHEIGHT-80, V_SNAPTOTOP|V_SNAPTORIGHT|159); @@ -3881,15 +3786,11 @@ void M_DrawReplayHut(void) // Draw the cursor V_DrawScaledPatch(currentMenu->x - 24, cursory, V_SNAPTOTOP|V_SNAPTOLEFT, W_CachePatchName("M_CURSOR", PU_CACHE)); - V_DrawString(currentMenu->x, cursory, MENUCAPS|V_SNAPTOTOP|V_SNAPTOLEFT|highlightflags, currentMenu->menuitems[itemOn].text); // Now draw some replay info! V_DrawFill(10, 10, 300, 60, V_SNAPTOTOP|159); - if (itemOn == replaylistitem) - { - DrawReplayHutReplayInfo(); - } + DrawReplayHutReplayInfo(); } void M_DrawReplayStartMenu(void) @@ -4616,7 +4517,7 @@ void M_DrawSkyRoom(void) for (i = 0; i < currentMenu->numitems; ++i) { - if (currentMenu->menuitems[i].itemaction.routine == MR_HandleSoundTest) + if (¤tMenu->menuitems[i] == M_CheckMenuItem(MN_OP_SOUND, "SOUNDTEST")) { y = currentMenu->menuitems[i].y; break; @@ -4646,14 +4547,11 @@ void M_DrawSkyRoom(void) INT32 MR_HandleSoundTest(INT32 choice) { + if (!M_IsItemOn(MN_OP_SOUND, "SOUNDTEST")) + return false; + switch (choice) { - case KEY_RIGHTARROW: - CV_AddValue(&cv_soundtest, 1); - break; - case KEY_LEFTARROW: - CV_AddValue(&cv_soundtest, -1); - break; case KEY_ENTER: S_StopSounds(); S_StartSound(NULL, cv_soundtest.value); @@ -5520,7 +5418,7 @@ void M_DrawTimeAttackMenu(void) } } } - else if ((currentMenu->menuitems[i].status & IT_TYPE) == IT_KEYHANDLER && cv_dummystaff.value) // bad hacky assumption: IT_KEYHANDLER is assumed to be staff ghost selector + else if (¤tMenu->menuitems[i] == M_CheckMenuItem(MN_SP_REPLAY, "REPLAYSTAFF") && cv_dummystaff.value) { INT32 strw = V_StringWidth(dummystaffname, V_ALLOWLOWERCASE); V_DrawString(BASEVIDWIDTH - x - strw, y, highlightflags|V_ALLOWLOWERCASE, dummystaffname); @@ -5674,6 +5572,9 @@ INT32 MR_ChooseTimeAttack(INT32 choice) INT32 MR_HandleStaffReplay(INT32 choice) { + if (!M_IsItemOn(MN_SP_REPLAY, "REPLAYSTAFF")) + return false; + lumpnum_t l = W_CheckNumForName(va("%sS%02u",G_BuildMapName(cv_nextmap.value),cv_dummystaff.value)); switch (choice) @@ -6008,6 +5909,9 @@ Fetch_servers_thread (int *id) INT32 MR_HandleServerPage(INT32 choice) { + if (!M_IsItemOn(MN_MP_CONNECT, "PAGE")) + return false; + switch (choice) { case KEY_ENTER: @@ -6637,7 +6541,7 @@ static void Splitplayers_OnChange(void) setupm_pselect = 1; } -INT32 MR_SetupMultiHandler(INT32 choice) +static INT32 MR_SetupMultiHandler(INT32 choice) { switch (choice) { @@ -6695,7 +6599,7 @@ static void M_ConnectIP(INT32 choice) } // Tails 11-19-2002 -INT32 MR_HandleConnectIP(INT32 choice) +static INT32 MR_HandleConnectIP(INT32 choice) { size_t l; @@ -6746,6 +6650,16 @@ INT32 MR_HandleConnectIP(INT32 choice) return true; } +INT32 MR_HandleMPMainMenu(INT32 choice) +{ + if (M_IsItemOn(MN_MP_MAIN, "PLAYERSETUP")) + return MR_SetupMultiHandler(choice); + else if (M_IsItemOn(MN_MP_MAIN, "CONNECTIP")) + return MR_HandleConnectIP(choice); + else + return false; +} + // ======================== // MULTIPLAYER PLAYER SETUP // ======================== @@ -7680,6 +7594,25 @@ INT32 MR_SetupControlsMenu(INT32 arg) return true; } +INT32 MR_HandleControlsMenu(INT32 ch) +{ + if ((currentMenu->menuitems[itemOn].status & IT_TYPE) != IT_CALL + || currentMenu->menuitems[itemOn].itemaction.routine != MR_ChangeControl) + return false; + + switch (ch) + { + case KEY_BACKSPACE: + // detach any keys associated with the game control + G_ClearControlKeys(setupcontrols, currentMenu->menuitems[itemOn].argument); + S_StartSound(NULL, sfx_shldls); + break; + default: + return false; + } + return true; +} + #define controlheight 18 // Draws the Customise Controls menu @@ -7755,7 +7688,8 @@ void M_DrawControl(void) if (i == itemOn) cursory = y; - if (currentMenu->menuitems[i].status == (IT_STRING2|IT_CALL)) + if ((currentMenu->menuitems[i].status & IT_TYPE) == IT_CALL + && currentMenu->menuitems[i].itemaction.routine == MR_ChangeControl) { V_DrawString(x, y, ((i == itemOn) ? highlightflags : 0)|MENUCAPS, currentMenu->menuitems[i].text); diff --git a/src/m_menu.h b/src/m_menu.h index f25ebe201..0b7a4b71d 100644 --- a/src/m_menu.h +++ b/src/m_menu.h @@ -160,7 +160,7 @@ boolean M_CanShowLevelInList(INT32 mapnum, INT32 gt); #define IT_TYPE (1+2+4) #define IT_CALL 1 // call the function #define IT_ARROWS 2 // call function with 0 for left arrow and 1 for right arrow in param -#define IT_KEYHANDLER 4 // call with the key in param +#define IT_DUMMY 4 // selectable, but does nothing #define IT_SUBMENU (1+2) // go to sub menu #define IT_CVAR (1+4) // handle as a cvar #define IT_PAIR (2+4) // no handling, define both sides of text @@ -170,7 +170,6 @@ boolean M_CanShowLevelInList(INT32 mapnum, INT32 gt); #define IT_PATCH 8 // a patch or a string with big font #define IT_STRING 16 // little string (spaced with 10) #define IT_WHITESTRING 32 // little string in white -#define IT_STRING2 (8+16) // a simple string #define IT_HEADERTEXT (8+32) // Non-selectable header option, displays in yellow offset to the left a little // flags specific to each item action type @@ -201,7 +200,7 @@ typedef union { menutype_t submenu; // IT_SUBMENU consvar_t *cvar; // IT_CVAR - menufunc_f *routine; // IT_CALL, IT_KEYHANDLER, IT_ARROWS + menufunc_f *routine; // IT_CALL, IT_ARROWS } itemaction_t; // @@ -235,6 +234,7 @@ struct menu_t INT16 lastOn; // last item user was on in menu menufunc_f *enterroutine; // called before enter a menu menufunc_f *quitroutine; // called before quit a menu + menufunc_f *keyhandler; // called before key press is processed }; extern menu_t menudefs[MAXMENUTYPES]; @@ -264,15 +264,15 @@ INT32 MR_SetGuestReplay(INT32 arg); INT32 MR_TimeAttackPreset(INT32 arg); INT32 MR_ReplayTimeAttack(INT32 arg); INT32 MR_HandleStaffReplay(INT32 choice); -INT32 MR_SetupMultiHandler(INT32 choice); +INT32 MR_HandleMPMainMenu(INT32 choice); INT32 MR_HandleSetupMultiPlayer(INT32 choice); INT32 MR_QuitMultiPlayerMenu(INT32 choice); INT32 MR_StartServerMenu(INT32 choice); INT32 MR_StartServer(INT32 choice); INT32 MR_ConnectMenuModChecks(INT32 choice); -INT32 MR_HandleConnectIP(INT32 choice); INT32 MR_CancelConnect(INT32 choice); INT32 MR_SetupControlsMenu(INT32 arg); +INT32 MR_HandleControlsMenu(INT32 ch); INT32 MR_HandleServerPage(INT32 choice); INT32 MR_Refresh(INT32 choice); INT32 MR_Connect(INT32 arg);