Make main menu persist to streamline redrawing (later)

This commit is contained in:
kreatordxx 2010-04-03 08:35:56 +00:00
parent 3ba90f69e0
commit 11edfb2aa6
2 changed files with 45 additions and 24 deletions

View file

@ -3,6 +3,7 @@ D1X-Rebirth Changelog
20100403
--------
arch/sdl/mouse.c, main/game.c, main/net_ipx.c, main/net_ipx.h, main/newmenu.c, main/newmenu.h, main/state.c: Make newmenu_do3 and newmenu_dotiny return as soon as the newmenu is created, which will allow the main menu (and others) to persist
main/menu.c: Make main menu persist to streamline redrawing (later)
20100402
--------

View file

@ -114,10 +114,10 @@ enum MENUS
#define ADD_ITEM(t,value,key) do { m[num_options].type=NM_TYPE_MENU; m[num_options].text=t; menu_choice[num_options]=value;num_options++; } while (0)
static window *menus[16];
static window *menus[16] = { NULL };
// Function Prototypes added after LINTING
void do_option(int select);
int do_option(int select);
int do_new_game_menu(void);
int do_load_level_menu(void);
void do_multi_player_menu();
@ -126,14 +126,14 @@ extern void ReorderPrimary();
extern void ReorderSecondary();
// Hide all menus
void hide_menus(void)
int hide_menus(void)
{
window *wind;
int i;
if (menus[0])
return; // there are already hidden menus
return 0; // there are already hidden menus
for (i = 0; (i < 15) && (wind = window_get_front()); i++)
{
menus[i] = wind;
@ -142,6 +142,8 @@ void hide_menus(void)
Assert(window_get_front() == NULL);
menus[i] = NULL;
return 1;
}
// Show all menus, with the front one shown first
@ -153,7 +155,7 @@ void show_menus(void)
for (i = 0; (i < 16) && menus[i]; i++)
if (window_exists(menus[i]))
window_set_visible(menus[i], 1);
menus[0] = NULL;
}
@ -376,6 +378,7 @@ int RegisterPlayer()
int main_menu_handler(newmenu *menu, d_event *event, int *menu_choice )
{
int curtime;
newmenu_item *items = newmenu_get_items(menu);
switch (event->type)
{
@ -384,6 +387,9 @@ int main_menu_handler(newmenu *menu, d_event *event, int *menu_choice )
RegisterPlayer();
else
keyd_time_when_last_pressed = timer_get_fixed_seconds(); // .. 20 seconds from now!
if (Function_mode == FMODE_EXIT)
return -2;
break;
case EVENT_KEY_COMMAND:
@ -398,14 +404,18 @@ int main_menu_handler(newmenu *menu, d_event *event, int *menu_choice )
if (curtime < 0) curtime = 0;
keyd_time_when_last_pressed = curtime; // Reset timer so that disk won't thrash if no demos.
newdemo_start_playback(NULL); // Randomly pick a file
if (Newdemo_state == ND_STATE_PLAYBACK)
{
Function_mode = FMODE_GAME;
return -2;
}
}
break;
case EVENT_NEWMENU_SELECTED:
return do_option(menu_choice[newmenu_get_citem(menu)]);
break;
case EVENT_WINDOW_CLOSE:
d_free(menu_choice);
d_free(items);
break;
default:
break;
}
@ -413,8 +423,6 @@ int main_menu_handler(newmenu *menu, d_event *event, int *menu_choice )
return 0;
}
static int main_menu_choice = 0;
// -----------------------------------------------------------------------------
// Create the main menu.
void create_main_menu(newmenu_item *m, int *menu_choice, int *callers_num_options)
@ -463,21 +471,28 @@ void create_main_menu(newmenu_item *m, int *menu_choice, int *callers_num_option
//returns number of item chosen
int DoMenu()
{
int menu_choice[25];
newmenu_item m[25];
int *menu_choice;
newmenu_item *m;
int num_options = 0;
memset(&menu_choice, 0, sizeof(int)*25);
memset(&m, 0, sizeof(newmenu_item)*25);
MALLOC(menu_choice, int, 25);
if (!menu_choice)
return -1;
MALLOC(m, newmenu_item, 25);
if (!m)
{
d_free(menu_choice);
return -1;
}
memset(menu_choice, 0, sizeof(int)*25);
memset(m, 0, sizeof(newmenu_item)*25);
create_main_menu(m, menu_choice, &num_options); // may have to change, eg, maybe selected pilot and no save games.
if (main_menu_choice < 0 )
main_menu_choice = 0;
main_menu_choice = newmenu_do2( "", NULL, num_options, m, (int (*)(newmenu *, d_event *, void *))main_menu_handler, NULL, main_menu_choice, Menu_pcx_name);
if ( main_menu_choice > -1 ) do_option(menu_choice[main_menu_choice]);
newmenu_do3( "", NULL, num_options, m, (int (*)(newmenu *, d_event *, void *))main_menu_handler, menu_choice, 0, Menu_pcx_name, -1, -1);
return main_menu_choice;
return 0;
}
extern void show_order_form(void); // John didn't want this in inferno.h so I just externed it.
@ -497,7 +512,7 @@ int select_song_callback(listbox *lb, d_event *event, void *userdata)
}
//returns flag, true means quit menu
void do_option ( int select)
int do_option ( int select)
{
switch (select) {
case MENU_NEW_GAME:
@ -520,12 +535,15 @@ void do_option ( int select)
SetPlayerFromCurseg();
keyd_editor_mode = 1;
hide_menus();
editor();
if ( Function_mode == FMODE_GAME ) {
Game_mode = GM_EDITOR;
editor_reset_stuff_on_level();
N_players = 1;
}
else
show_menus();
break;
#endif
case MENU_VIEW_SCORES:
@ -541,7 +559,8 @@ void do_option ( int select)
if (! SafetyCheck()) break;
#endif
Function_mode = FMODE_EXIT;
break;
return 0;
case MENU_NEW_PLAYER:
RegisterPlayer(); //1 == allow escape out of menu
break;
@ -618,6 +637,7 @@ void do_option ( int select)
break;
}
return 1; // stay in main menu unless quitting
}
void delete_player_saved_games(char * name)