2013-08-12 20:47:41 -07:00
/*
2016-01-01 00:11:04 -08:00
* Copyright 2011 - 2016 Branimir Karadzic . All rights reserved .
* License : https : //github.com/bkaradzic/bgfx#license-bsd-2-clause
2013-08-12 20:47:41 -07:00
*/
2013-08-14 21:08:46 -07:00
# include "entry_p.h"
# if ENTRY_CONFIG_USE_SDL
2013-08-12 20:47:41 -07:00
2013-08-14 21:08:46 -07:00
# if BX_PLATFORM_WINDOWS
# define SDL_MAIN_HANDLED
# endif // BX_PLATFORM_WINDOWS
2013-08-12 20:47:41 -07:00
2016-01-23 21:07:44 -08:00
# include <bx/bx.h>
2013-08-12 20:47:41 -07:00
# include <SDL2/SDL.h>
2016-01-23 21:07:44 -08:00
BX_PRAGMA_DIAGNOSTIC_PUSH_CLANG ( )
BX_PRAGMA_DIAGNOSTIC_IGNORED_CLANG ( " -Wextern-c-compat " )
2015-04-22 09:30:28 -07:00
# include <SDL2/SDL_syswm.h>
2016-01-23 21:07:44 -08:00
BX_PRAGMA_DIAGNOSTIC_POP_CLANG ( )
2015-09-18 20:16:24 -07:00
# include <bgfx/bgfxplatform.h>
2016-01-24 22:35:49 -08:00
# if defined(None) // X11 defines this...
# undef None
# endif // defined(None)
2013-08-12 20:47:41 -07:00
# include <stdio.h>
# include <bx/thread.h>
2014-10-11 20:42:42 -07:00
# include <bx/handlealloc.h>
2016-01-23 21:07:44 -08:00
# include <bx/readerwriter.h>
2016-02-26 07:59:58 +01:00
# include <bx/crtimpl.h>
2014-10-11 20:42:42 -07:00
# include <tinystl/allocator.h>
# include <tinystl/string.h>
2013-08-12 20:47:41 -07:00
namespace entry
{
2013-08-14 21:08:46 -07:00
static uint8_t translateKeyModifiers ( uint16_t _sdl )
{
uint8_t modifiers = 0 ;
modifiers | = _sdl & KMOD_LALT ? Modifier : : LeftAlt : 0 ;
modifiers | = _sdl & KMOD_RALT ? Modifier : : RightAlt : 0 ;
modifiers | = _sdl & KMOD_LCTRL ? Modifier : : LeftCtrl : 0 ;
modifiers | = _sdl & KMOD_RCTRL ? Modifier : : RightCtrl : 0 ;
modifiers | = _sdl & KMOD_LSHIFT ? Modifier : : LeftShift : 0 ;
modifiers | = _sdl & KMOD_RSHIFT ? Modifier : : RightShift : 0 ;
modifiers | = _sdl & KMOD_LGUI ? Modifier : : LeftMeta : 0 ;
modifiers | = _sdl & KMOD_RGUI ? Modifier : : RightMeta : 0 ;
return modifiers ;
}
static uint8_t s_translateKey [ 256 ] ;
static void initTranslateKey ( uint16_t _sdl , Key : : Enum _key )
{
BX_CHECK ( _sdl < BX_COUNTOF ( s_translateKey ) , " Out of bounds %d. " , _sdl ) ;
s_translateKey [ _sdl & 0xff ] = ( uint8_t ) _key ;
}
static Key : : Enum translateKey ( SDL_Scancode _sdl )
{
return ( Key : : Enum ) s_translateKey [ _sdl & 0xff ] ;
}
2014-12-15 20:58:54 -08:00
static uint8_t s_translateGamepad [ 256 ] ;
static void initTranslateGamepad ( uint8_t _sdl , Key : : Enum _button )
{
s_translateGamepad [ _sdl ] = _button ;
}
static Key : : Enum translateGamepad ( uint8_t _sdl )
{
return Key : : Enum ( s_translateGamepad [ _sdl ] ) ;
}
static uint8_t s_translateGamepadAxis [ 256 ] ;
static void initTranslateGamepadAxis ( uint8_t _sdl , GamepadAxis : : Enum _axis )
{
s_translateGamepadAxis [ _sdl ] = uint8_t ( _axis ) ;
}
static GamepadAxis : : Enum translateGamepadAxis ( uint8_t _sdl )
{
return GamepadAxis : : Enum ( s_translateGamepadAxis [ _sdl ] ) ;
}
2016-01-24 22:17:49 -08:00
struct AxisDpadRemap
{
Key : : Enum first ;
Key : : Enum second ;
} ;
static AxisDpadRemap s_axisDpad [ ] =
{
{ Key : : GamepadLeft , Key : : GamepadRight } ,
{ Key : : GamepadUp , Key : : GamepadDown } ,
{ Key : : None , Key : : None } ,
{ Key : : GamepadLeft , Key : : GamepadRight } ,
{ Key : : GamepadUp , Key : : GamepadDown } ,
{ Key : : None , Key : : None } ,
} ;
2014-12-15 20:58:54 -08:00
struct GamepadSDL
{
GamepadSDL ( )
: m_controller ( NULL )
, m_jid ( INT32_MAX )
{
memset ( m_value , 0 , sizeof ( m_value ) ) ;
// Deadzone values from xinput.h
m_deadzone [ GamepadAxis : : LeftX ] =
m_deadzone [ GamepadAxis : : LeftY ] = 7849 ;
m_deadzone [ GamepadAxis : : RightX ] =
m_deadzone [ GamepadAxis : : RightY ] = 8689 ;
m_deadzone [ GamepadAxis : : LeftZ ] =
m_deadzone [ GamepadAxis : : RightZ ] = 30 ;
}
2016-01-24 22:17:49 -08:00
void create ( const SDL_JoyDeviceEvent & _jev )
{
m_joystick = SDL_JoystickOpen ( _jev . which ) ;
SDL_Joystick * joystick = m_joystick ;
m_jid = SDL_JoystickInstanceID ( joystick ) ;
}
void create ( const SDL_ControllerDeviceEvent & _cev )
2014-12-15 20:58:54 -08:00
{
2016-01-24 22:17:49 -08:00
m_controller = SDL_GameControllerOpen ( _cev . which ) ;
2014-12-15 20:58:54 -08:00
SDL_Joystick * joystick = SDL_GameControllerGetJoystick ( m_controller ) ;
m_jid = SDL_JoystickInstanceID ( joystick ) ;
}
2016-01-24 22:17:49 -08:00
void update ( EventQueue & _eventQueue , WindowHandle _handle , GamepadHandle _gamepad , GamepadAxis : : Enum _axis , int32_t _value )
{
if ( filter ( _axis , & _value ) )
{
_eventQueue . postAxisEvent ( _handle , _gamepad , _axis , _value ) ;
if ( Key : : None ! = s_axisDpad [ _axis ] . first )
{
if ( _value = = 0 )
{
_eventQueue . postKeyEvent ( _handle , s_axisDpad [ _axis ] . first , 0 , false ) ;
_eventQueue . postKeyEvent ( _handle , s_axisDpad [ _axis ] . second , 0 , false ) ;
}
else
{
_eventQueue . postKeyEvent ( _handle
, 0 > _value ? s_axisDpad [ _axis ] . first : s_axisDpad [ _axis ] . second
, 0
, true
) ;
}
}
}
}
2014-12-15 20:58:54 -08:00
void destroy ( )
{
2016-01-24 22:17:49 -08:00
if ( NULL ! = m_controller )
{
SDL_GameControllerClose ( m_controller ) ;
m_controller = NULL ;
}
if ( NULL ! = m_joystick )
{
SDL_JoystickClose ( m_joystick ) ;
m_joystick = NULL ;
}
2014-12-15 20:58:54 -08:00
m_jid = INT32_MAX ;
}
bool filter ( GamepadAxis : : Enum _axis , int32_t * _value )
{
const int32_t old = m_value [ _axis ] ;
const int32_t deadzone = m_deadzone [ _axis ] ;
int32_t value = * _value ;
value = value > deadzone | | value < - deadzone ? value : 0 ;
m_value [ _axis ] = value ;
* _value = value ;
return old ! = value ;
}
int32_t m_value [ GamepadAxis : : Count ] ;
int32_t m_deadzone [ GamepadAxis : : Count ] ;
2016-01-24 22:17:49 -08:00
SDL_Joystick * m_joystick ;
2014-12-15 20:58:54 -08:00
SDL_GameController * m_controller ;
// SDL_Haptic* m_haptic;
SDL_JoystickID m_jid ;
} ;
2013-08-12 20:47:41 -07:00
struct MainThreadEntry
{
int m_argc ;
char * * m_argv ;
static int32_t threadFunc ( void * _userData ) ;
} ;
2014-10-12 09:58:06 -07:00
///
2014-10-12 11:41:04 -07:00
static void * sdlNativeWindowHandle ( SDL_Window * _window )
2014-10-12 09:58:06 -07:00
{
SDL_SysWMinfo wmi ;
SDL_VERSION ( & wmi . version ) ;
if ( ! SDL_GetWindowWMInfo ( _window , & wmi ) )
{
return NULL ;
}
2016-01-04 18:08:46 +01:00
# if BX_PLATFORM_LINUX || BX_PLATFORM_BSD
2014-10-12 11:41:04 -07:00
return ( void * ) wmi . info . x11 . window ;
2014-10-12 09:58:06 -07:00
# elif BX_PLATFORM_OSX
return wmi . info . cocoa . window ;
# elif BX_PLATFORM_WINDOWS
return wmi . info . win . window ;
2016-02-15 19:45:58 +01:00
# elif BX_PLATFORM_STEAMLINK
2016-02-29 20:46:27 -08:00
return wmi . info . vivante . window ;
2014-10-12 09:58:06 -07:00
# endif // BX_PLATFORM_
}
2013-08-14 21:08:46 -07:00
2014-10-11 20:42:42 -07:00
struct Msg
{
Msg ( )
: m_x ( 0 )
, m_y ( 0 )
, m_width ( 0 )
, m_height ( 0 )
, m_flags ( 0 )
{
}
int32_t m_x ;
int32_t m_y ;
uint32_t m_width ;
uint32_t m_height ;
uint32_t m_flags ;
tinystl : : string m_title ;
} ;
2013-08-14 21:08:46 -07:00
2014-10-12 11:41:04 -07:00
static uint32_t s_userEventStart ;
enum SDL_USER_WINDOW
{
SDL_USER_WINDOW_CREATE ,
SDL_USER_WINDOW_DESTROY ,
SDL_USER_WINDOW_SET_TITLE ,
SDL_USER_WINDOW_SET_POS ,
SDL_USER_WINDOW_SET_SIZE ,
SDL_USER_WINDOW_TOGGLE_FRAME ,
2015-03-07 23:38:48 +01:00
SDL_USER_WINDOW_TOGGLE_FULL_SCREEN ,
2014-10-12 11:41:04 -07:00
SDL_USER_WINDOW_MOUSE_LOCK ,
} ;
static void sdlPostEvent ( SDL_USER_WINDOW _type , WindowHandle _handle , Msg * _msg = NULL , uint32_t _code = 0 )
{
SDL_Event event ;
SDL_UserEvent & uev = event . user ;
uev . type = s_userEventStart + _type ;
union { void * p ; WindowHandle h ; } cast ;
cast . h = _handle ;
uev . data1 = cast . p ;
2015-03-07 22:25:06 -08:00
2014-10-12 11:41:04 -07:00
uev . data2 = _msg ;
uev . code = _code ;
SDL_PushEvent ( & event ) ;
}
static WindowHandle getWindowHandle ( const SDL_UserEvent & _uev )
{
union { void * p ; WindowHandle h ; } cast ;
cast . p = _uev . data1 ;
return cast . h ;
}
2013-08-12 20:47:41 -07:00
struct Context
{
Context ( )
2014-10-11 20:42:42 -07:00
: m_width ( ENTRY_DEFAULT_WIDTH )
2013-08-14 21:08:46 -07:00
, m_height ( ENTRY_DEFAULT_HEIGHT )
, m_aspectRatio ( 16.0f / 9.0f )
2015-03-16 15:19:35 +01:00
, m_mx ( 0 )
, m_my ( 0 )
, m_mz ( 0 )
2013-08-14 21:08:46 -07:00
, m_mouseLock ( false )
2015-03-07 23:38:48 +01:00
, m_fullscreen ( false )
2013-08-12 20:47:41 -07:00
{
2013-08-14 21:08:46 -07:00
memset ( s_translateKey , 0 , sizeof ( s_translateKey ) ) ;
initTranslateKey ( SDL_SCANCODE_ESCAPE , Key : : Esc ) ;
initTranslateKey ( SDL_SCANCODE_RETURN , Key : : Return ) ;
initTranslateKey ( SDL_SCANCODE_TAB , Key : : Tab ) ;
initTranslateKey ( SDL_SCANCODE_BACKSPACE , Key : : Backspace ) ;
initTranslateKey ( SDL_SCANCODE_SPACE , Key : : Space ) ;
initTranslateKey ( SDL_SCANCODE_UP , Key : : Up ) ;
initTranslateKey ( SDL_SCANCODE_DOWN , Key : : Down ) ;
initTranslateKey ( SDL_SCANCODE_LEFT , Key : : Left ) ;
initTranslateKey ( SDL_SCANCODE_RIGHT , Key : : Right ) ;
initTranslateKey ( SDL_SCANCODE_PAGEUP , Key : : PageUp ) ;
initTranslateKey ( SDL_SCANCODE_PAGEDOWN , Key : : PageDown ) ;
initTranslateKey ( SDL_SCANCODE_HOME , Key : : Home ) ;
initTranslateKey ( SDL_SCANCODE_END , Key : : End ) ;
initTranslateKey ( SDL_SCANCODE_PRINTSCREEN , Key : : Print ) ;
initTranslateKey ( SDL_SCANCODE_KP_PLUS , Key : : Plus ) ;
initTranslateKey ( SDL_SCANCODE_KP_MINUS , Key : : Minus ) ;
2016-02-29 20:46:27 -08:00
initTranslateKey ( SDL_SCANCODE_GRAVE , Key : : Tilde ) ;
2013-08-14 21:08:46 -07:00
initTranslateKey ( SDL_SCANCODE_F1 , Key : : F1 ) ;
initTranslateKey ( SDL_SCANCODE_F2 , Key : : F2 ) ;
initTranslateKey ( SDL_SCANCODE_F3 , Key : : F3 ) ;
initTranslateKey ( SDL_SCANCODE_F4 , Key : : F4 ) ;
initTranslateKey ( SDL_SCANCODE_F5 , Key : : F5 ) ;
initTranslateKey ( SDL_SCANCODE_F6 , Key : : F6 ) ;
initTranslateKey ( SDL_SCANCODE_F7 , Key : : F7 ) ;
initTranslateKey ( SDL_SCANCODE_F8 , Key : : F8 ) ;
initTranslateKey ( SDL_SCANCODE_F9 , Key : : F9 ) ;
initTranslateKey ( SDL_SCANCODE_F10 , Key : : F10 ) ;
initTranslateKey ( SDL_SCANCODE_F11 , Key : : F11 ) ;
initTranslateKey ( SDL_SCANCODE_F12 , Key : : F12 ) ;
initTranslateKey ( SDL_SCANCODE_KP_0 , Key : : NumPad0 ) ;
initTranslateKey ( SDL_SCANCODE_KP_1 , Key : : NumPad1 ) ;
initTranslateKey ( SDL_SCANCODE_KP_2 , Key : : NumPad2 ) ;
initTranslateKey ( SDL_SCANCODE_KP_3 , Key : : NumPad3 ) ;
initTranslateKey ( SDL_SCANCODE_KP_4 , Key : : NumPad4 ) ;
initTranslateKey ( SDL_SCANCODE_KP_5 , Key : : NumPad5 ) ;
initTranslateKey ( SDL_SCANCODE_KP_6 , Key : : NumPad6 ) ;
initTranslateKey ( SDL_SCANCODE_KP_7 , Key : : NumPad7 ) ;
initTranslateKey ( SDL_SCANCODE_KP_8 , Key : : NumPad8 ) ;
initTranslateKey ( SDL_SCANCODE_KP_9 , Key : : NumPad9 ) ;
initTranslateKey ( SDL_SCANCODE_0 , Key : : Key0 ) ;
initTranslateKey ( SDL_SCANCODE_1 , Key : : Key1 ) ;
initTranslateKey ( SDL_SCANCODE_2 , Key : : Key2 ) ;
initTranslateKey ( SDL_SCANCODE_3 , Key : : Key3 ) ;
initTranslateKey ( SDL_SCANCODE_4 , Key : : Key4 ) ;
initTranslateKey ( SDL_SCANCODE_5 , Key : : Key5 ) ;
initTranslateKey ( SDL_SCANCODE_6 , Key : : Key6 ) ;
initTranslateKey ( SDL_SCANCODE_7 , Key : : Key7 ) ;
initTranslateKey ( SDL_SCANCODE_8 , Key : : Key8 ) ;
initTranslateKey ( SDL_SCANCODE_9 , Key : : Key9 ) ;
initTranslateKey ( SDL_SCANCODE_A , Key : : KeyA ) ;
initTranslateKey ( SDL_SCANCODE_B , Key : : KeyB ) ;
initTranslateKey ( SDL_SCANCODE_C , Key : : KeyC ) ;
initTranslateKey ( SDL_SCANCODE_D , Key : : KeyD ) ;
initTranslateKey ( SDL_SCANCODE_E , Key : : KeyE ) ;
initTranslateKey ( SDL_SCANCODE_F , Key : : KeyF ) ;
initTranslateKey ( SDL_SCANCODE_G , Key : : KeyG ) ;
initTranslateKey ( SDL_SCANCODE_H , Key : : KeyH ) ;
initTranslateKey ( SDL_SCANCODE_I , Key : : KeyI ) ;
initTranslateKey ( SDL_SCANCODE_J , Key : : KeyJ ) ;
initTranslateKey ( SDL_SCANCODE_K , Key : : KeyK ) ;
initTranslateKey ( SDL_SCANCODE_L , Key : : KeyL ) ;
initTranslateKey ( SDL_SCANCODE_M , Key : : KeyM ) ;
initTranslateKey ( SDL_SCANCODE_N , Key : : KeyN ) ;
initTranslateKey ( SDL_SCANCODE_O , Key : : KeyO ) ;
initTranslateKey ( SDL_SCANCODE_P , Key : : KeyP ) ;
initTranslateKey ( SDL_SCANCODE_Q , Key : : KeyQ ) ;
initTranslateKey ( SDL_SCANCODE_R , Key : : KeyR ) ;
initTranslateKey ( SDL_SCANCODE_S , Key : : KeyS ) ;
initTranslateKey ( SDL_SCANCODE_T , Key : : KeyT ) ;
initTranslateKey ( SDL_SCANCODE_U , Key : : KeyU ) ;
initTranslateKey ( SDL_SCANCODE_V , Key : : KeyV ) ;
initTranslateKey ( SDL_SCANCODE_W , Key : : KeyW ) ;
initTranslateKey ( SDL_SCANCODE_X , Key : : KeyX ) ;
initTranslateKey ( SDL_SCANCODE_Y , Key : : KeyY ) ;
initTranslateKey ( SDL_SCANCODE_Z , Key : : KeyZ ) ;
2014-12-15 20:58:54 -08:00
memset ( s_translateGamepad , uint8_t ( Key : : Count ) , sizeof ( s_translateGamepad ) ) ;
initTranslateGamepad ( SDL_CONTROLLER_BUTTON_A , Key : : GamepadA ) ;
initTranslateGamepad ( SDL_CONTROLLER_BUTTON_B , Key : : GamepadB ) ;
initTranslateGamepad ( SDL_CONTROLLER_BUTTON_X , Key : : GamepadX ) ;
initTranslateGamepad ( SDL_CONTROLLER_BUTTON_Y , Key : : GamepadY ) ;
initTranslateGamepad ( SDL_CONTROLLER_BUTTON_LEFTSTICK , Key : : GamepadThumbL ) ;
initTranslateGamepad ( SDL_CONTROLLER_BUTTON_RIGHTSTICK , Key : : GamepadThumbR ) ;
initTranslateGamepad ( SDL_CONTROLLER_BUTTON_LEFTSHOULDER , Key : : GamepadShoulderL ) ;
initTranslateGamepad ( SDL_CONTROLLER_BUTTON_RIGHTSHOULDER , Key : : GamepadShoulderR ) ;
initTranslateGamepad ( SDL_CONTROLLER_BUTTON_DPAD_UP , Key : : GamepadUp ) ;
initTranslateGamepad ( SDL_CONTROLLER_BUTTON_DPAD_DOWN , Key : : GamepadDown ) ;
initTranslateGamepad ( SDL_CONTROLLER_BUTTON_DPAD_LEFT , Key : : GamepadLeft ) ;
initTranslateGamepad ( SDL_CONTROLLER_BUTTON_DPAD_RIGHT , Key : : GamepadRight ) ;
initTranslateGamepad ( SDL_CONTROLLER_BUTTON_BACK , Key : : GamepadBack ) ;
initTranslateGamepad ( SDL_CONTROLLER_BUTTON_START , Key : : GamepadStart ) ;
2014-12-20 10:38:40 -08:00
initTranslateGamepad ( SDL_CONTROLLER_BUTTON_GUIDE , Key : : GamepadGuide ) ;
2014-12-15 20:58:54 -08:00
memset ( s_translateGamepadAxis , uint8_t ( GamepadAxis : : Count ) , sizeof ( s_translateGamepadAxis ) ) ;
initTranslateGamepadAxis ( SDL_CONTROLLER_AXIS_LEFTX , GamepadAxis : : LeftX ) ;
initTranslateGamepadAxis ( SDL_CONTROLLER_AXIS_LEFTY , GamepadAxis : : LeftY ) ;
initTranslateGamepadAxis ( SDL_CONTROLLER_AXIS_TRIGGERLEFT , GamepadAxis : : LeftZ ) ;
initTranslateGamepadAxis ( SDL_CONTROLLER_AXIS_RIGHTX , GamepadAxis : : RightX ) ;
initTranslateGamepadAxis ( SDL_CONTROLLER_AXIS_RIGHTY , GamepadAxis : : RightY ) ;
initTranslateGamepadAxis ( SDL_CONTROLLER_AXIS_TRIGGERRIGHT , GamepadAxis : : RightZ ) ;
2013-08-12 20:47:41 -07:00
}
2015-06-09 22:24:49 -07:00
int run ( int _argc , char * * _argv )
2013-08-12 20:47:41 -07:00
{
2014-10-12 16:41:15 -07:00
m_mte . m_argc = _argc ;
m_mte . m_argv = _argv ;
2013-08-12 20:47:41 -07:00
2014-12-15 20:58:54 -08:00
SDL_Init ( 0
| SDL_INIT_GAMECONTROLLER
) ;
2013-08-12 20:47:41 -07:00
2014-10-11 20:42:42 -07:00
m_windowAlloc . alloc ( ) ;
m_window [ 0 ] = SDL_CreateWindow ( " bgfx "
2013-08-12 20:47:41 -07:00
, SDL_WINDOWPOS_UNDEFINED
, SDL_WINDOWPOS_UNDEFINED
2013-08-14 21:08:46 -07:00
, m_width
, m_height
, SDL_WINDOW_SHOWN
| SDL_WINDOW_RESIZABLE
2013-08-12 20:47:41 -07:00
) ;
2014-10-11 20:42:42 -07:00
m_flags [ 0 ] = 0
| ENTRY_WINDOW_FLAG_ASPECT_RATIO
| ENTRY_WINDOW_FLAG_FRAME
;
s_userEventStart = SDL_RegisterEvents ( 7 ) ;
2013-08-14 21:08:46 -07:00
2014-10-11 20:42:42 -07:00
bgfx : : sdlSetWindow ( m_window [ 0 ] ) ;
2014-10-11 21:55:24 -07:00
bgfx : : renderFrame ( ) ;
2013-08-12 20:47:41 -07:00
m_thread . init ( MainThreadEntry : : threadFunc , & m_mte ) ;
2013-08-14 21:08:46 -07:00
// Force window resolution...
2014-09-21 09:52:55 -07:00
WindowHandle defaultWindow = { 0 } ;
setWindowSize ( defaultWindow , m_width , m_height , true ) ;
2013-08-14 21:08:46 -07:00
2016-02-04 22:54:40 -08:00
bx : : CrtFileReader reader ;
if ( bx : : open ( & reader , " gamecontrollerdb.txt " ) )
2014-12-15 20:58:54 -08:00
{
2016-01-23 21:07:44 -08:00
bx : : AllocatorI * allocator = getAllocator ( ) ;
2016-02-04 22:54:40 -08:00
uint32_t size = ( uint32_t ) bx : : getSize ( & reader ) ;
2016-01-23 21:07:44 -08:00
void * data = BX_ALLOC ( allocator , size ) ;
2016-02-04 22:54:40 -08:00
bx : : read ( & reader , data , size ) ;
bx : : close ( & reader ) ;
2016-01-23 21:07:44 -08:00
SDL_GameControllerAddMapping ( ( char * ) data ) ;
BX_FREE ( allocator , data ) ;
2014-12-15 20:58:54 -08:00
}
2013-08-12 20:47:41 -07:00
bool exit = false ;
SDL_Event event ;
2014-10-11 21:55:24 -07:00
while ( ! exit )
2013-08-12 20:47:41 -07:00
{
2014-10-11 21:55:24 -07:00
bgfx : : renderFrame ( ) ;
2013-08-14 21:08:46 -07:00
2014-10-11 21:55:24 -07:00
while ( SDL_PollEvent ( & event ) )
{
switch ( event . type )
2013-08-14 21:08:46 -07:00
{
2014-10-11 21:55:24 -07:00
case SDL_QUIT :
m_eventQueue . postExitEvent ( ) ;
exit = true ;
break ;
2013-08-14 21:08:46 -07:00
2014-10-11 21:55:24 -07:00
case SDL_MOUSEMOTION :
{
const SDL_MouseMotionEvent & mev = event . motion ;
2015-03-16 15:19:35 +01:00
m_mx = mev . x ;
m_my = mev . y ;
2014-10-12 11:41:04 -07:00
WindowHandle handle = findHandle ( mev . windowID ) ;
2014-10-12 11:51:58 -07:00
if ( isValid ( handle ) )
{
2015-03-16 15:19:35 +01:00
m_eventQueue . postMouseEvent ( handle , m_mx , m_my , m_mz ) ;
2014-10-12 11:51:58 -07:00
}
2014-10-11 21:55:24 -07:00
}
break ;
2013-08-14 21:08:46 -07:00
2014-10-11 21:55:24 -07:00
case SDL_MOUSEBUTTONDOWN :
case SDL_MOUSEBUTTONUP :
{
const SDL_MouseButtonEvent & mev = event . button ;
2014-10-12 11:41:04 -07:00
WindowHandle handle = findHandle ( mev . windowID ) ;
2014-10-12 11:51:58 -07:00
if ( isValid ( handle ) )
{
2014-10-12 14:04:06 -07:00
MouseButton : : Enum button ;
switch ( mev . button )
{
default :
case SDL_BUTTON_LEFT : button = MouseButton : : Left ; break ;
case SDL_BUTTON_MIDDLE : button = MouseButton : : Middle ; break ;
case SDL_BUTTON_RIGHT : button = MouseButton : : Right ; break ;
}
m_eventQueue . postMouseEvent ( handle
, mev . x
, mev . y
, 0
, button
, mev . type = = SDL_MOUSEBUTTONDOWN
) ;
2014-10-12 11:51:58 -07:00
}
2014-10-11 21:55:24 -07:00
}
break ;
2013-08-14 21:08:46 -07:00
2015-03-16 15:19:35 +01:00
case SDL_MOUSEWHEEL :
{
const SDL_MouseWheelEvent & mev = event . wheel ;
m_mz + = mev . y ;
WindowHandle handle = findHandle ( mev . windowID ) ;
if ( isValid ( handle ) )
{
m_eventQueue . postMouseEvent ( handle , m_mx , m_my , m_mz ) ;
}
}
break ;
2015-03-16 22:23:06 -07:00
case SDL_TEXTINPUT :
{
const SDL_TextInputEvent & tev = event . text ;
WindowHandle handle = findHandle ( tev . windowID ) ;
if ( isValid ( handle ) )
{
m_eventQueue . postCharEvent ( handle , 1 , ( const uint8_t * ) tev . text ) ;
}
}
break ;
2014-10-11 21:55:24 -07:00
case SDL_KEYDOWN :
2015-03-09 03:52:09 +01:00
{
const SDL_KeyboardEvent & kev = event . key ;
WindowHandle handle = findHandle ( kev . windowID ) ;
if ( isValid ( handle ) )
{
uint8_t modifiers = translateKeyModifiers ( kev . keysym . mod ) ;
Key : : Enum key = translateKey ( kev . keysym . scancode ) ;
2015-05-03 16:20:41 +02:00
// TODO: These keys are not captured by SDL_TEXTINPUT. Should be probably handled by SDL_TEXTEDITING. This is a workaround for now.
if ( key = = 1 ) // Escape
{
uint8_t pressedChar [ 4 ] ;
pressedChar [ 0 ] = 0x1b ;
m_eventQueue . postCharEvent ( handle , 1 , pressedChar ) ;
}
else if ( key = = 2 ) // Enter
{
uint8_t pressedChar [ 4 ] ;
pressedChar [ 0 ] = 0x0d ;
m_eventQueue . postCharEvent ( handle , 1 , pressedChar ) ;
}
else if ( key = = 5 ) // Backspace
{
uint8_t pressedChar [ 4 ] ;
pressedChar [ 0 ] = 0x08 ;
m_eventQueue . postCharEvent ( handle , 1 , pressedChar ) ;
}
else
{
m_eventQueue . postKeyEvent ( handle , key , modifiers , kev . state = = SDL_PRESSED ) ;
}
2015-03-09 03:52:09 +01:00
}
}
break ;
2016-01-23 21:07:44 -08:00
2014-10-11 21:55:24 -07:00
case SDL_KEYUP :
2013-08-14 21:08:46 -07:00
{
2014-10-11 21:55:24 -07:00
const SDL_KeyboardEvent & kev = event . key ;
2014-10-12 11:41:04 -07:00
WindowHandle handle = findHandle ( kev . windowID ) ;
2014-10-12 11:51:58 -07:00
if ( isValid ( handle ) )
{
uint8_t modifiers = translateKeyModifiers ( kev . keysym . mod ) ;
Key : : Enum key = translateKey ( kev . keysym . scancode ) ;
m_eventQueue . postKeyEvent ( handle , key , modifiers , kev . state = = SDL_PRESSED ) ;
}
2013-08-14 21:08:46 -07:00
}
2014-10-11 21:55:24 -07:00
break ;
2013-08-14 21:08:46 -07:00
2014-10-11 21:55:24 -07:00
case SDL_WINDOWEVENT :
2014-10-11 20:42:42 -07:00
{
2014-10-11 21:55:24 -07:00
const SDL_WindowEvent & wev = event . window ;
switch ( wev . event )
2014-10-11 20:42:42 -07:00
{
2014-10-11 21:55:24 -07:00
case SDL_WINDOWEVENT_RESIZED :
case SDL_WINDOWEVENT_SIZE_CHANGED :
2014-10-12 11:41:04 -07:00
{
WindowHandle handle = findHandle ( wev . windowID ) ;
setWindowSize ( handle , wev . data1 , wev . data2 ) ;
}
2014-10-11 21:55:24 -07:00
break ;
case SDL_WINDOWEVENT_SHOWN :
case SDL_WINDOWEVENT_HIDDEN :
case SDL_WINDOWEVENT_EXPOSED :
case SDL_WINDOWEVENT_MOVED :
case SDL_WINDOWEVENT_MINIMIZED :
case SDL_WINDOWEVENT_MAXIMIZED :
case SDL_WINDOWEVENT_RESTORED :
case SDL_WINDOWEVENT_ENTER :
case SDL_WINDOWEVENT_LEAVE :
case SDL_WINDOWEVENT_FOCUS_GAINED :
case SDL_WINDOWEVENT_FOCUS_LOST :
break ;
case SDL_WINDOWEVENT_CLOSE :
2014-10-12 11:41:04 -07:00
{
WindowHandle handle = findHandle ( wev . windowID ) ;
if ( 0 = = handle . idx )
{
m_eventQueue . postExitEvent ( ) ;
exit = true ;
}
}
2014-10-11 21:55:24 -07:00
break ;
}
}
break ;
2016-01-24 22:17:49 -08:00
case SDL_JOYAXISMOTION :
{
const SDL_JoyAxisEvent & jev = event . jaxis ;
GamepadHandle handle = findGamepad ( jev . which ) ;
if ( isValid ( handle ) )
{
GamepadAxis : : Enum axis = translateGamepadAxis ( jev . axis ) ;
m_gamepad [ handle . idx ] . update ( m_eventQueue , defaultWindow , handle , axis , jev . value ) ;
}
}
break ;
2014-12-15 20:58:54 -08:00
case SDL_CONTROLLERAXISMOTION :
{
const SDL_ControllerAxisEvent & aev = event . caxis ;
GamepadHandle handle = findGamepad ( aev . which ) ;
if ( isValid ( handle ) )
{
GamepadAxis : : Enum axis = translateGamepadAxis ( aev . axis ) ;
2016-01-24 22:17:49 -08:00
m_gamepad [ handle . idx ] . update ( m_eventQueue , defaultWindow , handle , axis , aev . value ) ;
}
}
break ;
case SDL_JOYBUTTONDOWN :
case SDL_JOYBUTTONUP :
{
const SDL_JoyButtonEvent & bev = event . jbutton ;
GamepadHandle handle = findGamepad ( bev . which ) ;
if ( isValid ( handle ) )
{
Key : : Enum key = translateGamepad ( bev . button ) ;
if ( Key : : Count ! = key )
2014-12-15 20:58:54 -08:00
{
2016-01-24 22:17:49 -08:00
m_eventQueue . postKeyEvent ( defaultWindow , key , 0 , event . type = = SDL_JOYBUTTONDOWN ) ;
2014-12-15 20:58:54 -08:00
}
}
}
break ;
case SDL_CONTROLLERBUTTONDOWN :
case SDL_CONTROLLERBUTTONUP :
{
const SDL_ControllerButtonEvent & bev = event . cbutton ;
GamepadHandle handle = findGamepad ( bev . which ) ;
if ( isValid ( handle ) )
{
Key : : Enum key = translateGamepad ( bev . button ) ;
if ( Key : : Count ! = key )
{
m_eventQueue . postKeyEvent ( defaultWindow , key , 0 , event . type = = SDL_CONTROLLERBUTTONDOWN ) ;
}
}
}
break ;
2016-01-24 22:17:49 -08:00
case SDL_JOYDEVICEADDED :
2014-12-15 20:58:54 -08:00
{
2016-01-24 22:17:49 -08:00
GamepadHandle handle = { m_gamepadAlloc . alloc ( ) } ;
if ( isValid ( handle ) )
{
const SDL_JoyDeviceEvent & jev = event . jdevice ;
m_gamepad [ handle . idx ] . create ( jev ) ;
m_eventQueue . postGamepadEvent ( defaultWindow , handle , true ) ;
}
}
break ;
case SDL_JOYDEVICEREMOVED :
{
const SDL_JoyDeviceEvent & jev = event . jdevice ;
GamepadHandle handle = findGamepad ( jev . which ) ;
if ( isValid ( handle ) )
{
m_gamepad [ handle . idx ] . destroy ( ) ;
m_gamepadAlloc . free ( handle . idx ) ;
m_eventQueue . postGamepadEvent ( defaultWindow , handle , false ) ;
}
}
break ;
2014-12-15 20:58:54 -08:00
2016-01-24 22:17:49 -08:00
case SDL_CONTROLLERDEVICEADDED :
{
2014-12-15 20:58:54 -08:00
GamepadHandle handle = { m_gamepadAlloc . alloc ( ) } ;
if ( isValid ( handle ) )
{
2016-01-24 22:17:49 -08:00
const SDL_ControllerDeviceEvent & cev = event . cdevice ;
m_gamepad [ handle . idx ] . create ( cev ) ;
2014-12-17 21:25:00 -08:00
m_eventQueue . postGamepadEvent ( defaultWindow , handle , true ) ;
2014-12-15 20:58:54 -08:00
}
}
break ;
case SDL_CONTROLLERDEVICEREMAPPED :
{
}
break ;
case SDL_CONTROLLERDEVICEREMOVED :
{
const SDL_ControllerDeviceEvent & cev = event . cdevice ;
GamepadHandle handle = findGamepad ( cev . which ) ;
if ( isValid ( handle ) )
{
m_gamepad [ handle . idx ] . destroy ( ) ;
m_gamepadAlloc . free ( handle . idx ) ;
2014-12-17 21:25:00 -08:00
m_eventQueue . postGamepadEvent ( defaultWindow , handle , false ) ;
2014-12-15 20:58:54 -08:00
}
}
break ;
2014-10-11 21:55:24 -07:00
default :
{
2014-10-12 09:58:06 -07:00
const SDL_UserEvent & uev = event . user ;
switch ( uev . type - s_userEventStart )
2014-10-11 21:55:24 -07:00
{
2014-10-12 09:58:06 -07:00
case SDL_USER_WINDOW_CREATE :
2014-10-11 21:55:24 -07:00
{
2014-10-12 11:41:04 -07:00
WindowHandle handle = getWindowHandle ( uev ) ;
2014-10-12 09:58:06 -07:00
Msg * msg = ( Msg * ) uev . data2 ;
m_window [ handle . idx ] = SDL_CreateWindow ( msg - > m_title . c_str ( )
, msg - > m_x
, msg - > m_y
, msg - > m_width
, msg - > m_height
, SDL_WINDOW_SHOWN
| SDL_WINDOW_RESIZABLE
) ;
m_flags [ handle . idx ] = msg - > m_flags ;
void * nwh = sdlNativeWindowHandle ( m_window [ handle . idx ] ) ;
if ( NULL ! = nwh )
{
m_eventQueue . postWindowEvent ( handle , nwh ) ;
m_eventQueue . postSizeEvent ( handle , msg - > m_width , msg - > m_height ) ;
}
delete msg ;
2014-10-11 21:55:24 -07:00
}
2014-10-12 09:58:06 -07:00
break ;
2014-10-11 20:42:42 -07:00
2014-10-12 09:58:06 -07:00
case SDL_USER_WINDOW_DESTROY :
{
2014-10-12 11:41:04 -07:00
WindowHandle handle = getWindowHandle ( uev ) ;
2014-10-12 11:51:58 -07:00
if ( isValid ( handle ) )
{
m_eventQueue . postWindowEvent ( handle ) ;
SDL_DestroyWindow ( m_window [ handle . idx ] ) ;
m_window [ handle . idx ] = NULL ;
}
2014-10-12 09:58:06 -07:00
}
break ;
case SDL_USER_WINDOW_SET_TITLE :
{
2014-10-12 11:41:04 -07:00
WindowHandle handle = getWindowHandle ( uev ) ;
2014-10-12 09:58:06 -07:00
Msg * msg = ( Msg * ) uev . data2 ;
2014-10-12 11:51:58 -07:00
if ( isValid ( handle ) )
{
2015-07-16 20:28:43 -07:00
SDL_SetWindowTitle ( m_window [ handle . idx ] , msg - > m_title . c_str ( ) ) ;
2014-10-12 11:51:58 -07:00
}
2014-10-12 09:58:06 -07:00
delete msg ;
}
break ;
case SDL_USER_WINDOW_SET_POS :
{
2014-10-12 11:41:04 -07:00
WindowHandle handle = getWindowHandle ( uev ) ;
2014-10-12 09:58:06 -07:00
Msg * msg = ( Msg * ) uev . data2 ;
SDL_SetWindowPosition ( m_window [ handle . idx ] , msg - > m_x , msg - > m_y ) ;
delete msg ;
}
break ;
case SDL_USER_WINDOW_SET_SIZE :
{
2014-10-12 11:41:04 -07:00
WindowHandle handle = getWindowHandle ( uev ) ;
Msg * msg = ( Msg * ) uev . data2 ;
2014-10-12 11:51:58 -07:00
if ( isValid ( handle ) )
{
setWindowSize ( handle , msg - > m_width , msg - > m_height ) ;
}
delete msg ;
2014-10-12 09:58:06 -07:00
}
break ;
case SDL_USER_WINDOW_TOGGLE_FRAME :
{
2014-10-12 11:41:04 -07:00
WindowHandle handle = getWindowHandle ( uev ) ;
2014-10-12 11:51:58 -07:00
if ( isValid ( handle ) )
{
m_flags [ handle . idx ] ^ = ENTRY_WINDOW_FLAG_FRAME ;
SDL_SetWindowBordered ( m_window [ handle . idx ] , ( SDL_bool ) ! ! ( m_flags [ handle . idx ] & ENTRY_WINDOW_FLAG_FRAME ) ) ;
}
2014-10-12 09:58:06 -07:00
}
break ;
2015-03-07 23:38:48 +01:00
case SDL_USER_WINDOW_TOGGLE_FULL_SCREEN :
{
2015-03-07 22:25:06 -08:00
WindowHandle handle = getWindowHandle ( uev ) ;
2015-03-07 23:38:48 +01:00
m_fullscreen = ! m_fullscreen ;
SDL_SetWindowFullscreen ( m_window [ handle . idx ] , m_fullscreen ? SDL_WINDOW_FULLSCREEN_DESKTOP : 0 ) ;
}
break ;
2014-10-12 09:58:06 -07:00
case SDL_USER_WINDOW_MOUSE_LOCK :
{
SDL_SetRelativeMouseMode ( ! ! uev . code ? SDL_TRUE : SDL_FALSE ) ;
}
break ;
default :
break ;
2014-10-11 21:55:24 -07:00
}
2013-08-14 21:08:46 -07:00
}
2014-10-11 21:55:24 -07:00
break ;
2013-08-14 21:08:46 -07:00
}
2013-08-12 20:47:41 -07:00
}
}
2014-10-11 21:55:24 -07:00
while ( bgfx : : RenderFrame : : NoContext ! = bgfx : : renderFrame ( ) ) { } ;
2013-08-12 20:47:41 -07:00
m_thread . shutdown ( ) ;
2014-10-11 20:42:42 -07:00
SDL_DestroyWindow ( m_window [ 0 ] ) ;
2013-08-12 20:47:41 -07:00
SDL_Quit ( ) ;
2015-06-09 22:24:49 -07:00
return m_thread . getExitCode ( ) ;
2013-08-12 20:47:41 -07:00
}
2014-10-11 20:42:42 -07:00
WindowHandle findHandle ( uint32_t _windowId )
2013-08-14 21:08:46 -07:00
{
2014-10-11 20:42:42 -07:00
SDL_Window * window = SDL_GetWindowFromID ( _windowId ) ;
return findHandle ( window ) ;
2013-08-14 21:08:46 -07:00
}
2014-10-11 20:42:42 -07:00
WindowHandle findHandle ( SDL_Window * _window )
2013-08-14 21:08:46 -07:00
{
2014-10-11 20:42:42 -07:00
bx : : LwMutexScope scope ( m_lock ) ;
for ( uint32_t ii = 0 , num = m_windowAlloc . getNumHandles ( ) ; ii < num ; + + ii )
{
uint16_t idx = m_windowAlloc . getHandleAt ( ii ) ;
if ( _window = = m_window [ idx ] )
{
WindowHandle handle = { idx } ;
return handle ;
}
}
WindowHandle invalid = { UINT16_MAX } ;
return invalid ;
2013-08-14 21:08:46 -07:00
}
2014-09-21 09:52:55 -07:00
void setWindowSize ( WindowHandle _handle , uint32_t _width , uint32_t _height , bool _force = false )
2013-08-14 21:08:46 -07:00
{
if ( _width ! = m_width
| | _height ! = m_height
| | _force )
{
m_width = _width ;
m_height = _height ;
2014-10-11 20:42:42 -07:00
SDL_SetWindowSize ( m_window [ _handle . idx ] , m_width , m_height ) ;
2014-09-21 09:52:55 -07:00
m_eventQueue . postSizeEvent ( _handle , m_width , m_height ) ;
2013-08-14 21:08:46 -07:00
}
}
2014-12-15 20:58:54 -08:00
GamepadHandle findGamepad ( SDL_JoystickID _jid )
{
for ( uint32_t ii = 0 , num = m_gamepadAlloc . getNumHandles ( ) ; ii < num ; + + ii )
{
uint16_t idx = m_gamepadAlloc . getHandleAt ( ii ) ;
if ( _jid = = m_gamepad [ idx ] . m_jid )
{
GamepadHandle handle = { idx } ;
return handle ;
}
}
GamepadHandle invalid = { UINT16_MAX } ;
return invalid ;
}
2013-08-12 20:47:41 -07:00
MainThreadEntry m_mte ;
bx : : Thread m_thread ;
EventQueue m_eventQueue ;
2014-10-11 20:42:42 -07:00
bx : : LwMutex m_lock ;
2013-08-12 20:47:41 -07:00
2014-10-11 20:42:42 -07:00
bx : : HandleAllocT < ENTRY_CONFIG_MAX_WINDOWS > m_windowAlloc ;
SDL_Window * m_window [ ENTRY_CONFIG_MAX_WINDOWS ] ;
uint32_t m_flags [ ENTRY_CONFIG_MAX_WINDOWS ] ;
2013-08-14 21:08:46 -07:00
2014-12-15 20:58:54 -08:00
bx : : HandleAllocT < ENTRY_CONFIG_MAX_GAMEPADS > m_gamepadAlloc ;
GamepadSDL m_gamepad [ ENTRY_CONFIG_MAX_GAMEPADS ] ;
2013-08-14 21:08:46 -07:00
uint32_t m_width ;
uint32_t m_height ;
float m_aspectRatio ;
int32_t m_mx ;
int32_t m_my ;
2015-03-16 15:19:35 +01:00
int32_t m_mz ;
2013-08-14 21:08:46 -07:00
bool m_mouseLock ;
2015-03-07 23:38:48 +01:00
bool m_fullscreen ;
2013-08-12 20:47:41 -07:00
} ;
static Context s_ctx ;
const Event * poll ( )
{
return s_ctx . m_eventQueue . poll ( ) ;
}
2014-09-22 19:34:10 -07:00
const Event * poll ( WindowHandle _handle )
{
return s_ctx . m_eventQueue . poll ( _handle ) ;
}
2013-08-12 20:47:41 -07:00
void release ( const Event * _event )
{
s_ctx . m_eventQueue . release ( _event ) ;
}
2014-09-22 19:34:10 -07:00
WindowHandle createWindow ( int32_t _x , int32_t _y , uint32_t _width , uint32_t _height , uint32_t _flags , const char * _title )
{
2014-10-11 20:42:42 -07:00
bx : : LwMutexScope scope ( s_ctx . m_lock ) ;
WindowHandle handle = { s_ctx . m_windowAlloc . alloc ( ) } ;
if ( UINT16_MAX ! = handle . idx )
{
Msg * msg = new Msg ;
msg - > m_x = _x ;
msg - > m_y = _y ;
msg - > m_width = _width ;
msg - > m_height = _height ;
msg - > m_title = _title ;
msg - > m_flags = _flags ;
2014-10-12 11:41:04 -07:00
sdlPostEvent ( SDL_USER_WINDOW_CREATE , handle , msg ) ;
2014-10-11 20:42:42 -07:00
}
2014-09-22 19:34:10 -07:00
return handle ;
}
void destroyWindow ( WindowHandle _handle )
{
2014-10-11 20:42:42 -07:00
if ( UINT16_MAX ! = _handle . idx )
{
2014-10-12 11:41:04 -07:00
sdlPostEvent ( SDL_USER_WINDOW_DESTROY , _handle ) ;
2014-10-11 20:42:42 -07:00
bx : : LwMutexScope scope ( s_ctx . m_lock ) ;
s_ctx . m_windowAlloc . free ( _handle . idx ) ;
}
2014-09-22 19:34:10 -07:00
}
void setWindowPos ( WindowHandle _handle , int32_t _x , int32_t _y )
{
2014-10-11 20:42:42 -07:00
Msg * msg = new Msg ;
msg - > m_x = _x ;
msg - > m_y = _y ;
2014-10-12 11:41:04 -07:00
sdlPostEvent ( SDL_USER_WINDOW_SET_POS , _handle , msg ) ;
2014-09-22 19:34:10 -07:00
}
2014-09-21 09:52:55 -07:00
void setWindowSize ( WindowHandle _handle , uint32_t _width , uint32_t _height )
2013-08-12 20:47:41 -07:00
{
2014-10-12 11:41:04 -07:00
Msg * msg = new Msg ;
msg - > m_width = _width ;
msg - > m_height = _height ;
2014-10-11 20:42:42 -07:00
2014-10-12 11:41:04 -07:00
sdlPostEvent ( SDL_USER_WINDOW_SET_SIZE , _handle , msg ) ;
2013-08-12 20:47:41 -07:00
}
2014-09-21 09:52:55 -07:00
void setWindowTitle ( WindowHandle _handle , const char * _title )
2014-08-05 20:57:52 +01:00
{
2014-10-11 20:42:42 -07:00
Msg * msg = new Msg ;
msg - > m_title = _title ;
2014-10-12 11:41:04 -07:00
sdlPostEvent ( SDL_USER_WINDOW_SET_TITLE , _handle , msg ) ;
2014-08-05 20:57:52 +01:00
}
2014-09-21 09:52:55 -07:00
void toggleWindowFrame ( WindowHandle _handle )
2013-08-12 20:47:41 -07:00
{
2014-10-12 11:41:04 -07:00
sdlPostEvent ( SDL_USER_WINDOW_TOGGLE_FRAME , _handle ) ;
2013-08-12 20:47:41 -07:00
}
2015-03-07 23:38:48 +01:00
void toggleFullscreen ( WindowHandle _handle )
{
sdlPostEvent ( SDL_USER_WINDOW_TOGGLE_FULL_SCREEN , _handle ) ;
}
2014-09-21 09:52:55 -07:00
void setMouseLock ( WindowHandle _handle , bool _lock )
2013-08-12 20:47:41 -07:00
{
2014-10-12 11:41:04 -07:00
sdlPostEvent ( SDL_USER_WINDOW_MOUSE_LOCK , _handle , NULL , _lock ) ;
2013-08-12 20:47:41 -07:00
}
int32_t MainThreadEntry : : threadFunc ( void * _userData )
{
MainThreadEntry * self = ( MainThreadEntry * ) _userData ;
int32_t result = main ( self - > m_argc , self - > m_argv ) ;
SDL_Event event ;
2013-08-14 21:08:46 -07:00
SDL_QuitEvent & qev = event . quit ;
qev . type = SDL_QUIT ;
2013-08-12 20:47:41 -07:00
SDL_PushEvent ( & event ) ;
return result ;
}
} // namespace entry
2014-10-12 16:41:15 -07:00
int main ( int _argc , char * * _argv )
2013-08-12 20:47:41 -07:00
{
using namespace entry ;
2015-06-09 22:24:49 -07:00
return s_ctx . run ( _argc , _argv ) ;
2013-08-12 20:47:41 -07:00
}
2013-08-14 21:08:46 -07:00
# endif // ENTRY_CONFIG_USE_SDL