static unsigned int special_cursor_delay = 0;
static unsigned int special_cursor_delay_value = 1000;
+
+/* forward declarations for internal use */
+static void HandleNoEvent(void);
+static void HandleEventActions(void);
+
+
/* event filter especially needed for SDL event filtering due to
delay problems with lots of mouse motion events when mouse button
not pressed (X11 can handle this with 'PointerMotionHintMask') */
if (PendingEvent())
HandleEvents();
else
- HandleMouseCursor();
+ HandleNoEvent();
- /* also execute after pending events have been processed before */
- HandleNoEvent();
+ /* execute event related actions after pending events have been processed */
+ HandleEventActions();
/* don't use all CPU time when idle; the main loop while playing
has its own synchronization and is CPU friendly, too */
}
}
+void ClearPlayerMouseAction()
+{
+ local_player->mouse_action.lx = 0;
+ local_player->mouse_action.ly = 0;
+ local_player->mouse_action.button = 0;
+}
+
void ClearPlayerAction()
{
int i;
stored_player[i].action = 0;
ClearJoystickState();
+ ClearPlayerMouseAction();
+}
+
+void SetPlayerMouseAction(int mx, int my, int button)
+{
+ int lx = getLevelFromScreenX(mx);
+ int ly = getLevelFromScreenY(my);
+
+ ClearPlayerMouseAction();
+
+ if (!IN_GFX_FIELD_PLAY(mx, my) || !IN_LEV_FIELD(lx, ly))
+ return;
+
+ local_player->mouse_action.lx = lx;
+ local_player->mouse_action.ly = ly;
+ local_player->mouse_action.button = button;
+
+ if (tape.recording && tape.pausing && tape.use_mouse)
+ {
+ /* prevent button release or motion events from un-pausing a paused game */
+ if (button && !motion_status)
+ TapeTogglePause(TAPE_TOGGLE_MANUAL);
+ }
}
void SleepWhileUnmapped()
break;
case GAME_MODE_PLAYING:
- if (level.game_engine_type == GAME_ENGINE_TYPE_MM)
- ClickElement(mx, my, button);
+ SetPlayerMouseAction(mx, my, button);
+
#if defined(TARGET_SDL2)
- else
- HandleFollowFinger(mx, my, button);
+ HandleFollowFinger(mx, my, button);
#endif
#ifdef DEBUG
has_snapped[pnr] = FALSE;
}
}
- else if (tape.recording && tape.pausing)
+ else if (tape.recording && tape.pausing && !tape.use_mouse)
{
/* prevent key release events from un-pausing a paused game */
if (key_status == KEY_PRESSED && key_action & KEY_ACTION)
}
void HandleNoEvent()
+{
+ HandleMouseCursor();
+
+ switch (game_status)
+ {
+#if defined(TARGET_SDL2)
+ case GAME_MODE_PLAYING:
+ HandleFollowFinger(-1, -1, -1);
+ break;
+#endif
+ }
+}
+
+void HandleEventActions()
{
// if (button_status && game_status != GAME_MODE_PLAYING)
if (button_status && (game_status != GAME_MODE_PLAYING ||
HandleLevelEditorIdle();
break;
-#if defined(TARGET_SDL2)
- case GAME_MODE_PLAYING:
- HandleFollowFinger(-1, -1, -1);
- break;
-#endif
-
default:
break;
}