Browse Source

added SDL joystick api + SDL_SetHint wrapper (#252)

Josu Igoa 6 years ago
parent
commit
e7c4605ef3
4 changed files with 226 additions and 0 deletions
  1. 92 0
      libs/sdl/sdl.c
  2. 8 0
      libs/sdl/sdl/Event.hx
  3. 74 0
      libs/sdl/sdl/Joystick.hx
  4. 52 0
      libs/sdl/sdl/Sdl.hx

+ 92 - 0
libs/sdl/sdl.c

@@ -46,6 +46,13 @@ typedef enum {
 	TouchDown = 200,
 	TouchUp,
 	TouchMove,
+	JoystickAxisMotion = 300,
+	JoystickBallMotion,
+	JoystickHatMotion,
+	JoystickButtonDown,
+	JoystickButtonUp,
+	JoystickAdded,
+	JoystickRemoved,
 } event_type;
 
 typedef enum {
@@ -77,6 +84,7 @@ typedef struct {
 	int keyCode;
 	bool keyRepeat;
 	int controller;
+	int joystick;
 	int value;
 	int fingerId;
 } event_data;
@@ -129,6 +137,10 @@ HL_PRIM void HL_NAME(gl_options)( int major, int minor, int depth, int stencil,
 	}
 }
 
+HL_PRIM bool HL_NAME(hint_value)( vbyte* name, vbyte* value) {
+	return SDL_SetHint((char*)name, (char*)value) == SDL_TRUE;
+}
+
 HL_PRIM bool HL_NAME(event_loop)( event_data *event ) {
 	while (true) {
 		SDL_Event e;
@@ -273,6 +285,43 @@ HL_PRIM bool HL_NAME(event_loop)( event_data *event ) {
 			event->button = e.caxis.axis;
 			event->value = e.caxis.value;
 			break;
+		case SDL_JOYAXISMOTION:
+			event->type = JoystickAxisMotion;
+			event->joystick = e.jaxis.which;
+			event->button = e.jaxis.axis;
+			event->value = e.jaxis.value;
+			break;
+		case SDL_JOYBALLMOTION:
+			event->type = JoystickBallMotion;
+			event->joystick = e.jball.which;
+			event->button = e.jball.ball;
+			event->mouseXRel = e.jball.xrel;
+			event->mouseYRel = e.jball.yrel;
+			break;
+		case SDL_JOYHATMOTION:
+			event->type = JoystickHatMotion;
+			event->joystick = e.jhat.which;
+			event->button = e.jhat.hat;
+			event->value = e.jhat.value;
+			break;
+		case SDL_JOYBUTTONDOWN:
+			event->type = JoystickButtonDown;
+			event->joystick = e.jbutton.which;
+			event->button = e.jbutton.button;
+			break;
+		case SDL_JOYBUTTONUP:
+			event->type = JoystickButtonUp;
+			event->joystick = e.jbutton.which;
+			event->button = e.jbutton.button;
+			break;
+		case SDL_JOYDEVICEADDED:
+			event->type = JoystickAdded;
+			event->joystick = e.jdevice.which;
+			break;
+		case SDL_JOYDEVICEREMOVED:
+			event->type = JoystickRemoved;
+			event->joystick = e.jdevice.which;
+			break;
 		default:
 			//printf("Unknown event type 0x%X\\n", e.type);
 			continue;
@@ -619,6 +668,49 @@ DEFINE_PRIM(_VOID, haptic_close, THAPTIC);
 DEFINE_PRIM(_I32, haptic_rumble_init, THAPTIC);
 DEFINE_PRIM(_I32, haptic_rumble_play, THAPTIC _F64 _I32);
 
+// joystick
+
+HL_PRIM int HL_NAME(joy_count)() {
+	return SDL_NumJoysticks();
+}
+
+HL_PRIM SDL_Joystick *HL_NAME(joy_open)(int idx) {
+	return SDL_JoystickOpen(idx);
+}
+
+HL_PRIM void HL_NAME(joy_close)(SDL_Joystick *joystick) {
+	SDL_JoystickClose(joystick);
+}
+
+HL_PRIM int HL_NAME(joy_get_axis)(SDL_Joystick *joystick, int axisIdx ){
+	return SDL_JoystickGetAxis(joystick, axisIdx);
+}
+
+HL_PRIM int HL_NAME(joy_get_hat)(SDL_Joystick *joystick, int hatIdx ){
+	return SDL_JoystickGetHat(joystick, hatIdx);
+}
+
+HL_PRIM bool HL_NAME(joy_get_button)(SDL_Joystick *joystick, int btnIdx) {
+	return SDL_JoystickGetButton(joystick, btnIdx) == 1;
+}
+
+HL_PRIM int HL_NAME(joy_get_id)(SDL_Joystick *joystick) {
+	return SDL_JoystickInstanceID(joystick);
+}
+
+HL_PRIM vbyte *HL_NAME(joy_get_name)(SDL_Joystick *joystick) {
+	return (vbyte*)SDL_JoystickName(joystick);
+}
+
+#define TGCTRL _ABSTRACT(sdl_joystick)
+DEFINE_PRIM(_I32, joy_count, _NO_ARG);
+DEFINE_PRIM(TGCTRL, joy_open, _I32);
+DEFINE_PRIM(_VOID, joy_close, TGCTRL);
+DEFINE_PRIM(_I32, joy_get_axis, TGCTRL _I32);
+DEFINE_PRIM(_I32, joy_get_hat, TGCTRL _I32);
+DEFINE_PRIM(_BOOL, joy_get_button, TGCTRL _I32);
+DEFINE_PRIM(_I32, joy_get_id, TGCTRL);
+DEFINE_PRIM(_BYTES, joy_get_name, TGCTRL);
 
 // surface
 

+ 8 - 0
libs/sdl/sdl/Event.hx

@@ -12,6 +12,7 @@ package sdl;
 	public var keyCode : Int;
 	public var keyRepeat : Bool;
 	public var controller : Int;
+	public var joystick : Int;
 	public var value : Int;
 	public var fingerId : Int;
 	public function new() {
@@ -37,6 +38,13 @@ package sdl;
 	var TouchDown	= 200;
 	var TouchUp		= 201;
 	var TouchMove	= 202;
+	var JoystickAxisMotion	= 300;
+	var JoystickBallMotion	= 301;
+	var JoystickHatMotion	= 302;
+	var JoystickButtonDown	= 303;
+	var JoystickButtonUp	= 304;
+	var JoystickAdded		= 305;
+	var JoystickRemoved		= 306;
 }
 
 @:enum abstract WindowStateChange(Int) {

+ 74 - 0
libs/sdl/sdl/Joystick.hx

@@ -0,0 +1,74 @@
+package sdl;
+
+private typedef JoystickPtr = hl.Abstract<"sdl_joystick">;
+
+@:hlNative("sdl")
+class Joystick {
+
+	var ptr : JoystickPtr;
+
+	public var id(get,never) : Int;
+	public var name(get,never) : String;
+
+	public function new( index : Int ){
+		ptr = joyOpen( index );
+	}
+
+	public inline function getAxis( axisId : Int ){
+		return joyGetAxis(ptr,axisId);
+	}
+
+	public inline function getHat( hatId : Int ){
+		return joyGetHat(ptr,hatId);
+	}
+
+	public inline function getButton( btnId : Int ){
+		return joyGetButton(ptr,btnId);
+	}
+
+	public inline function get_id() : Int {
+		return joyGetId(ptr);
+	}
+
+	public inline function get_name() : String {
+		return @:privateAccess String.fromUTF8( joyGetName(ptr) );
+	}
+
+	public function close(){
+		joyClose( ptr );
+		ptr = null;
+	}
+
+	static function joyCount() : Int {
+		return 0;
+	}
+
+	static function joyOpen( idx : Int ) : JoystickPtr {
+		return null;
+	}
+
+	static function joyClose( joystick : JoystickPtr ){
+	}
+
+	static function joyGetAxis( joystick : JoystickPtr, axisId : Int ) : Int {
+		return 0;
+	}
+
+	static function joyGetHat( joystick : JoystickPtr, hatId : Int ) : Int {
+		return 0;
+	}
+
+	static function joyGetButton( joystick : JoystickPtr, btnId : Int ) : Bool {
+		return false;
+	}
+
+	static function joyGetId( joystick : JoystickPtr ) : Int {
+		return -1;
+	}
+
+	static function joyGetName( joystick : JoystickPtr ) : hl.Bytes {
+		return null;
+	}
+
+
+}

+ 52 - 0
libs/sdl/sdl/Sdl.hx

@@ -22,6 +22,9 @@ class Sdl {
 		glOptions(major, minor, depth, stencil, flags, samples);
 	}
 
+	public static function setHint(name:String, value:String) {
+		return @:privateAccess hintValue(name.toUtf8(), value.toUtf8());
+	}
 
 	public static dynamic function onGlContextRetry() {
 		return false;
@@ -47,6 +50,7 @@ class Sdl {
 
 	static function initOnce() return false;
 	static function eventLoop( e : Event ) return false;
+	static function hintValue( name : hl.Bytes, value : hl.Bytes ) return false;
 
 	static var event = new Event();
 	public static function processEvents( onEvent : Event -> Bool ) {
@@ -116,4 +120,52 @@ class Sdl {
 		return @:privateAccess String.fromUTF8(detect_keyboard_layout());
 	}
 
+}
+
+@:enum
+abstract SDLHint(String) from String to String {
+
+	var SDL_HINT_FRAMEBUFFER_ACCELERATION =                 "SDL_FRAMEBUFFER_ACCELERATION";
+	var SDL_HINT_RENDER_DRIVER =                            "SDL_RENDER_DRIVER";
+	var SDL_HINT_RENDER_OPENGL_SHADERS =                    "SDL_RENDER_OPENGL_SHADERS";
+	var SDL_HINT_RENDER_DIRECT3D_THREADSAFE =               "SDL_RENDER_DIRECT3D_THREADSAFE";
+	var SDL_HINT_RENDER_DIRECT3D11_DEBUG =                  "SDL_RENDER_DIRECT3D11_DEBUG";
+	var SDL_HINT_RENDER_SCALE_QUALITY =                     "SDL_RENDER_SCALE_QUALITY";
+	var SDL_HINT_RENDER_VSYNC =                             "SDL_RENDER_VSYNC";
+	var SDL_HINT_VIDEO_ALLOW_SCREENSAVER =                  "SDL_VIDEO_ALLOW_SCREENSAVER";
+	var SDL_HINT_VIDEO_X11_XVIDMODE =                       "SDL_VIDEO_X11_XVIDMODE";
+	var SDL_HINT_VIDEO_X11_XINERAMA =                       "SDL_VIDEO_X11_XINERAMA";
+	var SDL_HINT_VIDEO_X11_XRANDR =                         "SDL_VIDEO_X11_XRANDR";
+	var SDL_HINT_VIDEO_X11_NET_WM_PING =                    "SDL_VIDEO_X11_NET_WM_PING";
+	var SDL_HINT_WINDOW_FRAME_USABLE_WHILE_CURSOR_HIDDEN =  "SDL_WINDOW_FRAME_USABLE_WHILE_CURSOR_HIDDEN";
+	var SDL_HINT_WINDOWS_ENABLE_MESSAGELOOP =               "SDL_WINDOWS_ENABLE_MESSAGELOOP";
+	var SDL_HINT_GRAB_KEYBOARD =                            "SDL_GRAB_KEYBOARD";
+	var SDL_HINT_MOUSE_RELATIVE_MODE_WARP =                 "SDL_MOUSE_RELATIVE_MODE_WARP";
+	var SDL_HINT_VIDEO_MINIMIZE_ON_FOCUS_LOSS =             "SDL_VIDEO_MINIMIZE_ON_FOCUS_LOSS";
+	var SDL_HINT_IDLE_TIMER_DISABLED =                      "SDL_IOS_IDLE_TIMER_DISABLED";
+	var SDL_HINT_ORIENTATIONS =                             "SDL_IOS_ORIENTATIONS";
+	var SDL_HINT_ACCELEROMETER_AS_JOYSTICK =                "SDL_ACCELEROMETER_AS_JOYSTICK";
+	var SDL_HINT_XINPUT_ENABLED =                           "SDL_XINPUT_ENABLED";
+	var SDL_HINT_XINPUT_USE_OLD_JOYSTICK_MAPPING =          "SDL_XINPUT_USE_OLD_JOYSTICK_MAPPING";
+	var SDL_HINT_GAMECONTROLLERCONFIG =                     "SDL_GAMECONTROLLERCONFIG";
+	var SDL_HINT_JOYSTICK_ALLOW_BACKGROUND_EVENTS =         "SDL_JOYSTICK_ALLOW_BACKGROUND_EVENTS";
+	var SDL_HINT_ALLOW_TOPMOST =                            "SDL_ALLOW_TOPMOST";
+	var SDL_HINT_TIMER_RESOLUTION =                         "SDL_TIMER_RESOLUTION";
+	var SDL_HINT_THREAD_STACK_SIZE =                        "SDL_THREAD_STACK_SIZE";
+	var SDL_HINT_VIDEO_HIGHDPI_DISABLED =                   "SDL_VIDEO_HIGHDPI_DISABLED";
+	var SDL_HINT_MAC_CTRL_CLICK_EMULATE_RIGHT_CLICK =       "SDL_MAC_CTRL_CLICK_EMULATE_RIGHT_CLICK";
+	var SDL_HINT_VIDEO_WIN_D3DCOMPILER =                    "SDL_VIDEO_WIN_D3DCOMPILER";
+	var SDL_HINT_VIDEO_WINDOW_SHARE_PIXEL_FORMAT =          "SDL_VIDEO_WINDOW_SHARE_PIXEL_FORMAT";
+	var SDL_HINT_WINRT_PRIVACY_POLICY_URL =                 "SDL_WINRT_PRIVACY_POLICY_URL";
+	var SDL_HINT_WINRT_PRIVACY_POLICY_LABEL =               "SDL_WINRT_PRIVACY_POLICY_LABEL";
+	var SDL_HINT_WINRT_HANDLE_BACK_BUTTON =                 "SDL_WINRT_HANDLE_BACK_BUTTON";
+	var SDL_HINT_VIDEO_MAC_FULLSCREEN_SPACES =              "SDL_VIDEO_MAC_FULLSCREEN_SPACES";
+	var SDL_HINT_MAC_BACKGROUND_APP =                       "SDL_MAC_BACKGROUND_APP";
+	var SDL_HINT_ANDROID_APK_EXPANSION_MAIN_FILE_VERSION =  "SDL_ANDROID_APK_EXPANSION_MAIN_FILE_VERSION";
+	var SDL_HINT_ANDROID_APK_EXPANSION_PATCH_FILE_VERSION = "SDL_ANDROID_APK_EXPANSION_PATCH_FILE_VERSION";
+	var SDL_HINT_IME_INTERNAL_EDITING =                     "SDL_IME_INTERNAL_EDITING";
+	var SDL_HINT_ANDROID_SEPARATE_MOUSE_AND_TOUCH =         "SDL_ANDROID_SEPARATE_MOUSE_AND_TOUCH";
+	var SDL_HINT_EMSCRIPTEN_KEYBOARD_ELEMENT =              "SDL_EMSCRIPTEN_KEYBOARD_ELEMENT";
+	var SDL_HINT_NO_SIGNAL_HANDLERS =                       "SDL_NO_SIGNAL_HANDLERS";
+	var SDL_HINT_WINDOWS_NO_CLOSE_ON_ALT_F4 =               "SDL_WINDOWS_NO_CLOSE_ON_ALT_F4";
 }