X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Fevents.c;h=69efaf508189e9631cb3b7f3b08f608f364922f5;hp=d912e8206f80834dda3e85e2cebcff2f6d729e2f;hb=bbbd254d0e097f479e20a06ddf97eb84782c2e82;hpb=181dedd1aa7ede55254598c09f6fc1c3736decf5 diff --git a/src/events.c b/src/events.c index d912e820..69efaf50 100644 --- a/src/events.c +++ b/src/events.c @@ -43,6 +43,7 @@ static boolean stop_processing_events = FALSE; // forward declarations for internal use +static void ClearTouchInfo(void); static void HandleNoEvent(void); static void HandleEventActions(void); @@ -442,6 +443,10 @@ void ClearPlayerAction(void) stored_player[i].snap_action = 0; } + // simulate finger release events for still pressed virtual buttons + overlay.grid_button_action = JOY_NO_ACTION; + + ClearTouchInfo(); ClearJoystickState(); ClearPlayerMouseAction(); } @@ -503,7 +508,7 @@ static boolean CheckVirtualButtonPressed(int mx, int my, int button) void HandleButtonEvent(ButtonEvent *event) { #if DEBUG_EVENTS_BUTTON - Error(ERR_DEBUG, "BUTTON EVENT: button %d %s, x/y %d/%d\n", + Debug("event:button", "button %d %s, x/y %d/%d\n", event->button, event->type == EVENT_BUTTONPRESS ? "pressed" : "released", event->x, event->y); @@ -535,7 +540,7 @@ void HandleMotionEvent(MotionEvent *event) motion_status = TRUE; #if DEBUG_EVENTS_MOTION - Error(ERR_DEBUG, "MOTION EVENT: button %d moved, x/y %d/%d\n", + Debug("event:motion", "button %d moved, x/y %d/%d\n", button_status, event->x, event->y); #endif @@ -548,11 +553,11 @@ void HandleWheelEvent(WheelEvent *event) #if DEBUG_EVENTS_WHEEL #if 1 - Error(ERR_DEBUG, "WHEEL EVENT: mouse == %d, x/y == %d/%d\n", + Debug("event:wheel", "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", + Debug("event:wheel", "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")); @@ -603,7 +608,7 @@ void HandleWindowEvent(WindowEvent *event) subtype == SDL_WINDOWEVENT_CLOSE ? "SDL_WINDOWEVENT_CLOSE" : "(UNKNOWN)"); - Error(ERR_DEBUG, "WINDOW EVENT: '%s', %ld, %ld", + Debug("event:window", "name: '%s', data1: %ld, data2: %ld", event_name, event->data1, event->data2); #endif @@ -698,6 +703,24 @@ static struct byte action; } touch_info[NUM_TOUCH_FINGERS]; +static void SetTouchInfo(int pos, SDL_FingerID finger_id, int counter, + Key key, byte action) +{ + touch_info[pos].touched = (action != JOY_NO_ACTION); + touch_info[pos].finger_id = finger_id; + touch_info[pos].counter = counter; + touch_info[pos].key = key; + touch_info[pos].action = action; +} + +static void ClearTouchInfo(void) +{ + int i; + + for (i = 0; i < NUM_TOUCH_FINGERS; i++) + SetTouchInfo(i, 0, 0, 0, JOY_NO_ACTION); +} + static void HandleFingerEvent_VirtualButtons(FingerEvent *event) { int x = event->x * overlay.grid_xsize; @@ -714,7 +737,7 @@ static void HandleFingerEvent_VirtualButtons(FingerEvent *event) // for any touch input event, enable overlay buttons (if activated) SetOverlayEnabled(TRUE); - Error(ERR_DEBUG, "::: key '%s' was '%s' [fingerId: %lld]", + Debug("event:finger", "key '%s' was '%s' [fingerId: %lld]", getKeyNameFromKey(key), key_status_name, event->fingerId); if (key_status == KEY_PRESSED) @@ -728,7 +751,7 @@ static void HandleFingerEvent_VirtualButtons(FingerEvent *event) if (touch_info[i].touched && touch_info[i].finger_id == event->fingerId) { - // Error(ERR_DEBUG, "MARK 1: %d", i); + // Debug("event:finger", "MARK 1: %d", i); break; } @@ -748,12 +771,12 @@ static void HandleFingerEvent_VirtualButtons(FingerEvent *event) oldest_pos = i; oldest_counter = touch_info[i].counter; - // Error(ERR_DEBUG, "MARK 2: %d", i); + // Debug("event:finger", "MARK 2: %d", i); } if (!touch_info[i].touched) { - // Error(ERR_DEBUG, "MARK 3: %d", i); + // Debug("event:finger", "MARK 3: %d", i); break; } @@ -764,7 +787,7 @@ static void HandleFingerEvent_VirtualButtons(FingerEvent *event) // all slots allocated -- use oldest slot i = oldest_pos; - // Error(ERR_DEBUG, "MARK 4: %d", i); + // Debug("event:finger", "MARK 4: %d", i); } } else @@ -775,7 +798,7 @@ static void HandleFingerEvent_VirtualButtons(FingerEvent *event) { HandleKey(key, KEY_RELEASED); - Error(ERR_DEBUG, "=> key == '%s', key_status == '%s' [slot %d] [1]", + Debug("event:finger", "key == '%s', key_status == '%s' [slot %d] [1]", getKeyNameFromKey(key), "KEY_RELEASED", i); } } @@ -794,7 +817,7 @@ static void HandleFingerEvent_VirtualButtons(FingerEvent *event) // undraw previous grid button when moving finger away overlay.grid_button_action &= ~touch_info[i].action; - Error(ERR_DEBUG, "=> key == '%s', key_status == '%s' [slot %d] [2]", + Debug("event:finger", "key == '%s', key_status == '%s' [slot %d] [2]", getKeyNameFromKey(touch_info[i].key), "KEY_RELEASED", i); } @@ -802,16 +825,12 @@ static void HandleFingerEvent_VirtualButtons(FingerEvent *event) { HandleKey(key, KEY_PRESSED); - Error(ERR_DEBUG, "=> key == '%s', key_status == '%s' [slot %d] [3]", + Debug("event:finger", "key == '%s', key_status == '%s' [slot %d] [3]", getKeyNameFromKey(key), "KEY_PRESSED", i); } } - touch_info[i].touched = TRUE; - touch_info[i].finger_id = event->fingerId; - touch_info[i].counter = Counter(); - touch_info[i].key = key; - touch_info[i].action = grid_button_action; + SetTouchInfo(i, event->fingerId, Counter(), key, grid_button_action); } else { @@ -819,15 +838,11 @@ static void HandleFingerEvent_VirtualButtons(FingerEvent *event) { HandleKey(touch_info[i].key, KEY_RELEASED); - Error(ERR_DEBUG, "=> key == '%s', key_status == '%s' [slot %d] [4]", + Debug("event:finger", "key == '%s', key_status == '%s' [slot %d] [4]", getKeyNameFromKey(touch_info[i].key), "KEY_RELEASED", i); } - touch_info[i].touched = FALSE; - touch_info[i].finger_id = 0; - touch_info[i].counter = 0; - touch_info[i].key = 0; - touch_info[i].action = JOY_NO_ACTION; + SetTouchInfo(i, 0, 0, 0, JOY_NO_ACTION); } } } @@ -862,7 +877,7 @@ static void HandleFingerEvent_WipeGestures(FingerEvent *event) motion_key_x = KSYM_UNDEFINED; motion_key_y = KSYM_UNDEFINED; - Error(ERR_DEBUG, "---------- MOVE STARTED (WAIT) ----------"); + Debug("event:finger", "---------- MOVE STARTED (WAIT) ----------"); } else { @@ -877,7 +892,7 @@ static void HandleFingerEvent_WipeGestures(FingerEvent *event) HandleKey(button_key, KEY_PRESSED); - Error(ERR_DEBUG, "---------- SNAP STARTED ----------"); + Debug("event:finger", "---------- SNAP STARTED ----------"); } } else if (event->type == EVENT_FINGERRELEASE) @@ -894,7 +909,7 @@ static void HandleFingerEvent_WipeGestures(FingerEvent *event) motion_key_x = KSYM_UNDEFINED; motion_key_y = KSYM_UNDEFINED; - Error(ERR_DEBUG, "---------- MOVE STOPPED ----------"); + Debug("event:finger", "---------- MOVE STOPPED ----------"); } else if (event->fingerId == button_id) { @@ -905,7 +920,7 @@ static void HandleFingerEvent_WipeGestures(FingerEvent *event) button_key = KSYM_UNDEFINED; - Error(ERR_DEBUG, "---------- SNAP STOPPED ----------"); + Debug("event:finger", "---------- SNAP STOPPED ----------"); } } else if (event->type == EVENT_FINGERMOTION) @@ -954,7 +969,7 @@ static void HandleFingerEvent_WipeGestures(FingerEvent *event) motion_key_x = new_motion_key_x; motion_key_y = new_motion_key_y; - Error(ERR_DEBUG, "---------- MOVE STARTED (MOVE) ----------"); + Debug("event:finger", "---------- MOVE STARTED (MOVE) ----------"); } } else if (event->fingerId == button_id) @@ -975,7 +990,7 @@ static void HandleFingerEvent_WipeGestures(FingerEvent *event) HandleKey(button_key, KEY_PRESSED); - Error(ERR_DEBUG, "---------- DROP STARTED ----------"); + Debug("event:finger", "---------- DROP STARTED ----------"); } } } @@ -984,7 +999,7 @@ static void HandleFingerEvent_WipeGestures(FingerEvent *event) void HandleFingerEvent(FingerEvent *event) { #if DEBUG_EVENTS_FINGER - Error(ERR_DEBUG, "FINGER EVENT: finger was %s, touch ID %lld, finger ID %lld, x/y %f/%f, dx/dy %f/%f, pressure %f", + Debug("event:finger", "finger was %s, touch ID %lld, finger ID %lld, x/y %f/%f, dx/dy %f/%f, pressure %f", event->type == EVENT_FINGERPRESS ? "pressed" : event->type == EVENT_FINGERRELEASE ? "released" : "moved", event->touchId, @@ -1051,7 +1066,7 @@ static void HandleButtonOrFinger_WipeGestures_MM(int mx, int my, int button) ClearPlayerMouseAction(); - Error(ERR_DEBUG, "---------- TOUCH ACTION STARTED ----------"); + Debug("event:finger", "---------- TOUCH ACTION STARTED ----------"); } } else if (button == MB_RELEASED && touched) @@ -1065,7 +1080,7 @@ static void HandleButtonOrFinger_WipeGestures_MM(int mx, int my, int button) else SetPlayerMouseAction(old_mx, old_my, MB_RELEASED); - Error(ERR_DEBUG, "---------- TOUCH ACTION STOPPED ----------"); + Debug("event:finger", "---------- TOUCH ACTION STOPPED ----------"); } if (touched) @@ -1090,7 +1105,7 @@ static void HandleButtonOrFinger_WipeGestures_MM(int mx, int my, int button) last_button = button_nr; - Error(ERR_DEBUG, "---------- TOUCH ACTION: ROTATING ----------"); + Debug("event:finger", "---------- TOUCH ACTION: ROTATING ----------"); } else { @@ -1098,7 +1113,7 @@ static void HandleButtonOrFinger_WipeGestures_MM(int mx, int my, int button) SetPlayerMouseAction(old_mx, old_my, MB_RELEASED); - Error(ERR_DEBUG, "---------- TOUCH ACTION PAUSED ----------"); + Debug("event:finger", "---------- TOUCH ACTION PAUSED ----------"); } } } @@ -1137,7 +1152,7 @@ static void HandleButtonOrFinger_FollowFinger_MM(int mx, int my, int button) ClearPlayerMouseAction(); - Error(ERR_DEBUG, "---------- TOUCH ACTION STARTED ----------"); + Debug("event:finger", "---------- TOUCH ACTION STARTED ----------"); } } else if (button == MB_RELEASED && touched) @@ -1151,7 +1166,7 @@ static void HandleButtonOrFinger_FollowFinger_MM(int mx, int my, int button) else SetPlayerMouseAction(old_mx, old_my, MB_RELEASED); - Error(ERR_DEBUG, "---------- TOUCH ACTION STOPPED ----------"); + Debug("event:finger", "---------- TOUCH ACTION STOPPED ----------"); } if (touched) @@ -1180,7 +1195,7 @@ static void HandleButtonOrFinger_FollowFinger_MM(int mx, int my, int button) tapped = FALSE; - Error(ERR_DEBUG, "---------- TOUCH ACTION: ROTATING ----------"); + Debug("event:finger", "---------- TOUCH ACTION: ROTATING ----------"); } else { @@ -1188,7 +1203,7 @@ static void HandleButtonOrFinger_FollowFinger_MM(int mx, int my, int button) SetPlayerMouseAction(old_mx, old_my, MB_RELEASED); - Error(ERR_DEBUG, "---------- TOUCH ACTION PAUSED ----------"); + Debug("event:finger", "---------- TOUCH ACTION PAUSED ----------"); } } } @@ -1223,7 +1238,7 @@ static void HandleButtonOrFinger_FollowFinger(int mx, int my, int button) motion_key_x = KSYM_UNDEFINED; motion_key_y = KSYM_UNDEFINED; - Error(ERR_DEBUG, "---------- TOUCH ACTION STARTED ----------"); + Debug("event:finger", "---------- TOUCH ACTION STARTED ----------"); } } else if (button == MB_RELEASED && touched) @@ -1242,13 +1257,13 @@ static void HandleButtonOrFinger_FollowFinger(int mx, int my, int button) { if (player_is_dropping) { - Error(ERR_DEBUG, "---------- DROP STOPPED ----------"); + Debug("event:finger", "---------- DROP STOPPED ----------"); HandleKey(setup.input[0].key.drop, KEY_RELEASED); } else { - Error(ERR_DEBUG, "---------- SNAP STOPPED ----------"); + Debug("event:finger", "---------- SNAP STOPPED ----------"); HandleKey(setup.input[0].key.snap, KEY_RELEASED); } @@ -1257,7 +1272,7 @@ static void HandleButtonOrFinger_FollowFinger(int mx, int my, int button) motion_key_x = KSYM_UNDEFINED; motion_key_y = KSYM_UNDEFINED; - Error(ERR_DEBUG, "---------- TOUCH ACTION STOPPED ----------"); + Debug("event:finger", "---------- TOUCH ACTION STOPPED ----------"); } if (touched) @@ -1301,13 +1316,13 @@ static void HandleButtonOrFinger_FollowFinger(int mx, int my, int button) if (player_is_dropping) { - Error(ERR_DEBUG, "---------- DROP STARTED ----------"); + Debug("event:finger", "---------- DROP STARTED ----------"); HandleKey(setup.input[0].key.drop, KEY_PRESSED); } else { - Error(ERR_DEBUG, "---------- SNAP STARTED ----------"); + Debug("event:finger", "---------- SNAP STARTED ----------"); HandleKey(setup.input[0].key.snap, KEY_PRESSED); } @@ -1317,7 +1332,7 @@ static void HandleButtonOrFinger_FollowFinger(int mx, int my, int button) if (player_is_dropping && player_drop_count == getPlayerInventorySize(0)) { - Error(ERR_DEBUG, "---------- DROP -> SNAP ----------"); + Debug("event:finger", "---------- DROP -> SNAP ----------"); HandleKey(setup.input[0].key.drop, KEY_RELEASED); HandleKey(setup.input[0].key.snap, KEY_PRESSED); @@ -1328,7 +1343,7 @@ static void HandleButtonOrFinger_FollowFinger(int mx, int my, int button) if (new_motion_key_x != motion_key_x) { - Error(ERR_DEBUG, "---------- %s %s ----------", + Debug("event:finger", "---------- %s %s ----------", started_on_player && !player_is_dropping ? "SNAPPING" : "MOVING", dx < 0 ? "LEFT" : dx > 0 ? "RIGHT" : "PAUSED"); @@ -1340,7 +1355,7 @@ static void HandleButtonOrFinger_FollowFinger(int mx, int my, int button) if (new_motion_key_y != motion_key_y) { - Error(ERR_DEBUG, "---------- %s %s ----------", + Debug("event:finger", "---------- %s %s ----------", started_on_player && !player_is_dropping ? "SNAPPING" : "MOVING", dy < 0 ? "UP" : dy > 0 ? "DOWN" : "PAUSED"); @@ -1386,6 +1401,14 @@ static boolean checkTextInputKey(Key key) if (game_status == GAME_MODE_PLAYING) return FALSE; + // if Shift or right Alt key is pressed, handle key as text input + if ((GetKeyModState() & KMOD_TextInput) != KMOD_None) + return TRUE; + + // ignore raw keys as text input when not in text input mode + if (KSYM_RAW(key) && !textinput_status) + return FALSE; + // else handle all printable keys as text input return KSYM_PRINTABLE(key); } @@ -1396,7 +1419,7 @@ void HandleTextEvent(TextEvent *event) Key key = getKeyFromKeyName(text); #if DEBUG_EVENTS_TEXT - Error(ERR_DEBUG, "TEXT EVENT: text == '%s' [%d byte(s), '%c'/%d], resulting key == %d (%s) [%04x]", + Debug("event:text", "text == '%s' [%d byte(s), '%c'/%d], resulting key == %d (%s) [%04x]", text, strlen(text), text[0], (int)(text[0]), @@ -1433,7 +1456,7 @@ void HandleKeyEvent(KeyEvent *event) Key keymod = (with_modifiers ? GetEventKey(event, FALSE) : key); #if DEBUG_EVENTS_KEY - Error(ERR_DEBUG, "KEY EVENT: key was %s, keysym.scancode == %d, keysym.sym == %d, keymod = %d, GetKeyModState() = 0x%04x, resulting key == %d (%s)", + Debug("event:key", "key was %s, keysym.scancode == %d, keysym.sym == %d, keymod = %d, GetKeyModState() = 0x%04x, resulting key == %d (%s)", event->type == EVENT_KEYPRESS ? "pressed" : "released", event->keysym.scancode, event->keysym.sym, @@ -1474,12 +1497,12 @@ void HandleKeyEvent(KeyEvent *event) static int HandleDropFileEvent(char *filename) { - Error(ERR_DEBUG, "DROP FILE EVENT: '%s'", filename); + Debug("event:dropfile", "filename == '%s'", filename); // check and extract dropped zip files into correct user data directory if (!strSuffixLower(filename, ".zip")) { - Error(ERR_WARN, "file '%s' not supported", filename); + Warn("file '%s' not supported", filename); return TREE_TYPE_UNDEFINED; } @@ -1490,7 +1513,7 @@ static int HandleDropFileEvent(char *filename) if (directory == NULL) { - Error(ERR_WARN, "zip file '%s' has invalid content!", filename); + Warn("zip file '%s' has invalid content!", filename); return TREE_TYPE_UNDEFINED; } @@ -1532,7 +1555,7 @@ static int HandleDropFileEvent(char *filename) static void HandleDropTextEvent(char *text) { - Error(ERR_DEBUG, "DROP TEXT EVENT: '%s'", text); + Debug("event:droptext", "text == '%s'", text); } static void HandleDropCompleteEvent(int num_level_sets_succeeded, @@ -1804,7 +1827,7 @@ static void HandleKeysSpecial(Key key) cheat_input[cheat_input_len] = '\0'; #if DEBUG_EVENTS_KEY - Error(ERR_DEBUG, "SPECIAL KEY '%s' [%d]\n", cheat_input, cheat_input_len); + Debug("event:key:special", "'%s' [%d]", cheat_input, cheat_input_len); #endif if (game_status == GAME_MODE_MAIN) @@ -1855,19 +1878,15 @@ static void HandleKeysSpecial(Key key) { DumpTape(&tape); } + else if (strSuffix(cheat_input, ":undo-tape") || + strSuffix(cheat_input, ":ut")) + { + UndoTape(); + } else if (strSuffix(cheat_input, ":fix-tape") || strSuffix(cheat_input, ":ft")) { - /* fix single-player tapes that contain player input for more than one - player (due to a bug in 3.3.1.2 and earlier versions), which results - in playing levels with more than one player in multi-player mode, - even though the tape was originally recorded in single-player mode */ - - // remove player input actions for all players but the first one - for (i = 1; i < MAX_PLAYERS; i++) - tape.player_participates[i] = FALSE; - - tape.changed = TRUE; + FixTape_ForceSinglePlayer(); } else if (strSuffix(cheat_input, ":save-native-level") || strSuffix(cheat_input, ":snl")) @@ -1959,13 +1978,13 @@ boolean HandleKeysDebug(Key key, int key_status) SetVideoFrameDelay(GameFrameDelay); if (GameFrameDelay > ONE_SECOND_DELAY) - Error(ERR_INFO, "frame delay == %d ms", GameFrameDelay); + Debug("event:key:debug", "frame delay == %d ms", GameFrameDelay); else if (GameFrameDelay != 0) - Error(ERR_INFO, "frame delay == %d ms (max. %d fps / %d %%)", + Debug("event:key:debug", "frame delay == %d ms (max. %d fps / %d %%)", GameFrameDelay, ONE_SECOND_DELAY / GameFrameDelay, GAME_FRAME_DELAY * 100 / GameFrameDelay); else - Error(ERR_INFO, "frame delay == 0 ms (maximum speed)"); + Debug("event:key:debug", "frame delay == 0 ms (maximum speed)"); return TRUE; } @@ -1978,14 +1997,14 @@ boolean HandleKeysDebug(Key key, int key_status) { options.debug = !options.debug; - Error(ERR_INFO, "debug mode %s", + Debug("event:key:debug", "debug mode %s", (options.debug ? "enabled" : "disabled")); return TRUE; } else if (key == KSYM_v) { - Error(ERR_INFO, "currently using game engine version %d", + Debug("event:key:debug", "currently using game engine version %d", game.engine_version); return TRUE;