Add a default event handler for screenshots, entering debugger, Redbook repeating etc

This commit is contained in:
kreatordxx 2010-04-02 05:01:08 +00:00
parent 8cf06690d7
commit d749889c89
17 changed files with 134 additions and 172 deletions

View file

@ -1,5 +1,9 @@
D1X-Rebirth Changelog
20100401
--------
arch/include/event.h, arch/sdl/event.c, arch/sdl/key.c, arch/sdl/mouse.c, main/automap.c, main/credits.c, main/game.c, main/gamecntl.c, main/inferno.c, main/kconfig.c, main/kmatrix.c, main/net_ipx.c, main/net_udp.c, main/newmenu.c, main/scores.c, main/titles.c: Add a default event handler for screenshots, entering debugger, Redbook repeating etc
20100331
--------
main/game.h, main/gamecntl.c, main/gamerend.c, main/kconfig.c, main/kconfig.h, main/laser.c, main/laser.h: Make gamecntl.c more similar between D1X and D2X

View file

@ -28,6 +28,10 @@ int event_init();
// Sends input events to event handlers
void event_poll();
// Set and call the default event handler
void set_default_handler(int (*handler)(d_event *event));
int call_default_handler(d_event *event);
// Sends input, idle and draw events to event handlers
void event_process();

View file

@ -72,6 +72,21 @@ int event_init()
return 0;
}
int (*default_handler)(d_event *event) = NULL;
void set_default_handler(int (*handler)(d_event *event))
{
default_handler = handler;
}
int call_default_handler(d_event *event)
{
if (default_handler)
return (*default_handler)(event);
return 0;
}
// Process the first event in queue, sending to the appropriate handler
// This is the new object-oriented system
// Uses the old system for now, but this may change
@ -82,13 +97,15 @@ void event_process(void)
event_poll(); // send input events first
event.type = EVENT_IDLE; // most user input handled in idle event for now (except for newmenu)
wind = window_get_front();
if (!wind)
return;
window_send_event(wind, &event);
event.type = EVENT_IDLE;
if ((wind = window_get_front()))
{
if (!window_send_event(wind, &event))
call_default_handler(&event);
}
else
call_default_handler(&event);
event.type = EVENT_WINDOW_DRAW; // then draw all visible windows
for (wind = window_get_first(); wind != NULL; wind = window_get_next(wind))
if (window_is_visible(wind))

View file

@ -433,8 +433,13 @@ void key_handler(SDL_KeyboardEvent *event, int counter)
event.type = EVENT_KEY_COMMAND;
event.keycode = key_command;
if ((wind = window_get_front()) && window_send_event(wind, (d_event *)&event))
/*return*/; // handled it - don't add to queue NOT YET: have to make all input loops into windows
if ((wind = window_get_front()))
{
if (!window_send_event(wind, (d_event *)&event))
call_default_handler((d_event *)&event);
}
else
call_default_handler((d_event *)&event);
}
}

View file

@ -88,7 +88,12 @@ void mouse_button_handler(SDL_MouseButtonEvent *mbe)
event.button = button;
if ((wind = window_get_front()))
window_send_event(wind, (d_event *)&event);
{
if (!window_send_event(wind, (d_event *)&event))
call_default_handler((d_event *)&event);
}
else
call_default_handler((d_event *)&event);
}
void mouse_motion_handler(SDL_MouseMotionEvent *mme)

View file

@ -360,10 +360,6 @@ int automap_key_command(window *wind, d_event *event, automap *am)
switch (c)
{
#ifndef NDEBUG
case KEY_BACKSP: Int3(); return 1;
#endif
case KEY_PRINT_SCREEN: {
gr_set_current_canvas(NULL);
save_screen_shot(1);
@ -414,10 +410,6 @@ int automap_key_command(window *wind, d_event *event, automap *am)
adjust_segment_limit(am, am->segment_limit);
}
return 1;
case KEY_ALTED+KEY_ENTER:
case KEY_ALTED+KEY_PADENTER:
gr_toggle_fullscreen();
return 1;
}
return 0;
@ -451,9 +443,6 @@ int automap_idle(window *wind, d_event *event, automap *am)
}
}
//see if redbook song needs to be restarted
RBACheckFinishedHook();
if ( Controls.fire_primary_down_count ) {
// Reset orientation
am->viewDist = ZOOM_DEFAULT;

View file

@ -61,32 +61,20 @@ typedef struct credits
int credits_handler(window *wind, d_event *event, credits *cr)
{
int j, k, l;
int j, l;
char * tempp;
int y;
switch (event->type)
{
case EVENT_KEY_COMMAND:
k = ((d_event_keycommand *)event)->keycode;
switch (k)
{
case KEY_PRINT_SCREEN:
save_screen_shot(0);
return 1;
default:
window_close(wind);
return 1;
}
break;
if (!call_default_handler(event)) // if not print screen, debug etc
window_close(wind);
return 1;
case EVENT_IDLE:
timer_delay(F1_0/25);
//see if redbook song needs to be restarted
RBACheckFinishedHook();
if (cr->row == 0)
{
do {

View file

@ -1028,9 +1028,6 @@ int game_handler(window *wind, d_event *event, void *data)
if (window_get_front() != wind)
break;
//see if redbook song needs to be restarted
RBACheckFinishedHook(); // Handle RedBook Audio Repeating.
if (Config_menu_flag) {
do_options_menu();
}

View file

@ -146,7 +146,6 @@ void advance_sound(void);
void play_test_sound(void);
#define key_isfunc(k) (((k&0xff)>=KEY_F1 && (k&0xff)<=KEY_F10) || (k&0xff)==KEY_F11 || (k&0xff)==KEY_F12)
#define key_ismod(k) ((k&0xff)==KEY_LALT || (k&0xff)==KEY_RALT || (k&0xff)==KEY_LSHIFT || (k&0xff)==KEY_RSHIFT || (k&0xff)==KEY_LCTRL || (k&0xff)==KEY_RCTRL || (k&0xff)==KEY_LMETA || (k&0xff)==KEY_RMETA)
void update_vcr_state();
void do_weapon_stuff(void);
@ -251,10 +250,6 @@ int pause_handler(window *wind, d_event *event, char *msg)
case KEY_PAUSE:
window_close(wind);
return 1;
case KEY_ALTED+KEY_ENTER:
case KEY_ALTED+KEY_PADENTER:
gr_toggle_fullscreen();
return 1;
default:
break;
}
@ -320,13 +315,6 @@ int HandleEndlevelKey(int key)
{
switch (key)
{
#ifdef macintosh
case KEY_COMMAND + KEY_SHIFTED + KEY_3:
#endif
case KEY_PRINT_SCREEN:
save_screen_shot(0);
return 1;
case KEY_COMMAND+KEY_P:
case KEY_PAUSE:
do_game_pause();
@ -336,10 +324,6 @@ int HandleEndlevelKey(int key)
stop_endlevel_sequence();
last_drawn_cockpit=-1;
return 1;
case KEY_BACKSP:
Int3();
return 1;
}
return 0;
@ -347,7 +331,7 @@ int HandleEndlevelKey(int key)
int HandleDeathKey(int key)
{
if (Player_exploded && !key_isfunc(key) && !key_ismod(key) && key)
if (Player_exploded && !key_isfunc(key) && key)
Death_sequence_aborted = 1; //Any key but func or modifier aborts
if (key == KEY_ESC) {
@ -444,15 +428,7 @@ int HandleDemoKey(int key)
}
break;
}
case KEY_ALTED+KEY_ENTER:
case KEY_ALTED+KEY_PADENTER:
gr_toggle_fullscreen();
break;
#ifndef NDEBUG
case KEY_BACKSP:
Int3();
break;
case KEY_DEBUGGED + KEY_I:
Newdemo_do_interpolate = !Newdemo_do_interpolate;
HUD_init_message("Demo playback interpolation %s", Newdemo_do_interpolate?"ON":"OFF");
@ -669,15 +645,9 @@ int HandleSystemKey(int key)
songs_goto_next_song();
break;
#if defined(__APPLE__) || defined(macintosh)
case KEY_COMMAND+KEY_Q:
macintosh_quit();
break;
#endif
default:
return 0;
break;
}
return 1;
@ -1409,6 +1379,9 @@ int ReadControls(d_event *event)
return 1;
#endif
if (call_default_handler(event))
return 1;
if (Player_is_dead)
return HandleDeathKey(key);
}

View file

@ -79,6 +79,7 @@ char copyright[] = "DESCENT COPYRIGHT (C) 1994,1995 PARALLAX SOFTWARE CORPORAT
#include "joy.h"
#include "../texmap/scanline.h" //for select_tmap -MM
#include "event.h"
#include "rbaudio.h"
#ifdef EDITOR
#include "editor/editor.h"
@ -195,6 +196,74 @@ void error_messagebox(char *s)
nm_messagebox( TXT_SORRY, 1, TXT_OK, s );
}
#define key_ismod(k) ((k&0xff)==KEY_LALT || (k&0xff)==KEY_RALT || (k&0xff)==KEY_LSHIFT || (k&0xff)==KEY_RSHIFT || (k&0xff)==KEY_LCTRL || (k&0xff)==KEY_RCTRL || (k&0xff)==KEY_LMETA || (k&0xff)==KEY_RMETA)
// Default event handler for everything except the editor
int standard_handler(d_event *event)
{
int key;
switch (event->type)
{
case EVENT_MOUSE_BUTTON_DOWN:
case EVENT_MOUSE_BUTTON_UP:
// No window selecting
// We stay with the current one until it's closed/hidden or another one is made
// Not the case for the editor
break;
case EVENT_KEY_COMMAND:
key = ((d_event_keycommand *)event)->keycode;
// Don't let modifier(s) on their own do something unless we explicitly want that
// (e.g. if it's a game control like fire primary)
if (key_ismod(key))
return 1;
switch (key)
{
#ifdef macintosh
case KEY_COMMAND + KEY_SHIFTED + KEY_3:
#endif
case KEY_PRINT_SCREEN:
{
gr_set_current_canvas(NULL);
save_screen_shot(0);
return 1;
}
case KEY_ALTED+KEY_ENTER:
case KEY_ALTED+KEY_PADENTER:
gr_toggle_fullscreen();
return 1;
#ifndef NDEBUG
case KEY_BACKSP:
Int3();
return 1;
#endif
#if defined(__APPLE__) || defined(macintosh)
case KEY_COMMAND+KEY_Q:
// Alt-F4 already taken, too bad
macintosh_quit();
break;
#endif
}
break;
case EVENT_IDLE:
//see if redbook song needs to be restarted
RBACheckFinishedHook();
return 1;
default:
break;
}
return 0;
}
int MacHog = 0; // using a Mac hogfile?
jmp_buf LeaveEvents;
#define PROGNAME argv[0]
@ -299,6 +368,8 @@ int main(int argc, char *argv[])
return(0);
error_init(error_messagebox, NULL);
set_default_handler(standard_handler);
con_printf( CON_DEBUG, "\nInitializing texture caching system..." );
texmerge_init( 10 ); // 10 cache bitmaps

View file

@ -631,15 +631,6 @@ int kconfig_key_command(window *wind, d_event *event, kc_menu *menu)
switch (k)
{
case KEY_BACKSP:
Int3();
return 1;
#ifdef macintosh
case KEY_COMMAND+KEY_SHIFTED+KEY_3:
#endif
case KEY_PRINT_SCREEN:
save_screen_shot(0);
return 1;
case KEY_CTRLED+KEY_D:
menu->items[menu->citem].value = 255;
return 1;
@ -833,9 +824,6 @@ int kconfig_handler(window *wind, d_event *event, kc_menu *menu)
else
timer_delay2(50);
//see if redbook song needs to be restarted
RBACheckFinishedHook();
if (menu->changing)
{
switch( menu->items[menu->citem].type )

View file

@ -221,14 +221,6 @@ int kmatrix_ipx_handler(window *wind, d_event *event, kmatrix_ipx_screen *km)
window_close(wind);
return 1;
case KEY_PRINT_SCREEN:
save_screen_shot(0);
return 1;
case KEY_BACKSP:
Int3();
return 1;
default:
break;
}
@ -237,9 +229,6 @@ int kmatrix_ipx_handler(window *wind, d_event *event, kmatrix_ipx_screen *km)
case EVENT_IDLE:
timer_delay2(50);
//see if redbook song needs to be restarted
RBACheckFinishedHook();
if (timer_get_fixed_seconds() >= (km->entry_time+MAX_VIEW_TIME))
window_close(wind);
@ -521,10 +510,6 @@ int kmatrix_handler(window *wind, d_event *event, kmatrix_screen *km)
}
return 1;
case KEY_PRINT_SCREEN:
save_screen_shot(0);
return 1;
default:
break;
}
@ -533,8 +518,6 @@ int kmatrix_handler(window *wind, d_event *event, kmatrix_screen *km)
case EVENT_IDLE:
timer_delay2(50);
RBACheckFinishedHook(); //see if redbook song needs to be restarted
if (km->network)
multi_do_protocol_frame(0, 1);

View file

@ -3952,9 +3952,6 @@ static int show_game_rules_handler(window *wind, d_event *event, netgame_info *n
k = ((d_event_keycommand *)event)->keycode;
switch (k)
{
case KEY_PRINT_SCREEN:
save_screen_shot(0); k = 0;
return 1;
case KEY_ENTER:
case KEY_SPACEBAR:
case KEY_ESC:
@ -3965,9 +3962,6 @@ static int show_game_rules_handler(window *wind, d_event *event, netgame_info *n
case EVENT_IDLE:
timer_delay2(50);
//see if redbook song needs to be restarted
RBACheckFinishedHook();
break;
case EVENT_WINDOW_DRAW:

View file

@ -4291,9 +4291,6 @@ static int show_game_rules_handler(window *wind, d_event *event, netgame_info *n
k = ((d_event_keycommand *)event)->keycode;
switch (k)
{
case KEY_PRINT_SCREEN:
save_screen_shot(0); k = 0;
return 1;
case KEY_ENTER:
case KEY_SPACEBAR:
case KEY_ESC:
@ -4304,9 +4301,6 @@ static int show_game_rules_handler(window *wind, d_event *event, netgame_info *n
case EVENT_IDLE:
timer_delay2(50);
//see if redbook song needs to be restarted
RBACheckFinishedHook();
break;
case EVENT_WINDOW_DRAW:

View file

@ -975,11 +975,6 @@ int newmenu_key_command(window *wind, d_event *event, newmenu *menu)
}
break;
case KEY_ALTED+KEY_ENTER:
case KEY_ALTED+KEY_PADENTER:
gr_toggle_fullscreen();
break;
case KEY_ESC:
if ( (menu->citem>-1) && (item->type==NM_TYPE_INPUT_MENU) && (item->group==1)) {
item->group=0;
@ -992,13 +987,6 @@ int newmenu_key_command(window *wind, d_event *event, newmenu *menu)
}
break;
#ifdef macintosh
case KEY_COMMAND+KEY_SHIFTED+KEY_3:
#endif
case KEY_PRINT_SCREEN:
save_screen_shot(0);
break;
#ifndef NDEBUG
case KEY_BACKSP:
if ( (menu->citem>-1) && (item->type!=NM_TYPE_INPUT)&&(item->type!=NM_TYPE_INPUT_MENU))
@ -1278,9 +1266,6 @@ int newmenu_handler(window *wind, d_event *event, newmenu *menu)
case EVENT_IDLE:
timer_delay2(50);
//see if redbook song needs to be restarted
RBACheckFinishedHook();
return newmenu_mouse(wind, event, menu);
break;
@ -1806,12 +1791,6 @@ int listbox_key_command(window *wind, d_event *event, listbox *lb)
int rval = 1;
switch(key) {
#ifdef macintosh
case KEY_COMMAND+KEY_SHIFTED+KEY_3:
#endif
case KEY_PRINT_SCREEN:
save_screen_shot(0);
break;
case KEY_HOME:
case KEY_PAD7:
lb->citem = 0;
@ -1854,11 +1833,6 @@ int listbox_key_command(window *wind, d_event *event, listbox *lb)
return 1;
break;
case KEY_ALTED+KEY_ENTER:
case KEY_ALTED+KEY_PADENTER:
gr_toggle_fullscreen();
break;
default:
{
int ascii = key_ascii();
@ -1971,9 +1945,6 @@ int listbox_handler(window *wind, d_event *event, listbox *lb)
case EVENT_IDLE:
timer_delay2(50);
//see if redbook song needs to be restarted
RBACheckFinishedHook();
return listbox_mouse(wind, event, lb);
break;

View file

@ -344,12 +344,10 @@ int scores_handler(window *wind, d_event *event, scores_menu *menu)
}
}
return 1;
case KEY_BACKSP: Int3(); k = 0; return 1;
case KEY_PRINT_SCREEN: save_screen_shot(0); k = 0; return 1;
case KEY_ENTER:
case KEY_SPACEBAR:
case KEY_ESC:
case KEY_ENTER:
case KEY_SPACEBAR:
case KEY_ESC:
window_close(wind);
return 1;
}
@ -357,9 +355,6 @@ int scores_handler(window *wind, d_event *event, scores_menu *menu)
case EVENT_IDLE:
timer_delay2(50);
//see if redbook song needs to be restarted
RBACheckFinishedHook();
break;
case EVENT_WINDOW_DRAW:

View file

@ -100,18 +100,10 @@ int title_handler(window *wind, d_event *event, title_screen *ts)
break;
case EVENT_KEY_COMMAND:
switch (((d_event_keycommand *)event)->keycode)
{
case KEY_PRINT_SCREEN:
save_screen_shot(0);
return 1;
default:
if (ts->allow_keys)
window_close(wind);
return 1;
}
break;
if (!call_default_handler(event))
if (ts->allow_keys)
window_close(wind);
return 1;
case EVENT_IDLE:
timer_delay2(50);
@ -1123,16 +1115,6 @@ int briefing_handler(window *wind, d_event *event, briefing *br)
title_save_game();
return 1;
case KEY_PRINT_SCREEN:
save_screen_shot(0);
return 1;
#ifndef NDEBUG
case KEY_BACKSP:
Int3();
return 1;
#endif
case KEY_ESC:
window_close(wind);
return 1;
@ -1143,7 +1125,9 @@ int briefing_handler(window *wind, d_event *event, briefing *br)
// fall through
default:
if (br->new_screen)
if (call_default_handler(event))
return 1;
else if (br->new_screen)
{
if (!new_briefing_screen(br, 0))
{