From 0c8c99fd13302878d496795b629d8bb205729973 Mon Sep 17 00:00:00 2001 From: kreatordxx <> Date: Sat, 3 Apr 2010 07:24:50 +0000 Subject: [PATCH] Make newmenu_do3 and newmenu_dotiny return as soon as the newmenu is created, which will allow the main menu (and others) to persist --- CHANGELOG.txt | 6 +- arch/sdl/mouse.c | 2 +- main/game.c | 40 ++++++-- main/net_ipx.c | 238 +++++++++++++++++++++++++++-------------------- main/newmenu.c | 110 +++++++++++++--------- main/newmenu.h | 7 +- main/state.c | 2 +- 7 files changed, 248 insertions(+), 157 deletions(-) diff --git a/CHANGELOG.txt b/CHANGELOG.txt index a4ebcfed4..c8dd1aa76 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -1,6 +1,10 @@ D2X-Rebirth Changelog -20100401 +20100403 +-------- +arch/sdl/mouse.c, main/game.c, main/net_ipx.c, 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 + +20100402 -------- arch/include/event.h, arch/sdl/event.c, arch/sdl/key.c, arch/sdl/mouse.c, main/automap.c, main/credits.c, main/escort.c, main/game.c, main/gamecntl.c, main/inferno.c, main/kconfig.c, main/kmatrix.c, main/movie.c, main/net_ipx.c, main/net_udp.c, main/newmenu.c, main/scores.c, main/titles.c: Add a default event handler for screenshots, entering debugger, Redbook repeating etc main/menu.c, main/newmenu.c: Keep demo selector just after playing one, for convenience diff --git a/arch/sdl/mouse.c b/arch/sdl/mouse.c index 410856338..567c861e0 100644 --- a/arch/sdl/mouse.c +++ b/arch/sdl/mouse.c @@ -129,7 +129,7 @@ void mouse_flush() // clears all mice events... //======================================================================== void mouse_get_pos( int *x, int *y, int *z ) { - event_poll(); + //event_poll(); // Have to assume this is called in event_process, because event_poll can cause a window to close (depending on what the user does) *x=Mouse.x; *y=Mouse.y; *z=Mouse.z; diff --git a/main/game.c b/main/game.c index 7dcba0cfb..675543fb3 100644 --- a/main/game.c +++ b/main/game.c @@ -607,7 +607,7 @@ void do_cloak_stuff(void) if (Game_mode & GM_MULTI) multi_send_play_sound(SOUND_CLOAK_OFF, F1_0); maybe_drop_net_powerup(POW_CLOAK); - if ( Newdemo_state == ND_STATE_PLAYBACK ) + if ( Newdemo_state != ND_STATE_PLAYBACK ) multi_send_decloak(); // For demo recording #endif } @@ -884,10 +884,27 @@ extern int Death_sequence_aborted; #define EXT_MUSIC_TEXT "Audio CD" #endif +static int free_help(newmenu *menu, d_event *event, void *userdata) +{ + userdata = userdata; + + if (event->type == EVENT_WINDOW_CLOSE) + { + newmenu_item *items = newmenu_get_items(menu); + d_free(items); + } + + return 0; +} + void show_help() { int nitems = 0; - newmenu_item m[26]; + newmenu_item *m; + + MALLOC(m, newmenu_item, 26); + if (!m) + return; m[nitems].type = NM_TYPE_TEXT; m[nitems++].text = TXT_HELP_ESC; m[nitems].type = NM_TYPE_TEXT; m[nitems++].text = "SHIFT-ESC\t SHOW GAME LOG"; @@ -931,14 +948,18 @@ void show_help() m[nitems].type = NM_TYPE_TEXT; m[nitems++].text = "(Use \x85-# for F#. e.g. \x85-1 for F1)"; #endif - newmenu_dotiny( NULL, TXT_KEYS, nitems, m, NULL, NULL ); + newmenu_dotiny( NULL, TXT_KEYS, nitems, m, free_help, NULL ); } void show_netgame_help() { int nitems = 0; - newmenu_item m[17]; + newmenu_item *m; + MALLOC(m, newmenu_item, 17); + if (!m) + return; + m[nitems].type = NM_TYPE_TEXT; m[nitems++].text = "F1\t THIS SCREEN"; m[nitems].type = NM_TYPE_TEXT; m[nitems++].text = "ALT-0\t DROP FLAG"; m[nitems].type = NM_TYPE_TEXT; m[nitems++].text = "ALT-F4\t SHOW RETICLE NAMES"; @@ -960,14 +981,18 @@ void show_netgame_help() m[nitems].type = NM_TYPE_TEXT; m[nitems++].text = "kick: (*)\t KICK PLAYER (*) FROM GAME (Host-only)"; m[nitems].type = NM_TYPE_TEXT; m[nitems++].text = "KillReactor\t BLOW UP THE MINE (Host-only)"; - newmenu_dotiny( NULL, TXT_KEYS, nitems, m, NULL, NULL ); + newmenu_dotiny( NULL, TXT_KEYS, nitems, m, free_help, NULL ); } void show_newdemo_help() { - newmenu_item m[15]; + newmenu_item *m; int nitems = 0; + MALLOC(m, newmenu_item, 15); + if (!m) + return; + m[nitems].type = NM_TYPE_TEXT; m[nitems++].text = "ESC\t QUIT DEMO PLAYBACK"; m[nitems].type = NM_TYPE_TEXT; m[nitems++].text = "F1\t THIS SCREEN"; m[nitems].type = NM_TYPE_TEXT; m[nitems++].text = TXT_HELP_F2; @@ -985,7 +1010,8 @@ void show_newdemo_help() m[nitems].type = NM_TYPE_TEXT; m[nitems++].text = ""; m[nitems].type = NM_TYPE_TEXT; m[nitems++].text = "(Use \x85-# for F#. e.g. \x85-1 for F1)"; #endif - newmenu_dotiny( NULL, "DEMO PLAYBACK CONTROLS", nitems, m, NULL, NULL ); + + newmenu_dotiny( NULL, "DEMO PLAYBACK CONTROLS", nitems, m, free_help, NULL ); } //temp function until Matt cleans up game sequencing diff --git a/main/net_ipx.c b/main/net_ipx.c index f6ffc4a1e..9e95d4c03 100644 --- a/main/net_ipx.c +++ b/main/net_ipx.c @@ -3694,68 +3694,30 @@ void restart_net_searching(newmenu_item * m) char *ModeLetters[]={"ANRCHY","TEAM","ROBO","COOP","FLAG","HOARD","TMHOARD"}; -int net_ipx_join_poll( newmenu *menu, d_event *event, void *userdata ) +void net_ipx_join_listen(newmenu *menu) { - // Polling loop for Join Game menu newmenu_item *menus = newmenu_get_items(menu); static fix t1 = 0; - int i, osocket,join_status,temp; - int key = 0; - int rval = 0; - - if (event->type == EVENT_KEY_COMMAND) - key = ((d_event_keycommand *)event)->keycode; - else if (event->type != EVENT_IDLE) - return 0; - - userdata = userdata; - - if ( IPX_allow_socket_changes ) { - osocket = IPX_Socket; - - if ( key==KEY_PAGEDOWN ) { IPX_Socket--; rval = 1; } - if ( key==KEY_PAGEUP ) { IPX_Socket++; rval = 1; } - - if (IPX_Socket>99) - IPX_Socket=99; - if (IPX_Socket<-99) - IPX_Socket=-99; - - if ( IPX_Socket+IPX_DEFAULT_SOCKET > 0x8000 ) - IPX_Socket = 0x8000 - IPX_DEFAULT_SOCKET; - - if ( IPX_Socket+IPX_DEFAULT_SOCKET < 0 ) - IPX_Socket = IPX_DEFAULT_SOCKET; - - if (IPX_Socket != osocket ) { - sprintf( menus[0].text, "\t%s %+d (PgUp/PgDn to change)", TXT_CURRENT_IPX_SOCKET, IPX_Socket ); - net_ipx_listen(); - ipxdrv_change_default_socket( IPX_DEFAULT_SOCKET + IPX_Socket ); - restart_net_searching(menus); - net_ipx_send_game_list_request(); - return rval; - } - } + int i,join_status,temp; // send a request for game info every 3 seconds - if (timer_get_fixed_seconds() > t1+F1_0*3) { t1 = timer_get_fixed_seconds(); net_ipx_send_game_list_request(); } - + temp=num_active_ipx_games; - + net_ipx_listen(); - + if (!num_active_ipx_changed) - return rval; - + return; + if (temp!=num_active_ipx_games) digi_play_sample (SOUND_HUD_MESSAGE,F1_0); - + num_active_ipx_changed = 0; - + // Copy the active games data into the menu options for (i = 0; i < num_active_ipx_games; i++) { @@ -3763,35 +3725,35 @@ int net_ipx_join_poll( newmenu *menu, d_event *event, void *userdata ) int j,x, k,tx,ty,ta,nplayers = 0; char levelname[8],MissName[25],GameName[25],thold[2]; thold[1]=0; - + // These next two loops protect against menu skewing // if missiontitle or gamename contain a tab - + for (x=0,tx=0,k=0,j=0;j<15;j++) { if (Active_ipx_games[i].mission_title[j]=='\t') continue; thold[0]=Active_ipx_games[i].mission_title[j]; gr_get_string_size (thold,&tx,&ty,&ta); - + if ((x+=tx)>=FSPACX(55)) { MissName[k]=MissName[k+1]=MissName[k+2]='.'; k+=3; break; } - + MissName[k++]=Active_ipx_games[i].mission_title[j]; } MissName[k]=0; - + for (x=0,tx=0,k=0,j=0;j<15;j++) { if (Active_ipx_games[i].game_name[j]=='\t') continue; thold[0]=Active_ipx_games[i].game_name[j]; gr_get_string_size (thold,&tx,&ty,&ta); - + if ((x+=tx)>=FSPACX(55)) { GameName[k]=GameName[k+1]=GameName[k+2]='.'; @@ -3801,15 +3763,15 @@ int net_ipx_join_poll( newmenu *menu, d_event *event, void *userdata ) GameName[k++]=Active_ipx_games[i].game_name[j]; } GameName[k]=0; - - + + nplayers=Active_ipx_games[i].numconnected; - + if (Active_ipx_games[i].levelnum < 0) sprintf(levelname, "S%d", -Active_ipx_games[i].levelnum); else sprintf(levelname, "%d", Active_ipx_games[i].levelnum); - + if (game_status == NETSTAT_STARTING) { sprintf (menus[i+2].text,"%d.\t%s \t%s \t %d/%d \t%s \t %s \t%s", @@ -3819,7 +3781,7 @@ int net_ipx_join_poll( newmenu *menu, d_event *event, void *userdata ) else if (game_status == NETSTAT_PLAYING) { join_status=net_ipx_can_join_netgame(&Active_ipx_games[i]); - + if (join_status==1) sprintf (menus[i+2].text,"%d.\t%s \t%s \t %d/%d \t%s \t %s \t%s", i+1,GameName,ModeLetters[Active_ipx_games[i].gamemode],nplayers, @@ -3836,23 +3798,105 @@ int net_ipx_join_poll( newmenu *menu, d_event *event, void *userdata ) sprintf (menus[i+2].text,"%d.\t%s \t%s \t %d/%d \t%s \t %s \t%s", i+1,GameName,ModeLetters[Active_ipx_games[i].gamemode],nplayers, Active_ipx_games[i].max_numplayers,MissName,levelname,"Closed"); - + } else sprintf (menus[i+2].text,"%d.\t%s \t%s \t %d/%d \t%s \t %s \t%s", i+1,GameName,ModeLetters[Active_ipx_games[i].gamemode],nplayers, Active_ipx_games[i].max_numplayers,MissName,levelname,"Between"); - - + + Assert(strlen(menus[i+2].text) < 100); } - + for (i = num_active_ipx_games; i < IPX_MAX_NETGAMES; i++) { sprintf(menus[i+2].text, "%d. ",i+1); } - - return rval; +} + +int net_ipx_do_join_game(int choice); + +int net_ipx_join_poll( newmenu *menu, d_event *event, void *menu_text ) +{ + // Polling loop for Join Game menu + newmenu_item *menus = newmenu_get_items(menu); + int citem = newmenu_get_citem(menu); + int key = 0; + + switch (event->type) + { + case EVENT_KEY_COMMAND: + key = ((d_event_keycommand *)event)->keycode; + + if ( IPX_allow_socket_changes ) { + int osocket; + int rval = 0; + + osocket = IPX_Socket; + + if ( key==KEY_PAGEDOWN ) { IPX_Socket--; rval = 1; } + if ( key==KEY_PAGEUP ) { IPX_Socket++; rval = 1; } + + if (IPX_Socket>99) + IPX_Socket=99; + if (IPX_Socket<-99) + IPX_Socket=-99; + + if ( IPX_Socket+IPX_DEFAULT_SOCKET > 0x8000 ) + IPX_Socket = 0x8000 - IPX_DEFAULT_SOCKET; + + if ( IPX_Socket+IPX_DEFAULT_SOCKET < 0 ) + IPX_Socket = IPX_DEFAULT_SOCKET; + + if (IPX_Socket != osocket ) { + sprintf( menus[0].text, "\t%s %+d (PgUp/PgDn to change)", TXT_CURRENT_IPX_SOCKET, IPX_Socket ); + net_ipx_listen(); + ipxdrv_change_default_socket( IPX_DEFAULT_SOCKET + IPX_Socket ); + restart_net_searching(menus); + net_ipx_send_game_list_request(); + return rval; + } + } + break; + + case EVENT_IDLE: + net_ipx_join_listen(menu); + break; + + case EVENT_NEWMENU_SELECTED: + citem-=2; + + if (citem >=num_active_ipx_games) + { + nm_messagebox(TXT_SORRY, 1, TXT_OK, TXT_INVALID_CHOICE); + return 1; + } + + if (net_ipx_show_game_stats(citem)==0) + return 1; + + // Choice has been made and looks legit + if (net_ipx_do_join_game(citem)==0) + return 1; + + // look ma, we're in a game!!! + break; + + case EVENT_WINDOW_CLOSE: + SurfingNet=0; + d_free(menu_text); + d_free(menu); + + if (!Game_wind) + Network_status = NETSTAT_MENU; // they cancelled + break; + + default: + break; + } + + return 0; } int @@ -4109,16 +4153,25 @@ int net_ipx_do_join_game(int choice); void net_ipx_join_game() { - int choice, i; - char menu_text[IPX_MAX_NETGAMES+2][200]; - - newmenu_item m[IPX_MAX_NETGAMES+2]; + int i; + char *menu_text; + newmenu_item *m; if ( !IPX_active ) { nm_messagebox(NULL, 1, TXT_OK, TXT_IPX_NOT_FOUND); return; } + + MALLOC(m, newmenu_item, ((IPX_MAX_NETGAMES)*2)+1); + if (!m) + return; + MALLOC(menu_text, char, (((IPX_MAX_NETGAMES)*2)+1)*200); + if (!menu_text) + { + d_free(m); + return; + } net_ipx_init(); @@ -4126,13 +4179,13 @@ void net_ipx_join_game() // FIXME: Keep browsing window to go back to //setjmp(LeaveGame); - + Network_send_objects = 0; Network_sending_extras=0; Network_rejoined=0; - + Network_status = NETSTAT_BROWSING; // We are looking at a game menu - + net_ipx_flush(); net_ipx_listen(); // Throw out old info @@ -4142,54 +4195,29 @@ void net_ipx_join_game() memset(m, 0, sizeof(newmenu_item)*IPX_MAX_NETGAMES); memset(Active_ipx_games, 0, sizeof(netgame_info)*IPX_MAX_NETGAMES); - + gr_set_fontcolor(BM_XRGB(15,15,23),-1); - m[0].text = menu_text[0]; + m[0].text = menu_text; m[0].type = NM_TYPE_TEXT; if (IPX_allow_socket_changes) sprintf( m[0].text, "\tCurrent IPX Socket is default %+d (PgUp/PgDn to change)", IPX_Socket ); else strcpy( m[0].text, "" ); //sprintf( m[0].text, "" ); - m[1].text=menu_text[1]; + m[1].text=menu_text + 200*1; m[1].type=NM_TYPE_TEXT; sprintf (m[1].text,"\tGAME \tMODE \t#PLYRS \tMISSION \tLEV \tSTATUS"); for (i = 0; i < IPX_MAX_NETGAMES; i++) { - m[i+2].text = menu_text[i+2]; + m[i+2].text = menu_text + 200*(i+2); m[i+2].type = NM_TYPE_MENU; sprintf(m[i+2].text, "%d. ", i+1); } num_active_ipx_changed = 1; -remenu: SurfingNet=1; - nm_draw_background1(Menu_pcx_name); //load this here so if we abort after loading level, we restore the palette - gr_palette_load(gr_palette); - choice=newmenu_dotiny("NETGAMES", NULL,IPX_MAX_NETGAMES+2, m, net_ipx_join_poll, NULL); - SurfingNet=0; - - if (choice==-1) { - Network_status = NETSTAT_MENU; - return; // they cancelled - } - choice-=2; - - if (choice >=num_active_ipx_games) - { - nm_messagebox(TXT_SORRY, 1, TXT_OK, TXT_INVALID_CHOICE); - goto remenu; - } - - if (net_ipx_show_game_stats(choice)==0) - goto remenu; - - // Choice has been made and looks legit - if (net_ipx_do_join_game(choice)==0) - goto remenu; - - return; // look ma, we're in a game!!! + newmenu_dotiny("NETGAMES", NULL,IPX_MAX_NETGAMES+2, m, net_ipx_join_poll, menu_text); } fix StartWaitAllTime=0; @@ -5503,6 +5531,8 @@ void net_ipx_request_player_names (int n) void net_ipx_process_names_return (ubyte *data) { + newmenu *menu; + window *wind; newmenu_item m[15]; char mtext[15][50],temp[50]; int i,t,l,gnum,num=0,count=5,numplayers; @@ -5571,7 +5601,11 @@ void net_ipx_process_names_return (ubyte *data) sprintf (mtext[num++],"Packets Per Second: %d",data[count+2]); } - newmenu_dotiny( NULL, NULL, num, m, NULL, NULL); + menu = newmenu_dotiny( NULL, NULL, num, m, NULL, NULL); + + wind = newmenu_get_window(menu); + while (window_exists(wind)) + event_process(); } char NameReturning=1; diff --git a/main/newmenu.c b/main/newmenu.c index cd050038c..9e093ecf5 100644 --- a/main/newmenu.c +++ b/main/newmenu.c @@ -73,6 +73,7 @@ COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED. struct newmenu { + window *wind; int x,y,w,h; char *title; char *subtitle; @@ -87,7 +88,7 @@ struct newmenu int is_scroll_box; // Is this a scrolling box? Set to false at init int max_on_menu; int mouse_state, dblclick_flag; - int done; + int leave; // Leave newmenu_doX function void *userdata; // For whatever - like with window system }; @@ -98,7 +99,7 @@ ubyte SurfingNet=0; static int draw_copyright=0; extern ubyte Version_major,Version_minor; -int newmenu_do4( char * title, char * subtitle, int nitems, newmenu_item * item, int (*subfunction)(newmenu *menu, d_event *event, void *userdata), void *userdata, int citem, char * filename, int width, int height, int TinyMode ); +newmenu *newmenu_do4( char * title, char * subtitle, int nitems, newmenu_item * item, int (*subfunction)(newmenu *menu, d_event *event, void *userdata), void *userdata, int citem, char * filename, int width, int height, int TinyMode ); void newmenu_close() { if (nm_background.bm_data) @@ -512,10 +513,10 @@ void strip_end_whitespace( char * text ) int newmenu_do( char * title, char * subtitle, int nitems, newmenu_item * item, int (*subfunction)(newmenu *menu, d_event *event, void *userdata), void *userdata ) { - return newmenu_do3( title, subtitle, nitems, item, subfunction, userdata, 0, NULL, -1, -1 ); + return newmenu_do2( title, subtitle, nitems, item, subfunction, userdata, 0, NULL ); } -int newmenu_dotiny( char * title, char * subtitle, int nitems, newmenu_item * item, int (*subfunction)(newmenu *menu, d_event *event, void *userdata), void *userdata ) +newmenu *newmenu_dotiny( char * title, char * subtitle, int nitems, newmenu_item * item, int (*subfunction)(newmenu *menu, d_event *event, void *userdata), void *userdata ) { return newmenu_do4( title, subtitle, nitems, item, subfunction, userdata, 0, NULL, -1, -1, 1 ); } @@ -523,21 +524,44 @@ int newmenu_dotiny( char * title, char * subtitle, int nitems, newmenu_item * it int newmenu_do1( char * title, char * subtitle, int nitems, newmenu_item * item, int (*subfunction)(newmenu *menu, d_event *event, void *userdata), void *userdata, int citem ) { - return newmenu_do3( title, subtitle, nitems, item, subfunction, userdata, citem, NULL, -1, -1 ); + return newmenu_do2( title, subtitle, nitems, item, subfunction, userdata, citem, NULL ); } int newmenu_do2( char * title, char * subtitle, int nitems, newmenu_item * item, int (*subfunction)(newmenu *menu, d_event *event, void *userdata), void *userdata, int citem, char * filename ) { - return newmenu_do3( title, subtitle, nitems, item, subfunction, userdata, citem, filename, -1, -1 ); + newmenu *menu; + int rval = -1; + + menu = newmenu_do3( title, subtitle, nitems, item, subfunction, userdata, citem, filename, -1, -1 ); + + if (!menu) + return -1; + menu->leave = 0; // no leaving this function until we're finished + + // newmenu_do2 and simpler get their own event loop + // This is so the caller doesn't have to provide a callback that responds to EVENT_NEWMENU_SELECTED + while (window_exists(menu->wind)) + { + event_process(); + + if (menu->leave) + { + rval = menu->citem; + if (!window_close(menu->wind)) + menu->leave = 0; // user aborted close + } + } + + return rval; } -int newmenu_do3( char * title, char * subtitle, int nitems, newmenu_item * item, int (*subfunction)(newmenu *menu, d_event *event, void *userdata), void *userdata, int citem, char * filename, int width, int height ) +newmenu *newmenu_do3( char * title, char * subtitle, int nitems, newmenu_item * item, int (*subfunction)(newmenu *menu, d_event *event, void *userdata), void *userdata, int citem, char * filename, int width, int height ) { set_screen_mode(SCREEN_MENU);//hafta set the screen mode before calling or fonts might get changed/freed up if screen res changes return newmenu_do4( title, subtitle, nitems, item, subfunction, userdata, citem, filename, width, height, 0 ); } -int newmenu_do_fixedfont( char * title, char * subtitle, int nitems, newmenu_item * item, int (*subfunction)(newmenu *menu, d_event *event, void *userdata), void *userdata, int citem, char * filename, int width, int height){ +newmenu *newmenu_do_fixedfont( char * title, char * subtitle, int nitems, newmenu_item * item, int (*subfunction)(newmenu *menu, d_event *event, void *userdata), void *userdata, int citem, char * filename, int width, int height){ set_screen_mode(SCREEN_MENU);//hafta set the screen mode before calling or fonts might get changed/freed up if screen res changes return newmenu_do4( title, subtitle, nitems, item, subfunction, userdata, citem, filename, width, height, 0); } @@ -562,6 +586,24 @@ int newmenu_get_citem(newmenu *menu) return menu->citem; } +window *newmenu_get_window(newmenu *menu) +{ + return menu->wind; +} + +// The 'softer' version of window_close, +// this leaves citem alone +int newmenu_close_window(newmenu *menu) +{ + if (!menu->leave) + { + menu->leave = 1; + return 1; + } + + return window_close(newmenu_get_window(menu)); +} + int newmenu_mouse(window *wind, d_event *event, newmenu *menu) { int old_choice, i; @@ -620,7 +662,7 @@ int newmenu_mouse(window *wind, d_event *event, newmenu *menu) if (menu->mouse_state && menu->all_text) { - menu->done = 1; + newmenu_close_window(menu); gr_set_current_canvas(save_canvas); return 1; } @@ -752,7 +794,7 @@ int newmenu_mouse(window *wind, d_event *event, newmenu *menu) if (menu->subfunction && (*menu->subfunction)(menu, event, menu->userdata)) return 1; - menu->done = 1; + newmenu_close_window(menu); gr_set_current_canvas(save_canvas); return 1; } @@ -765,7 +807,7 @@ int newmenu_mouse(window *wind, d_event *event, newmenu *menu) if (menu->subfunction && (*menu->subfunction)(menu, event, menu->userdata)) return 1; - menu->done = 1; + newmenu_close_window(menu); gr_set_current_canvas(save_canvas); return 1; } @@ -981,7 +1023,7 @@ int newmenu_key_command(window *wind, d_event *event, newmenu *menu) if (menu->subfunction && (*menu->subfunction)(menu, event, menu->userdata)) return 1; - menu->done = 1; + newmenu_close_window(menu); return 1; } break; @@ -992,8 +1034,8 @@ int newmenu_key_command(window *wind, d_event *event, newmenu *menu) strcpy(item->text, item->saved_text ); item->value = -1; } else { - menu->done = 1; menu->citem = -1; + newmenu_close_window(menu); return 1; } break; @@ -1243,7 +1285,7 @@ int newmenu_handler(window *wind, d_event *event, newmenu *menu) if (rval < -1) { menu->citem = rval; - menu->done = 1; + newmenu_close_window(menu); } return 1; // event handled @@ -1285,11 +1327,11 @@ int newmenu_handler(window *wind, d_event *event, newmenu *menu) break; case EVENT_WINDOW_CLOSE: - if (!menu->done) + if (!menu->leave) { menu->citem = -1; - menu->done = 1; - return 1; // cancel close and do it in newmenu_do4 instead + menu->leave = 1; + return 1; // cancel close and do it in newmenu_do2 instead } d_free(menu); @@ -1302,7 +1344,7 @@ int newmenu_handler(window *wind, d_event *event, newmenu *menu) return 0; } -int newmenu_do4( char * title, char * subtitle, int nitems, newmenu_item * item, int (*subfunction)(newmenu *menu, d_event *event, void *userdata), void *userdata, int citem, char * filename, int width, int height, int TinyMode ) +newmenu *newmenu_do4( char * title, char * subtitle, int nitems, newmenu_item * item, int (*subfunction)(newmenu *menu, d_event *event, void *userdata), void *userdata, int citem, char * filename, int width, int height, int TinyMode ) { window *wind = NULL; newmenu *menu; @@ -1311,13 +1353,11 @@ int newmenu_do4( char * title, char * subtitle, int nitems, newmenu_item * item, grs_font * save_font; int string_width, string_height, average_width; grs_canvas *menu_canvas, *save_canvas; - int rval = -1; - int done = 0; MALLOC(menu, newmenu, 1); if (!menu) - return -1; + return NULL; memset(menu, 0, sizeof(newmenu)); menu->citem = citem; @@ -1334,7 +1374,7 @@ int newmenu_do4( char * title, char * subtitle, int nitems, newmenu_item * item, menu->items = item; menu->filename = filename; menu->tiny_mode = TinyMode; - menu->done = 0; + menu->leave = 1; // Default to leaving newmenu_doX function menu->userdata = userdata; newmenu_close(); @@ -1342,7 +1382,7 @@ int newmenu_do4( char * title, char * subtitle, int nitems, newmenu_item * item, if (nitems < 1 ) { d_free(menu); - return -1; + return NULL; } menu->max_displayable=nitems; @@ -1525,9 +1565,10 @@ int newmenu_do4( char * title, char * subtitle, int nitems, newmenu_item * item, { d_free(menu); - return -1; + return NULL; } + menu->wind = wind; menu_canvas = window_get_canvas(wind); gr_set_curfont(save_font); gr_set_current_canvas(menu_canvas); @@ -1579,23 +1620,8 @@ int newmenu_do4( char * title, char * subtitle, int nitems, newmenu_item * item, menu->mouse_state = 0; gr_set_current_canvas(save_canvas); - - // All newmenus get their own event loop, for now. - while (!done) - { - event_process(); - - if (menu->done) - { - rval = menu->citem; - if (!window_close(wind)) - menu->done = 0; // user aborted close - else - done = 1; - } - } - - return rval; + + return menu; } @@ -2048,7 +2074,7 @@ listbox *newmenu_listbox1( char * title, int nitems, char * items[], int allow_a } //added on 10/14/98 by Victor Rachels to attempt a fixedwidth font messagebox -int nm_messagebox_fixedfont( char *title, int nchoices, ... ) +newmenu *nm_messagebox_fixedfont( char *title, int nchoices, ... ) { int i; char * format; diff --git a/main/newmenu.h b/main/newmenu.h index 39e4008ec..a989b1527 100644 --- a/main/newmenu.h +++ b/main/newmenu.h @@ -76,10 +76,10 @@ extern int newmenu_do1(char *title, char *subtitle, int nitems, newmenu_item *it extern int newmenu_do2(char *title, char *subtitle, int nitems, newmenu_item *item, int (*subfunction)(newmenu *menu, d_event *event, void *userdata), void *userdata, int citem, char *filename); // Same as above, only you can pass through the width and height -extern int newmenu_do3(char *title, char *subtitle, int nitems, newmenu_item *item, int (*subfunction)(newmenu *menu, d_event *event, void *userdata), void *userdata, int citem, char *filename, int width, int height); +extern newmenu *newmenu_do3(char *title, char *subtitle, int nitems, newmenu_item *item, int (*subfunction)(newmenu *menu, d_event *event, void *userdata), void *userdata, int citem, char *filename, int width, int height); // Tiny menu with GAME_FONT -extern int newmenu_dotiny(char * title, char * subtitle, int nitems, newmenu_item * item, int (*subfunction)(newmenu *menu, d_event *event, void *userdata), void *userdata); +extern newmenu *newmenu_dotiny(char * title, char * subtitle, int nitems, newmenu_item * item, int (*subfunction)(newmenu *menu, d_event *event, void *userdata), void *userdata); // Sample Code: /* @@ -115,6 +115,7 @@ int nm_messagebox1(char *title, int (*subfunction)(newmenu *menu, d_event *event newmenu_item *newmenu_get_items(newmenu *menu); int newmenu_get_nitems(newmenu *menu); int newmenu_get_citem(newmenu *menu); +struct window *newmenu_get_window(newmenu *menu); void nm_draw_background(int x1, int y1, int x2, int y2); void nm_restore_background(int x, int y, int w, int h); @@ -150,7 +151,7 @@ extern listbox *newmenu_listbox(char *title, int nitems, char *items[], int allo extern listbox *newmenu_listbox1(char *title, int nitems, char *items[], int allow_abort_flag, int default_item, int (*listbox_callback)(listbox *lb, d_event *event, void *userdata), void *userdata); //added on 10/14/98 by Victor Rachels to attempt a fixedwidth font messagebox -int nm_messagebox_fixedfont(char *title, int nchoices, ...); +newmenu *nm_messagebox_fixedfont(char *title, int nchoices, ...); //end this section addition //should be called whenever the palette changes diff --git a/main/state.c b/main/state.c index ee6fa4219..ff0ffff9c 100644 --- a/main/state.c +++ b/main/state.c @@ -244,7 +244,7 @@ int state_get_savegame_filename(char * fname, char * dsc, char * caption, int bl if (blind_save) choice = state_default_item + 1; else - choice = newmenu_do3( NULL, caption, NUM_SAVES+1, m, (int (*)(newmenu *, d_event *, void *))state_callback, sc_bmp, state_default_item + 1, NULL, -1, -1 ); + choice = newmenu_do2( NULL, caption, NUM_SAVES+1, m, (int (*)(newmenu *, d_event *, void *))state_callback, sc_bmp, state_default_item + 1, NULL ); for (i=0; i