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
--------
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
--------

View file

@ -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;
}

View file

@ -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);
}

View file

@ -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;
}

View file

@ -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; 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)
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; i<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;
#endif
case 0: // some other event
case 0: // some other event
break;
default:
default:
return 0;
break;
}
#ifdef NEWMENU_MOUSE
gr_set_current_canvas(window_get_canvas(wind));
if ( (menu->mouse_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; 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;
}

View file

@ -549,117 +549,16 @@ int newmenu_get_citem(newmenu *menu)
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;
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; 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);
#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; 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;
}
@ -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; 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);
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; 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;
}