X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fevents.c;h=843fb1972f2005871c0eab401a157b6ccd260be1;hb=eb51a78900b95e3f7c9c3fbc9e4cf9360b374188;hp=2127242f376221be14192a8d893f689e8b3c71f2;hpb=d0409bd76aa84a8745ec2ea6d8a5480c8bea0bcd;p=rocksndiamonds.git diff --git a/src/events.c b/src/events.c index 2127242f..843fb197 100644 --- a/src/events.c +++ b/src/events.c @@ -19,7 +19,7 @@ #include "editor.h" #include "files.h" #include "tape.h" -#include "cartoons.h" +#include "anim.h" #include "network.h" @@ -27,6 +27,7 @@ #define DEBUG_EVENTS_BUTTON (DEBUG_EVENTS * 0) #define DEBUG_EVENTS_MOTION (DEBUG_EVENTS * 0) +#define DEBUG_EVENTS_WHEEL (DEBUG_EVENTS * 1) #define DEBUG_EVENTS_WINDOW (DEBUG_EVENTS * 0) #define DEBUG_EVENTS_FINGER (DEBUG_EVENTS * 0) #define DEBUG_EVENTS_TEXT (DEBUG_EVENTS * 1) @@ -174,6 +175,10 @@ void HandleEvents() break; #if defined(TARGET_SDL2) + case EVENT_WHEELMOTION: + HandleWheelEvent((WheelEvent *) &event); + break; + case SDL_WINDOWEVENT: HandleWindowEvent((WindowEvent *) &event); break; @@ -309,7 +314,7 @@ void EventLoop(void) BackToFront(); /* reset video frame delay to default (may change again while playing) */ - SetVideoFrameDelay(GAME_FRAME_DELAY); + SetVideoFrameDelay(MenuFrameDelay); if (game_status == GAME_MODE_QUIT) return; @@ -434,6 +439,45 @@ void HandleMotionEvent(MotionEvent *event) #if defined(TARGET_SDL2) +void HandleWheelEvent(WheelEvent *event) +{ + int button_nr; + +#if DEBUG_EVENTS_WHEEL +#if 1 + Error(ERR_DEBUG, "WHEEL EVENT: mouse == %d, x/y == %d/%d\n", + event->which, event->x, event->y); +#else + // (SDL_MOUSEWHEEL_NORMAL/SDL_MOUSEWHEEL_FLIPPED needs SDL 2.0.4 or newer) + Error(ERR_DEBUG, "WHEEL EVENT: mouse == %d, x/y == %d/%d, direction == %s\n", + event->which, event->x, event->y, + (event->direction == SDL_MOUSEWHEEL_NORMAL ? "SDL_MOUSEWHEEL_NORMAL" : + "SDL_MOUSEWHEEL_FLIPPED")); +#endif +#endif + + button_nr = (event->x < 0 ? MB_WHEEL_LEFT : + event->x > 0 ? MB_WHEEL_RIGHT : + event->y < 0 ? MB_WHEEL_DOWN : + event->y > 0 ? MB_WHEEL_UP : 0); + +#if defined(PLATFORM_WIN32) || defined(PLATFORM_MACOSX) + // accelerated mouse wheel available on Mac and Windows + wheel_steps = (event->x ? ABS(event->x) : ABS(event->y)); +#else + // no accelerated mouse wheel available on Unix/Linux + wheel_steps = DEFAULT_WHEEL_STEPS; +#endif + + motion_status = FALSE; + + button_status = button_nr; + HandleButton(0, 0, button_status, -button_nr); + + button_status = MB_RELEASED; + HandleButton(0, 0, button_status, -button_nr); +} + void HandleWindowEvent(WindowEvent *event) { #if DEBUG_EVENTS_WINDOW @@ -460,10 +504,13 @@ void HandleWindowEvent(WindowEvent *event) event_name, event->data1, event->data2); #endif +#if 0 + // (not needed, as the screen gets redrawn every 20 ms anyway) if (event->event == SDL_WINDOWEVENT_SIZE_CHANGED || event->event == SDL_WINDOWEVENT_RESIZED || event->event == SDL_WINDOWEVENT_EXPOSED) SDLRedrawWindow(); +#endif if (event->event == SDL_WINDOWEVENT_RESIZED && !video.fullscreen_enabled) { @@ -477,8 +524,10 @@ void HandleWindowEvent(WindowEvent *event) int new_xpercent = (100 * new_window_width / video.width); int new_ypercent = (100 * new_window_height / video.height); - setup.window_scaling_percent = video.window_scaling_percent = - MIN(MAX(MIN_WINDOW_SCALING_PERCENT, MIN(new_xpercent, new_ypercent)), + // (extreme window scaling allowed, but cannot be saved permanently) + video.window_scaling_percent = MIN(new_xpercent, new_ypercent); + setup.window_scaling_percent = + MIN(MAX(MIN_WINDOW_SCALING_PERCENT, video.window_scaling_percent), MAX_WINDOW_SCALING_PERCENT); video.window_width = new_window_width; @@ -943,11 +992,11 @@ void HandleButton(int mx, int my, int button, int button_nr) static int old_mx = 0, old_my = 0; boolean button_hold = FALSE; - if (button < 0) + if (button_nr < 0) { mx = old_mx; my = old_my; - button = -button; + button_nr = -button_nr; button_hold = TRUE; } else @@ -1352,9 +1401,11 @@ void HandleKey(Key key, int key_status) if ((key == KSYM_minus || key == KSYM_plus || + key == KSYM_equal || // ("Shift-=" is "+" on US keyboards) key == KSYM_0) && ((GetKeyModState() & KMOD_Control) || - (GetKeyModState() & KMOD_Alt)) && + (GetKeyModState() & KMOD_Alt) || + (GetKeyModState() & KMOD_Meta)) && video.window_scaling_available && !video.fullscreen_enabled) { @@ -1400,7 +1451,7 @@ void HandleKey(Key key, int key_status) else if (key == setup.shortcut.load_game) TapeQuickLoad(); else if (key == setup.shortcut.toggle_pause) - TapeTogglePause(TAPE_TOGGLE_MANUAL); + TapeTogglePause(TAPE_TOGGLE_MANUAL | TAPE_TOGGLE_PLAY_PAUSE); HandleTapeButtonKeys(key); HandleSoundButtonKeys(key); @@ -1515,18 +1566,6 @@ void HandleKey(Key key, int key_status) HandleHallOfFame(0, 0, 0, +1 * SCROLL_PAGE, MB_MENU_MARK); break; -#ifdef DEBUG - case KSYM_0: - GameFrameDelay = (GameFrameDelay == 500 ? GAME_FRAME_DELAY : 500); - break; - - case KSYM_b: - setup.sp_show_border_elements = !setup.sp_show_border_elements; - printf("Supaplex border elements %s\n", - setup.sp_show_border_elements ? "enabled" : "disabled"); - break; -#endif - default: break; } @@ -1546,20 +1585,6 @@ void HandleKey(Key key, int key_status) break; #ifdef DEBUG - case KSYM_0: - if (key == KSYM_0) - { - if (GameFrameDelay == 500) - GameFrameDelay = GAME_FRAME_DELAY; - else - GameFrameDelay = 500; - } - else - GameFrameDelay = (key - KSYM_0) * 10; - printf("Game speed == %d%% (%d ms delay between two frames)\n", - GAME_FRAME_DELAY * 100 / GameFrameDelay, GameFrameDelay); - break; - case KSYM_d: if (options.debug) { @@ -1595,6 +1620,41 @@ void HandleKey(Key key, int key_status) return; } } + +#ifdef DEBUG + if (game_status == GAME_MODE_PLAYING || !setup.debug.frame_delay_game_only) + { + boolean mod_key_pressed = ((GetKeyModState() & KMOD_Control) || + (GetKeyModState() & KMOD_Alt) || + (GetKeyModState() & KMOD_Meta)); + + for (i = 0; i < NUM_DEBUG_FRAME_DELAY_KEYS; i++) + { + if (key == setup.debug.frame_delay_key[i] && + (mod_key_pressed || !setup.debug.frame_delay_use_mod_key)) + { + GameFrameDelay = (GameFrameDelay != setup.debug.frame_delay[i] ? + setup.debug.frame_delay[i] : GAME_FRAME_DELAY); + + if (!setup.debug.frame_delay_game_only) + MenuFrameDelay = GameFrameDelay; + + SetVideoFrameDelay(GameFrameDelay); + + if (GameFrameDelay > ONE_SECOND_DELAY) + Error(ERR_DEBUG, "frame delay == %d ms", GameFrameDelay); + else if (GameFrameDelay != 0) + Error(ERR_DEBUG, "frame delay == %d ms (max. %d fps / %d %%)", + GameFrameDelay, ONE_SECOND_DELAY / GameFrameDelay, + GAME_FRAME_DELAY * 100 / GameFrameDelay); + else + Error(ERR_DEBUG, "frame delay == 0 ms (maximum speed)"); + + break; + } + } + } +#endif } void HandleNoEvent() @@ -1602,7 +1662,7 @@ void HandleNoEvent() // if (button_status && game_status != GAME_MODE_PLAYING) if (button_status && (game_status != GAME_MODE_PLAYING || tape.pausing)) { - HandleButton(0, 0, -button_status, button_status); + HandleButton(0, 0, button_status, -button_status); } else { @@ -1618,15 +1678,6 @@ void HandleNoEvent() { case GAME_MODE_MAIN: DrawPreviewLevelAnimation(); - DoAnimation(); - break; - - case GAME_MODE_LEVELS: - case GAME_MODE_LEVELNR: - case GAME_MODE_SETUP: - case GAME_MODE_INFO: - case GAME_MODE_SCORES: - DoAnimation(); break; case GAME_MODE_EDITOR: