return FALSE;
}
-void HandleEvents()
+static void HandleEvents(void)
{
Event event;
unsigned int event_frame_delay = 0;
}
}
-void HandleMouseCursor()
+static void HandleMouseCursor(void)
{
if (game_status == GAME_MODE_TITLE)
{
}
}
-void ClearEventQueue()
+void ClearAutoRepeatKeyEvents(void)
+{
+ while (PendingEvent())
+ {
+ Event next_event;
+
+ PeekEvent(&next_event);
+
+ /* if event is repeated key press event, remove it from event queue */
+ if (next_event.type == EVENT_KEYPRESS &&
+ next_event.key.repeat)
+ WaitEvent(&next_event);
+ else
+ break;
+ }
+}
+
+void ClearEventQueue(void)
{
Event event;
}
}
-void ClearPlayerMouseAction()
+static void ClearPlayerMouseAction(void)
{
local_player->mouse_action.lx = 0;
local_player->mouse_action.ly = 0;
local_player->mouse_action.button = 0;
}
-void ClearPlayerAction()
+void ClearPlayerAction(void)
{
int i;
ClearPlayerMouseAction();
}
-void SetPlayerMouseAction(int mx, int my, int button)
+static void SetPlayerMouseAction(int mx, int my, int button)
{
int lx = getLevelFromScreenX(mx);
int ly = getLevelFromScreenY(my);
int new_button = (!local_player->mouse_action.button && button);
+ if (local_player->mouse_action.button_hint)
+ button = local_player->mouse_action.button_hint;
+
ClearPlayerMouseAction();
if (!IN_GFX_FIELD_PLAY(mx, my) || !IN_LEV_FIELD(lx, ly))
SetTileCursorXY(lx, ly);
}
-void SleepWhileUnmapped()
+void SleepWhileUnmapped(void)
{
boolean window_unmapped = TRUE;
if (new_display_width != video.display_width ||
new_display_height != video.display_height)
{
+ int nr = GRID_ACTIVE_NR(); // previous screen orientation
+
video.display_width = new_display_width;
video.display_height = new_display_height;
SDLSetScreenProperties();
+
+ // check if screen orientation has changed (should always be true here)
+ if (nr != GRID_ACTIVE_NR())
+ {
+ int x, y;
+
+ if (game_status == GAME_MODE_SETUP)
+ RedrawSetupScreenAfterScreenRotation(nr);
+
+ nr = GRID_ACTIVE_NR();
+
+ overlay.grid_xsize = setup.touch.grid_xsize[nr];
+ overlay.grid_ysize = setup.touch.grid_ysize[nr];
+
+ for (x = 0; x < MAX_GRID_XSIZE; x++)
+ for (y = 0; y < MAX_GRID_YSIZE; y++)
+ overlay.grid_button[x][y] = setup.touch.grid_button[nr][x][y];
+ }
}
}
#endif
Key key;
} touch_info[NUM_TOUCH_FINGERS];
-void HandleFingerEvent_VirtualButtons(FingerEvent *event)
+static void HandleFingerEvent_VirtualButtons(FingerEvent *event)
{
+#if 1
+ int x = event->x * overlay.grid_xsize;
+ int y = event->y * overlay.grid_ysize;
+ int grid_button = overlay.grid_button[x][y];
+ int grid_button_action = GET_ACTION_FROM_GRID_BUTTON(grid_button);
+ Key key = (grid_button == CHAR_GRID_BUTTON_LEFT ? setup.input[0].key.left :
+ grid_button == CHAR_GRID_BUTTON_RIGHT ? setup.input[0].key.right :
+ grid_button == CHAR_GRID_BUTTON_UP ? setup.input[0].key.up :
+ grid_button == CHAR_GRID_BUTTON_DOWN ? setup.input[0].key.down :
+ grid_button == CHAR_GRID_BUTTON_SNAP ? setup.input[0].key.snap :
+ grid_button == CHAR_GRID_BUTTON_DROP ? setup.input[0].key.drop :
+ KSYM_UNDEFINED);
+#else
float ypos = 1.0 - 1.0 / 3.0 * video.display_width / video.display_height;
float event_x = (event->x);
float event_y = (event->y - ypos) / (1 - ypos);
event_y > 2.0 / 3.0 && event_y < 1 ?
setup.input[0].key.down :
KSYM_UNDEFINED);
+#endif
int key_status = (event->type == EVENT_FINGERRELEASE ? KEY_RELEASED :
KEY_PRESSED);
char *key_status_name = (key_status == KEY_RELEASED ? "KEY_RELEASED" :
Error(ERR_DEBUG, "::: key '%s' was '%s' [fingerId: %lld]",
getKeyNameFromKey(key), key_status_name, event->fingerId);
+ if (key_status == KEY_PRESSED)
+ overlay.grid_button_action |= grid_button_action;
+ else
+ overlay.grid_button_action &= ~grid_button_action;
+
// check if we already know this touch event's finger id
for (i = 0; i < NUM_TOUCH_FINGERS; i++)
{
}
}
-void HandleFingerEvent_WipeGestures(FingerEvent *event)
+static void HandleFingerEvent_WipeGestures(FingerEvent *event)
{
static Key motion_key_x = KSYM_UNDEFINED;
static Key motion_key_y = KSYM_UNDEFINED;
return;
if (level.game_engine_type == GAME_ENGINE_TYPE_MM)
+ {
+ if (strEqual(setup.touch.control_type, TOUCH_CONTROL_OFF))
+ local_player->mouse_action.button_hint =
+ (event->type == EVENT_FINGERRELEASE ? MB_NOT_PRESSED :
+ event->x < 0.5 ? MB_LEFTBUTTON :
+ event->x > 0.5 ? MB_RIGHTBUTTON :
+ MB_NOT_PRESSED);
+
return;
+ }
if (strEqual(setup.touch.control_type, TOUCH_CONTROL_VIRTUAL_BUTTONS))
HandleFingerEvent_VirtualButtons(event);
HandleButtonOrFinger_WipeGestures_MM(mx, my, button);
else if (strEqual(setup.touch.control_type, TOUCH_CONTROL_FOLLOW_FINGER))
HandleButtonOrFinger_FollowFinger_MM(mx, my, button);
+ else if (strEqual(setup.touch.control_type, TOUCH_CONTROL_VIRTUAL_BUTTONS))
+ SetPlayerMouseAction(mx, my, button); /* special case */
}
else
{
#if defined(TARGET_SDL2)
-static boolean checkTextInputKeyModState()
+static boolean checkTextInputKeyModState(void)
{
// when playing, only handle raw key events and ignore text input
if (game_status == GAME_MODE_PLAYING)
strEqual(setup.touch.control_type, TOUCH_CONTROL_FOLLOW_FINGER));
#endif
- if (handle_gadgets && HandleGadgets(mx, my, button))
+ if (HandleGlobalAnimClicks(mx, my, button))
{
/* do not handle this button event anymore */
- mx = my = -32; /* force mouse event to be outside screen tiles */
+ return; /* force mouse event not to be handled at all */
}
- if (HandleGlobalAnimClicks(mx, my, button))
+ if (handle_gadgets && HandleGadgets(mx, my, button))
{
/* do not handle this button event anymore */
- return; /* force mouse event not to be handled at all */
+ mx = my = -32; /* force mouse event to be outside screen tiles */
}
if (button_hold && game_status == GAME_MODE_PLAYING && tape.pausing)
{
InsertSolutionTape();
}
+ else if (is_string_suffix(cheat_input, ":play-solution-tape") ||
+ is_string_suffix(cheat_input, ":pst"))
+ {
+ PlaySolutionTape();
+ }
else if (is_string_suffix(cheat_input, ":reload-graphics") ||
is_string_suffix(cheat_input, ":rg"))
{
DumpBrush_Small();
}
}
+
+ /* special key shortcuts for all game modes */
+ if (is_string_suffix(cheat_input, ":dump-event-actions") ||
+ is_string_suffix(cheat_input, ":dea") ||
+ is_string_suffix(cheat_input, ":DEA"))
+ {
+ DumpGadgetIdentifiers();
+ DumpScreenIdentifiers();
+ }
}
void HandleKeysDebug(Key key)
if (game_status == GAME_MODE_MAIN &&
(key == setup.shortcut.toggle_pause || key == KSYM_space))
{
- StartGameActions(options.network, setup.autorecord, level.random_seed);
+ StartGameActions(network.enabled, setup.autorecord, level.random_seed);
return;
}
case GAME_MODE_SETUP:
case GAME_MODE_INFO:
case GAME_MODE_SCORES:
+
+ if (anyTextGadgetActiveOrJustFinished && key != KSYM_Escape)
+ break;
+
switch (key)
{
case KSYM_space:
HandleKeysDebug(key);
}
-void HandleNoEvent()
+void HandleNoEvent(void)
{
HandleMouseCursor();
}
}
-void HandleEventActions()
+void HandleEventActions(void)
{
// if (button_status && game_status != GAME_MODE_PLAYING)
if (button_status && (game_status != GAME_MODE_PLAYING ||
HandleJoystick();
}
-#if defined(NETWORK_AVALIABLE)
- if (options.network)
+ if (network.enabled)
HandleNetworking();
-#endif
switch (game_status)
{
}
}
-static int HandleJoystickForAllPlayers()
+static int HandleJoystickForAllPlayers(void)
{
int i;
int result = 0;
return result;
}
-void HandleJoystick()
+void HandleJoystick(void)
{
static unsigned int joytest_delay = 0;
static unsigned int joytest_delay_value = GADGET_FRAME_DELAY;
case GAME_MODE_INFO:
case GAME_MODE_SCORES:
{
+ if (anyTextGadgetActive())
+ break;
+
if (game_status == GAME_MODE_TITLE)
HandleTitleScreen(0,0,dx,dy, newbutton ? MB_MENU_CHOICE : MB_MENU_MARK);
else if (game_status == GAME_MODE_MAIN)
void HandleSpecialGameControllerButtons(Event *event)
{
#if defined(TARGET_SDL2)
+ int key_status;
+ Key key;
+
switch (event->type)
{
case SDL_CONTROLLERBUTTONDOWN:
- if (event->cbutton.button == SDL_CONTROLLER_BUTTON_START)
- HandleKey(KSYM_space, KEY_PRESSED);
- else if (event->cbutton.button == SDL_CONTROLLER_BUTTON_BACK)
- HandleKey(KSYM_Escape, KEY_PRESSED);
-
+ key_status = KEY_PRESSED;
break;
case SDL_CONTROLLERBUTTONUP:
- if (event->cbutton.button == SDL_CONTROLLER_BUTTON_START)
- HandleKey(KSYM_space, KEY_RELEASED);
- else if (event->cbutton.button == SDL_CONTROLLER_BUTTON_BACK)
- HandleKey(KSYM_Escape, KEY_RELEASED);
+ key_status = KEY_RELEASED;
+ break;
+ default:
+ return;
+ }
+
+ switch (event->cbutton.button)
+ {
+ case SDL_CONTROLLER_BUTTON_START:
+ key = KSYM_space;
break;
+
+ case SDL_CONTROLLER_BUTTON_BACK:
+ key = KSYM_Escape;
+ break;
+
+ default:
+ return;
}
+
+ HandleKey(key, key_status);
#endif
}
#endif
#endif
}
+
+boolean DoKeysymAction(int keysym)
+{
+ if (keysym < 0)
+ {
+ Key key = (Key)(-keysym);
+
+ HandleKey(key, KEY_PRESSED);
+ HandleKey(key, KEY_RELEASED);
+
+ return TRUE;
+ }
+
+ return FALSE;
+}