Skip to content
Snippets Groups Projects
01_orbital.patch 25.5 KiB
Newer Older
Nagy Tibor's avatar
Nagy Tibor committed
diff -rupNw source-original/build-scripts/config.sub source/build-scripts/config.sub
--- source-original/build-scripts/config.sub	2012-01-19 07:30:05.000000000 +0100
Nagy Tibor's avatar
Nagy Tibor committed
+++ source/build-scripts/config.sub	2018-05-01 17:31:52.766229515 +0200
@@ -1276,7 +1276,7 @@ case $os in
 	-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
 	      | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\
 	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
-	      | -kopensolaris* \
+	      | -kopensolaris* | -redox* \
 	      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
 	      | -aos* | -aros* \
 	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
Nagy Tibor's avatar
Nagy Tibor committed
diff -rupNw source-original/configure.in source/configure.in
--- source-original/configure.in	2012-01-19 07:30:05.000000000 +0100
Nagy Tibor's avatar
Nagy Tibor committed
+++ source/configure.in	2018-05-01 17:31:52.770229654 +0200
Nagy Tibor's avatar
Nagy Tibor committed
@@ -1646,6 +1646,20 @@ AC_HELP_STRING([--enable-video-dummy], [
+dnl Set up the Orbital video driver.
+CheckOrbitalVideo()
+{
+    AC_ARG_ENABLE(video-orbital,
+AC_HELP_STRING([--enable-video-orbital], [use orbital video driver [[default=yes]]]),
+                  , enable_video_orbital=yes)
+    if test x$enable_video_orbital = xyes; then
+        AC_DEFINE(SDL_VIDEO_DRIVER_ORBITAL)
+        SOURCES="$SOURCES $srcdir/src/video/orbital/*.c"
Nagy Tibor's avatar
Nagy Tibor committed
+        SDL_LIBS="$SDL_LIBS -Wl,--gc-sections -lorbital"
+        have_video=yes
+    fi
+}
+
 dnl Check to see if OpenGL support is desired
 AC_ARG_ENABLE(video-opengl,
 AC_HELP_STRING([--enable-video-opengl], [include OpenGL context creation [[default=yes]]]),
Nagy Tibor's avatar
Nagy Tibor committed
@@ -2325,10 +2339,11 @@ case "$host" in
             have_timers=yes
         fi
         ;;
-    *-*-linux*|*-*-uclinux*|*-*-gnu*|*-*-k*bsd*-gnu|*-*-bsdi*|*-*-freebsd*|*-*-dragonfly*|*-*-netbsd*|*-*-openbsd*|*-*-sysv5*|*-*-solaris*|*-*-hpux*|*-*-irix*|*-*-aix*|*-*-osf*)
+    *-*-linux*|*-*-uclinux*|*-*-redox*|*-*-gnu*|*-*-k*bsd*-gnu|*-*-bsdi*|*-*-freebsd*|*-*-dragonfly*|*-*-netbsd*|*-*-openbsd*|*-*-sysv5*|*-*-solaris*|*-*-hpux*|*-*-irix*|*-*-aix*|*-*-osf*)
         case "$host" in
             *-*-linux*)         ARCH=linux ;;
             *-*-uclinux*)       ARCH=linux ;;
+            *-*-redox*)         ARCH=redox ;;
             *-*-kfreebsd*-gnu)  ARCH=kfreebsd-gnu ;;
             *-*-knetbsd*-gnu)   ARCH=knetbsd-gnu ;;
             *-*-kopenbsd*-gnu)  ARCH=kopenbsd-gnu ;;
Nagy Tibor's avatar
Nagy Tibor committed
@@ -2347,6 +2362,7 @@ case "$host" in
         esac
         CheckVisibilityHidden
         CheckDummyVideo
+        CheckOrbitalVideo
         CheckDiskAudio
         CheckDummyAudio
         CheckDLOPEN
Nagy Tibor's avatar
Nagy Tibor committed
diff -rupNw source-original/include/SDL_config.h.in source/include/SDL_config.h.in
--- source-original/include/SDL_config.h.in	2012-01-19 07:30:05.000000000 +0100
Nagy Tibor's avatar
Nagy Tibor committed
+++ source/include/SDL_config.h.in	2018-05-01 17:31:52.770229654 +0200
@@ -268,6 +268,7 @@
 #undef SDL_VIDEO_DRIVER_GGI
 #undef SDL_VIDEO_DRIVER_IPOD
 #undef SDL_VIDEO_DRIVER_NANOX
+#undef SDL_VIDEO_DRIVER_ORBITAL
 #undef SDL_VIDEO_DRIVER_OS2FS
 #undef SDL_VIDEO_DRIVER_PHOTON
 #undef SDL_VIDEO_DRIVER_PICOGUI
Nagy Tibor's avatar
Nagy Tibor committed
diff -rupNw source-original/src/video/orbital/SDL_orbitalevents.c source/src/video/orbital/SDL_orbitalevents.c
--- source-original/src/video/orbital/SDL_orbitalevents.c	1970-01-01 01:00:00.000000000 +0100
Nagy Tibor's avatar
Nagy Tibor committed
+++ source/src/video/orbital/SDL_orbitalevents.c	2018-05-01 17:31:52.770229654 +0200
Nagy Tibor's avatar
Nagy Tibor committed
@@ -0,0 +1,197 @@
+/*
+    SDL - Simple DirectMedia Layer
+    Copyright (C) 1997-2012 Sam Lantinga
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    Sam Lantinga
+    slouken@libsdl.org
+*/
+#include "SDL_config.h"
+
+#include "SDL.h"
+#include "../../events/SDL_sysevents.h"
+#include "../../events/SDL_events_c.h"
+
Nagy Tibor's avatar
Nagy Tibor committed
+#include <orbital.h>
+#include "SDL_orbitalvideo.h"
+#include "SDL_orbitalevents_c.h"
+
+#include <unistd.h>
+
+static SDLKey keymap[128];
+
+/* Static variables so only changes are reported */
Nagy Tibor's avatar
Nagy Tibor committed
+static bool last_button_left = false;
+static bool last_button_middle = false;
+static bool last_button_right = false;
+void ORBITAL_PumpEvents(_THIS)
+{
Nagy Tibor's avatar
Nagy Tibor committed
+    SDL_keysym keysym;
+
+    void* event_iter = orb_window_events(this->hidden->window);
+    OrbEventOption oeo = orb_events_next(event_iter);
+
+    while (oeo.tag != OrbEventOption_None) {
+        switch (oeo.tag) {
+            case OrbEventOption_Key:
Nagy Tibor's avatar
Nagy Tibor committed
+                keysym.unicode = oeo.key.character;
Nagy Tibor's avatar
Nagy Tibor committed
+                keysym.scancode = oeo.key.scancode;
+                keysym.sym = keymap[oeo.key.scancode];
+                keysym.mod = KMOD_NONE;
+
+                SDL_PrivateKeyboard(oeo.key.pressed ? SDL_PRESSED : SDL_RELEASED, &keysym);
+                break;
+            case OrbEventOption_Mouse:
+                SDL_PrivateMouseMotion(0, 0, oeo.mouse.x, oeo.mouse.y);
+                break;
+            case OrbEventOption_Button:
+                if (oeo.button.left ^ last_button_left)
+                    SDL_PrivateMouseButton(oeo.button.left ? SDL_PRESSED : SDL_RELEASED, SDL_BUTTON_LEFT, 0, 0);
+                if (oeo.button.middle ^ last_button_middle)
+                    SDL_PrivateMouseButton(oeo.button.middle ? SDL_PRESSED : SDL_RELEASED, SDL_BUTTON_MIDDLE, 0, 0);
+                if (oeo.button.right ^ last_button_right)
+                    SDL_PrivateMouseButton(oeo.button.right ? SDL_PRESSED : SDL_RELEASED, SDL_BUTTON_RIGHT, 0, 0);
+
+                last_button_left = oeo.button.left;
+                last_button_middle = oeo.button.middle;
+                last_button_right = oeo.button.right;
+                break;
+            case OrbEventOption_Scroll:
+                if (oeo.scroll.y > 0) {
+                    SDL_PrivateMouseButton(SDL_PRESSED, SDL_BUTTON_WHEELUP, 0, 0);
+                    SDL_PrivateMouseButton(SDL_RELEASED, SDL_BUTTON_WHEELUP, 0, 0);
+                } else if (oeo.scroll.y < 0) {
+                    SDL_PrivateMouseButton(SDL_PRESSED, SDL_BUTTON_WHEELDOWN, 0, 0);
+                    SDL_PrivateMouseButton(SDL_RELEASED, SDL_BUTTON_WHEELDOWN, 0, 0);
+                }
+                break;
+            case OrbEventOption_Quit:
+                SDL_PrivateQuit();
+                break;
+            case OrbEventOption_Focus:
+                SDL_PrivateAppActive(oeo.focus.focused, SDL_APPMOUSEFOCUS);
+                break;
+            case OrbEventOption_Move:
+                // oeo.move.x, oeo.move.y
+                break;
+            case OrbEventOption_Resize:
+                SDL_PrivateResize(oeo.resize.width, oeo.resize.height);
+                break;
+            case OrbEventOption_Screen:
+                // oeo.screen.width, oeo.screen.height
+                break;
+            case OrbEventOption_Unknown:
+                // oeo.unknown.code, oeo.unknown.a, oeo.unknown.b
+                break;
+            default:
+                break;
Nagy Tibor's avatar
Nagy Tibor committed
+
+        oeo = orb_events_next(event_iter);
Nagy Tibor's avatar
Nagy Tibor committed
+
+    orb_events_destroy(event_iter);
+}
+
+void ORBITAL_InitOSKeymap(_THIS)
+{
+    int i;
+    for ( i = 0; i < SDL_arraysize(keymap); ++i )
+        keymap[i] = SDLK_UNKNOWN;
+
Nagy Tibor's avatar
Nagy Tibor committed
+    keymap[ORB_KEY_ESC] = SDLK_ESCAPE;
+    keymap[ORB_KEY_1] = SDLK_1;
+    keymap[ORB_KEY_2] = SDLK_2;
+    keymap[ORB_KEY_3] = SDLK_3;
+    keymap[ORB_KEY_4] = SDLK_4;
+    keymap[ORB_KEY_5] = SDLK_5;
+    keymap[ORB_KEY_6] = SDLK_6;
+    keymap[ORB_KEY_7] = SDLK_7;
+    keymap[ORB_KEY_8] = SDLK_8;
+    keymap[ORB_KEY_9] = SDLK_9;
+    keymap[ORB_KEY_0] = SDLK_0;
+    keymap[ORB_KEY_MINUS] = SDLK_MINUS;
+    keymap[ORB_KEY_EQUALS] = SDLK_EQUALS;
+    keymap[ORB_KEY_BKSP] = SDLK_BACKSPACE;
+    keymap[ORB_KEY_TAB] = SDLK_TAB;
+    keymap[ORB_KEY_Q] = SDLK_q;
+    keymap[ORB_KEY_W] = SDLK_w;
+    keymap[ORB_KEY_E] = SDLK_e;
+    keymap[ORB_KEY_R] = SDLK_r;
+    keymap[ORB_KEY_T] = SDLK_t;
+    keymap[ORB_KEY_Y] = SDLK_y;
+    keymap[ORB_KEY_U] = SDLK_u;
+    keymap[ORB_KEY_I] = SDLK_i;
+    keymap[ORB_KEY_O] = SDLK_o;
+    keymap[ORB_KEY_P] = SDLK_p;
+    keymap[ORB_KEY_BRACE_OPEN] = SDLK_LEFTBRACKET;
+    keymap[ORB_KEY_BRACE_CLOSE] = SDLK_RIGHTBRACKET;
+    keymap[ORB_KEY_ENTER] = SDLK_RETURN;
+    keymap[ORB_KEY_CTRL] = SDLK_LCTRL;
+    keymap[ORB_KEY_A] = SDLK_a;
+    keymap[ORB_KEY_S] = SDLK_s;
+    keymap[ORB_KEY_D] = SDLK_d;
+    keymap[ORB_KEY_F] = SDLK_f;
+    keymap[ORB_KEY_G] = SDLK_g;
+    keymap[ORB_KEY_H] = SDLK_h;
+    keymap[ORB_KEY_J] = SDLK_j;
+    keymap[ORB_KEY_K] = SDLK_k;
+    keymap[ORB_KEY_L] = SDLK_l;
+    keymap[ORB_KEY_SEMICOLON] = SDLK_SEMICOLON;
+    keymap[ORB_KEY_QUOTE] = SDLK_QUOTE;
+    keymap[ORB_KEY_TICK] = SDLK_BACKQUOTE;
+    keymap[ORB_KEY_LEFT_SHIFT] = SDLK_LSHIFT;
+    keymap[ORB_KEY_RIGHT_SHIFT] = SDLK_RSHIFT;
+    keymap[ORB_KEY_BACKSLASH] = SDLK_BACKSLASH;
+    keymap[ORB_KEY_Z] = SDLK_z;
+    keymap[ORB_KEY_X] = SDLK_x;
+    keymap[ORB_KEY_C] = SDLK_c;
+    keymap[ORB_KEY_V] = SDLK_v;
+    keymap[ORB_KEY_B] = SDLK_b;
+    keymap[ORB_KEY_N] = SDLK_n;
+    keymap[ORB_KEY_M] = SDLK_m;
+    keymap[ORB_KEY_COMMA] = SDLK_COMMA;
+    keymap[ORB_KEY_PERIOD] = SDLK_PERIOD;
+    keymap[ORB_KEY_SLASH] = SDLK_SLASH;
+    keymap[ORB_KEY_ALT] = SDLK_LALT;
+    keymap[ORB_KEY_SPACE] = SDLK_SPACE;
+    keymap[ORB_KEY_CAPS] = SDLK_CAPSLOCK;
+    keymap[ORB_KEY_F1] = SDLK_F1;
+    keymap[ORB_KEY_F2] = SDLK_F2;
+    keymap[ORB_KEY_F3] = SDLK_F3;
+    keymap[ORB_KEY_F4] = SDLK_F4;
+    keymap[ORB_KEY_F5] = SDLK_F5;
+    keymap[ORB_KEY_F6] = SDLK_F6;
+    keymap[ORB_KEY_F7] = SDLK_F7;
+    keymap[ORB_KEY_F8] = SDLK_F8;
+    keymap[ORB_KEY_F9] = SDLK_F9;
+    keymap[ORB_KEY_F10] = SDLK_F10;
+    keymap[ORB_KEY_F11] = SDLK_F11;
+    keymap[ORB_KEY_F12] = SDLK_F12;
+    keymap[ORB_KEY_HOME] = SDLK_HOME;
+    keymap[ORB_KEY_UP] = SDLK_UP;
+    keymap[ORB_KEY_PGUP] = SDLK_PAGEUP;
+    keymap[ORB_KEY_LEFT] = SDLK_LEFT;
+    keymap[ORB_KEY_RIGHT] = SDLK_RIGHT;
+    keymap[ORB_KEY_END] = SDLK_END;
+    keymap[ORB_KEY_DOWN] = SDLK_DOWN;
+    keymap[ORB_KEY_PGDN] = SDLK_PAGEDOWN;
+    keymap[ORB_KEY_INSERT] = SDLK_INSERT;
+    keymap[ORB_KEY_DEL] = SDLK_DELETE;
+}
+
+/* end of SDL_orbitalevents.c ... */
Nagy Tibor's avatar
Nagy Tibor committed
diff -rupNw source-original/src/video/orbital/SDL_orbitalevents_c.h source/src/video/orbital/SDL_orbitalevents_c.h
--- source-original/src/video/orbital/SDL_orbitalevents_c.h	1970-01-01 01:00:00.000000000 +0100
Nagy Tibor's avatar
Nagy Tibor committed
+++ source/src/video/orbital/SDL_orbitalevents_c.h	2018-05-01 17:31:52.770229654 +0200
@@ -0,0 +1,32 @@
+/*
+    SDL - Simple DirectMedia Layer
+    Copyright (C) 1997-2012 Sam Lantinga
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    Sam Lantinga
+    slouken@libsdl.org
+*/
+#include "SDL_config.h"
+
+#include "SDL_orbitalvideo.h"
+
+/* Variables and functions exported by SDL_sysevents.c to other parts
+   of the native video subsystem (SDL_sysvideo.c)
+*/
+extern void ORBITAL_InitOSKeymap(_THIS);
+extern void ORBITAL_PumpEvents(_THIS);
+
+/* end of SDL_orbitalevents_c.h ... */
Nagy Tibor's avatar
Nagy Tibor committed
diff -rupNw source-original/src/video/orbital/SDL_orbitalmouse.c source/src/video/orbital/SDL_orbitalmouse.c
--- source-original/src/video/orbital/SDL_orbitalmouse.c	1970-01-01 01:00:00.000000000 +0100
Nagy Tibor's avatar
Nagy Tibor committed
+++ source/src/video/orbital/SDL_orbitalmouse.c	2018-05-01 17:31:52.770229654 +0200
@@ -0,0 +1,33 @@
+/*
+    SDL - Simple DirectMedia Layer
+    Copyright (C) 1997-2012 Sam Lantinga
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    Sam Lantinga
+    slouken@libsdl.org
+*/
+#include "SDL_config.h"
+
+#include "SDL_mouse.h"
+#include "../../events/SDL_events_c.h"
+
+#include "SDL_orbitalmouse_c.h"
+
+
+/* The implementation dependent data for the window manager cursor */
+struct WMcursor {
+	int unused;
+};
Nagy Tibor's avatar
Nagy Tibor committed
diff -rupNw source-original/src/video/orbital/SDL_orbitalmouse_c.h source/src/video/orbital/SDL_orbitalmouse_c.h
--- source-original/src/video/orbital/SDL_orbitalmouse_c.h	1970-01-01 01:00:00.000000000 +0100
Nagy Tibor's avatar
Nagy Tibor committed
+++ source/src/video/orbital/SDL_orbitalmouse_c.h	2018-05-01 17:31:52.770229654 +0200
@@ -0,0 +1,26 @@
+/*
+    SDL - Simple DirectMedia Layer
+    Copyright (C) 1997-2012 Sam Lantinga
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    Sam Lantinga
+    slouken@libsdl.org
+*/
+#include "SDL_config.h"
+
+#include "SDL_orbitalvideo.h"
+
+/* Functions to be exported */
Nagy Tibor's avatar
Nagy Tibor committed
diff -rupNw source-original/src/video/orbital/SDL_orbitalvideo.c source/src/video/orbital/SDL_orbitalvideo.c
--- source-original/src/video/orbital/SDL_orbitalvideo.c	1970-01-01 01:00:00.000000000 +0100
Nagy Tibor's avatar
Nagy Tibor committed
+++ source/src/video/orbital/SDL_orbitalvideo.c	2018-05-01 17:32:53.000320923 +0200
@@ -0,0 +1,252 @@
+/*
+    SDL - Simple DirectMedia Layer
+    Copyright (C) 1997-2012 Sam Lantinga
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    Sam Lantinga
+    slouken@libsdl.org
+*/
+#include "SDL_config.h"
+
+/* Orbital SDL video driver implementation
+ *
+ * Initial work by Ryan C. Gordon (icculus@icculus.org). A good portion
+ *  of this was cut-and-pasted from Stephane Peter's work in the AAlib
+ *  SDL video driver.  Renamed to "DUMMY" by Sam Lantinga.
+ *  Repurposed to ORBITAL by Jeremy Soller.
+ */
+
+#include "SDL_video.h"
+#include "SDL_mouse.h"
+#include "../SDL_sysvideo.h"
+#include "../SDL_pixels_c.h"
+#include "../../events/SDL_events_c.h"
+
Nagy Tibor's avatar
Nagy Tibor committed
+#include <orbital.h>
+#include "SDL_orbitalvideo.h"
+#include "SDL_orbitalevents_c.h"
+#include "SDL_orbitalmouse_c.h"
+
+#include <fcntl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
Jeremy Soller's avatar
Jeremy Soller committed
+#include <unistd.h>
+
+#define ORBITALVID_DRIVER_NAME "orbital"
+
+/* Initialization/Query functions */
+static int ORBITAL_VideoInit(_THIS, SDL_PixelFormat *vformat);
+static SDL_Rect **ORBITAL_ListModes(_THIS, SDL_PixelFormat *format, Uint32 flags);
+static SDL_Surface *ORBITAL_SetVideoMode(_THIS, SDL_Surface *current, int width, int height, int bpp, Uint32 flags);
+static int ORBITAL_SetColors(_THIS, int firstcolor, int ncolors, SDL_Color *colors);
+static void ORBITAL_VideoQuit(_THIS);
+static void ORBITAL_SetCaption(_THIS, const char *title, const char *icon);
+
+/* Hardware surface functions */
+static int ORBITAL_AllocHWSurface(_THIS, SDL_Surface *surface);
+static int ORBITAL_LockHWSurface(_THIS, SDL_Surface *surface);
+static void ORBITAL_UnlockHWSurface(_THIS, SDL_Surface *surface);
+static void ORBITAL_FreeHWSurface(_THIS, SDL_Surface *surface);
+
+/* etc. */
+static void ORBITAL_UpdateRects(_THIS, int numrects, SDL_Rect *rects);
+
+/* ORBITAL driver bootstrap functions */
+
+static int ORBITAL_Available(void)
+{
+	return(1);
+}
+
+static void ORBITAL_DeleteDevice(SDL_VideoDevice *device)
+{
+	SDL_free(device->hidden);
+	SDL_free(device);
+}
+
+static SDL_VideoDevice *ORBITAL_CreateDevice(int devindex)
+{
+	SDL_VideoDevice *device;
+
+	/* Initialize all variables that we clean on shutdown */
+	device = (SDL_VideoDevice *)SDL_malloc(sizeof(SDL_VideoDevice));
+	if ( device ) {
+		SDL_memset(device, 0, (sizeof *device));
+		device->hidden = (struct SDL_PrivateVideoData *)
+				SDL_malloc((sizeof *device->hidden));
+	}
+	if ( (device == NULL) || (device->hidden == NULL) ) {
+		SDL_OutOfMemory();
+		if ( device ) {
+			SDL_free(device);
+		}
+		return(0);
+	}
+	SDL_memset(device->hidden, 0, (sizeof *device->hidden));
+
+	/* Set the function pointers */
+	device->VideoInit = ORBITAL_VideoInit;
+	device->ListModes = ORBITAL_ListModes;
+	device->SetVideoMode = ORBITAL_SetVideoMode;
+	device->CreateYUVOverlay = NULL;
+	device->SetColors = ORBITAL_SetColors;
+	device->UpdateRects = ORBITAL_UpdateRects;
+	device->VideoQuit = ORBITAL_VideoQuit;
+	device->AllocHWSurface = ORBITAL_AllocHWSurface;
+	device->CheckHWBlit = NULL;
+	device->FillHWRect = NULL;
+	device->SetHWColorKey = NULL;
+	device->SetHWAlpha = NULL;
+	device->LockHWSurface = ORBITAL_LockHWSurface;
+	device->UnlockHWSurface = ORBITAL_UnlockHWSurface;
+	device->FlipHWSurface = NULL;
+	device->FreeHWSurface = ORBITAL_FreeHWSurface;
+	device->SetCaption = ORBITAL_SetCaption;
+	device->SetIcon = NULL;
+	device->IconifyWindow = NULL;
+	device->GrabInput = NULL;
+	device->GetWMInfo = NULL;
+	device->InitOSKeymap = ORBITAL_InitOSKeymap;
+	device->PumpEvents = ORBITAL_PumpEvents;
+
+	device->free = ORBITAL_DeleteDevice;
+
+	return device;
+}
+
+VideoBootStrap ORBITAL_bootstrap = {
+	ORBITALVID_DRIVER_NAME, "SDL orbital video driver",
+	ORBITAL_Available, ORBITAL_CreateDevice
+};
+
+
+int ORBITAL_VideoInit(_THIS, SDL_PixelFormat *vformat)
+{
+	fprintf(stderr, "WARNING: You are using the SDL orbital video driver!\n");
+
+	/* Determine the screen depth (use default 32-bit depth) */
+	/* we change this during the SDL_SetVideoMode implementation... */
+	vformat->BitsPerPixel = 32;
+	vformat->BytesPerPixel = 4;
+
+	/* We're done! */
+	return(0);
+}
+
+SDL_Rect **ORBITAL_ListModes(_THIS, SDL_PixelFormat *format, Uint32 flags)
+{
+	if (format->BitsPerPixel != 32)
+		return NULL;
+
+	return (SDL_Rect **) -1;
+}
+
+SDL_Surface *ORBITAL_SetVideoMode(_THIS, SDL_Surface *current,
+				int width, int height, int bpp, Uint32 flags)
+{
Jeremy Soller's avatar
Jeremy Soller committed
+	if ( bpp != 32 ) {
+		SDL_SetError("Unsupported color depth - must use 32-bits per pixel");
+		return(NULL);
+	}
+
Nagy Tibor's avatar
Nagy Tibor committed
+	if (this->hidden->window) {
+		orb_window_set_size(this->hidden->window, width, height);
Nagy Tibor's avatar
Nagy Tibor committed
+		uint32_t orb_flags = ORB_WINDOW_ASYNC;
Nagy Tibor's avatar
Nagy Tibor committed
+		if (flags & SDL_RESIZABLE)
Nagy Tibor's avatar
Nagy Tibor committed
+			orb_flags |= ORB_WINDOW_RESIZABLE;
Nagy Tibor's avatar
Nagy Tibor committed
+
Nagy Tibor's avatar
Nagy Tibor committed
+		this->hidden->window = orb_window_new_flags(-1, -1, width, height, "SDL", orb_flags);
Nagy Tibor's avatar
Nagy Tibor committed
+		if (!this->hidden->window) {
+			SDL_SetError("Couldn't create window for requested mode");
+			return(NULL);
+		}
+ 	fprintf(stderr, "Setting mode %dx%d@%d\n", width, height, bpp);
+
+	/* Allocate the new pixel format for the screen */
Nagy Tibor's avatar
Nagy Tibor committed
+	if ( ! SDL_ReallocFormat(current, bpp, 0x00FF0000, 0x0000FF00, 0x000000FF, 0xFF000000) ) {
Nagy Tibor's avatar
Nagy Tibor committed
+		orb_window_destroy(this->hidden->window);
+		this->hidden->window = NULL;
+
+		SDL_SetError("Couldn't allocate new pixel format for requested mode");
+		return(NULL);
+	}
+
+	/* Set up the new mode framebuffer */
+	current->flags = flags /*& SDL_FULLSCREEN*/;
Nagy Tibor's avatar
Nagy Tibor committed
+	current->w = width;
+	current->h = height;
+	current->pitch = width * (bpp / 8);
+	current->pixels = orb_window_data(this->hidden->window);
+
+	/* We're done */
+	return(current);
+}
+
+static void ORBITAL_SetCaption(_THIS, const char *title, const char *icon)
+{
Nagy Tibor's avatar
Nagy Tibor committed
+	if (this->hidden->window)
+		orb_window_set_title(this->hidden->window, title);
+/* We don't actually allow hardware surfaces other than the main one */
+static int ORBITAL_AllocHWSurface(_THIS, SDL_Surface *surface)
+{
+	return(-1);
+}
+static void ORBITAL_FreeHWSurface(_THIS, SDL_Surface *surface)
+{
+	return;
+}
+
+/* We need to wait for vertical retrace on page flipped displays */
+static int ORBITAL_LockHWSurface(_THIS, SDL_Surface *surface)
+{
+	return(0);
+}
+
+static void ORBITAL_UnlockHWSurface(_THIS, SDL_Surface *surface)
+{
+	return;
+}
+
+static void ORBITAL_UpdateRects(_THIS, int numrects, SDL_Rect *rects)
+{
Nagy Tibor's avatar
Nagy Tibor committed
+	if (this->hidden->window) {
+		SDL_SetAlphaChannel(this->screen, SDL_ALPHA_OPAQUE);
Nagy Tibor's avatar
Nagy Tibor committed
+		orb_window_sync(this->hidden->window);
Nagy Tibor's avatar
Nagy Tibor committed
+	}
+}
+
+int ORBITAL_SetColors(_THIS, int firstcolor, int ncolors, SDL_Color *colors)
+{
+	/* do nothing of note. */
+	return(1);
+}
+
+/* Note:  If we are terminated, this could be called in the middle of
+   another SDL video routine -- notably UpdateRects.
+*/
+void ORBITAL_VideoQuit(_THIS)
+{
Nagy Tibor's avatar
Nagy Tibor committed
+	if (this->hidden->window) {
+		orb_window_destroy(this->hidden->window);
+		this->hidden->window = NULL;
+		this->screen->pixels = NULL;
Jeremy Soller's avatar
Jeremy Soller committed
+	}
Nagy Tibor's avatar
Nagy Tibor committed
diff -rupNw source-original/src/video/orbital/SDL_orbitalvideo.h source/src/video/orbital/SDL_orbitalvideo.h
--- source-original/src/video/orbital/SDL_orbitalvideo.h	1970-01-01 01:00:00.000000000 +0100
Nagy Tibor's avatar
Nagy Tibor committed
+++ source/src/video/orbital/SDL_orbitalvideo.h	2018-05-01 17:31:52.770229654 +0200
Nagy Tibor's avatar
Nagy Tibor committed
@@ -0,0 +1,39 @@
+/*
+    SDL - Simple DirectMedia Layer
+    Copyright (C) 1997-2012 Sam Lantinga
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    Sam Lantinga
+    slouken@libsdl.org
+*/
+#include "SDL_config.h"
+
+#ifndef _SDL_orbitalvideo_h
+#define _SDL_orbitalvideo_h
+
+#include "../SDL_sysvideo.h"
+
+/* Hidden "this" pointer for the video functions */
+#define _THIS	SDL_VideoDevice *this
+
+
+/* Private display data */
+
+struct SDL_PrivateVideoData {
Nagy Tibor's avatar
Nagy Tibor committed
+    void *window;
+};
+
+#endif /* _SDL_orbitalvideo_h */
Nagy Tibor's avatar
Nagy Tibor committed
diff -rupNw source-original/src/video/SDL_gamma.c source/src/video/SDL_gamma.c
--- source-original/src/video/SDL_gamma.c	2012-01-19 07:30:06.000000000 +0100
Nagy Tibor's avatar
Nagy Tibor committed
+++ source/src/video/SDL_gamma.c	2018-05-01 17:31:52.770229654 +0200
@@ -35,6 +35,9 @@
 #define log(x)		__ieee754_log(x)
+#include "e_log.h"
+#define log(x)		__ieee754_log(x)
+
 #include "SDL_sysvideo.h"
Nagy Tibor's avatar
Nagy Tibor committed
diff -rupNw source-original/src/video/SDL_sysvideo.h source/src/video/SDL_sysvideo.h
--- source-original/src/video/SDL_sysvideo.h	2012-01-19 07:30:06.000000000 +0100
Nagy Tibor's avatar
Nagy Tibor committed
+++ source/src/video/SDL_sysvideo.h	2018-05-01 17:31:52.770229654 +0200
@@ -410,6 +410,9 @@ extern VideoBootStrap AALIB_bootstrap;
 #if SDL_VIDEO_DRIVER_CACA
 extern VideoBootStrap CACA_bootstrap;
 #endif
+#if SDL_VIDEO_DRIVER_ORBITAL
+extern VideoBootStrap ORBITAL_bootstrap;
+#endif
 #if SDL_VIDEO_DRIVER_DUMMY
 extern VideoBootStrap DUMMY_bootstrap;
 #endif
Nagy Tibor's avatar
Nagy Tibor committed
diff -rupNw source-original/src/video/SDL_video.c source/src/video/SDL_video.c
--- source-original/src/video/SDL_video.c	2012-01-19 07:30:06.000000000 +0100
Nagy Tibor's avatar
Nagy Tibor committed
+++ source/src/video/SDL_video.c	2018-05-01 17:31:52.774229792 +0200
@@ -126,6 +126,9 @@ static VideoBootStrap *bootstrap[] = {
 #if SDL_VIDEO_DRIVER_CACA
 	&CACA_bootstrap,
 #endif
+#if SDL_VIDEO_DRIVER_ORBITAL
+	&ORBITAL_bootstrap,
+#endif
 #if SDL_VIDEO_DRIVER_DUMMY
 	&DUMMY_bootstrap,
 #endif
@@ -726,7 +729,8 @@ SDL_Surface * SDL_SetVideoMode (int widt
 		video->offset_y = 0;
 		mode->offset = 0;
 		SDL_SetClipRect(mode, NULL);
-		SDL_ClearSurface(mode);
+		// Causes blinking under Orbital
+		//SDL_ClearSurface(mode);
 		/* Now adjust the offsets to match the desired mode */
 		video->offset_x = (mode->w-width)/2;