From 7046ea43ffa3c563be8ed5a23df92d283ab74c31 Mon Sep 17 00:00:00 2001 From: kreatordxx <> Date: Fri, 26 Feb 2010 08:42:44 +0000 Subject: [PATCH] Handle all user input in callback for sounds menu, being more judicious about when to restart the music. Also make the jukebox path input a NM_TYPE_INPUT_MENU, allowing the user to abort changes --- CHANGELOG.txt | 4 ++ main/menu.c | 136 ++++++++++++++++++++++++++++++------------------- main/newmenu.c | 21 ++++---- 3 files changed, 98 insertions(+), 63 deletions(-) diff --git a/CHANGELOG.txt b/CHANGELOG.txt index 2b47ea50b..b3dd92a0a 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -1,5 +1,9 @@ D1X-Rebirth Changelog +20100226 +-------- +main/menu.c, main/newmenu.c: Handle all user input in callback for sounds menu, being more judicious about when to restart the music. Also make the jukebox path input a NM_TYPE_INPUT_MENU, allowing the user to abort changes + 20100225 -------- main/game.c, main/gamecntl.c, main/gameseq.c, main/state.c, main/state.h: Put fast save back, using Alt-F1 instead of F6 diff --git a/main/menu.c b/main/menu.c index 63f5f1031..5c7494353 100644 --- a/main/menu.c +++ b/main/menu.c @@ -1079,90 +1079,120 @@ void set_extmusic_volume(int volume); int sound_menuset(newmenu *menu, d_event *event, void *userdata) { newmenu_item *items = newmenu_get_items(menu); + int citem = newmenu_get_citem(menu); + int nitems = newmenu_get_nitems(menu); + int replay = 0; + int rval = 0; switch (event->type) { case EVENT_NEWMENU_CHANGED: - switch (newmenu_get_citem(menu)) + switch (citem) { case 0: - GameCfg.DigiVolume = items[0].value; + GameCfg.DigiVolume = items[citem].value; digi_set_digi_volume( (GameCfg.DigiVolume*32768)/8 ); digi_play_sample_once( SOUND_DROP_BOMB, F1_0 ); break; case 1: - GameCfg.MusicVolume = items[1].value; + GameCfg.MusicVolume = items[citem].value; if (EXT_MUSIC_ON) set_extmusic_volume(GameCfg.MusicVolume); else digi_set_midi_volume( (GameCfg.MusicVolume*128)/8 ); break; + + case 3: + case 4: + GameCfg.SndEnableRedbook = items[4].value; + replay = 1; + break; +#ifdef USE_SDLMIXER + case 5: + GameCfg.JukeboxOn = items[citem].value; + replay = 1; + break; +#endif + + default: + if (citem == nitems - 1) + GameCfg.ReverseStereo = items[citem].value; + else if (citem == nitems - 2) + { + GameCfg.OrigTrackOrder = items[citem].value; + replay = Game_wind != NULL; + } + break; } break; +#ifdef USE_SDLMIXER + case EVENT_NEWMENU_SELECTED: + if (citem == 7) // changed the jukebox path + replay = 1; + rval = 1; // stay in menu + break; +#endif + + case EVENT_WINDOW_CLOSE: + d_free(items); + break; + default: break; } + if (replay) + { + ext_music_stop(); + ext_music_unload(); + ext_music_select_system(GameCfg.JukeboxOn ? EXT_MUSIC_JUKEBOX : EXT_MUSIC_REDBOOK); + if (Game_wind) + songs_play_level_song( Current_level_num ); + else + songs_play_song(SONG_TITLE, 1); + } + userdata = userdata; - return 0; + return rval; } +#ifdef USE_SDLMIXER +#define SOUND_MENU_NITEMS 10 +#else +#define SOUND_MENU_NITEMS 7 +#endif + void do_sound_menu() { + newmenu_item *m; + int nitems = 0; + + if (GameCfg.SndEnableRedbook && GameCfg.JukeboxOn) + GameCfg.JukeboxOn = 0; + + MALLOC(m, newmenu_item, SOUND_MENU_NITEMS); + if (!m) + return; + + m[nitems].type = NM_TYPE_SLIDER; m[nitems].text=TXT_FX_VOLUME; m[nitems].value=GameCfg.DigiVolume; m[nitems].min_value=0; m[nitems++].max_value=8; + m[nitems].type = NM_TYPE_SLIDER; m[nitems].text="music volume"; m[nitems].value=GameCfg.MusicVolume; m[nitems].min_value=0; m[nitems++].max_value=8; + m[nitems].type = NM_TYPE_TEXT; m[nitems++].text=""; + m[nitems].type = NM_TYPE_RADIO; m[nitems].text = "MIDI Music enabled"; m[nitems].value = (!GameCfg.SndEnableRedbook && !GameCfg.JukeboxOn); m[nitems].group = 0; nitems++; + m[nitems].type = NM_TYPE_RADIO; m[nitems].text="CD Music enabled"; m[nitems].value=GameCfg.SndEnableRedbook; m[nitems].group = 0; nitems++; #ifdef USE_SDLMIXER - newmenu_item m[10]; -#else - newmenu_item m[7]; + m[nitems].type = NM_TYPE_RADIO; m[nitems].text="jukebox enabled"; m[nitems].value=GameCfg.JukeboxOn; m[nitems].group = 0; nitems++; + m[nitems].type = NM_TYPE_TEXT; m[nitems++].text="path to music for jukebox:"; + m[nitems].type = NM_TYPE_INPUT_MENU; m[nitems].text = GameCfg.JukeboxPath; m[nitems++].text_len = NM_MAX_TEXT_LEN-1; #endif - int i = 0; - int nitems; - - do { - if (GameCfg.SndEnableRedbook && GameCfg.JukeboxOn) - GameCfg.JukeboxOn = 0; - - nitems = 0; - - m[nitems].type = NM_TYPE_SLIDER; m[nitems].text=TXT_FX_VOLUME; m[nitems].value=GameCfg.DigiVolume; m[nitems].min_value=0; m[nitems++].max_value=8; - m[nitems].type = NM_TYPE_SLIDER; m[nitems].text="music volume"; m[nitems].value=GameCfg.MusicVolume; m[nitems].min_value=0; m[nitems++].max_value=8; - m[nitems].type = NM_TYPE_TEXT; m[nitems++].text=""; - m[nitems].type = NM_TYPE_RADIO; m[nitems].text = "MIDI Music enabled"; m[nitems].value = (!GameCfg.SndEnableRedbook && !GameCfg.JukeboxOn); m[nitems].group = 0; nitems++; - m[nitems].type = NM_TYPE_RADIO; m[nitems].text="CD Music enabled"; m[nitems].value=GameCfg.SndEnableRedbook; m[nitems].group = 0; nitems++; -#ifdef USE_SDLMIXER - m[nitems].type = NM_TYPE_RADIO; m[nitems].text="jukebox enabled"; m[nitems].value=GameCfg.JukeboxOn; m[nitems].group = 0; nitems++; - m[nitems].type = NM_TYPE_TEXT; m[nitems++].text="path to music for jukebox:"; - m[nitems].type = NM_TYPE_INPUT; m[nitems].text = GameCfg.JukeboxPath; m[nitems++].text_len = NM_MAX_TEXT_LEN-1; -#endif - m[nitems].type = NM_TYPE_CHECK; m[nitems].text="Force Mac Descent CD track order"; m[nitems++].value=GameCfg.OrigTrackOrder; - m[nitems].type = NM_TYPE_CHECK; m[nitems].text=TXT_REVERSE_STEREO; m[nitems++].value=GameCfg.ReverseStereo; - - i = newmenu_do1( NULL, "Sound Effects & Music", nitems, m, sound_menuset, NULL, i ); - - GameCfg.ReverseStereo = m[nitems - 1].value; - GameCfg.OrigTrackOrder = m[nitems - 2].value; - if ((GameCfg.SndEnableRedbook != m[4].value) -#ifdef USE_SDLMIXER - || (GameCfg.JukeboxOn != m[5].value) || (GameCfg.JukeboxOn) -#endif - ) - { - GameCfg.SndEnableRedbook = m[4].value; -#ifdef USE_SDLMIXER - GameCfg.JukeboxOn = m[5].value; -#endif - ext_music_stop(); - ext_music_unload(); - ext_music_select_system(GameCfg.JukeboxOn ? EXT_MUSIC_JUKEBOX : EXT_MUSIC_REDBOOK); - if (Function_mode == FMODE_GAME) - songs_play_level_song( Current_level_num ); - else - songs_play_song(SONG_TITLE, 1); - } - - } while( i>-1 ); + m[nitems].type = NM_TYPE_CHECK; m[nitems].text="Force Mac Descent CD track order"; m[nitems++].value=GameCfg.OrigTrackOrder; + m[nitems].type = NM_TYPE_CHECK; m[nitems].text=TXT_REVERSE_STEREO; m[nitems++].value=GameCfg.ReverseStereo; + + Assert(nitems == SOUND_MENU_NITEMS); + + newmenu_do1( NULL, "Sound Effects & Music", nitems, m, sound_menuset, NULL, 0 ); } #define ADD_CHECK(n,txt,v) do { m[n].type=NM_TYPE_CHECK; m[n].text=txt; m[n].value=v;} while (0) diff --git a/main/newmenu.c b/main/newmenu.c index 31a73a4ab..e00b0a4ed 100644 --- a/main/newmenu.c +++ b/main/newmenu.c @@ -729,6 +729,9 @@ int newmenu_key_command(window *wind, d_event *event, newmenu *menu) } } else { + if (item->type==NM_TYPE_INPUT_MENU) + item->group = 0; // go out of editing mode + // Tell callback, allow staying in menu event->type = EVENT_NEWMENU_SELECTED; if (menu->subfunction && (*menu->subfunction)(menu, event, menu->userdata)) @@ -1317,7 +1320,7 @@ int newmenu_do4( char * title, char * subtitle, int nitems, newmenu_item * item, if (!menu) return -1; - memset(menu, 0, sizeof(newmenu)); + memset(menu, 0, sizeof(newmenu)); menu->citem = citem; menu->scroll_offset = 0; menu->last_scroll_check = -1; @@ -1435,23 +1438,21 @@ int newmenu_do4( char * title, char * subtitle, int nitems, newmenu_item * item, item[i].right_offset = w1; } - if ( item[i].type == NM_TYPE_INPUT ) { + if ((item[i].type == NM_TYPE_INPUT) || (item[i].type == NM_TYPE_INPUT_MENU)) + { Assert( strlen(item[i].text) < NM_MAX_TEXT_LEN ); strcpy(item[i].saved_text, item[i].text ); - nothers++; + string_width = item[i].text_len*FSPACX(8)+item[i].text_len; if ( string_width > MAX_TEXT_WIDTH ) string_width = MAX_TEXT_WIDTH; - item[i].value = -1; - } - if ( item[i].type == NM_TYPE_INPUT_MENU ) { - Assert( strlen(item[i].text) < NM_MAX_TEXT_LEN ); - strcpy(item[i].saved_text, item[i].text ); - nmenus++; - string_width = item[i].text_len*FSPACX(8)+item[i].text_len; item[i].value = -1; item[i].group = 0; + if (item[i].type == NM_TYPE_INPUT_MENU) + nmenus++; + else + nothers++; } item[i].w = string_width;