// (c) 1995-2014 by Artsoft Entertainment
// Holger Schemel
// info@artsoft.org
-// http://www.artsoft.org/
+// https://www.artsoft.org/
// ----------------------------------------------------------------------------
// system.c
// ============================================================================
boolean motion_status = FALSE;
int wheel_steps = DEFAULT_WHEEL_STEPS;
boolean keyrepeat_status = TRUE;
+boolean textinput_status = FALSE;
int redraw_mask = REDRAW_NONE;
network.server_host = server_host;
network.server_port = server_port;
+
+ network.server_thread = NULL;
+ network.is_server_thread = FALSE;
}
void InitRuntimeInfo()
{
+#if defined(HAS_TOUCH_DEVICE)
+ runtime.uses_touch_device = TRUE;
+#else
runtime.uses_touch_device = FALSE;
+#endif
}
void InitScoresInfo(void)
{
if (program.global_scores)
{
- Error(ERR_DEBUG, "Using global, multi-user scores directory '%s'.",
+ Debug("internal:path", "Using global, multi-user scores directory '%s'.",
global_scores_dir);
- Error(ERR_DEBUG, "Remove to enable single-user scores directory.");
- Error(ERR_DEBUG, "(This enables multipe score entries per user.)");
+ Debug("internal:path", "Remove to enable single-user scores directory.");
+ Debug("internal:path", "(This enables multipe score entries per user.)");
}
else
{
- Error(ERR_DEBUG, "Using private, single-user scores directory.");
+ Debug("internal:path", "Using private, single-user scores directory.");
}
}
#endif
int sdl_init_flags = SDL_INIT_EVENTS | SDL_INIT_NOPARACHUTE;
if (SDL_Init(sdl_init_flags) < 0)
- Error(ERR_EXIT, "SDL_Init() failed: %s", SDL_GetError());
+ Fail("SDL_Init() failed: %s", SDL_GetError());
SDLNet_Init();
}
void InitGfxOtherSettings(void)
{
gfx.cursor_mode = CURSOR_DEFAULT;
- gfx.mouse_x = 0;
- gfx.mouse_y = 0;
+ gfx.cursor_mode_override = CURSOR_UNDEFINED;
+ gfx.cursor_mode_final = gfx.cursor_mode;
+
+ // prevent initially displaying custom mouse cursor in upper left corner
+ gfx.mouse_x = POS_OFFSCREEN;
+ gfx.mouse_y = POS_OFFSCREEN;
}
void InitTileCursorInfo(void)
tile_cursor.sx = 0;
tile_cursor.sy = 0;
+
+ tile_cursor.xsn_debug = FALSE;
}
void InitOverlayInfo(void)
{
- int nr = GRID_ACTIVE_NR();
- int x, y;
-
overlay.enabled = FALSE;
overlay.active = FALSE;
overlay.show_grid = FALSE;
- 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];
-
overlay.grid_button_highlight = CHAR_GRID_BUTTON_NONE;
overlay.grid_button_action = JOY_NO_ACTION;
+ SetOverlayGridSizeAndButtons();
+
#if defined(USE_TOUCH_INPUT_OVERLAY)
if (strEqual(setup.touch.control_type, TOUCH_CONTROL_VIRTUAL_BUTTONS))
overlay.enabled = TRUE;
#endif
}
+void SetOverlayGridSizeAndButtons(void)
+{
+ int nr = GRID_ACTIVE_NR();
+ int x, y;
+
+ 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];
+}
+
void SetTileCursorEnabled(boolean enabled)
{
tile_cursor.enabled = enabled;
video.window_scaling_available = WINDOW_SCALING_STATUS;
+ video.frame_counter = 0;
video.frame_delay = 0;
video.frame_delay_value = GAME_FRAME_DELAY;
Bitmap *new_bitmap;
if (filename == NULL)
- Error(ERR_EXIT, "LoadCustomImage(): cannot find file '%s'", basename);
+ Fail("LoadCustomImage(): cannot find file '%s'", basename);
if ((new_bitmap = LoadImage(filename)) == NULL)
- Error(ERR_EXIT, "LoadImage('%s') failed: %s", basename, GetError());
+ Fail("LoadImage('%s') failed", basename);
return new_bitmap;
}
if (filename == NULL) // (should never happen)
{
- Error(ERR_WARN, "ReloadCustomImage(): cannot find file '%s'", basename);
+ Warn("ReloadCustomImage(): cannot find file '%s'", basename);
+
return;
}
if ((new_bitmap = LoadImage(filename)) == NULL)
{
- Error(ERR_WARN, "LoadImage('%s') failed: %s", basename, GetError());
+ Warn("LoadImage('%s') failed", basename);
+
return;
}
if (bitmap->width != new_bitmap->width ||
bitmap->height != new_bitmap->height)
{
- Error(ERR_WARN, "ReloadCustomImage: new image '%s' has wrong dimensions",
+ Warn("ReloadCustomImage: new image '%s' has wrong dimensions",
filename);
+
FreeBitmap(new_bitmap);
+
return;
}
static struct MouseCursorInfo *cursor_none = NULL;
static struct MouseCursorInfo *cursor_playfield = NULL;
struct MouseCursorInfo *cursor_new;
+ int mode_final = mode;
if (cursor_none == NULL)
cursor_none = get_cursor_from_image(cursor_image_none);
if (cursor_playfield == NULL)
cursor_playfield = get_cursor_from_image(cursor_image_playfield);
- cursor_new = (mode == CURSOR_DEFAULT ? NULL :
- mode == CURSOR_NONE ? cursor_none :
- mode == CURSOR_PLAYFIELD ? cursor_playfield : NULL);
+ if (gfx.cursor_mode_override != CURSOR_UNDEFINED)
+ mode_final = gfx.cursor_mode_override;
+
+ cursor_new = (mode_final == CURSOR_DEFAULT ? NULL :
+ mode_final == CURSOR_NONE ? cursor_none :
+ mode_final == CURSOR_PLAYFIELD ? cursor_playfield : NULL);
SDLSetMouseCursor(cursor_new);
gfx.cursor_mode = mode;
+ gfx.cursor_mode_final = mode_final;
+}
+
+void UpdateRawMousePosition(int mouse_x, int mouse_y)
+{
+ // mouse events do not contain logical screen size corrections yet
+ SDLCorrectRawMousePosition(&mouse_x, &mouse_y);
+
+ mouse_x -= video.screen_xoffset;
+ mouse_y -= video.screen_yoffset;
+
+ gfx.mouse_x = mouse_x;
+ gfx.mouse_y = mouse_y;
+}
+
+void UpdateMousePosition(void)
+{
+ int mouse_x, mouse_y;
+
+ SDL_PumpEvents();
+ SDL_GetMouseState(&mouse_x, &mouse_y);
+
+ UpdateRawMousePosition(mouse_x, mouse_y);
}
// event functions
// ============================================================================
+void InitEventFilter(EventFilter filter_function)
+{
+ SDL_SetEventFilter(filter_function, NULL);
+}
+
boolean PendingEvent(void)
{
return (SDL_PollEvent(NULL) ? TRUE : FALSE);
SDL_PeepEvents(event, 1, SDL_PEEKEVENT, SDL_FIRSTEVENT, SDL_LASTEVENT);
}
+void PumpEvents(void)
+{
+ SDL_PumpEvents();
+}
+
void CheckQuitEvent(void)
{
if (SDL_QuitRequested())
{
KeyMod new_modifier = KMOD_None;
- switch(key)
+ switch (key)
{
case KSYM_Shift_L:
new_modifier = KMOD_Shift_L;
void StartTextInput(int x, int y, int width, int height)
{
+ textinput_status = TRUE;
+
#if defined(HAS_SCREEN_KEYBOARD)
SDL_StartTextInput();
void StopTextInput(void)
{
+ textinput_status = FALSE;
+
#if defined(HAS_SCREEN_KEYBOARD)
SDL_StopTextInput();