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

This commit is contained in:
kreatordxx 2010-01-20 11:04:09 +00:00
parent 88d1b32914
commit 7e92589332
6 changed files with 456 additions and 376 deletions

View file

@ -3,6 +3,7 @@ D1X-Rebirth Changelog
20100120 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 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 20100119
-------- --------

View file

@ -351,41 +351,11 @@ extern int set_segment_depths(int start_seg, ubyte *segbuf);
#define MAP_BACKGROUND_FILENAME "MAP.PCX" #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; vms_matrix tempm;
int c; 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) if ( am->leave_mode==0 && Controls.automap_state && (timer_get_fixed_seconds()-am->entry_time)>LEAVE_TIME)
am->leave_mode = 1; am->leave_mode = 1;
@ -444,7 +414,7 @@ int automap_handler(window *wind, d_event *event, automap *am)
return 1; return 1;
} }
break; break;
case KEY_ALTED+KEY_F: // Alt+F shows full map, if cheats enabled case KEY_ALTED+KEY_F: // Alt+F shows full map, if cheats enabled
if (Cheats_enabled) if (Cheats_enabled)
{ {
@ -456,9 +426,9 @@ int automap_handler(window *wind, d_event *event, automap *am)
} }
break; break;
#ifndef NDEBUG #ifndef NDEBUG
case KEY_DEBUGGED+KEY_F: { case KEY_DEBUGGED+KEY_F: {
int i; int i;
for (i=0; i<=Highest_segment_index; i++ ) for (i=0; i<=Highest_segment_index; i++ )
Automap_visited[i] = 1; Automap_visited[i] = 1;
automap_build_edge_list(am); automap_build_edge_list(am);
@ -469,20 +439,20 @@ int automap_handler(window *wind, d_event *event, automap *am)
break; break;
#endif #endif
case KEY_F9: case KEY_F9:
if (am->segment_limit > 1) { if (am->segment_limit > 1) {
am->segment_limit--; am->segment_limit--;
adjust_segment_limit(am, am->segment_limit); adjust_segment_limit(am, am->segment_limit);
} }
break; break;
case KEY_F10: case KEY_F10:
if (am->segment_limit < am->max_segments_away) { if (am->segment_limit < am->max_segments_away) {
am->segment_limit++; am->segment_limit++;
adjust_segment_limit(am, am->segment_limit); adjust_segment_limit(am, am->segment_limit);
} }
break; break;
case KEY_ALTED+KEY_ENTER: case KEY_ALTED+KEY_ENTER:
case KEY_ALTED+KEY_PADENTER: case KEY_ALTED+KEY_PADENTER:
gr_toggle_fullscreen(); gr_toggle_fullscreen();
break; break;
} }
@ -537,6 +507,49 @@ int automap_handler(window *wind, d_event *event, automap *am)
} }
am->t1 = am->t2; 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; return 1;
} }

View file

@ -990,79 +990,101 @@ window *game_setup(void)
void game_render_frame(); void game_render_frame();
window *Game_wind = NULL;
// Event handler for the game // Event handler for the game
int game_handler(window *wind, d_event *event, void *data) int game_handler(window *wind, d_event *event, void *data)
{ {
data = data; data = data;
if (event->type == EVENT_WINDOW_DRAW) switch (event->type)
{ {
if (force_cockpit_redraw) { //screen need redrawing? case EVENT_IDLE:
init_cockpit(); // GAME LOOP!
force_cockpit_redraw=0; Config_menu_flag = 0;
}
game_render_frame(); calc_frame_time();
return 1; 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; return 1;
} }
window *Game_wind = NULL;
// ------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------
//this function is the game. called when game mode selected. runs until //this function is the game. called when game mode selected. runs until
//editor mode or exit selected //editor mode or exit selected
@ -1072,24 +1094,9 @@ void game()
if ( setjmp(LeaveGame)==0 ) { if ( setjmp(LeaveGame)==0 ) {
while (1) while (Game_wind)
event_process(); 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); window_close(Game_wind);
} }

View file

@ -228,50 +228,56 @@ int pause_handler(window *wind, d_event *event, char *msg)
{ {
int key; int key;
if (event->type == EVENT_WINDOW_DRAW) switch (event->type)
{ {
show_boxed_message(msg, 1); case EVENT_IDLE:
return 1; timer_delay2(50);
}
else if (event->type == EVENT_WINDOW_CLOSE) key = key_inkey();
{
game_flush_inputs(); switch (key) {
reset_cockpit(); case 0:
start_time(); break;
if (EXT_MUSIC_ON) case KEY_ESC:
ext_music_resume(); //Function_mode = FMODE_MENU; // Don't like this, just press escape twice (kreatordxx)
digi_resume_all(); window_close(wind);
d_free(msg); break;
case KEY_F1:
return 1; show_help();
} break;
case KEY_PAUSE:
timer_delay2(50); window_close(wind);
break;
key = key_inkey(); case KEY_ALTED+KEY_ENTER:
case KEY_ALTED+KEY_PADENTER:
switch (key) { gr_toggle_fullscreen();
case 0: break;
default:
return 0;
break;
}
return 0;
break; break;
case KEY_ESC:
//Function_mode = FMODE_MENU; // Don't like this, just press escape twice (kreatordxx) case EVENT_WINDOW_DRAW:
window_close(wind); show_boxed_message(msg, 1);
break; break;
case KEY_F1:
show_help(); case EVENT_WINDOW_CLOSE:
break; game_flush_inputs();
case KEY_PAUSE: reset_cockpit();
window_close(wind); start_time();
break; if (EXT_MUSIC_ON)
case KEY_ALTED+KEY_ENTER: ext_music_resume();
case KEY_ALTED+KEY_PADENTER: digi_resume_all();
gr_toggle_fullscreen(); d_free(msg);
break; break;
default: default:
return 0; return 0;
break; break;
} }
return 1; return 1;
} }

View file

@ -504,7 +504,7 @@ int get_item_height(kc_item *item)
void nm_draw_background1(char * filename); void nm_draw_background1(char * filename);
void kc_drawquestion( kc_menu *menu, kc_item *item ); 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_canvas * save_canvas = grd_curcanv;
grs_font * save_font; grs_font * save_font;
@ -642,48 +642,13 @@ void kconfig_start_changing(kc_menu *menu)
menu->changing = 1; 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; grs_canvas * save_canvas = grd_curcanv;
int i,k; int i,k;
#ifdef NEWMENU_MOUSE #ifdef NEWMENU_MOUSE
int mx, my, mz, x1, x2, y1, y2; int mx, my, mz, x1, x2, y1, y2;
#endif #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; i<NUM_KEY_CONTROLS; i++ )
PlayerCfg.KeySettings[0][i] = kc_keyboard[i].value;
if ( CONTROL_USING_JOYSTICK )
{
for (i=0; i<NUM_JOYSTICK_CONTROLS; i++ )
PlayerCfg.KeySettings[CONTROL_JOYSTICK][i] = kc_joystick[i].value;
}
if ( CONTROL_USING_MOUSE )
{
for (i=0; i<NUM_MOUSE_CONTROLS; i++ )
PlayerCfg.KeySettings[CONTROL_MOUSE][i] = kc_mouse[i].value;
}
for (i=0; i<NUM_D1X_CONTROLS; i++)
PlayerCfg.KeySettingsD1X[i] = kc_d1x[i].value;
return 1;
}
if (menu->changing) if (menu->changing)
timer_delay(f0_1/10); timer_delay(f0_1/10);
@ -722,7 +687,7 @@ int kconfig_handler(window *wind, d_event *event, kc_menu *menu)
return 1; return 1;
} }
} }
#ifdef NETWORK #ifdef NETWORK
if ( !menu->time_stopped ) if ( !menu->time_stopped )
if (multi_menu_poll() == -1) if (multi_menu_poll() == -1)
@ -772,47 +737,47 @@ int kconfig_handler(window *wind, d_event *event, kc_menu *menu)
} }
} }
break; break;
case KEY_DELETE: case KEY_DELETE:
menu->items[menu->citem].value=255; menu->items[menu->citem].value=255;
break; break;
case KEY_UP: case KEY_UP:
case KEY_PAD8: case KEY_PAD8:
#ifdef TABLE_CREATION #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); if (menu->items[menu->citem].u==-1) menu->items[menu->citem].u=find_next_item_up( menu->items,menu->nitems, menu->citem);
#endif #endif
menu->citem = menu->items[menu->citem].u; menu->citem = menu->items[menu->citem].u;
break; break;
case KEY_DOWN: case KEY_DOWN:
case KEY_PAD2: case KEY_PAD2:
#ifdef TABLE_CREATION #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); if (menu->items[menu->citem].d==-1) menu->items[menu->citem].d=find_next_item_down( menu->items,menu->nitems, menu->citem);
#endif #endif
menu->citem = menu->items[menu->citem].d; menu->citem = menu->items[menu->citem].d;
break; break;
case KEY_LEFT: case KEY_LEFT:
case KEY_PAD4: case KEY_PAD4:
#ifdef TABLE_CREATION #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); if (menu->items[menu->citem].l==-1) menu->items[menu->citem].l=find_next_item_left( menu->items,menu->nitems, menu->citem);
#endif #endif
menu->citem = menu->items[menu->citem].l; menu->citem = menu->items[menu->citem].l;
break; break;
case KEY_RIGHT: case KEY_RIGHT:
case KEY_PAD6: case KEY_PAD6:
#ifdef TABLE_CREATION #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); if (menu->items[menu->citem].r==-1) menu->items[menu->citem].r=find_next_item_right( menu->items,menu->nitems, menu->citem);
#endif #endif
menu->citem = menu->items[menu->citem].r; menu->citem = menu->items[menu->citem].r;
break; break;
case KEY_ENTER: case KEY_ENTER:
case KEY_PADENTER: case KEY_PADENTER:
kconfig_start_changing(menu); kconfig_start_changing(menu);
break; break;
case -2: case -2:
case KEY_ESC: case KEY_ESC:
window_close(wind); window_close(wind);
break; break;
#ifdef TABLE_CREATION #ifdef TABLE_CREATION
case KEY_F12: { case KEY_F12: {
FILE * fp; FILE * fp;
for (i=0; i<NUM_KEY_CONTROLS; i++ ) { for (i=0; i<NUM_KEY_CONTROLS; i++ ) {
kc_keyboard[i].u = find_next_item_up( kc_keyboard,NUM_KEY_CONTROLS, i); kc_keyboard[i].u = find_next_item_up( kc_keyboard,NUM_KEY_CONTROLS, i);
@ -891,17 +856,17 @@ int kconfig_handler(window *wind, d_event *event, kc_menu *menu)
} }
break; break;
#endif #endif
case 0: // some other event case 0: // some other event
break; break;
default: default:
return 0; return 0;
break; break;
} }
#ifdef NEWMENU_MOUSE #ifdef NEWMENU_MOUSE
gr_set_current_canvas(window_get_canvas(wind)); gr_set_current_canvas(window_get_canvas(wind));
if ( (menu->mouse_state && !menu->omouse_state) || (menu->mouse_state && menu->omouse_state) ) { if ( (menu->mouse_state && !menu->omouse_state) || (menu->mouse_state && menu->omouse_state) ) {
int item_height; int item_height;
@ -936,13 +901,61 @@ int kconfig_handler(window *wind, d_event *event, kc_menu *menu)
menu->changing = 0; menu->changing = 0;
gr_set_fontcolor( BM_XRGB(28,28,28), BM_XRGB(0,0,0) ); gr_set_fontcolor( BM_XRGB(28,28,28), BM_XRGB(0,0,0) );
game_flush_inputs(); game_flush_inputs();
return 1;
} }
} }
gr_set_current_canvas(save_canvas); gr_set_current_canvas(save_canvas);
#endif // NEWMENU_MOUSE #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; i<NUM_KEY_CONTROLS; i++ )
PlayerCfg.KeySettings[0][i] = kc_keyboard[i].value;
if ( CONTROL_USING_JOYSTICK )
{
for (i=0; i<NUM_JOYSTICK_CONTROLS; i++ )
PlayerCfg.KeySettings[CONTROL_JOYSTICK][i] = kc_joystick[i].value;
}
if ( CONTROL_USING_MOUSE )
{
for (i=0; i<NUM_MOUSE_CONTROLS; i++ )
PlayerCfg.KeySettings[CONTROL_MOUSE][i] = kc_mouse[i].value;
}
for (i=0; i<NUM_D1X_CONTROLS; i++)
PlayerCfg.KeySettingsD1X[i] = kc_d1x[i].value;
break;
default:
return 0;
break;
}
return 1; return 1;
} }

View file

@ -549,117 +549,16 @@ int newmenu_get_citem(newmenu *menu)
return menu->citem; return menu->citem;
} }
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; grs_canvas *menu_canvas = window_get_canvas(wind), *save_canvas = grd_curcanv;
int string_width, string_height, average_width;
char *Temp,TempVal; char *Temp,TempVal;
#ifdef NEWMENU_MOUSE #ifdef NEWMENU_MOUSE
int mx=0, my=0, mz=0, x1 = 0, x2, y1, y2; int mx=0, my=0, mz=0, x1 = 0, x2, y1, y2;
#endif #endif
int rval = 0; 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; i<menu->max_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_displayable<menu->nitems)
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); timer_delay2(50);
#ifdef NEWMENU_MOUSE #ifdef NEWMENU_MOUSE
@ -689,7 +588,7 @@ int newmenu_handler(window *wind, d_event *event, newmenu *menu)
} }
gr_set_current_canvas(menu_canvas); gr_set_current_canvas(menu_canvas);
if (menu->tiny_mode) if (menu->tiny_mode)
gr_set_curfont(GAME_FONT); gr_set_curfont(GAME_FONT);
else else
@ -700,10 +599,10 @@ int newmenu_handler(window *wind, d_event *event, newmenu *menu)
if (k) if (k)
{ {
d_event_keycommand key_event; // for now - will be passed through newmenu_handler later d_event_keycommand key_event; // for now - will be passed through newmenu_handler later
key_event.type = EVENT_KEY_COMMAND; key_event.type = EVENT_KEY_COMMAND;
key_event.keycode = k; key_event.keycode = k;
rval = (*menu->subfunction)(menu, (d_event *)&key_event, menu->userdata); rval = (*menu->subfunction)(menu, (d_event *)&key_event, menu->userdata);
k = key_event.keycode; k = key_event.keycode;
} }
@ -880,7 +779,7 @@ int newmenu_handler(window *wind, d_event *event, newmenu *menu)
event->type = EVENT_NEWMENU_SELECTED; event->type = EVENT_NEWMENU_SELECTED;
if (menu->subfunction && (*menu->subfunction)(menu, event, menu->userdata)) if (menu->subfunction && (*menu->subfunction)(menu, event, menu->userdata))
return 1; return 1;
menu->done = 1; menu->done = 1;
gr_set_current_canvas(save_canvas); gr_set_current_canvas(save_canvas);
return 1; return 1;
@ -1239,6 +1138,127 @@ int newmenu_handler(window *wind, d_event *event, newmenu *menu)
gr_set_current_canvas(save_canvas); 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; i<menu->max_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_displayable<menu->nitems)
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; 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 i;
int ocitem, ofirst_item, key; int ocitem, ofirst_item, key;
@ -1688,57 +1708,6 @@ int listbox_handler(window *wind, d_event *event, listbox *lb)
#endif #endif
int rval = 0; 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; i<lb->first_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); timer_delay2(50);
ocitem = lb->citem; ocitem = lb->citem;
ofirst_item = lb->first_item; ofirst_item = lb->first_item;
@ -1758,10 +1727,10 @@ int listbox_handler(window *wind, d_event *event, listbox *lb)
if (key) if (key)
{ {
d_event_keycommand key_event; // somewhere to put the keycode for now d_event_keycommand key_event; // somewhere to put the keycode for now
key_event.type = EVENT_KEY_COMMAND; key_event.type = EVENT_KEY_COMMAND;
key_event.keycode = key; key_event.keycode = key;
rval = (*lb->listbox_callback)(lb, (d_event *)&key_event, lb->userdata); rval = (*lb->listbox_callback)(lb, (d_event *)&key_event, lb->userdata);
key = key_event.keycode; key = key_event.keycode;
} }
@ -1815,8 +1784,8 @@ int listbox_handler(window *wind, d_event *event, listbox *lb)
return 1; return 1;
} }
break; break;
case KEY_ENTER: case KEY_ENTER:
case KEY_PADENTER: case KEY_PADENTER:
// Tell callback, allow staying in menu // Tell callback, allow staying in menu
event->type = EVENT_NEWMENU_SELECTED; event->type = EVENT_NEWMENU_SELECTED;
if (lb->listbox_callback && (*lb->listbox_callback)(lb, event, lb->userdata)) 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; return 1;
break; break;
case KEY_ALTED+KEY_ENTER: case KEY_ALTED+KEY_ENTER:
case KEY_ALTED+KEY_PADENTER: case KEY_ALTED+KEY_PADENTER:
gr_toggle_fullscreen(); gr_toggle_fullscreen();
break; break;
@ -1888,7 +1857,7 @@ int listbox_handler(window *wind, d_event *event, listbox *lb)
y2 = y1+h; y2 = y1+h;
if ( ((mx > x1) && (mx < x2)) && ((my > y1) && (my < y2)) ) { if ( ((mx > x1) && (mx < x2)) && ((my > y1) && (my < y2)) ) {
lb->citem = i; lb->citem = i;
// Tell callback, allow staying in menu // Tell callback, allow staying in menu
event->type = EVENT_NEWMENU_SELECTED; event->type = EVENT_NEWMENU_SELECTED;
if (lb->listbox_callback && (*lb->listbox_callback)(lb, event, lb->userdata)) 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 #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; i<lb->first_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; return 1;
} }