From 7e925893328722ac6d17816dfff949f4346f0658 Mon Sep 17 00:00:00 2001 From: kreatordxx <> Date: Wed, 20 Jan 2010 11:04:09 +0000 Subject: [PATCH] Fix major issues with last commit - tidy up window callbacks to dodge EVENT_WINDOW_ACTIVATED where it's unnecessary or erroneous to respond to, fix compiling error --- CHANGELOG.txt | 1 + main/automap.c | 89 +++++++----- main/game.c | 163 +++++++++++---------- main/gamecntl.c | 78 +++++----- main/kconfig.c | 129 +++++++++-------- main/newmenu.c | 372 +++++++++++++++++++++++++++--------------------- 6 files changed, 456 insertions(+), 376 deletions(-) diff --git a/CHANGELOG.txt b/CHANGELOG.txt index 4de06674f..fe96c4187 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -3,6 +3,7 @@ D1X-Rebirth Changelog 20100120 -------- arch/include/event.h, arch/sdl/event.c, arch/sdl/window.c, main/automap.c, main/game.c, main/gamecntl.c, main/kconfig.c, main/menu.c, main/net_ipx.c, main/net_udp.c, main/newmenu.c, main/state.c: Add EVENT_WINDOW_ACTIVATED, change EVENT_DRAW to EVENT_WINDOW_DRAW and EVENT_CLOSE to EVENT_WINDOW_CLOSE +main/automap.c, main/game.c, main/gamecntl.c, main/kconfig.c, main/newmenu.c: Fix major issues with last commit - tidy up window callbacks to dodge EVENT_WINDOW_ACTIVATED where it's unnecessary or erroneous to respond to 20100119 -------- diff --git a/main/automap.c b/main/automap.c index e1978a81b..7cc3b7e0c 100644 --- a/main/automap.c +++ b/main/automap.c @@ -351,41 +351,11 @@ extern int set_segment_depths(int start_seg, ubyte *segbuf); #define MAP_BACKGROUND_FILENAME "MAP.PCX" -int automap_handler(window *wind, d_event *event, automap *am) +int automap_idle(window *wind, d_event *event, automap *am) { vms_matrix tempm; int c; - if (event->type == EVENT_WINDOW_DRAW) - { - draw_automap(am); - return 1; - } - else if (event->type == EVENT_WINDOW_CLOSE) - { -#ifdef OGL - gr_free_bitmap_data(&am->automap_background); -#endif - d_free(am->edges); - d_free(am->drawingListBright); - - game_flush_inputs(); - - if (am->pause_game) - { - start_time(); - digi_resume_digi_sounds(); - } - - Screen_mode=-1; set_screen_mode(SCREEN_GAME); - init_cockpit(); - last_drawn_cockpit = -1; - game_flush_inputs(); - d_free(am); - window_set_visible(Game_wind, 1); - return 1; - } - if ( am->leave_mode==0 && Controls.automap_state && (timer_get_fixed_seconds()-am->entry_time)>LEAVE_TIME) am->leave_mode = 1; @@ -444,7 +414,7 @@ int automap_handler(window *wind, d_event *event, automap *am) return 1; } break; - + case KEY_ALTED+KEY_F: // Alt+F shows full map, if cheats enabled if (Cheats_enabled) { @@ -456,9 +426,9 @@ int automap_handler(window *wind, d_event *event, automap *am) } break; #ifndef NDEBUG - case KEY_DEBUGGED+KEY_F: { + case KEY_DEBUGGED+KEY_F: { int i; - + for (i=0; i<=Highest_segment_index; i++ ) Automap_visited[i] = 1; automap_build_edge_list(am); @@ -469,20 +439,20 @@ int automap_handler(window *wind, d_event *event, automap *am) break; #endif - case KEY_F9: + case KEY_F9: if (am->segment_limit > 1) { am->segment_limit--; adjust_segment_limit(am, am->segment_limit); } break; - case KEY_F10: + case KEY_F10: if (am->segment_limit < am->max_segments_away) { am->segment_limit++; adjust_segment_limit(am, am->segment_limit); } break; - case KEY_ALTED+KEY_ENTER: - case KEY_ALTED+KEY_PADENTER: + case KEY_ALTED+KEY_ENTER: + case KEY_ALTED+KEY_PADENTER: gr_toggle_fullscreen(); break; } @@ -537,6 +507,49 @@ int automap_handler(window *wind, d_event *event, automap *am) } am->t1 = am->t2; + return 0; +} + +int automap_handler(window *wind, d_event *event, automap *am) +{ + switch (event->type) + { + case EVENT_IDLE: + return automap_idle(wind, event, am); + break; + + case EVENT_WINDOW_DRAW: + draw_automap(am); + break; + + case EVENT_WINDOW_CLOSE: +#ifdef OGL + gr_free_bitmap_data(&am->automap_background); +#endif + d_free(am->edges); + d_free(am->drawingListBright); + + game_flush_inputs(); + + if (am->pause_game) + { + start_time(); + digi_resume_digi_sounds(); + } + + Screen_mode=-1; set_screen_mode(SCREEN_GAME); + init_cockpit(); + last_drawn_cockpit = -1; + game_flush_inputs(); + d_free(am); + window_set_visible(Game_wind, 1); + break; + + default: + return 0; + break; + } + return 1; } diff --git a/main/game.c b/main/game.c index 285a32ee7..1f6edb23d 100644 --- a/main/game.c +++ b/main/game.c @@ -990,79 +990,101 @@ window *game_setup(void) void game_render_frame(); +window *Game_wind = NULL; + // Event handler for the game int game_handler(window *wind, d_event *event, void *data) { data = data; - if (event->type == EVENT_WINDOW_DRAW) + switch (event->type) { - if (force_cockpit_redraw) { //screen need redrawing? - init_cockpit(); - force_cockpit_redraw=0; - } - game_render_frame(); - - return 1; + case EVENT_IDLE: + // GAME LOOP! + Config_menu_flag = 0; + + calc_frame_time(); + + ReadControls(); // will have its own event(s) eventually + if (window_get_front() != wind) + return 1; + + GameProcessFrame(); + + //see if redbook song needs to be restarted + RBACheckFinishedHook(); // Handle RedBook Audio Repeating. + + if (Config_menu_flag) { + if (!(Game_mode&GM_MULTI)) palette_save(); + do_options_menu(); + if (!(Game_mode&GM_MULTI)) palette_restore(); + } + + if ( (Function_mode != FMODE_GAME) && GameArg.SysAutoDemo && (Newdemo_state != ND_STATE_NORMAL) ) { + int choice, fmode; + fmode = Function_mode; + Function_mode = FMODE_GAME; + choice=nm_messagebox( NULL, 2, TXT_YES, TXT_NO, TXT_ABORT_AUTODEMO ); + Function_mode = fmode; + if (choice==0) { + GameArg.SysAutoDemo = 0; + newdemo_stop_playback(); + Function_mode = FMODE_MENU; + } else { + Function_mode = FMODE_GAME; + } + } + + if ( (Function_mode != FMODE_GAME ) && (Newdemo_state != ND_STATE_PLAYBACK ) && (Function_mode!=FMODE_EDITOR)) + { + int choice, fmode; + fmode = Function_mode; + Function_mode = FMODE_GAME; + choice=nm_messagebox( NULL, 2, TXT_YES, TXT_NO, TXT_ABORT_GAME ); + Function_mode = fmode; + if (choice != 0) + Function_mode = FMODE_GAME; + } + + if (Function_mode != FMODE_GAME) + longjmp(LeaveGame,0); + return 0; + break; + + case EVENT_WINDOW_DRAW: + if (force_cockpit_redraw) { //screen need redrawing? + init_cockpit(); + force_cockpit_redraw=0; + } + game_render_frame(); + break; + + case EVENT_WINDOW_CLOSE: + digi_stop_all(); + + if ( (Newdemo_state == ND_STATE_RECORDING) || (Newdemo_state == ND_STATE_PAUSED) ) + newdemo_stop_recording(); + +#ifdef NETWORK + multi_leave_game(); +#endif + + if ( Newdemo_state == ND_STATE_PLAYBACK ) + newdemo_stop_playback(); + + clear_warn_func(game_show_warning); //don't use this func anymore + game_disable_cheats(); + Game_wind = NULL; + break; + + default: + return 0; + break; } - else if (event->type == EVENT_WINDOW_CLOSE) - // Will have abort dialog here... - return 1; - - // GAME LOOP! - Config_menu_flag = 0; - - calc_frame_time(); - - ReadControls(); // will have its own event(s) eventually - if (window_get_front() != wind) - return 1; - - GameProcessFrame(); - - //see if redbook song needs to be restarted - RBACheckFinishedHook(); // Handle RedBook Audio Repeating. - - if (Config_menu_flag) { - if (!(Game_mode&GM_MULTI)) palette_save(); - do_options_menu(); - if (!(Game_mode&GM_MULTI)) palette_restore(); - } - - if ( (Function_mode != FMODE_GAME) && GameArg.SysAutoDemo && (Newdemo_state != ND_STATE_NORMAL) ) { - int choice, fmode; - fmode = Function_mode; - Function_mode = FMODE_GAME; - choice=nm_messagebox( NULL, 2, TXT_YES, TXT_NO, TXT_ABORT_AUTODEMO ); - Function_mode = fmode; - if (choice==0) { - GameArg.SysAutoDemo = 0; - newdemo_stop_playback(); - Function_mode = FMODE_MENU; - } else { - Function_mode = FMODE_GAME; - } - } - - if ( (Function_mode != FMODE_GAME ) && (Newdemo_state != ND_STATE_PLAYBACK ) && (Function_mode!=FMODE_EDITOR) - ) { - int choice, fmode; - fmode = Function_mode; - Function_mode = FMODE_GAME; - choice=nm_messagebox( NULL, 2, TXT_YES, TXT_NO, TXT_ABORT_GAME ); - Function_mode = fmode; - if (choice != 0) - Function_mode = FMODE_GAME; - } - - if (Function_mode != FMODE_GAME) - longjmp(LeaveGame,0); return 1; } -window *Game_wind = NULL; - // ------------------------------------------------------------------------------------ //this function is the game. called when game mode selected. runs until //editor mode or exit selected @@ -1072,24 +1094,9 @@ void game() if ( setjmp(LeaveGame)==0 ) { - while (1) + while (Game_wind) event_process(); } - - digi_stop_all(); - - if ( (Newdemo_state == ND_STATE_RECORDING) || (Newdemo_state == ND_STATE_PAUSED) ) - newdemo_stop_recording(); - -#ifdef NETWORK - multi_leave_game(); -#endif - - if ( Newdemo_state == ND_STATE_PLAYBACK ) - newdemo_stop_playback(); - - clear_warn_func(game_show_warning); //don't use this func anymore - game_disable_cheats(); window_close(Game_wind); } diff --git a/main/gamecntl.c b/main/gamecntl.c index 9d6336859..ae8e3e03a 100644 --- a/main/gamecntl.c +++ b/main/gamecntl.c @@ -228,50 +228,56 @@ int pause_handler(window *wind, d_event *event, char *msg) { int key; - if (event->type == EVENT_WINDOW_DRAW) + switch (event->type) { - show_boxed_message(msg, 1); - return 1; - } - else if (event->type == EVENT_WINDOW_CLOSE) - { - game_flush_inputs(); - reset_cockpit(); - start_time(); - if (EXT_MUSIC_ON) - ext_music_resume(); - digi_resume_all(); - d_free(msg); - - return 1; - } - - timer_delay2(50); - - key = key_inkey(); - - switch (key) { - case 0: + case EVENT_IDLE: + timer_delay2(50); + + key = key_inkey(); + + switch (key) { + case 0: + break; + case KEY_ESC: + //Function_mode = FMODE_MENU; // Don't like this, just press escape twice (kreatordxx) + window_close(wind); + break; + case KEY_F1: + show_help(); + break; + case KEY_PAUSE: + window_close(wind); + break; + case KEY_ALTED+KEY_ENTER: + case KEY_ALTED+KEY_PADENTER: + gr_toggle_fullscreen(); + break; + default: + return 0; + break; + } + return 0; break; - case KEY_ESC: - //Function_mode = FMODE_MENU; // Don't like this, just press escape twice (kreatordxx) - window_close(wind); + + case EVENT_WINDOW_DRAW: + show_boxed_message(msg, 1); break; - case KEY_F1: - show_help(); - break; - case KEY_PAUSE: - window_close(wind); - break; - case KEY_ALTED+KEY_ENTER: - case KEY_ALTED+KEY_PADENTER: - gr_toggle_fullscreen(); + + case EVENT_WINDOW_CLOSE: + game_flush_inputs(); + reset_cockpit(); + start_time(); + if (EXT_MUSIC_ON) + ext_music_resume(); + digi_resume_all(); + d_free(msg); break; + default: return 0; break; } - + return 1; } diff --git a/main/kconfig.c b/main/kconfig.c index a3a29827d..297deb041 100644 --- a/main/kconfig.c +++ b/main/kconfig.c @@ -504,7 +504,7 @@ int get_item_height(kc_item *item) void nm_draw_background1(char * filename); void kc_drawquestion( kc_menu *menu, kc_item *item ); -void kconfig_sub_draw_table(kc_menu *menu) +void kconfig_draw(kc_menu *menu) { grs_canvas * save_canvas = grd_curcanv; grs_font * save_font; @@ -642,48 +642,13 @@ void kconfig_start_changing(kc_menu *menu) menu->changing = 1; } -int kconfig_handler(window *wind, d_event *event, kc_menu *menu) +int kconfig_idle(window *wind, d_event *event, kc_menu *menu) { grs_canvas * save_canvas = grd_curcanv; int i,k; #ifdef NEWMENU_MOUSE int mx, my, mz, x1, x2, y1, y2; #endif - - if (event->type == EVENT_WINDOW_DRAW) - { - kconfig_sub_draw_table(menu); - return 1; - } - else if (event->type == EVENT_WINDOW_CLOSE) - { - game_flush_inputs(); - newmenu_hide_cursor(); - if (menu->time_stopped) - start_time(); - d_free(menu); - - // Update save values... - - for (i=0; ichanging) timer_delay(f0_1/10); @@ -722,7 +687,7 @@ int kconfig_handler(window *wind, d_event *event, kc_menu *menu) return 1; } } - + #ifdef NETWORK if ( !menu->time_stopped ) if (multi_menu_poll() == -1) @@ -772,47 +737,47 @@ int kconfig_handler(window *wind, d_event *event, kc_menu *menu) } } break; - case KEY_DELETE: + case KEY_DELETE: menu->items[menu->citem].value=255; break; - case KEY_UP: - case KEY_PAD8: + case KEY_UP: + case KEY_PAD8: #ifdef TABLE_CREATION if (menu->items[menu->citem].u==-1) menu->items[menu->citem].u=find_next_item_up( menu->items,menu->nitems, menu->citem); #endif menu->citem = menu->items[menu->citem].u; break; - case KEY_DOWN: - case KEY_PAD2: + case KEY_DOWN: + case KEY_PAD2: #ifdef TABLE_CREATION if (menu->items[menu->citem].d==-1) menu->items[menu->citem].d=find_next_item_down( menu->items,menu->nitems, menu->citem); #endif menu->citem = menu->items[menu->citem].d; break; - case KEY_LEFT: - case KEY_PAD4: + case KEY_LEFT: + case KEY_PAD4: #ifdef TABLE_CREATION if (menu->items[menu->citem].l==-1) menu->items[menu->citem].l=find_next_item_left( menu->items,menu->nitems, menu->citem); #endif menu->citem = menu->items[menu->citem].l; break; - case KEY_RIGHT: - case KEY_PAD6: + case KEY_RIGHT: + case KEY_PAD6: #ifdef TABLE_CREATION if (menu->items[menu->citem].r==-1) menu->items[menu->citem].r=find_next_item_right( menu->items,menu->nitems, menu->citem); #endif menu->citem = menu->items[menu->citem].r; break; - case KEY_ENTER: - case KEY_PADENTER: + case KEY_ENTER: + case KEY_PADENTER: kconfig_start_changing(menu); break; - case -2: - case KEY_ESC: + case -2: + case KEY_ESC: window_close(wind); break; #ifdef TABLE_CREATION - case KEY_F12: { + case KEY_F12: { FILE * fp; for (i=0; imouse_state && !menu->omouse_state) || (menu->mouse_state && menu->omouse_state) ) { int item_height; @@ -936,13 +901,61 @@ int kconfig_handler(window *wind, d_event *event, kc_menu *menu) menu->changing = 0; gr_set_fontcolor( BM_XRGB(28,28,28), BM_XRGB(0,0,0) ); game_flush_inputs(); - return 1; } } - + gr_set_current_canvas(save_canvas); #endif // NEWMENU_MOUSE + return 0; +} + +int kconfig_handler(window *wind, d_event *event, kc_menu *menu) +{ + int i; + + switch (event->type) + { + case EVENT_IDLE: + return kconfig_idle(wind, event, menu); + break; + + case EVENT_WINDOW_DRAW: + kconfig_draw(menu); + break; + + case EVENT_WINDOW_CLOSE: + game_flush_inputs(); + newmenu_hide_cursor(); + if (menu->time_stopped) + start_time(); + d_free(menu); + + // Update save values... + + for (i=0; icitem; } -int newmenu_handler(window *wind, d_event *event, newmenu *menu) +int newmenu_idle(window *wind, d_event *event, newmenu *menu) { - int old_choice, i, tw, th, k = -1, sx, sy; + int old_choice, i, k = -1; grs_canvas *menu_canvas = window_get_canvas(wind), *save_canvas = grd_curcanv; - int string_width, string_height, average_width; char *Temp,TempVal; #ifdef NEWMENU_MOUSE int mx=0, my=0, mz=0, x1 = 0, x2, y1, y2; #endif int rval = 0; - - if (event->type == EVENT_WINDOW_CLOSE) - { - // Don't allow cancel here - handle item selected events / key events instead - if (menu->subfunction) - (*menu->subfunction)(menu, event, menu->userdata); - - newmenu_hide_cursor(); - game_flush_inputs(); - - if (menu->time_stopped) - start_time(); - - if ( menu->sound_stopped ) - digi_resume_digi_sounds(); - - // d_free(menu); // have to wait until newmenus use a separate event loop - - return 1; // always close - } - if (event->type == EVENT_WINDOW_DRAW) - { - int ty; - - gr_set_current_canvas( NULL ); -#ifdef OGL - nm_draw_background1(menu->filename); -#endif - if (menu->filename == NULL) - nm_draw_background(menu->x-(menu->is_scroll_box?FSPACX(5):0),menu->y,menu->x+menu->w,menu->y+menu->h); - - gr_set_current_canvas( menu_canvas ); - - ty = BORDERY; - - if ( menu->title ) { - gr_set_curfont(HUGE_FONT); - gr_set_fontcolor( BM_XRGB(31,31,31), -1 ); - gr_get_string_size(menu->title,&string_width,&string_height,&average_width ); - tw = string_width; - th = string_height; - gr_printf( 0x8000, ty, menu->title ); - } - - if ( menu->subtitle ) { - gr_set_curfont(MEDIUM3_FONT); - gr_set_fontcolor( BM_XRGB(21,21,21), -1 ); - gr_get_string_size(menu->subtitle,&string_width,&string_height,&average_width ); - tw = string_width; - th = (menu->title?th:0); - gr_printf( 0x8000, ty+th, menu->subtitle ); - } - - if (menu->tiny_mode) - gr_set_curfont(GAME_FONT); - else - gr_set_curfont(MEDIUM1_FONT); - - // Redraw everything... - for (i=menu->scroll_offset; imax_displayable+menu->scroll_offset; i++ ) - { - menu->items[i].y-=(((int)LINE_SPACING)*menu->scroll_offset); - draw_item( &menu->items[i], (i==menu->citem && !menu->all_text),menu->tiny_mode ); - menu->items[i].y+=(((int)LINE_SPACING)*menu->scroll_offset); - - } - - if (menu->is_scroll_box) - { - menu->last_scroll_check=menu->scroll_offset; - gr_set_curfont(MEDIUM2_FONT); - - sy=menu->items[menu->scroll_offset].y-(((int)LINE_SPACING)*menu->scroll_offset); - sx=menu->items[menu->scroll_offset].x-FSPACX(11); - - - if (menu->scroll_offset!=0) - nm_rstring( FSPACX(11), sx, sy, UP_ARROW_MARKER ); - else - nm_rstring( FSPACX(11), sx, sy, " " ); - - sy=menu->items[menu->scroll_offset+menu->max_displayable-1].y-(((int)LINE_SPACING)*menu->scroll_offset); - sx=menu->items[menu->scroll_offset+menu->max_displayable-1].x-FSPACX(11); - - if (menu->scroll_offset+menu->max_displayablenitems) - nm_rstring( FSPACX(11), sx, sy, DOWN_ARROW_MARKER ); - else - nm_rstring( FSPACX(11), sx, sy, " " ); - - } - - // Only allow drawing over the top of the default stuff - if (menu->subfunction) - (*menu->subfunction)(menu, event, menu->userdata); - - gr_set_current_canvas(save_canvas); - - return 1; - } - timer_delay2(50); #ifdef NEWMENU_MOUSE @@ -689,7 +588,7 @@ int newmenu_handler(window *wind, d_event *event, newmenu *menu) } gr_set_current_canvas(menu_canvas); - + if (menu->tiny_mode) gr_set_curfont(GAME_FONT); else @@ -700,10 +599,10 @@ int newmenu_handler(window *wind, d_event *event, newmenu *menu) if (k) { d_event_keycommand key_event; // for now - will be passed through newmenu_handler later - + key_event.type = EVENT_KEY_COMMAND; key_event.keycode = k; - + rval = (*menu->subfunction)(menu, (d_event *)&key_event, menu->userdata); k = key_event.keycode; } @@ -880,7 +779,7 @@ int newmenu_handler(window *wind, d_event *event, newmenu *menu) event->type = EVENT_NEWMENU_SELECTED; if (menu->subfunction && (*menu->subfunction)(menu, event, menu->userdata)) return 1; - + menu->done = 1; gr_set_current_canvas(save_canvas); return 1; @@ -1239,6 +1138,127 @@ int newmenu_handler(window *wind, d_event *event, newmenu *menu) gr_set_current_canvas(save_canvas); + return 0; +} + +int newmenu_draw(window *wind, d_event *event, newmenu *menu) +{ + grs_canvas *menu_canvas = window_get_canvas(wind), *save_canvas = grd_curcanv; + int tw, th, ty, sx, sy; + int i; + int string_width, string_height, average_width; + + gr_set_current_canvas( NULL ); +#ifdef OGL + nm_draw_background1(menu->filename); +#endif + if (menu->filename == NULL) + nm_draw_background(menu->x-(menu->is_scroll_box?FSPACX(5):0),menu->y,menu->x+menu->w,menu->y+menu->h); + + gr_set_current_canvas( menu_canvas ); + + ty = BORDERY; + + if ( menu->title ) { + gr_set_curfont(HUGE_FONT); + gr_set_fontcolor( BM_XRGB(31,31,31), -1 ); + gr_get_string_size(menu->title,&string_width,&string_height,&average_width ); + tw = string_width; + th = string_height; + gr_printf( 0x8000, ty, menu->title ); + } + + if ( menu->subtitle ) { + gr_set_curfont(MEDIUM3_FONT); + gr_set_fontcolor( BM_XRGB(21,21,21), -1 ); + gr_get_string_size(menu->subtitle,&string_width,&string_height,&average_width ); + tw = string_width; + th = (menu->title?th:0); + gr_printf( 0x8000, ty+th, menu->subtitle ); + } + + if (menu->tiny_mode) + gr_set_curfont(GAME_FONT); + else + gr_set_curfont(MEDIUM1_FONT); + + // Redraw everything... + for (i=menu->scroll_offset; imax_displayable+menu->scroll_offset; i++ ) + { + menu->items[i].y-=(((int)LINE_SPACING)*menu->scroll_offset); + draw_item( &menu->items[i], (i==menu->citem && !menu->all_text),menu->tiny_mode ); + menu->items[i].y+=(((int)LINE_SPACING)*menu->scroll_offset); + + } + + if (menu->is_scroll_box) + { + menu->last_scroll_check=menu->scroll_offset; + gr_set_curfont(MEDIUM2_FONT); + + sy=menu->items[menu->scroll_offset].y-(((int)LINE_SPACING)*menu->scroll_offset); + sx=menu->items[menu->scroll_offset].x-FSPACX(11); + + + if (menu->scroll_offset!=0) + nm_rstring( FSPACX(11), sx, sy, UP_ARROW_MARKER ); + else + nm_rstring( FSPACX(11), sx, sy, " " ); + + sy=menu->items[menu->scroll_offset+menu->max_displayable-1].y-(((int)LINE_SPACING)*menu->scroll_offset); + sx=menu->items[menu->scroll_offset+menu->max_displayable-1].x-FSPACX(11); + + if (menu->scroll_offset+menu->max_displayablenitems) + nm_rstring( FSPACX(11), sx, sy, DOWN_ARROW_MARKER ); + else + nm_rstring( FSPACX(11), sx, sy, " " ); + + } + + // Only allow drawing over the top of the default stuff + if (menu->subfunction) + (*menu->subfunction)(menu, event, menu->userdata); + + gr_set_current_canvas(save_canvas); + + return 1; +} + +int newmenu_handler(window *wind, d_event *event, newmenu *menu) +{ + switch (event->type) + { + case EVENT_IDLE: + return newmenu_idle(wind, event, menu); + break; + + case EVENT_WINDOW_DRAW: + return newmenu_draw(wind, event, menu); + break; + + case EVENT_WINDOW_CLOSE: + // Don't allow cancel here - handle item selected events / key events instead + if (menu->subfunction) + (*menu->subfunction)(menu, event, menu->userdata); + + newmenu_hide_cursor(); + game_flush_inputs(); + + if (menu->time_stopped) + start_time(); + + if ( menu->sound_stopped ) + digi_resume_digi_sounds(); + + // d_free(menu); // have to wait until newmenus use a separate event loop + break; // always close + + default: + return 0; + break; + } + + return 1; } @@ -1679,7 +1699,7 @@ void listbox_delete_item(listbox *lb, int item) } } -int listbox_handler(window *wind, d_event *event, listbox *lb) +int listbox_idle(window *wind, d_event *event, listbox *lb) { int i; int ocitem, ofirst_item, key; @@ -1688,57 +1708,6 @@ int listbox_handler(window *wind, d_event *event, listbox *lb) #endif int rval = 0; - if (event->type == EVENT_WINDOW_CLOSE) - { - // Don't allow cancel here - handle item selected events / key events instead - if (lb->listbox_callback) - (*lb->listbox_callback)(lb, event, lb->userdata); - - newmenu_hide_cursor(); - return 1; // always close - } - - if (event->type == EVENT_WINDOW_DRAW) - { -#ifdef OGL - nm_draw_background1(NULL); -#endif - nm_draw_background( lb->box_x-BORDERX,lb->box_y-lb->title_height-BORDERY,lb->box_x+lb->box_w+BORDERX,lb->box_y+lb->height+BORDERY ); - gr_set_curfont(MEDIUM3_FONT); - gr_string( 0x8000, lb->box_y - lb->title_height, lb->title ); - - gr_setcolor( BM_XRGB( 0,0,0) ); - for (i=lb->first_item; ifirst_item+LB_ITEMS_ON_SCREEN; i++ ) { - int y = (i-lb->first_item)*LINE_SPACING+lb->box_y; - if ( i >= lb->nitems ) { - gr_setcolor( BM_XRGB(5,5,5)); - gr_rect( lb->box_x + lb->box_w - FSPACX(1), y-FSPACY(1), lb->box_x + lb->box_w, y + LINE_SPACING); - gr_setcolor( BM_XRGB(2,2,2)); - gr_rect( lb->box_x - FSPACX(1), y - FSPACY(1), lb->box_x, y + LINE_SPACING ); - gr_setcolor( BM_XRGB(0,0,0)); - gr_rect( lb->box_x, y - FSPACY(1), lb->box_x + lb->box_w - FSPACX(1), y + LINE_SPACING); - } else { - if ( i == lb->citem ) - gr_set_curfont(MEDIUM2_FONT); - else - gr_set_curfont(MEDIUM1_FONT); - gr_setcolor( BM_XRGB(5,5,5)); - gr_rect( lb->box_x + lb->box_w - FSPACX(1), y-FSPACY(1), lb->box_x + lb->box_w, y + LINE_SPACING); - gr_setcolor( BM_XRGB(2,2,2)); - gr_rect( lb->box_x - FSPACX(1), y - FSPACY(1), lb->box_x, y + LINE_SPACING ); - gr_setcolor( BM_XRGB(0,0,0)); - gr_rect( lb->box_x, y - FSPACY(1), lb->box_x + lb->box_w - FSPACX(1), y + LINE_SPACING); - gr_string( lb->box_x+FSPACX(5), y, lb->item[i] ); - } - } - - // Only allow drawing over the top of the default stuff - if ( lb->listbox_callback ) - (*lb->listbox_callback)(lb, event, lb->userdata); - - return 1; - } - timer_delay2(50); ocitem = lb->citem; ofirst_item = lb->first_item; @@ -1758,10 +1727,10 @@ int listbox_handler(window *wind, d_event *event, listbox *lb) if (key) { d_event_keycommand key_event; // somewhere to put the keycode for now - + key_event.type = EVENT_KEY_COMMAND; key_event.keycode = key; - + rval = (*lb->listbox_callback)(lb, (d_event *)&key_event, lb->userdata); key = key_event.keycode; } @@ -1815,8 +1784,8 @@ int listbox_handler(window *wind, d_event *event, listbox *lb) return 1; } break; - case KEY_ENTER: - case KEY_PADENTER: + case KEY_ENTER: + case KEY_PADENTER: // Tell callback, allow staying in menu event->type = EVENT_NEWMENU_SELECTED; if (lb->listbox_callback && (*lb->listbox_callback)(lb, event, lb->userdata)) @@ -1826,8 +1795,8 @@ int listbox_handler(window *wind, d_event *event, listbox *lb) return 1; break; - case KEY_ALTED+KEY_ENTER: - case KEY_ALTED+KEY_PADENTER: + case KEY_ALTED+KEY_ENTER: + case KEY_ALTED+KEY_PADENTER: gr_toggle_fullscreen(); break; @@ -1888,7 +1857,7 @@ int listbox_handler(window *wind, d_event *event, listbox *lb) y2 = y1+h; if ( ((mx > x1) && (mx < x2)) && ((my > y1) && (my < y2)) ) { lb->citem = i; - + // Tell callback, allow staying in menu event->type = EVENT_NEWMENU_SELECTED; if (lb->listbox_callback && (*lb->listbox_callback)(lb, event, lb->userdata)) @@ -1901,7 +1870,78 @@ int listbox_handler(window *wind, d_event *event, listbox *lb) } } #endif + + return 0; +} + +int listbox_draw(window *wind, d_event *event, listbox *lb) +{ + int i; + +#ifdef OGL + nm_draw_background1(NULL); +#endif + nm_draw_background( lb->box_x-BORDERX,lb->box_y-lb->title_height-BORDERY,lb->box_x+lb->box_w+BORDERX,lb->box_y+lb->height+BORDERY ); + gr_set_curfont(MEDIUM3_FONT); + gr_string( 0x8000, lb->box_y - lb->title_height, lb->title ); + gr_setcolor( BM_XRGB( 0,0,0) ); + for (i=lb->first_item; ifirst_item+LB_ITEMS_ON_SCREEN; i++ ) { + int y = (i-lb->first_item)*LINE_SPACING+lb->box_y; + if ( i >= lb->nitems ) { + gr_setcolor( BM_XRGB(5,5,5)); + gr_rect( lb->box_x + lb->box_w - FSPACX(1), y-FSPACY(1), lb->box_x + lb->box_w, y + LINE_SPACING); + gr_setcolor( BM_XRGB(2,2,2)); + gr_rect( lb->box_x - FSPACX(1), y - FSPACY(1), lb->box_x, y + LINE_SPACING ); + gr_setcolor( BM_XRGB(0,0,0)); + gr_rect( lb->box_x, y - FSPACY(1), lb->box_x + lb->box_w - FSPACX(1), y + LINE_SPACING); + } else { + if ( i == lb->citem ) + gr_set_curfont(MEDIUM2_FONT); + else + gr_set_curfont(MEDIUM1_FONT); + gr_setcolor( BM_XRGB(5,5,5)); + gr_rect( lb->box_x + lb->box_w - FSPACX(1), y-FSPACY(1), lb->box_x + lb->box_w, y + LINE_SPACING); + gr_setcolor( BM_XRGB(2,2,2)); + gr_rect( lb->box_x - FSPACX(1), y - FSPACY(1), lb->box_x, y + LINE_SPACING ); + gr_setcolor( BM_XRGB(0,0,0)); + gr_rect( lb->box_x, y - FSPACY(1), lb->box_x + lb->box_w - FSPACX(1), y + LINE_SPACING); + gr_string( lb->box_x+FSPACX(5), y, lb->item[i] ); + } + } + + // Only allow drawing over the top of the default stuff + if ( lb->listbox_callback ) + (*lb->listbox_callback)(lb, event, lb->userdata); + + return 1; +} + +int listbox_handler(window *wind, d_event *event, listbox *lb) +{ + switch (event->type) + { + case EVENT_IDLE: + return listbox_idle(wind, event, lb); + break; + + case EVENT_WINDOW_DRAW: + return listbox_draw(wind, event, lb); + break; + + case EVENT_WINDOW_CLOSE: + // Don't allow cancel here - handle item selected events / key events instead + if (lb->listbox_callback) + (*lb->listbox_callback)(lb, event, lb->userdata); + + newmenu_hide_cursor(); + break; + + default: + return 0; + break; + } + return 1; }