#if defined(TARGET_SDL2)
void HandleFingerEvent(FingerEvent *event)
{
+ static int num_events = 0;
+ int max_events = 10;
+
// #if DEBUG_EVENTS
Error(ERR_DEBUG, "FINGER EVENT: 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->pressure);
// #endif
+ int x = (int)(event->x * video.width);
+ int y = (int)(event->y * video.height);
+ int button = MB_LEFTBUTTON;
+
+ Error(ERR_DEBUG, "=> screen x/y %d/%d", x, y);
+
+#if 0
+ if (++num_events >= max_events)
+ CloseAllAndExit(0);
+#endif
+
#if 1
- CloseAllAndExit(0);
-#else
if (event->type == EVENT_FINGERPRESS)
- button_status = event->button;
+ button_status = button;
else
button_status = MB_RELEASED;
- HandleButton(event->x, event->y, button_status, event->button);
+ int max_x = SX + SXSIZE;
+ int max_y = SY + SYSIZE;
+
+ if (game_status == GAME_MODE_PLAYING &&
+ x < max_x)
+ {
+ int key_status = (event->type == EVENT_FINGERRELEASE ? KEY_RELEASED :
+ KEY_PRESSED);
+ Key key = (y < max_y / 3 ? setup.input[0].key.up :
+ y > 2 * max_y / 3 ? setup.input[0].key.down :
+ x < max_x / 3 ? setup.input[0].key.left :
+ x > 2 * max_x / 3 ? setup.input[0].key.right :
+ setup.input[0].key.drop);
+
+ Error(ERR_DEBUG, "=> key == %d, key_status == %d", key, key_status);
+
+ HandleKey(key, key_status);
+ }
+ else
+ {
+ HandleButton(x, y, button_status, button);
+ }
#endif
}
#endif
/* SDL internal variables */
#if defined(TARGET_SDL2)
static SDL_Window *sdl_window = NULL;
-// SDL_Window *sdl_window = NULL;
-// static SDL_Renderer *sdl_renderer = NULL;
+static SDL_Renderer *sdl_renderer = NULL;
+static SDL_Texture *sdl_texture = NULL;
#endif
/* stuff needed to work around SDL/Windows fullscreen drawing bug */
/* functions from SGE library */
void sge_Line(SDL_Surface *, Sint16, Sint16, Sint16, Sint16, Uint32);
+static void UpdateScreen(SDL_Rect *rect)
+{
+#if 1
+ SDL_Surface *screen = backbuffer->surface;
+
+ SDL_UpdateTexture(sdl_texture, NULL, screen->pixels, screen->pitch);
+ SDL_RenderClear(sdl_renderer);
+ SDL_RenderCopy(sdl_renderer, sdl_texture, NULL, NULL);
+ SDL_RenderPresent(sdl_renderer);
+#else
+ if (rect)
+ SDL_UpdateWindowSurfaceRects(sdl_window, rect, 1);
+ else
+ SDL_UpdateWindowSurface(sdl_window);
+#endif
+}
+
static void setFullscreenParameters(char *fullscreen_mode_string)
{
struct ScreenModeInfo *fullscreen_mode;
{
boolean success = TRUE;
#if defined(TARGET_SDL2)
- int surface_flags_fullscreen = SURFACE_FLAGS | SDL_WINDOW_FULLSCREEN;
+ // int surface_flags_fullscreen = SURFACE_FLAGS | SDL_WINDOW_FULLSCREEN;
+ int surface_flags_fullscreen = SURFACE_FLAGS | SDL_WINDOW_FULLSCREEN_DESKTOP;
int surface_flags_window = SURFACE_FLAGS;
#else
int surface_flags_fullscreen = SURFACE_FLAGS | SDL_FULLSCREEN;
{
new_surface = SDL_GetWindowSurface(sdl_window);
- SDL_UpdateWindowSurface(sdl_window); // immediately map window
+ // SDL_UpdateWindowSurface(sdl_window); // immediately map window
+ UpdateScreen(NULL); // immediately map window
}
#else
new_surface = SDL_SetVideoMode(fullscreen_width, fullscreen_height,
/* switch display to window mode */
#if defined(TARGET_SDL2)
+
+#if 1
+ float scale_factor = 1;
+ int test_fullscreen = 0;
+ int surface_flags = (test_fullscreen ? surface_flags_fullscreen :
+ surface_flags_window);
+
+ sdl_window = SDL_CreateWindow(program.window_title,
+ SDL_WINDOWPOS_CENTERED,
+ SDL_WINDOWPOS_CENTERED,
+ (int)(scale_factor * video.width),
+ (int)(scale_factor * video.height),
+ surface_flags);
+
+ if (sdl_window != NULL)
+ {
+ sdl_renderer = SDL_CreateRenderer(sdl_window, -1, 0);
+
+ if (sdl_renderer != NULL)
+ {
+ SDL_RenderSetLogicalSize(sdl_renderer, video.width, video.height);
+ SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "linear");
+
+ sdl_texture = SDL_CreateTexture(sdl_renderer,
+ SDL_PIXELFORMAT_ARGB8888,
+ SDL_TEXTUREACCESS_STREAMING,
+ video.width, video.height);
+
+ if (sdl_texture != NULL)
+ {
+ new_surface = SDL_CreateRGBSurface(0, video.width, video.height, 32,
+ 0x00FF0000,
+ 0x0000FF00,
+ 0x000000FF,
+ 0xFF000000);
+
+ if (new_surface == NULL)
+ Error(ERR_WARN, "SDL_CreateRGBSurface() failed: %s",
+ SDL_GetError());
+ }
+ else
+ {
+ Error(ERR_WARN, "SDL_CreateTexture() failed: %s", SDL_GetError());
+ }
+ }
+ else
+ {
+ Error(ERR_WARN, "SDL_CreateRenderer() failed: %s", SDL_GetError());
+ }
+ }
+ else
+ {
+ Error(ERR_WARN, "SDL_CreateWindow() failed: %s", SDL_GetError());
+ }
+#else
sdl_window = SDL_CreateWindow(program.window_title,
SDL_WINDOWPOS_CENTERED,
SDL_WINDOWPOS_CENTERED,
video.width, video.height,
surface_flags_window);
+
if (sdl_window != NULL)
{
new_surface = SDL_GetWindowSurface(sdl_window);
- SDL_UpdateWindowSurface(sdl_window); // immediately map window
+ // SDL_UpdateWindowSurface(sdl_window); // immediately map window
+ UpdateScreen(NULL); // immediately map window
}
+#endif
+
#else
new_surface = SDL_SetVideoMode(video.width, video.height,
video.depth, surface_flags_window);
if (dst_bitmap == window)
{
// SDL_UpdateWindowSurface(sdl_window);
- SDL_UpdateWindowSurfaceRects(sdl_window, &dst_rect, 1);
+ // SDL_UpdateWindowSurfaceRects(sdl_window, &dst_rect, 1);
+ UpdateScreen(&dst_rect);
}
#else
if (dst_bitmap == window)
if (dst_bitmap == window)
{
// SDL_UpdateWindowSurface(sdl_window);
- SDL_UpdateWindowSurfaceRects(sdl_window, &rect, 1);
+ // SDL_UpdateWindowSurfaceRects(sdl_window, &rect, 1);
+ UpdateScreen(&rect);
}
#else
if (dst_bitmap == window)
#if defined(TARGET_SDL2)
// SDL_UpdateWindowSurface(sdl_window);
- SDL_UpdateWindowSurfaceRects(sdl_window, &dst_rect2, 1);
+ // SDL_UpdateWindowSurfaceRects(sdl_window, &dst_rect2, 1);
+ UpdateScreen(&dst_rect2);
#else
SDL_UpdateRect(surface_screen, dst_x, dst_y, width, height);
#endif
/* only update the region of the screen that is affected from fading */
#if defined(TARGET_SDL2)
// SDL_UpdateWindowSurface(sdl_window);
- SDL_UpdateWindowSurfaceRects(sdl_window, &dst_rect, 1);
+ // SDL_UpdateWindowSurfaceRects(sdl_window, &dst_rect, 1);
+ UpdateScreen(&dst_rect);
#else
SDL_UpdateRect(surface_screen, dst_x, dst_y, width, height);
#endif