diff --git a/CHANGELOG.txt b/CHANGELOG.txt index 5bb592304..e0d1fb714 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -1,11 +1,15 @@ D2X-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/escort.c, main/game.c, main/gamecntl.c, main/inferno.c, main/kconfig.c, main/kmatrix.c, main/movie.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/gamecntl.c, main/laser.c, main/laser.h: Make gamecntl.c more similar between D1X and D2X main/automap.c, main/game.c, main/gamecntl.c, main/multi.c, main/multi.h: Make game respond to EVENT_KEY_COMMAND for key commands, allowing default key handler (later) main/gamecntl.c: Fix bug introduced in last commit where the player can't escape from the death sequence (whoops) -main/gameseq.c: Hide the game window so the exit movie has a black background +main/endlevel.c: Hide the game window so the exit movie has a black background 20100330 -------- diff --git a/arch/include/event.h b/arch/include/event.h index 8833d8035..9c8a71c3a 100644 --- a/arch/include/event.h +++ b/arch/include/event.h @@ -44,6 +44,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(); diff --git a/arch/sdl/event.c b/arch/sdl/event.c index 874482d62..be1b90e97 100644 --- a/arch/sdl/event.c +++ b/arch/sdl/event.c @@ -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)) diff --git a/arch/sdl/key.c b/arch/sdl/key.c index 296adf606..8b62c5cce 100644 --- a/arch/sdl/key.c +++ b/arch/sdl/key.c @@ -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); } } diff --git a/arch/sdl/mouse.c b/arch/sdl/mouse.c index 7d1e50c27..410856338 100644 --- a/arch/sdl/mouse.c +++ b/arch/sdl/mouse.c @@ -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) diff --git a/main/automap.c b/main/automap.c index 155a84c55..9cfd1a218 100644 --- a/main/automap.c +++ b/main/automap.c @@ -545,10 +545,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); @@ -635,13 +631,6 @@ int automap_key_command(window *wind, d_event *event, automap *am) MarkerScale+=.5; return 1; #endif - - case KEY_ALTED+KEY_ENTER: - case KEY_ALTED+KEY_PADENTER: - gr_toggle_fullscreen(); - return 1; - //end addition -MM - } return 0; @@ -675,9 +664,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; diff --git a/main/credits.c b/main/credits.c index a0ec6d7f5..3f6baeca3 100644 --- a/main/credits.c +++ b/main/credits.c @@ -64,32 +64,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 { diff --git a/main/escort.c b/main/escort.c index e6b0d58ed..dbf0b79b0 100644 --- a/main/escort.c +++ b/main/escort.c @@ -1653,14 +1653,6 @@ int escort_menu_keycommand(window *wind, d_event *event, escort_menu *menu) window_close(wind); return 1; - case KEY_PRINT_SCREEN: - save_screen_shot(0); - return 1; - -#ifndef RELEASE - case KEY_BACKSP: Int3(); return 1; -#endif - case KEY_T: { char msg[32]; int temp; diff --git a/main/game.c b/main/game.c index bd795d623..7dcba0cfb 100644 --- a/main/game.c +++ b/main/game.c @@ -1202,9 +1202,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(); } diff --git a/main/gamecntl.c b/main/gamecntl.c index 0f7688725..47847ebea 100644 --- a/main/gamecntl.c +++ b/main/gamecntl.c @@ -159,7 +159,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) // Functions ------------------------------------------------------------------ @@ -391,10 +390,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; } @@ -466,13 +461,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(); @@ -482,10 +470,6 @@ int HandleEndlevelKey(int key) stop_endlevel_sequence(); last_drawn_cockpit=-1; return 1; - - case KEY_BACKSP: - Int3(); - return 1; } return 0; @@ -493,7 +477,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) { @@ -593,15 +577,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"); @@ -996,15 +972,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; @@ -2101,6 +2071,9 @@ int ReadControls(d_event *event) return 1; #endif + if (call_default_handler(event)) + return 1; + if (Player_is_dead) return HandleDeathKey(key); } diff --git a/main/inferno.c b/main/inferno.c index fe4cd45b0..01fd430b7 100644 --- a/main/inferno.c +++ b/main/inferno.c @@ -92,6 +92,7 @@ char copyright[] = "DESCENT II COPYRIGHT (C) 1994-1996 PARALLAX SOFTWARE CORPOR #include "joy.h" #include "../texmap/scanline.h" //for select_tmap -MM #include "event.h" +#include "rbaudio.h" #ifdef EDITOR #include "editor/editor.h" @@ -221,6 +222,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; +} + jmp_buf LeaveEvents; #define PROGNAME argv[0] @@ -323,6 +392,8 @@ int main(int argc, char *argv[]) con_printf(CON_DEBUG, "Initializing font system...\n" ); gamefont_init(); // must load after palette data loaded. + set_default_handler(standard_handler); + con_printf( CON_DEBUG, "Initializing movie libraries...\n" ); init_movies(); //init movie libraries @@ -344,7 +415,7 @@ int main(int argc, char *argv[]) return(0); error_init(error_messagebox, NULL); - + con_printf( CON_DEBUG, "\nInitializing texture caching system..." ); texmerge_init( 10 ); // 10 cache bitmaps diff --git a/main/kconfig.c b/main/kconfig.c index 332998883..1394113aa 100644 --- a/main/kconfig.c +++ b/main/kconfig.c @@ -672,15 +672,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; @@ -881,9 +872,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 ) diff --git a/main/kmatrix.c b/main/kmatrix.c index 0f89fbd23..2a2dbe140 100644 --- a/main/kmatrix.c +++ b/main/kmatrix.c @@ -415,14 +415,6 @@ int kmatrix_ipx_handler(window *wind, d_event *event, kmatrix_ipx_screen *km) } return 1; - case KEY_PRINT_SCREEN: - save_screen_shot(0); - return 1; - - case KEY_BACKSP: - Int3(); - return 1; - default: break; } @@ -431,9 +423,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) && Players[Player_num].connected!=CONNECT_KMATRIX_WAITING) { if (is_D2_OEM) @@ -815,10 +804,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; } @@ -827,8 +812,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); diff --git a/main/movie.c b/main/movie.c index 82838b65d..bd6067f0d 100644 --- a/main/movie.c +++ b/main/movie.c @@ -244,7 +244,8 @@ int show_pause_message(window *wind, d_event *event, void *userdata) // else fall through case EVENT_KEY_COMMAND: - window_close(wind); + if (!call_default_handler(event)) + window_close(wind); return 1; case EVENT_WINDOW_DRAW: diff --git a/main/net_ipx.c b/main/net_ipx.c index 01c143f82..f6ffc4a1e 100644 --- a/main/net_ipx.c +++ b/main/net_ipx.c @@ -5639,9 +5639,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: @@ -5652,9 +5649,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: diff --git a/main/net_udp.c b/main/net_udp.c index 4fde629a6..104748e5c 100644 --- a/main/net_udp.c +++ b/main/net_udp.c @@ -4722,9 +4722,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: @@ -4735,9 +4732,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: diff --git a/main/newmenu.c b/main/newmenu.c index 110c0d6b5..e502ec4fd 100644 --- a/main/newmenu.c +++ b/main/newmenu.c @@ -986,11 +986,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; @@ -1003,13 +998,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)) @@ -1289,9 +1277,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; @@ -1817,12 +1802,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; @@ -1865,11 +1844,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(); @@ -1982,9 +1956,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; diff --git a/main/scores.c b/main/scores.c index e5bf5ac6f..5bf9c42ff 100644 --- a/main/scores.c +++ b/main/scores.c @@ -350,12 +350,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; } @@ -363,9 +361,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: diff --git a/main/titles.c b/main/titles.c index a32c89a08..ce4aae45b 100644 --- a/main/titles.c +++ b/main/titles.c @@ -106,18 +106,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); @@ -1313,16 +1305,6 @@ int briefing_handler(window *wind, d_event *event, briefing *br) switch (key) { - 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; @@ -1333,7 +1315,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)) {