diff --git a/cs-code/menu.qc b/cs-code/menu.qc index 2b72fef00..ac63986af 100644 --- a/cs-code/menu.qc +++ b/cs-code/menu.qc @@ -33,7 +33,7 @@ void (string text, integer key) quit = void () main_menu = { - Menu_Begin (0, 0, ""); + Menu_Begin (0, 0, "main"); Menu_Pic (16, 4, "gfx/qplaque.lmp"); Menu_CenterPic (160, 4, "gfx/ttl_main.lmp"); Menu_Pic (71,32, "gfx/mainmenu.lmp"); diff --git a/include/QF/console.h b/include/QF/console.h index f0f019790..41e3d2451 100644 --- a/include/QF/console.h +++ b/include/QF/console.h @@ -133,5 +133,7 @@ void Menu_Init (void); void Menu_Load (void); void Menu_Draw (void); void Menu_KeyEvent (knum_t key, short unicode, qboolean down); +void Menu_Enter (void); +void Menu_Leave (void); #endif // __console_h diff --git a/libs/console/client.c b/libs/console/client.c index 548741979..cbed1c43c 100644 --- a/libs/console/client.c +++ b/libs/console/client.c @@ -469,12 +469,34 @@ C_KeyEvent (knum_t key, short unicode, qboolean down) if (!down) return; - if (key_dest == key_message) { - if (key == QFK_ESCAPE) { - key_dest = key_game; - game_target = IMT_0; - return; + if (down && (key == QFK_ESCAPE || unicode == '\x1b')) { + switch (key_dest) { + case key_menu: + Menu_Leave (); + return; + case key_message: + key_dest = key_game; + game_target = IMT_0; + return; + case key_console: + if (!con_data.force_commandline) { + Cbuf_AddText ("toggleconsole\n"); + return; + } + case key_game: + Menu_Enter (); + return; + default: + Sys_Error ("Bad key_dest"); } + } + + if (key_dest == key_menu) { + Menu_KeyEvent (key, unicode, down); + return; + } + + if (key_dest == key_message) { if (chat_team) { il = say_team_line; } else { @@ -700,9 +722,9 @@ C_DrawConsole (int lines) } else { if (key_dest == key_game || key_dest == key_message) DrawNotify (); // only draw notify in game - else if (key_dest == key_menu) - Menu_Draw (); } + if (key_dest == key_menu) + Menu_Draw (); } static void diff --git a/libs/console/menu.c b/libs/console/menu.c index c39745941..2d2e03d83 100644 --- a/libs/console/menu.c +++ b/libs/console/menu.c @@ -34,6 +34,7 @@ static const char rcsid[] = #include #include "QF/console.h" +#include "QF/draw.h" #include "QF/hash.h" #include "QF/plugin.h" #include "QF/progs.h" @@ -64,6 +65,7 @@ static hashtab_t *menu_hash; static func_t menu_init; static func_t menu_keyevent; static func_t menu_draw; +static const char *top_menu; static int menu_resolve_globals (void) @@ -138,6 +140,8 @@ bi_Menu_Begin (progs_t *pr) m->text = strdup (text); if (menu) menu_add_item (menu, m); + else + top_menu = m->text; menu = m; Hash_Add (menu_hash, m); } @@ -233,6 +237,7 @@ Menu_Load (void) } Hash_FlushTable (menu_hash); menu = 0; + top_menu = 0; if ((size = COM_FOpenFile (menu_pr_state.progs_name, &file)) != -1) { menu_pr_state.progs = malloc (size + 256 * 1024); @@ -266,8 +271,31 @@ Menu_Load (void) void Menu_Draw (void) { + menu_pic_t *m_pic; + int i; + if (!menu) return; + for (m_pic = menu->pics; m_pic; m_pic = m_pic->next) { + qpic_t *pic = Draw_CachePic (m_pic->name, 1); + if (!pic) + continue; + Draw_Pic (m_pic->x, m_pic->y, pic); + } + for (i = 0; i < menu->num_items; i++) { + if (menu->items[i]->text) { + Draw_String (menu->items[i]->x, menu->items[i]->y, + menu->items[i]->text); + } + } + if (menu->cursor) { + G_INT (&menu_pr_state, OFS_PARM0) = 0; + G_INT (&menu_pr_state, OFS_PARM1) = 0; + PR_ExecuteProgram (&menu_pr_state, menu->cursor); + } + if (menu_draw) { + PR_ExecuteProgram (&menu_pr_state, menu_draw); + } } void @@ -276,3 +304,28 @@ Menu_KeyEvent (knum_t key, short unicode, qboolean down) if (!menu) return; } + +void +Menu_Enter () +{ + if (!top_menu) { + key_dest = key_console; + game_target = IMT_CONSOLE; + return; + } + key_dest = key_menu; + game_target = IMT_CONSOLE; + menu = Hash_Find (menu_hash, top_menu); +} + +void +Menu_Leave () +{ + if (menu) { + menu = menu->parent; + if (!menu) { + key_dest = key_game; + game_target = IMT_0; + } + } +} diff --git a/libs/video/targets/keys.c b/libs/video/targets/keys.c index 52e567bdc..ffdef3ee4 100644 --- a/libs/video/targets/keys.c +++ b/libs/video/targets/keys.c @@ -420,7 +420,9 @@ Key_Game (knum_t key, short unicode) void Key_Console (knum_t key, short unicode) { - if (keydown[key] == 1 && Key_Game (key, unicode)) + // escape is un-bindable + if (keydown[key] == 1 && key != QFK_ESCAPE && unicode != '\x1b' + && Key_Game (key, unicode)) return; Con_KeyEvent (key, unicode, keydown[key]); @@ -727,19 +729,7 @@ Key_Event (knum_t key, short unicode, qboolean down) // handle escape specially, so the user can never unbind it if (unicode == '\x1b' || key == QFK_ESCAPE) { - if (!down || (keydown[key] > 1)) - return; - switch (key_dest) { - case key_message: - Key_Console (key, unicode); - break; - case key_game: - case key_console: - Cbuf_AddText ("toggleconsole\n"); - break; - default: - Sys_Error ("Bad key_dest"); - } + Key_Console (key, unicode); return; } @@ -748,12 +738,11 @@ Key_Event (knum_t key, short unicode, qboolean down) // if not a consolekey, send to the interpreter no matter what mode is switch (key_dest) { - case key_message: - Key_Console (key, unicode); - break; case key_game: Key_Game (key, unicode); break; + case key_message: + case key_menu: case key_console: Key_Console (key, unicode); break;