+2013-12-01
+ * version number set to 3.3.1.3
+
2013-11-24
* version 3.3.1.2 released
sdl:
@$(MAKE_CMD) TARGET=sdl
+sdl2:
+ @$(MAKE_CMD) TARGET=sdl2
+
solaris:
@$(MAKE_CMD) PLATFORM=solaris TARGET=x11
# -----------------------------------------------------------------------------
ifeq ($(TARGET),x11) # compiling for X11 target
-SYS_CFLAGS = -DTARGET_X11 $(X11_INCL)
+SYS_CFLAGS = -DTARGET_X11 $(X11_INCL)
SYS_LDFLAGS = $(X11_LIBS)
endif
ifeq ($(TARGET),sdl) # compiling for SDL target
-SYS_CFLAGS = -DTARGET_SDL $(shell sdl-config --cflags)
+SYS_CFLAGS = -DTARGET_SDL $(shell sdl-config --cflags)
SDL_LIBS = -lSDL_image -lSDL_mixer -lSDL_net -lsmpeg
SYS_LDFLAGS = $(SDL_LIBS) $(shell sdl-config --libs)
endif
+ifeq ($(TARGET),sdl2) # compiling for SDL2 target
+SYS_CFLAGS = -DTARGET_SDL2 $(shell sdl2-config --cflags)
+SDL_LIBS = -lSDL2_image -lSDL2_mixer -lSDL2_net -lsmpeg2
+SYS_LDFLAGS = $(SDL_LIBS) $(shell sdl2-config --libs)
+endif
+
ifeq ($(TARGET),sdl-static) # compiling for SDL target (static)
-SYS_CFLAGS = -DTARGET_SDL $(shell sdl-config --cflags)
+SYS_CFLAGS = -DTARGET_SDL $(shell sdl-config --cflags)
SDL_LIBS = -lSDL_image -lSDL_mixer -lSDL_net -lsmpeg -lmikmod
SYS_LDFLAGS = $(SDL_LIBS) $(shell sdl-config --static-libs)
endif
-#define COMPILE_DATE_STRING "2013-11-26 09:27"
+#define COMPILE_DATE_STRING "2013-12-01 16:17"
#define ENGINES_H
#include "libgame/libgame.h"
+
#include "game_em/export.h"
#include "game_sp/export.h"
delay problems with lots of mouse motion events when mouse button
not pressed (X11 can handle this with 'PointerMotionHintMask') */
-int FilterMouseMotionEvents(const Event *event)
+/* event filter addition for SDL2: as SDL2 does not have a function to enable
+ or disable keyboard auto-repeat, filter repeated keyboard events instead */
+
+int FilterEvents(const Event *event)
{
MotionEvent *motion;
+#if defined(TARGET_SDL2)
+ /* skip repeated key press events if keyboard auto-repeat is disabled */
+ if (event->type == EVENT_KEYPRESS &&
+ event->key.repeat &&
+ !keyrepeat_status)
+ return 0;
+#endif
+
/* non-motion events are directly passed to event handler functions */
if (event->type != EVENT_MOTIONNOTIFY)
return 1;
if (button_status == MB_RELEASED &&
game_status != GAME_MODE_EDITOR && game_status != GAME_MODE_PLAYING)
return 0;
- else
- return 1;
+
+ return 1;
}
/* to prevent delay problems, skip mouse motion events if the very next
void HandleExposeEvent(ExposeEvent *event)
{
-#ifndef TARGET_SDL
+#if !defined(TARGET_SDL)
RedrawPlayfield(FALSE, event->x, event->y, event->width, event->height);
FlushDisplay();
#endif
#include "main.h"
-int FilterMouseMotionEvents(const Event *);
+int FilterEvents(const Event *);
void EventLoop(void);
void HandleOtherEvents(Event *);
void ClearEventQueue(void);
InitVideoDisplay();
InitVideoBuffer(WIN_XSIZE, WIN_YSIZE, DEFAULT_DEPTH, setup.fullscreen);
- InitEventFilter(FilterMouseMotionEvents);
+ InitEventFilter(FilterEvents);
print_timestamp_time("[init video stuff]");
/* get these values from the program 'js' from the joystick package, */
/* set JOYSTICK_PERCENT to a threshold appropriate for your joystick */
-#ifdef TARGET_SDL
+#if defined(TARGET_SDL)
#define JOYSTICK_XLEFT -32767
#define JOYSTICK_XMIDDLE 0
#define JOYSTICK_XRIGHT 32767
#if 1
-#ifdef TARGET_SDL
+#if defined(TARGET_SDL)
static unsigned int getCurrentMS()
{
return SDL_GetTicks();
#else
-#ifdef TARGET_SDL
+#if defined(TARGET_SDL)
static unsigned int mainCounter(int mode)
{
static unsigned int base_ms = 0;
{ KSYM_Meta_R, "XK_Meta_R", "right meta" },
{ KSYM_Alt_L, "XK_Alt_L", "left alt" },
{ KSYM_Alt_R, "XK_Alt_R", "right alt" },
+#if !defined(TARGET_SDL2)
{ KSYM_Super_L, "XK_Super_L", "left super" }, /* Win-L */
{ KSYM_Super_R, "XK_Super_R", "right super" }, /* Win-R */
+#endif
{ KSYM_Mode_switch, "XK_Mode_switch", "mode switch" }, /* Alt-R */
{ KSYM_Multi_key, "XK_Multi_key", "multi key" }, /* Ctrl-R */
{ KSYM_braceright, "XK_braceright", "brace right" },
{ KSYM_asciitilde, "XK_asciitilde", "~" },
+#if !defined(TARGET_SDL2)
/* special (non-ASCII) keys */
{ KSYM_degree, "XK_degree", "°" },
{ KSYM_Adiaeresis, "XK_Adiaeresis", "Ä" },
{ KSYM_odiaeresis, "XK_odiaeresis", "ö" },
{ KSYM_udiaeresis, "XK_udiaeresis", "ü" },
{ KSYM_ssharp, "XK_ssharp", "sharp s" },
+#endif
/* end-of-array identifier */
{ 0, NULL, NULL }
* pcx.c *
***********************************************************/
-#ifndef TARGET_SDL
-
-#include <stdio.h>
-
#include "pcx.h"
#include "misc.h"
+#if !defined(TARGET_SDL)
+
#define PCX_DEBUG 0
#define PCX_MAGIC 0x0a /* first byte in a PCX image file */
#define TARGET_X11_NATIVE
#endif
+#if defined(TARGET_SDL2)
+#ifndef TARGET_SDL
+#define TARGET_SDL
+#endif
+#endif
+
/* ========================================================================= */
/* this should better go into "system.h" or "features.h" (yet to be created) */
}
/* set transparent color */
- SDL_SetColorKey(surface, SDL_SRCCOLORKEY,
+ SDL_SetColorKey(surface, SET_TRANSPARENT_PIXEL,
SDL_MapRGB(surface->format, 0x00, 0x00, 0x00));
SDL_WM_SetIcon(surface, NULL);
UPDATE_BUSY_STATE();
/* create native transparent surface for current image */
- SDL_SetColorKey(sdl_image_tmp, SDL_SRCCOLORKEY,
+ SDL_SetColorKey(sdl_image_tmp, SET_TRANSPARENT_PIXEL,
SDL_MapRGB(sdl_image_tmp->format, 0x00, 0x00, 0x00));
if ((new_bitmap->surface_masked = SDL_DisplayFormat(sdl_image_tmp)) == NULL)
{
#define SURFACE_FLAGS (SDL_SWSURFACE)
+#if defined(TARGET_SDL2)
+#define SET_TRANSPARENT_PIXEL (SDL_TRUE)
+#define UNSET_TRANSPARENT_PIXEL (SDL_FALSE)
+#else
+#define SET_TRANSPARENT_PIXEL (SDL_SRCCOLORKEY)
+#define UNSET_TRANSPARENT_PIXEL (0)
+#endif
+
+#if defined(TARGET_SDL2)
+#define SDL_DisplayFormat(s) (s)
+#endif
+
/* system dependent definitions */
#define TARGET_STRING "SDL"
typedef Uint32 Pixel;
typedef SDL_Cursor *Cursor;
+#if defined(TARGET_SDL2)
+typedef SDL_Keycode Key;
+#else
typedef SDLKey Key;
+#endif
typedef unsigned int KeyMod;
typedef SDL_Event Event;
#define KSYM_Shift_R SDLK_RSHIFT
#define KSYM_Control_L SDLK_LCTRL
#define KSYM_Control_R SDLK_RCTRL
+#if defined(TARGET_SDL2)
+#define KSYM_Meta_L SDLK_LGUI
+#define KSYM_Meta_R SDLK_RGUI
+#else
#define KSYM_Meta_L SDLK_LMETA
#define KSYM_Meta_R SDLK_RMETA
+#endif
#define KSYM_Alt_L SDLK_LALT
#define KSYM_Alt_R SDLK_RALT
+#if !defined(TARGET_SDL2)
#define KSYM_Super_L SDLK_LSUPER
#define KSYM_Super_R SDLK_RSUPER
+#endif
#define KSYM_Mode_switch SDLK_MODE
#define KSYM_Multi_key SDLK_RCTRL
#define KSYM_braceright KSYM_UNDEFINED /* undefined */
#define KSYM_asciitilde KSYM_UNDEFINED /* undefined */
+#if !defined(TARGET_SDL2)
#define KSYM_degree SDLK_WORLD_16
#define KSYM_Adiaeresis SDLK_WORLD_36
#define KSYM_Odiaeresis SDLK_WORLD_54
#define KSYM_odiaeresis SDLK_WORLD_86
#define KSYM_udiaeresis SDLK_WORLD_92
#define KSYM_ssharp SDLK_WORLD_63
+#endif
#ifndef SDLK_A
#define SDLK_A 65
#define KSYM_8 SDLK_8
#define KSYM_9 SDLK_9
+#if defined(TARGET_SDL2)
+#define KSYM_KP_0 SDLK_KP_0
+#define KSYM_KP_1 SDLK_KP_1
+#define KSYM_KP_2 SDLK_KP_2
+#define KSYM_KP_3 SDLK_KP_3
+#define KSYM_KP_4 SDLK_KP_4
+#define KSYM_KP_5 SDLK_KP_5
+#define KSYM_KP_6 SDLK_KP_6
+#define KSYM_KP_7 SDLK_KP_7
+#define KSYM_KP_8 SDLK_KP_8
+#define KSYM_KP_9 SDLK_KP_9
+#else
#define KSYM_KP_0 SDLK_KP0
#define KSYM_KP_1 SDLK_KP1
#define KSYM_KP_2 SDLK_KP2
#define KSYM_KP_7 SDLK_KP7
#define KSYM_KP_8 SDLK_KP8
#define KSYM_KP_9 SDLK_KP9
+#endif
#define KSYM_F1 SDLK_F1
#define KSYM_F2 SDLK_F2
#define KMOD_Shift_R KMOD_RSHIFT
#define KMOD_Control_L KMOD_LCTRL
#define KMOD_Control_R KMOD_RCTRL
+#if defined(TARGET_SDL2)
+#define KMOD_Meta_L KMOD_LGUI
+#define KMOD_Meta_R KMOD_RGUI
+#else
#define KMOD_Meta_L KMOD_LMETA
#define KMOD_Meta_R KMOD_RMETA
+#endif
#define KMOD_Alt_L KMOD_LALT
#define KMOD_Alt_R KMOD_RALT
int button_status = MB_NOT_PRESSED;
boolean motion_status = FALSE;
+#if defined(TARGET_SDL2)
+boolean keyrepeat_status = TRUE;
+#endif
int redraw_mask = REDRAW_NONE;
int redraw_tiles = 0;
#endif
#if defined(TARGET_SDL)
- if (SDL_Init(SDL_INIT_EVENTTHREAD | SDL_INIT_NOPARACHUTE) < 0)
+#if defined(TARGET_SDL2)
+ int sdl_init_flags = SDL_INIT_EVENTS | SDL_INIT_NOPARACHUTE;
+#else
+ int sdl_init_flags = SDL_INIT_EVENTTHREAD | SDL_INIT_NOPARACHUTE;
+#endif
+
+ if (SDL_Init(sdl_init_flags) < 0)
Error(ERR_EXIT, "SDL_Init() failed: %s", SDL_GetError());
SDLNet_Init();
/* execute all pending screen drawing operations */
void FlushDisplay(void)
{
-#ifndef TARGET_SDL
+#if !defined(TARGET_SDL)
XFlush(display);
#endif
}
/* execute and wait for all pending screen drawing operations */
void SyncDisplay(void)
{
-#ifndef TARGET_SDL
+#if !defined(TARGET_SDL)
XSync(display, FALSE);
#endif
}
void KeyboardAutoRepeatOn(void)
{
#if defined(TARGET_SDL)
+#if defined(TARGET_SDL2)
+ keyrepeat_status = TRUE;
+#else
SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY / 2,
SDL_DEFAULT_REPEAT_INTERVAL / 2);
SDL_EnableUNICODE(1);
+#endif
#else
if (display)
XAutoRepeatOn(display);
void KeyboardAutoRepeatOff(void)
{
#if defined(TARGET_SDL)
+#if defined(TARGET_SDL2)
+ keyrepeat_status = FALSE;
+#else
SDL_EnableKeyRepeat(0, SDL_DEFAULT_REPEAT_INTERVAL);
SDL_EnableUNICODE(0);
+#endif
#else
if (display)
XAutoRepeatOff(display);
if (old_bitmap->surface_masked)
SDL_FreeSurface(old_bitmap->surface_masked);
- SDL_SetColorKey(tmp_surface_1, SDL_SRCCOLORKEY,
+ SDL_SetColorKey(tmp_surface_1, SET_TRANSPARENT_PIXEL,
SDL_MapRGB(tmp_surface_1->format, 0x00, 0x00, 0x00));
if ((old_bitmap->surface_masked = SDL_DisplayFormat(tmp_surface_1)) ==NULL)
Error(ERR_EXIT, "SDL_DisplayFormat() failed");
- SDL_SetColorKey(tmp_surface_1, 0, 0); /* reset transparent pixel */
+ SDL_SetColorKey(tmp_surface_1, UNSET_TRANSPARENT_PIXEL, 0);
#endif
}
#endif
if (old_bitmap->surface_masked)
SDL_FreeSurface(old_bitmap->surface_masked);
- SDL_SetColorKey(old_surface, SDL_SRCCOLORKEY,
+ SDL_SetColorKey(old_surface, SET_TRANSPARENT_PIXEL,
SDL_MapRGB(old_surface->format, 0x00, 0x00, 0x00));
if ((old_bitmap->surface_masked = SDL_DisplayFormat(old_surface)) ==NULL)
Error(ERR_EXIT, "SDL_DisplayFormat() failed");
- SDL_SetColorKey(old_surface, 0, 0); /* reset transparent pixel */
+ SDL_SetColorKey(old_surface, UNSET_TRANSPARENT_PIXEL, 0);
#endif
}
#endif
void InitEventFilter(EventFilter filter_function)
{
-#if defined(TARGET_SDL)
/* set event filter to filter out certain events */
+#if defined(TARGET_SDL)
+#if defined(TARGET_SDL2)
+ SDL_SetEventFilter(filter_function, NULL);
+#else
SDL_SetEventFilter(filter_function);
#endif
+#endif
}
boolean PendingEvent(void)
void PeekEvent(Event *event)
{
#if defined(TARGET_SDL)
+#if defined(TARGET_SDL2)
+ SDL_PeepEvents(event, 1, SDL_PEEKEVENT, SDL_FIRSTEVENT, SDL_LASTEVENT);
+#else
SDL_PeepEvents(event, 1, SDL_PEEKEVENT, SDL_ALLEVENTS);
+#endif
#else
XPeekEvent(display, event);
#endif
Key GetEventKey(KeyEvent *event, boolean with_modifiers)
{
#if defined(TARGET_SDL)
+#if defined(TARGET_SDL2)
+ /* key up/down events in SDL2 do not return text characters anymore */
+ return event->keysym.sym;
+#else
#if 0
printf("unicode == '%d', sym == '%d', mod == '0x%04x'\n",
else
return event->keysym.sym;
+#endif
#else
#if 0
/* type definitions */
+#if defined(TARGET_SDL2)
+typedef int (*EventFilter)(void *, Event *);
+#else
typedef int (*EventFilter)(const Event *);
+#endif
/* structure definitions */
extern int button_status;
extern boolean motion_status;
+#if defined(TARGET_SDL2)
+extern boolean keyrepeat_status;
+#endif
extern int redraw_mask;
extern int redraw_tiles;
#define PROGRAM_VERSION_MAJOR 3
#define PROGRAM_VERSION_MINOR 3
#define PROGRAM_VERSION_PATCH 1
-#define PROGRAM_VERSION_BUILD 2
+#define PROGRAM_VERSION_BUILD 3
#define PROGRAM_TITLE_STRING "Rocks'n'Diamonds"
#define PROGRAM_AUTHOR_STRING "Holger Schemel"