123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332 |
- ' Copyright (c) 2014-2022 Bruce A Henderson
- '
- ' This software is provided 'as-is', without any express or implied
- ' warranty. In no event will the authors be held liable for any damages
- ' arising from the use of this software.
- '
- ' Permission is granted to anyone to use this software for any purpose,
- ' including commercial applications, and to alter it and redistribute it
- ' freely, subject to the following restrictions:
- '
- ' 1. The origin of this software must not be misrepresented; you must not
- ' claim that you wrote the original software. If you use this software
- ' in a product, an acknowledgment in the product documentation would be
- ' appreciated but is not required.
- '
- ' 2. Altered source versions must be plainly marked as such, and must not be
- ' misrepresented as being the original software.
- '
- ' 3. This notice may not be removed or altered from any source
- ' distribution.
- '
- SuperStrict
- Rem
- bbdoc: SDL System driver
- End Rem
- Module SDL.SDLSystem
- Import SDL.SDL
- Import BRL.System
- Import BRL.LinkedList
- Import Pub.NFD
- Import Brl.StringBuilder
- Import "common.bmx"
- Global _sdl_WarpMouse(x:Int, y:Int)
- Type TSDLSystemDriver Extends TSystemDriver
- Field _eventFilterCallback:Int(data:Object, event:Int)
- Field _eventFilterUserData:Object
- Method New()
- SDL_Init(SDL_INIT_EVENTS)
- bmx_SDL_SetEventFilter(Self)
- OnEnd(SDL_Quit)
- End Method
- Method Poll() Override
- bmx_SDL_Poll()
- End Method
-
- Method Wait() Override
- bmx_SDL_WaitEvent()
- End Method
- Method Emit( osevent:Byte Ptr,source:Object )
- ' TODO
- End Method
- Method SetMouseVisible( visible:Int ) Override
- SDL_ShowCursor(visible)
- End Method
- Method MoveMouse( x:Int,y:Int ) Override
- If _sdl_WarpMouse Then
- _sdl_WarpMouse(x, y)
- End If
- End Method
- Method Notify( Text:String,serious:Int ) Override
- Local res:Int = bmx_SDL_ShowSimpleMessageBox(Text, AppTitle, serious)
- ' failed to display message box?
- If res Then
- WriteStdout Text+"~r~n"
- End If
- End Method
-
- Method Confirm:Int( Text:String,serious:Int ) Override
- Return bmx_SDL_ShowMessageBox_confirm(Text, AppTitle, serious)
- End Method
-
- Method Proceed:Int( Text:String,serious:Int ) Override
- Return bmx_SDL_ShowMessageBox_proceed(Text, AppTitle, serious)
- End Method
- Method RequestFile:String( Text:String,exts:String,save:Int,file:String ) Override
- ?Not haiku and Not ios
- Local requestedFile:String
-
- Local res:Int
- Local defaultPath:Byte Ptr
- Local outPath:Byte Ptr
- Local filterList:Byte Ptr
- If file Then
- defaultPath = file.ToUTF8String()
- End If
- If exts Then
- Local groups:String[] = exts.Split(";")
- Local sb:TStringBuilder = New TStringBuilder
- For Local group:String = EachIn groups
- Local i:Int = group.Find(":")
- Local ext:String
- If i > -1 Then
- ext = group[i + 1..]
- Else
- ext = group
- End If
- If ext <> "*" Then
- If sb.Length() Then
- sb.Append(";")
- End If
- sb.Append(ext)
- End If
- Next
- filterList = sb.ToString().ToUTF8String()
- End If
-
- If save Then
- res = NFD_SaveDialog(filterList, defaultPath, Varptr outPath)
- Else
- res = NFD_OpenDialog(filterList, defaultPath, Varptr outPath)
- End If
-
- If res = 1 And outPath Then
- requestedFile = String.FromUTF8String(outPath)
- free_(outPath)
- End If
-
- If defaultPath Then
- MemFree(defaultPath)
- End If
- If filterList Then
- MemFree(filterList)
- End If
-
- Return requestedFile
- ?
- End Method
-
- Method RequestDir:String( Text:String,path:String ) Override
- ?Not haiku And Not ios
- Local requestedDir:String
-
- Local res:Int
- Local defaultPath:Byte Ptr
- Local outPath:Byte Ptr
- If path Then
- defaultPath = path.ToUTF8String()
- End If
-
- res = NFD_PickFolder(defaultPath, Varptr outPath)
- If res = 1 And outPath Then
- requestedDir = String.FromUTF8String(outPath)
- free_(outPath)
- End If
-
- If defaultPath Then
- MemFree(defaultPath)
- End If
-
- Return requestedDir
- ?
- End Method
- Method OpenURL:Int( url:String ) Override
- Local u:Byte Ptr = url.ToUTF8String()
- Local res:Int = SDL_OpenURL(u)
- MemFree(u)
- If Not res Then
- Return True
- End If
- End Method
- Method DesktopWidth:Int(display:Int) Override
- Return bmx_SDL_GetDisplayWidth(display)
- End Method
-
- Method DesktopHeight:Int(display:Int) Override
- Return bmx_SDL_GetDisplayHeight(display)
- End Method
-
- Method DesktopDepth:Int(display:Int) Override
- Return bmx_SDL_GetDisplayDepth(display)
- End Method
-
- Method DesktopHertz:Int(display:Int) Override
- Return bmx_SDL_GetDisplayhertz(display)
- End Method
- Function _eventFilter:Int(driver:TSDLSystemDriver, event:Int) { nomangle }
- If driver._eventFilterCallback Then
- Return driver._eventFilterCallback(driver._eventFilterUserData, event)
- End If
- Return 1
- End Function
- Method Name:String() Override
- Return "SDLSystemDriver"
- End Method
-
- End Type
- Rem
- bbdoc:
- End Rem
- Function SetEventFilterCallback(callback:Int(data:Object, event:Int), data:Object = Null)
- TSDLSystemDriver(SystemDriver())._eventFilterCallback = callback
- TSDLSystemDriver(SystemDriver())._eventFilterUserData = data
- End Function
- InitSystemDriver(New TSDLSystemDriver)
- Rem
- bbdoc: Information about multiple finger gestures.
- End Rem
- Type TSDLMultiGesture
- Rem
- bbdoc: The touch device id.
- End Rem
- Field touchId:Long
- Rem
- bbdoc: The center of the gesture.
- End Rem
- Field x:Int
- Rem
- bbdoc: The center of the gesture.
- End Rem
- Field y:Int
- Rem
- bbdoc: The amount that the fingers rotated during this motion.
- End Rem
- Field dTheta:Float
- Rem
- bbdoc: The amount that the fingers pinched during this motion.
- End Rem
- Field dDist:Float
- Rem
- bbdoc: The number of fingers used in the gesture.
- End Rem
- Field numFingers:Int
-
- Global _gestures:TList = New TList
-
- Function _getGesture:TSDLMultiGesture(touchId:Long, x:Int, y:Int, dTheta:Float, dDist:Float, numFingers:Int) { nomangle }
- Local gesture:TSDLMultiGesture = TSDLMultiGesture(_gestures.RemoveFirst())
- If Not gesture Then
- gesture = New TSDLMultiGesture
- End If
-
- gesture.touchId = touchId
- gesture.x = x
- gesture.y = y
- gesture.dTheta = dTheta
- gesture.dDist = dDist
- gesture.numFingers = numFingers
-
- Return gesture
- End Function
-
- Function _freeGesture(gesture:TSDLMultiGesture) { nomangle }
- _gestures.AddLast(gesture)
- End Function
-
- End Type
- Private
- Extern
- Function NFD_OpenDialog:Int(filterList:Byte Ptr, defaultPath:Byte Ptr, outPath:Byte Ptr Ptr)
- Function NFD_SaveDialog:Int(filterList:Byte Ptr, defaultPath:Byte Ptr, outPath:Byte Ptr Ptr)
- Function NFD_PickFolder:Int(defaultPath:Byte Ptr, outPath:Byte Ptr Ptr)
- Function free_(buf:Byte Ptr)="void free(void *)!"
- End Extern
- Rem
- bbdoc: Start accepting Unicode text input events.
- about: This function will start accepting Unicode text input events in the focused SDL window,
- and start emitting #SDLTextInputEvent (SDL_TEXTINPUT) and #SDLTextEditingEvent (SDL_TEXTEDITING) events.
- Please use this function in pair with #SDLStopTextInput().
- On some platforms using this function activates the screen keyboard.
- End Rem
- Function SDLStartTextInput()
- SDL_StartTextInput()
- End Function
- Rem
- bbdoc: Stop receiving any text input events.
- End Rem
- Function SDLStopTextInput()
- SDL_StopTextInput()
- End Function
- Rem
- bbdoc: Returns if an IME Composite or Candidate window is currently shown.
- End Rem
- Function SDLIsTextInputShown:Int()
- Return SDL_IsTextInputShown()
- End Function
- Rem
- bbdoc: Checks whether or not Unicode text input events are enabled.
- returns: #True if text input events are enabled else #False.
- End Rem
- Function SDLIsTextInputActive:Int()
- Return SDL_IsTextInputActive()
- End Function
- Rem
- bbdoc: Dismisses the composition window/IME without disabling the subsystem.
- End Rem
- Function SDLClearComposition()
- SDL_ClearComposition()
- End Function
- Rem
- bbdoc: Checks whether the platform has screen keyboard support.
- returns: #True if the platform has some screen keyboard support or #False if not.
- End Rem
- Function SDLHasScreenKeyboardSupport:Int()
- Return SDL_HasScreenKeyboardSupport()
- End Function
|