|
@@ -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
|
|
|
|