Opentk/Source/OpenTK/Platform/SDL2/Sdl2.cs
2014-07-21 17:46:39 +02:00

1737 lines
59 KiB
C#

#region License
//
// The Open Toolkit Library License
//
// Copyright (c) 2006 - 2013 Stefanos Apostolopoulos for the Open Toolkit library.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights to
// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
// the Software, and to permit persons to whom the Software is furnished to do
// so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
// OTHER DEALINGS IN THE SOFTWARE.
//
#endregion
using System;
using System.Diagnostics;
using System.Security;
using System.Runtime.InteropServices;
#pragma warning disable 0169
namespace OpenTK.Platform.SDL2
{
using Surface = IntPtr;
using Cursor = IntPtr;
partial class SDL
{
#if ANDROID
const string lib = "libSDL2.so";
#elif IPHONE
const string lib = "__Internal";
#else
const string lib = "SDL2.dll";
#endif
public readonly static object Sync = new object();
static Nullable<Version> version;
public static Version Version
{
get
{
try
{
if (!version.HasValue)
{
version = GetVersion();
}
return version.Value;
}
catch
{
// nom nom
Debug.Print("[SDL2] Failed to retrieve version");
return new Version();
}
}
}
#region Functions
static string IntPtrToString(IntPtr ptr)
{
return Marshal.PtrToStringAnsi(ptr);
//int strlen = 0;
//while (Marshal.ReadByte(ptr) != 0)
// strlen++;
}
#region Cursor
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_CreateColorCursor", ExactSpelling = true)]
public static extern Cursor CreateColorCursor(Surface surface, int hot_x, int hot_y);
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_FreeCursor", ExactSpelling = true)]
public static extern void FreeCursor(Cursor cursor);
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_GetDefaultCursor", ExactSpelling = true)]
public static extern IntPtr GetDefaultCursor();
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_SetCursor", ExactSpelling = true)]
public static extern void SetCursor(Cursor cursor);
#endregion
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_AddEventWatch", ExactSpelling = true)]
public static extern void AddEventWatch(EventFilter filter, IntPtr userdata);
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_AddEventWatch", ExactSpelling = true)]
public static extern void AddEventWatch(IntPtr filter, IntPtr userdata);
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_CreateRGBSurfaceFrom", ExactSpelling = true)]
public static extern IntPtr CreateRGBSurfaceFrom(IntPtr pixels,
int width, int height, int depth, int pitch,
uint Rmask, uint Gmask, uint Bmask, uint Amask);
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_CreateWindow", ExactSpelling = true)]
public static extern IntPtr CreateWindow(string title, int x, int y, int w, int h, WindowFlags flags);
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_CreateWindowFrom", ExactSpelling = true)]
public static extern IntPtr CreateWindowFrom(IntPtr data);
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_DelEventWatch", ExactSpelling = true)]
public static extern void DelEventWatch(EventFilter filter, IntPtr userdata);
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_DelEventWatch", ExactSpelling = true)]
public static extern void DelEventWatch(IntPtr filter, IntPtr userdata);
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_DestroyWindow", ExactSpelling = true)]
public static extern void DestroyWindow(IntPtr window);
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_FreeSurface", ExactSpelling = true)]
public static extern void FreeSurface(IntPtr surface);
#region GameContoller
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_GameControllerEventState", ExactSpelling = true)]
public static extern EventState GameControllerEventState(EventState state);
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_GameControllerGetAxis", ExactSpelling = true)]
public static extern short GameControllerGetAxis(IntPtr gamecontroller, GameControllerAxis axis);
/// <summary>
/// Gets the SDL joystick layer binding for the specified game controller axis
/// </summary>
/// <param name="gamecontroller">Pointer to a game controller instance returned by <c>GameControllerOpen</c>.</param>
/// <param name="axis">A value from the <c>GameControllerAxis</c> enumeration</param>
/// <returns>A GameControllerButtonBind instance describing the specified binding</returns>
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_GameControllerGetBindForAxis", ExactSpelling = true)]
public static extern GameControllerButtonBind GameControllerGetBindForAxis(IntPtr gamecontroller, GameControllerAxis axis);
/// <summary>
/// Gets the SDL joystick layer binding for the specified game controller button
/// </summary>
/// <param name="gamecontroller">Pointer to a game controller instance returned by <c>GameControllerOpen</c>.</param>
/// <param name="button">A value from the <c>GameControllerButton</c> enumeration</param>
/// <returns>A GameControllerButtonBind instance describing the specified binding</returns>
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_GameControllerGetBindForButton", ExactSpelling = true)]
public static extern GameControllerButtonBind GameControllerGetBindForButton(
IntPtr gamecontroller, GameControllerButton button);
/// <summary>
/// Gets the current state of a button on a game controller.
/// </summary>
/// <param name="gamecontroller">A game controller handle previously opened with <c>GameControllerOpen</c>.</param>
/// <param name="button">A zero-based <c>GameControllerButton</c> value.</param>
/// <returns><c>true</c> if the specified button is pressed; <c>false</c> otherwise.</returns>
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_GameControllerGetButton", ExactSpelling = true)]
public static extern bool GameControllerGetButton(IntPtr gamecontroller, GameControllerButton button);
/// <summary>
/// Retrieve the joystick handle that corresponds to the specified game controller.
/// </summary>
/// <param name="gamecontroller">A game controller handle previously opened with <c>GameControllerOpen</c>.</param>
/// <returns>A handle to a joystick, or IntPtr.Zero in case of error. The pointer is owned by the callee. Use <c>SDL.GetError</c> to retrieve error information</returns>
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_GameControllerGetJoystick", ExactSpelling = true)]
public static extern IntPtr GameControllerGetJoystick(IntPtr gamecontroller);
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_GetCurrentDisplayMode", ExactSpelling = true)]
public static extern int GetCurrentDisplayMode(int displayIndex, out DisplayMode mode);
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_GameControllerName", ExactSpelling = true)]
static extern IntPtr GameControllerNameInternal(IntPtr gamecontroller);
/// <summary>
/// Return the name for an openend game controller instance.
/// </summary>
/// <returns>The name of the game controller name.</returns>
/// <param name="gamecontroller">Pointer to a game controller instance returned by <c>GameControllerOpen</c>.</param>
public static string GameControllerName(IntPtr gamecontroller)
{
unsafe
{
return new string((sbyte*)GameControllerNameInternal(gamecontroller));
}
}
/// <summary>
/// Opens a game controller for use.
/// </summary>
/// <param name="joystick_index">
/// A zero-based index for the game controller.
/// This index is the value which will identify this controller in future controller events.
/// </param>
/// <returns>A handle to the game controller instance, or IntPtr.Zero in case of error.</returns>
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_GameControllerOpen", ExactSpelling = true)]
public static extern IntPtr GameControllerOpen(int joystick_index);
#endregion
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_GetDisplayBounds", ExactSpelling = true)]
public static extern int GetDisplayBounds(int displayIndex, out Rect rect);
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_GetDisplayMode", ExactSpelling = true)]
public static extern int GetDisplayMode(int displayIndex, int modeIndex, out DisplayMode mode);
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_GetError", ExactSpelling = true)]
static extern IntPtr GetErrorInternal();
public static string GetError()
{
return IntPtrToString(GetErrorInternal());
}
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_GetModState", ExactSpelling = true)]
public static extern Keymod GetModState();
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_GetMouseState", ExactSpelling = true)]
public static extern ButtonFlags GetMouseState(out int hx, out int hy);
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_GetNumDisplayModes", ExactSpelling = true)]
public static extern int GetNumDisplayModes(int displayIndex);
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_GetNumVideoDisplays", ExactSpelling = true)]
public static extern int GetNumVideoDisplays();
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_GetScancodeFromKey", ExactSpelling = true)]
public static extern Scancode GetScancodeFromKey(Keycode key);
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_GetVersion", ExactSpelling = true)]
public static extern void GetVersion(out Version version);
public static Version GetVersion()
{
Version v;
GetVersion(out v);
return v;
}
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_GetWindowID", ExactSpelling = true)]
public static extern uint GetWindowID(IntPtr window);
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_GetWindowPosition", ExactSpelling = true)]
public static extern void GetWindowPosition(IntPtr window, out int x, out int y);
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_GetWindowSize", ExactSpelling = true)]
public static extern void GetWindowSize(IntPtr window, out int w, out int h);
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_GetWindowTitle", ExactSpelling = true)]
static extern IntPtr GetWindowTitlePrivate(IntPtr window);
public static string GetWindowTitle(IntPtr window)
{
return Marshal.PtrToStringAnsi(GetWindowTitlePrivate(window));
}
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_HideWindow", ExactSpelling = true)]
public static extern void HideWindow(IntPtr window);
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_Init", ExactSpelling = true)]
public static extern int Init(SystemFlags flags);
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_InitSubSystem", ExactSpelling = true)]
public static extern int InitSubSystem(SystemFlags flags);
/// <summary>
/// Determines if the specified joystick is supported by the GameController API.
/// </summary>
/// <returns><c>true</c> if joystick_index is supported by the GameController API; <c>false</c> otherwise.</returns>
/// <param name="joystick_index">The index of the joystick to check.</param>
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_IsGameController", ExactSpelling = true)]
public static extern bool IsGameController(int joystick_index);
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_JoystickClose", ExactSpelling = true)]
public static extern void JoystickClose(IntPtr joystick);
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_JoystickEventState", ExactSpelling = true)]
public static extern EventState JoystickEventState(EventState enabled);
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_JoystickGetAxis", ExactSpelling = true)]
public static extern short JoystickGetAxis(IntPtr joystick, int axis);
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_JoystickGetButton", ExactSpelling = true)]
public static extern byte JoystickGetButton(IntPtr joystick, int button);
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_JoystickGetGUID", ExactSpelling = true)]
public static extern JoystickGuid JoystickGetGUID(IntPtr joystick);
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_JoystickName", ExactSpelling = true)]
static extern IntPtr JoystickNameInternal(IntPtr joystick);
public static string JoystickName(IntPtr joystick)
{
unsafe
{
return new string((sbyte*)JoystickNameInternal(joystick));
}
}
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_JoystickNumAxes", ExactSpelling = true)]
public static extern int JoystickNumAxes(IntPtr joystick);
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_JoystickNumBalls", ExactSpelling = true)]
public static extern int JoystickNumBalls(IntPtr joystick);
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_JoystickNumButtons", ExactSpelling = true)]
public static extern int JoystickNumButtons(IntPtr joystick);
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_JoystickNumHats", ExactSpelling = true)]
public static extern int JoystickNumHats(IntPtr joystick);
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_JoystickOpen", ExactSpelling = true)]
public static extern IntPtr JoystickOpen(int device_index);
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_JoystickUpdate", ExactSpelling = true)]
public static extern void JoystickUpdate();
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_MaximizeWindow", ExactSpelling = true)]
public static extern void MaximizeWindow(IntPtr window);
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_MinimizeWindow", ExactSpelling = true)]
public static extern void MinimizeWindow(IntPtr window);
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_NumJoysticks", ExactSpelling = true)]
public static extern int NumJoysticks();
public static int PeepEvents(ref Event e, EventAction action, EventType min, EventType max)
{
unsafe
{
fixed (Event* pe = &e)
{
return PeepEvents(pe, 1, action, min, max);
}
}
}
public static int PeepEvents(Event[] e, int count, EventAction action, EventType min, EventType max)
{
if (e == null)
throw new ArgumentNullException();
if (count <= 0 || count > e.Length)
throw new ArgumentOutOfRangeException();
unsafe
{
fixed (Event *pe = e)
{
return PeepEvents(pe, count, action, min, max);
}
}
}
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_PeepEvents", ExactSpelling = true)]
unsafe static extern int PeepEvents(Event* e, int count, EventAction action, EventType min, EventType max);
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_PixelFormatEnumToMasks", ExactSpelling = true)]
public static extern bool PixelFormatEnumToMasks(uint format, out int bpp,
out uint rmask, out uint gmask, out uint bmask, out uint amask);
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_PollEvent", ExactSpelling = true)]
public static extern int PollEvent(out Event e);
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_PumpEvents", ExactSpelling = true)]
public static extern void PumpEvents();
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_PushEvent", ExactSpelling = true)]
public static extern int PushEvent(ref Event @event);
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_RaiseWindow", ExactSpelling = true)]
public static extern void RaiseWindow(IntPtr window);
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_RestoreWindow", ExactSpelling = true)]
public static extern void RestoreWindow(IntPtr window);
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_SetRelativeMouseMode", ExactSpelling = true)]
public static extern int SetRelativeMouseMode(bool enabled);
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_SetWindowBordered", ExactSpelling = true)]
public static extern void SetWindowBordered(IntPtr window, bool bordered);
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_SetWindowFullscreen", ExactSpelling = true)]
public static extern int SetWindowFullscreen(IntPtr window, uint flags);
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_SetWindowGrab", ExactSpelling = true)]
public static extern void SetWindowGrab(IntPtr window, bool grabbed);
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_SetWindowIcon", ExactSpelling = true)]
public static extern void SetWindowIcon(IntPtr window, IntPtr icon);
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_SetWindowPosition", ExactSpelling = true)]
public static extern void SetWindowPosition(IntPtr window, int x, int y);
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_SetWindowSize", ExactSpelling = true)]
public static extern void SetWindowSize(IntPtr window, int x, int y);
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_SetWindowTitle", ExactSpelling = true)]
public static extern void SetWindowTitle(IntPtr window, string title);
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_ShowCursor", ExactSpelling = true)]
public static extern int ShowCursor(bool toggle);
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_ShowWindow", ExactSpelling = true)]
public static extern void ShowWindow(IntPtr window);
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_WasInit", ExactSpelling = true)]
public static extern bool WasInit(SystemFlags flags);
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_WarpMouseInWindow", ExactSpelling = true)]
public static extern void WarpMouseInWindow(IntPtr window, int x, int y);
#region SysWM
/// <summary>
/// Retrieves driver-dependent window information.
/// </summary>
/// <param name="window">
/// The window about which information is being requested.
/// </param>
/// <param name="info">
/// Returns driver-dependent information about the specified window.
/// </param>
/// <returns>
/// True, if the function is implemented and the version number of the info struct is valid;
/// false, otherwise.
/// </returns>
public static bool GetWindowWMInfo(IntPtr window, out SysWMInfo info)
{
info = new SysWMInfo();
info.Version = GetVersion();
return GetWindowWMInfoInternal(window, ref info);
}
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_GetWindowWMInfo", ExactSpelling = true)]
static extern bool GetWindowWMInfoInternal(IntPtr window, ref SysWMInfo info);
#endregion
public partial class GL
{
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_GL_CreateContext", ExactSpelling = true)]
public static extern IntPtr CreateContext(IntPtr window);
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_GL_DeleteContext", ExactSpelling = true)]
public static extern void DeleteContext(IntPtr context);
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_GL_GetAttribute", ExactSpelling = true)]
public static extern int GetAttribute(ContextAttribute attr, out int value);
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_GL_GetCurrentContext", ExactSpelling = true)]
public static extern IntPtr GetCurrentContext();
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_GL_GetDrawableSize", ExactSpelling = true)]
public static extern void GetDrawableSize(IntPtr window, out int w, out int h);
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_GL_GetProcAddress", ExactSpelling = true)]
public static extern IntPtr GetProcAddress(IntPtr proc);
public static IntPtr GetProcAddress(string proc)
{
IntPtr p = Marshal.StringToHGlobalAnsi(proc);
try
{
return GetProcAddress(p);
}
finally
{
Marshal.FreeHGlobal(p);
}
}
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_GL_GetSwapInterval", ExactSpelling = true)]
public static extern int GetSwapInterval();
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_GL_MakeCurrent", ExactSpelling = true)]
public static extern int MakeCurrent(IntPtr window, IntPtr context);
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_GL_SetAttribute", ExactSpelling = true)]
public static extern int SetAttribute(ContextAttribute attr, int value);
public static int SetAttribute(ContextAttribute attr, ContextFlags value)
{
return SetAttribute(attr, (int)value);
}
public static int SetAttribute(ContextAttribute attr, ContextProfileFlags value)
{
return SetAttribute(attr, (int)value);
}
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_GL_SetSwapInterval", ExactSpelling = true)]
public static extern int SetSwapInterval(int interval);
[SuppressUnmanagedCodeSecurity]
[DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_GL_SwapWindow", ExactSpelling = true)]
public static extern void SwapWindow(IntPtr window);
}
#endregion
}
#region Delegates
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
internal delegate int EventFilter(IntPtr userdata, IntPtr @event);
#endregion
#region Enums
enum Button : byte
{
Left = 1,
Middle,
Right,
X1,
X2
}
[Flags]
enum ButtonFlags
{
Left = 1 << (Button.Left - 1),
Middle = 1 << (Button.Middle - 1),
Right = 1 << (Button.Right - 1),
X1 = 1 << (Button.X1 - 1),
X2 = 1 << (Button.X2 - 1),
}
enum ContextAttribute
{
RED_SIZE,
GREEN_SIZE,
BLUE_SIZE,
ALPHA_SIZE,
BUFFER_SIZE,
DOUBLEBUFFER,
DEPTH_SIZE,
STENCIL_SIZE,
ACCUM_RED_SIZE,
ACCUM_GREEN_SIZE,
ACCUM_BLUE_SIZE,
ACCUM_ALPHA_SIZE,
STEREO,
MULTISAMPLEBUFFERS,
MULTISAMPLESAMPLES,
ACCELERATED_VISUAL,
RETAINED_BACKING,
CONTEXT_MAJOR_VERSION,
CONTEXT_MINOR_VERSION,
CONTEXT_EGL,
CONTEXT_FLAGS,
CONTEXT_PROFILE_MASK,
SHARE_WITH_CURRENT_CONTEXT
}
[Flags]
enum ContextFlags
{
DEBUG = 0x0001,
FORWARD_COMPATIBLE = 0x0002,
ROBUST_ACCESS = 0x0004,
RESET_ISOLATION = 0x0008
}
[Flags]
enum ContextProfileFlags
{
CORE = 0x0001,
COMPATIBILITY = 0x0002,
ES = 0x0004
}
enum EventAction
{
Add,
Peek,
Get
}
enum EventState
{
Query = -1,
Ignore = 0,
Enable = 1
}
enum EventType
{
FIRSTEVENT = 0,
QUIT = 0x100,
WINDOWEVENT = 0x200,
SYSWMEVENT,
KEYDOWN = 0x300,
KEYUP,
TEXTEDITING,
TEXTINPUT,
MOUSEMOTION = 0x400,
MOUSEBUTTONDOWN,
MOUSEBUTTONUP,
MOUSEWHEEL,
JOYAXISMOTION = 0x600,
JOYBALLMOTION,
JOYHATMOTION,
JOYBUTTONDOWN,
JOYBUTTONUP,
JOYDEVICEADDED,
JOYDEVICEREMOVED,
CONTROLLERAXISMOTION = 0x650,
CONTROLLERBUTTONDOWN,
CONTROLLERBUTTONUP,
CONTROLLERDEVICEADDED,
CONTROLLERDEVICEREMOVED,
CONTROLLERDEVICEREMAPPED,
FINGERDOWN = 0x700,
FINGERUP,
FINGERMOTION,
DOLLARGESTURE = 0x800,
DOLLARRECORD,
MULTIGESTURE,
CLIPBOARDUPDATE = 0x900,
DROPFILE = 0x1000,
USEREVENT = 0x8000,
LASTEVENT = 0xFFFF
}
enum GameControllerAxis : byte
{
Invalid = 0xff,
LeftX = 0,
LeftY,
RightX,
RightY,
TriggerLeft,
TriggerRight,
Max
}
enum GameControllerButton : byte
{
INVALID = 0xff,
A = 0,
B,
X,
Y,
BACK,
GUIDE,
START,
LEFTSTICK,
RIGHTSTICK,
LEFTSHOULDER,
RIGHTSHOULDER,
DPAD_UP,
DPAD_DOWN,
DPAD_LEFT,
DPAD_RIGHT,
Max
}
enum GameControllerBindType : byte
{
None = 0,
Button,
Axis,
Hat
}
[Flags]
enum HatPosition : byte
{
Centered = 0x00,
Up = 0x01,
Right = 0x02,
Down = 0x03,
Left = 0x04,
RightUp = Right | Up,
RightDown = Right | Down,
LeftUp = Left | Up,
LeftDown = Left | Down
}
enum Keycode
{
UNKNOWN = 0,
RETURN = '\r',
ESCAPE = 27, // '\033' octal
BACKSPACE = '\b',
TAB = '\t',
SPACE = ' ',
EXCLAIM = '!',
QUOTEDBL = '"',
HASH = '#',
PERCENT = '%',
DOLLAR = '$',
AMPERSAND = '&',
QUOTE = '\'',
LEFTPAREN = '(',
RIGHTPAREN = ')',
ASTERISK = '*',
PLUS = '+',
COMMA = ',',
MINUS = '-',
PERIOD = '.',
SLASH = '/',
Num0 = '0',
Num1 = '1',
Num2 = '2',
Num3 = '3',
Num4 = '4',
Num5 = '5',
Num6 = '6',
Num7 = '7',
Num8 = '8',
Num9 = '9',
COLON = ':',
SEMICOLON = ';',
LESS = '<',
EQUALS = '=',
GREATER = '>',
QUESTION = '?',
AT = '@',
LEFTBRACKET = '[',
BACKSLASH = '\\',
RIGHTBRACKET = ']',
CARET = '^',
UNDERSCORE = '_',
BACKQUOTE = '`',
a = 'a',
b = 'b',
c = 'c',
d = 'd',
e = 'e',
f = 'f',
g = 'g',
h = 'h',
i = 'i',
j = 'j',
k = 'k',
l = 'l',
m = 'm',
n = 'n',
o = 'o',
p = 'p',
q = 'q',
r = 'r',
s = 's',
t = 't',
u = 'u',
v = 'v',
w = 'w',
x = 'x',
y = 'y',
z = 'z',
CAPSLOCK = (1 << 30) | (int)Scancode.CAPSLOCK,
F1 = (1 << 30) | (int)Scancode.F1,
F2 = (1 << 30) | (int)Scancode.F2,
F3 = (1 << 30) | (int)Scancode.F3,
F4 = (1 << 30) | (int)Scancode.F4,
F5 = (1 << 30) | (int)Scancode.F5,
F6 = (1 << 30) | (int)Scancode.F6,
F7 = (1 << 30) | (int)Scancode.F7,
F8 = (1 << 30) | (int)Scancode.F8,
F9 = (1 << 30) | (int)Scancode.F9,
F10 = (1 << 30) | (int)Scancode.F10,
F11 = (1 << 30) | (int)Scancode.F11,
F12 = (1 << 30) | (int)Scancode.F12,
PRINTSCREEN = (1 << 30) | (int)Scancode.PRINTSCREEN,
SCROLLLOCK = (1 << 30) | (int)Scancode.SCROLLLOCK,
PAUSE = (1 << 30) | (int)Scancode.PAUSE,
INSERT = (1 << 30) | (int)Scancode.INSERT,
HOME = (1 << 30) | (int)Scancode.HOME,
PAGEUP = (1 << 30) | (int)Scancode.PAGEUP,
DELETE = 127, // '\177' octal
END = (1 << 30) | (int)Scancode.END,
PAGEDOWN = (1 << 30) | (int)Scancode.PAGEDOWN,
RIGHT = (1 << 30) | (int)Scancode.RIGHT,
LEFT = (1 << 30) | (int)Scancode.LEFT,
DOWN = (1 << 30) | (int)Scancode.DOWN,
UP = (1 << 30) | (int)Scancode.UP,
NUMLOCKCLEAR = (1 << 30) | (int)Scancode.NUMLOCKCLEAR,
KP_DIVIDE = (1 << 30) | (int)Scancode.KP_DIVIDE,
KP_MULTIPLY = (1 << 30) | (int)Scancode.KP_MULTIPLY,
KP_MINUS = (1 << 30) | (int)Scancode.KP_MINUS,
KP_PLUS = (1 << 30) | (int)Scancode.KP_PLUS,
KP_ENTER = (1 << 30) | (int)Scancode.KP_ENTER,
KP_1 = (1 << 30) | (int)Scancode.KP_1,
KP_2 = (1 << 30) | (int)Scancode.KP_2,
KP_3 = (1 << 30) | (int)Scancode.KP_3,
KP_4 = (1 << 30) | (int)Scancode.KP_4,
KP_5 = (1 << 30) | (int)Scancode.KP_5,
KP_6 = (1 << 30) | (int)Scancode.KP_6,
KP_7 = (1 << 30) | (int)Scancode.KP_7,
KP_8 = (1 << 30) | (int)Scancode.KP_8,
KP_9 = (1 << 30) | (int)Scancode.KP_9,
KP_0 = (1 << 30) | (int)Scancode.KP_0,
KP_PERIOD = (1 << 30) | (int)Scancode.KP_PERIOD,
APPLICATION = (1 << 30) | (int)Scancode.APPLICATION,
POWER = (1 << 30) | (int)Scancode.POWER,
KP_EQUALS = (1 << 30) | (int)Scancode.KP_EQUALS,
F13 = (1 << 30) | (int)Scancode.F13,
F14 = (1 << 30) | (int)Scancode.F14,
F15 = (1 << 30) | (int)Scancode.F15,
F16 = (1 << 30) | (int)Scancode.F16,
F17 = (1 << 30) | (int)Scancode.F17,
F18 = (1 << 30) | (int)Scancode.F18,
F19 = (1 << 30) | (int)Scancode.F19,
F20 = (1 << 30) | (int)Scancode.F20,
F21 = (1 << 30) | (int)Scancode.F21,
F22 = (1 << 30) | (int)Scancode.F22,
F23 = (1 << 30) | (int)Scancode.F23,
F24 = (1 << 30) | (int)Scancode.F24,
EXECUTE = (1 << 30) | (int)Scancode.EXECUTE,
HELP = (1 << 30) | (int)Scancode.HELP,
MENU = (1 << 30) | (int)Scancode.MENU,
SELECT = (1 << 30) | (int)Scancode.SELECT,
STOP = (1 << 30) | (int)Scancode.STOP,
AGAIN = (1 << 30) | (int)Scancode.AGAIN,
UNDO = (1 << 30) | (int)Scancode.UNDO,
CUT = (1 << 30) | (int)Scancode.CUT,
COPY = (1 << 30) | (int)Scancode.COPY,
PASTE = (1 << 30) | (int)Scancode.PASTE,
FIND = (1 << 30) | (int)Scancode.FIND,
MUTE = (1 << 30) | (int)Scancode.MUTE,
VOLUMEUP = (1 << 30) | (int)Scancode.VOLUMEUP,
VOLUMEDOWN = (1 << 30) | (int)Scancode.VOLUMEDOWN,
KP_COMMA = (1 << 30) | (int)Scancode.KP_COMMA,
KP_EQUALSAS400 = (1 << 30) | (int)Scancode.KP_EQUALSAS400,
ALTERASE = (1 << 30) | (int)Scancode.ALTERASE,
SYSREQ = (1 << 30) | (int)Scancode.SYSREQ,
CANCEL = (1 << 30) | (int)Scancode.CANCEL,
CLEAR = (1 << 30) | (int)Scancode.CLEAR,
PRIOR = (1 << 30) | (int)Scancode.PRIOR,
RETURN2 = (1 << 30) | (int)Scancode.RETURN2,
SEPARATOR = (1 << 30) | (int)Scancode.SEPARATOR,
OUT = (1 << 30) | (int)Scancode.OUT,
OPER = (1 << 30) | (int)Scancode.OPER,
CLEARAGAIN = (1 << 30) | (int)Scancode.CLEARAGAIN,
CRSEL = (1 << 30) | (int)Scancode.CRSEL,
EXSEL = (1 << 30) | (int)Scancode.EXSEL,
KP_00 = (1 << 30) | (int)Scancode.KP_00,
KP_000 = (1 << 30) | (int)Scancode.KP_000,
THOUSANDSSEPARATOR = (1 << 30) | (int)Scancode.THOUSANDSSEPARATOR,
DECIMALSEPARATOR = (1 << 30) | (int)Scancode.DECIMALSEPARATOR,
CURRENCYUNIT = (1 << 30) | (int)Scancode.CURRENCYUNIT,
CURRENCYSUBUNIT = (1 << 30) | (int)Scancode.CURRENCYSUBUNIT,
KP_LEFTPAREN = (1 << 30) | (int)Scancode.KP_LEFTPAREN,
KP_RIGHTPAREN = (1 << 30) | (int)Scancode.KP_RIGHTPAREN,
KP_LEFTBRACE = (1 << 30) | (int)Scancode.KP_LEFTBRACE,
KP_RIGHTBRACE = (1 << 30) | (int)Scancode.KP_RIGHTBRACE,
KP_TAB = (1 << 30) | (int)Scancode.KP_TAB,
KP_BACKSPACE = (1 << 30) | (int)Scancode.KP_BACKSPACE,
KP_A = (1 << 30) | (int)Scancode.KP_A,
KP_B = (1 << 30) | (int)Scancode.KP_B,
KP_C = (1 << 30) | (int)Scancode.KP_C,
KP_D = (1 << 30) | (int)Scancode.KP_D,
KP_E = (1 << 30) | (int)Scancode.KP_E,
KP_F = (1 << 30) | (int)Scancode.KP_F,
KP_XOR = (1 << 30) | (int)Scancode.KP_XOR,
KP_POWER = (1 << 30) | (int)Scancode.KP_POWER,
KP_PERCENT = (1 << 30) | (int)Scancode.KP_PERCENT,
KP_LESS = (1 << 30) | (int)Scancode.KP_LESS,
KP_GREATER = (1 << 30) | (int)Scancode.KP_GREATER,
KP_AMPERSAND = (1 << 30) | (int)Scancode.KP_AMPERSAND,
KP_DBLAMPERSAND = (1 << 30) | (int)Scancode.KP_DBLAMPERSAND,
KP_VERTICALBAR = (1 << 30) | (int)Scancode.KP_VERTICALBAR,
KP_DBLVERTICALBAR = (1 << 30) | (int)Scancode.KP_DBLVERTICALBAR,
KP_COLON = (1 << 30) | (int)Scancode.KP_COLON,
KP_HASH = (1 << 30) | (int)Scancode.KP_HASH,
KP_SPACE = (1 << 30) | (int)Scancode.KP_SPACE,
KP_AT = (1 << 30) | (int)Scancode.KP_AT,
KP_EXCLAM = (1 << 30) | (int)Scancode.KP_EXCLAM,
KP_MEMSTORE = (1 << 30) | (int)Scancode.KP_MEMSTORE,
KP_MEMRECALL = (1 << 30) | (int)Scancode.KP_MEMRECALL,
KP_MEMCLEAR = (1 << 30) | (int)Scancode.KP_MEMCLEAR,
KP_MEMADD = (1 << 30) | (int)Scancode.KP_MEMADD,
KP_MEMSUBTRACT = (1 << 30) | (int)Scancode.KP_MEMSUBTRACT,
KP_MEMMULTIPLY = (1 << 30) | (int)Scancode.KP_MEMMULTIPLY,
KP_MEMDIVIDE = (1 << 30) | (int)Scancode.KP_MEMDIVIDE,
KP_PLUSMINUS = (1 << 30) | (int)Scancode.KP_PLUSMINUS,
KP_CLEAR = (1 << 30) | (int)Scancode.KP_CLEAR,
KP_CLEARENTRY = (1 << 30) | (int)Scancode.KP_CLEARENTRY,
KP_BINARY = (1 << 30) | (int)Scancode.KP_BINARY,
KP_OCTAL = (1 << 30) | (int)Scancode.KP_OCTAL,
KP_DECIMAL = (1 << 30) | (int)Scancode.KP_DECIMAL,
KP_HEXADECIMAL = (1 << 30) | (int)Scancode.KP_HEXADECIMAL,
LCTRL = (1 << 30) | (int)Scancode.LCTRL,
LSHIFT = (1 << 30) | (int)Scancode.LSHIFT,
LALT = (1 << 30) | (int)Scancode.LALT,
LGUI = (1 << 30) | (int)Scancode.LGUI,
RCTRL = (1 << 30) | (int)Scancode.RCTRL,
RSHIFT = (1 << 30) | (int)Scancode.RSHIFT,
RALT = (1 << 30) | (int)Scancode.RALT,
RGUI = (1 << 30) | (int)Scancode.RGUI,
MODE = (1 << 30) | (int)Scancode.MODE,
AUDIONEXT = (1 << 30) | (int)Scancode.AUDIONEXT,
AUDIOPREV = (1 << 30) | (int)Scancode.AUDIOPREV,
AUDIOSTOP = (1 << 30) | (int)Scancode.AUDIOSTOP,
AUDIOPLAY = (1 << 30) | (int)Scancode.AUDIOPLAY,
AUDIOMUTE = (1 << 30) | (int)Scancode.AUDIOMUTE,
MEDIASELECT = (1 << 30) | (int)Scancode.MEDIASELECT,
WWW = (1 << 30) | (int)Scancode.WWW,
MAIL = (1 << 30) | (int)Scancode.MAIL,
CALCULATOR = (1 << 30) | (int)Scancode.CALCULATOR,
COMPUTER = (1 << 30) | (int)Scancode.COMPUTER,
AC_SEARCH = (1 << 30) | (int)Scancode.AC_SEARCH,
AC_HOME = (1 << 30) | (int)Scancode.AC_HOME,
AC_BACK = (1 << 30) | (int)Scancode.AC_BACK,
AC_FORWARD = (1 << 30) | (int)Scancode.AC_FORWARD,
AC_STOP = (1 << 30) | (int)Scancode.AC_STOP,
AC_REFRESH = (1 << 30) | (int)Scancode.AC_REFRESH,
AC_BOOKMARKS = (1 << 30) | (int)Scancode.AC_BOOKMARKS,
BRIGHTNESSDOWN = (1 << 30) | (int)Scancode.BRIGHTNESSDOWN,
BRIGHTNESSUP = (1 << 30) | (int)Scancode.BRIGHTNESSUP,
DISPLAYSWITCH = (1 << 30) | (int)Scancode.DISPLAYSWITCH,
KBDILLUMTOGGLE = (1 << 30) | (int)Scancode.KBDILLUMTOGGLE,
KBDILLUMDOWN = (1 << 30) | (int)Scancode.KBDILLUMDOWN,
KBDILLUMUP = (1 << 30) | (int)Scancode.KBDILLUMUP,
EJECT = (1 << 30) | (int)Scancode.EJECT,
SLEEP = (1 << 30) | (int)Scancode.SLEEP
}
[Flags]
enum Keymod : ushort
{
NONE = 0x0000,
LSHIFT = 0x0001,
RSHIFT = 0x0002,
LCTRL = 0x0040,
RCTRL = 0x0080,
LALT = 0x0100,
RALT = 0x0200,
LGUI = 0x0400,
RGUI = 0x0800,
NUM = 0x1000,
CAPS = 0x2000,
MODE = 0x4000,
RESERVED = 0x8000,
CTRL = (LCTRL | RCTRL),
SHIFT = (LSHIFT | RSHIFT),
ALT = (LALT | RALT),
GUI = (LGUI | RGUI)
}
enum Scancode
{
UNKNOWN = 0,
A = 4,
B = 5,
C = 6,
D = 7,
E = 8,
F = 9,
G = 10,
H = 11,
I = 12,
J = 13,
K = 14,
L = 15,
M = 16,
N = 17,
O = 18,
P = 19,
Q = 20,
R = 21,
S = 22,
T = 23,
U = 24,
V = 25,
W = 26,
X = 27,
Y = 28,
Z = 29,
Num1 = 30,
Num2 = 31,
Num3 = 32,
Num4 = 33,
Num5 = 34,
Num6 = 35,
Num7 = 36,
Num8 = 37,
Num9 = 38,
Num0 = 39,
RETURN = 40,
ESCAPE = 41,
BACKSPACE = 42,
TAB = 43,
SPACE = 44,
MINUS = 45,
EQUALS = 46,
LEFTBRACKET = 47,
RIGHTBRACKET = 48,
BACKSLASH = 49,
NONUSHASH = 50,
SEMICOLON = 51,
APOSTROPHE = 52,
GRAVE = 53,
COMMA = 54,
PERIOD = 55,
SLASH = 56,
CAPSLOCK = 57,
F1 = 58,
F2 = 59,
F3 = 60,
F4 = 61,
F5 = 62,
F6 = 63,
F7 = 64,
F8 = 65,
F9 = 66,
F10 = 67,
F11 = 68,
F12 = 69,
PRINTSCREEN = 70,
SCROLLLOCK = 71,
PAUSE = 72,
INSERT = 73,
HOME = 74,
PAGEUP = 75,
DELETE = 76,
END = 77,
PAGEDOWN = 78,
RIGHT = 79,
LEFT = 80,
DOWN = 81,
UP = 82,
NUMLOCKCLEAR = 83,
KP_DIVIDE = 84,
KP_MULTIPLY = 85,
KP_MINUS = 86,
KP_PLUS = 87,
KP_ENTER = 88,
KP_1 = 89,
KP_2 = 90,
KP_3 = 91,
KP_4 = 92,
KP_5 = 93,
KP_6 = 94,
KP_7 = 95,
KP_8 = 96,
KP_9 = 97,
KP_0 = 98,
KP_PERIOD = 99,
NONUSBACKSLASH = 100,
APPLICATION = 101,
POWER = 102,
KP_EQUALS = 103,
F13 = 104,
F14 = 105,
F15 = 106,
F16 = 107,
F17 = 108,
F18 = 109,
F19 = 110,
F20 = 111,
F21 = 112,
F22 = 113,
F23 = 114,
F24 = 115,
EXECUTE = 116,
HELP = 117,
MENU = 118,
SELECT = 119,
STOP = 120,
AGAIN = 121,
UNDO = 122,
CUT = 123,
COPY = 124,
PASTE = 125,
FIND = 126,
MUTE = 127,
VOLUMEUP = 128,
VOLUMEDOWN = 129,
// not sure whether there's a reason to enable these
// LOCKINGCAPSLOCK = 130,
// LOCKINGNUMLOCK = 131,
// LOCKINGSCROLLLOCK = 132,
KP_COMMA = 133,
KP_EQUALSAS400 = 134,
INTERNATIONAL1 = 135,
INTERNATIONAL2 = 136,
INTERNATIONAL3 = 137,
INTERNATIONAL4 = 138,
INTERNATIONAL5 = 139,
INTERNATIONAL6 = 140,
INTERNATIONAL7 = 141,
INTERNATIONAL8 = 142,
INTERNATIONAL9 = 143,
LANG1 = 144,
LANG2 = 145,
LANG3 = 146,
LANG4 = 147,
LANG5 = 148,
LANG6 = 149,
LANG7 = 150,
LANG8 = 151,
LANG9 = 152,
ALTERASE = 153,
SYSREQ = 154,
CANCEL = 155,
CLEAR = 156,
PRIOR = 157,
RETURN2 = 158,
SEPARATOR = 159,
OUT = 160,
OPER = 161,
CLEARAGAIN = 162,
CRSEL = 163,
EXSEL = 164,
KP_00 = 176,
KP_000 = 177,
THOUSANDSSEPARATOR = 178,
DECIMALSEPARATOR = 179,
CURRENCYUNIT = 180,
CURRENCYSUBUNIT = 181,
KP_LEFTPAREN = 182,
KP_RIGHTPAREN = 183,
KP_LEFTBRACE = 184,
KP_RIGHTBRACE = 185,
KP_TAB = 186,
KP_BACKSPACE = 187,
KP_A = 188,
KP_B = 189,
KP_C = 190,
KP_D = 191,
KP_E = 192,
KP_F = 193,
KP_XOR = 194,
KP_POWER = 195,
KP_PERCENT = 196,
KP_LESS = 197,
KP_GREATER = 198,
KP_AMPERSAND = 199,
KP_DBLAMPERSAND = 200,
KP_VERTICALBAR = 201,
KP_DBLVERTICALBAR = 202,
KP_COLON = 203,
KP_HASH = 204,
KP_SPACE = 205,
KP_AT = 206,
KP_EXCLAM = 207,
KP_MEMSTORE = 208,
KP_MEMRECALL = 209,
KP_MEMCLEAR = 210,
KP_MEMADD = 211,
KP_MEMSUBTRACT = 212,
KP_MEMMULTIPLY = 213,
KP_MEMDIVIDE = 214,
KP_PLUSMINUS = 215,
KP_CLEAR = 216,
KP_CLEARENTRY = 217,
KP_BINARY = 218,
KP_OCTAL = 219,
KP_DECIMAL = 220,
KP_HEXADECIMAL = 221,
LCTRL = 224,
LSHIFT = 225,
LALT = 226,
LGUI = 227,
RCTRL = 228,
RSHIFT = 229,
RALT = 230,
RGUI = 231,
MODE = 257,
// These come from the USB consumer page (0x0C)
AUDIONEXT = 258,
AUDIOPREV = 259,
AUDIOSTOP = 260,
AUDIOPLAY = 261,
AUDIOMUTE = 262,
MEDIASELECT = 263,
WWW = 264,
MAIL = 265,
CALCULATOR = 266,
COMPUTER = 267,
AC_SEARCH = 268,
AC_HOME = 269,
AC_BACK = 270,
AC_FORWARD = 271,
AC_STOP = 272,
AC_REFRESH = 273,
AC_BOOKMARKS = 274,
// These come from other sources, and are mostly mac related
BRIGHTNESSDOWN = 275,
BRIGHTNESSUP = 276,
DISPLAYSWITCH = 277,
KBDILLUMTOGGLE = 278,
KBDILLUMDOWN = 279,
KBDILLUMUP = 280,
EJECT = 281,
SLEEP = 282,
APP1 = 283,
APP2 = 284,
// This is not a key, simply marks the number of scancodes
// so that you know how big to make your arrays.
SDL_NUM_SCANCODES = 512
}
enum State : byte
{
Released = 0,
Pressed = 1
}
[Flags]
enum SystemFlags : uint
{
Default = 0,
TIMER = 0x00000001,
AUDIO = 0x00000010,
VIDEO = 0x00000020,
JOYSTICK = 0x00000200,
HAPTIC = 0x00001000,
GAMECONTROLLER = 0x00002000,
NOPARACHUTE = 0x00100000,
EVERYTHING = TIMER | AUDIO | VIDEO |
JOYSTICK | HAPTIC | GAMECONTROLLER
}
enum SysWMType
{
Unknown = 0,
Windows,
X11,
Wayland,
DirectFB,
Cocoa,
UIKit,
}
enum WindowEventID : byte
{
NONE,
SHOWN,
HIDDEN,
EXPOSED,
MOVED,
RESIZED,
SIZE_CHANGED,
MINIMIZED,
MAXIMIZED,
RESTORED,
ENTER,
LEAVE,
FOCUS_GAINED,
FOCUS_LOST,
CLOSE,
}
enum WindowFlags
{
Default = 0,
FULLSCREEN = 0x00000001,
OPENGL = 0x00000002,
SHOWN = 0x00000004,
HIDDEN = 0x00000008,
BORDERLESS = 0x00000010,
RESIZABLE = 0x00000020,
MINIMIZED = 0x00000040,
MAXIMIZED = 0x00000080,
INPUT_GRABBED = 0x00000100,
INPUT_FOCUS = 0x00000200,
MOUSE_FOCUS = 0x00000400,
FULLSCREEN_DESKTOP = (FULLSCREEN | 0x00001000),
FOREIGN = 0x00000800,
ALLOW_HIGHDPI = 0x00002000,
}
#endregion
#region Structs
struct ControllerAxisEvent
{
public EventType Type;
public uint Timestamp;
public int Which;
public GameControllerAxis Axis;
byte padding1;
byte padding2;
byte padding3;
public short Value;
ushort padding4;
}
struct ControllerButtonEvent
{
public EventType Type;
public uint Timestamp;
public int Which;
public GameControllerButton Button;
public State State;
byte padding1;
byte padding2;
}
struct ControllerDeviceEvent
{
public EventType Type;
public uint Timestamp;
/// <summary>
/// The joystick device index for the ADDED event, instance id for the REMOVED or REMAPPED event
/// </summary>
public int Which;
}
struct DisplayMode
{
public uint Format;
public int Width;
public int Height;
public int RefreshRate;
public IntPtr DriverData;
}
[StructLayout(LayoutKind.Explicit)]
struct Event
{
[FieldOffset(0)]
public EventType Type;
[FieldOffset(0)]
public WindowEvent Window;
[FieldOffset(0)]
public KeyboardEvent Key;
[FieldOffset(0)]
public TextEditingEvent Edit;
[FieldOffset(0)]
public TextInputEvent Text;
[FieldOffset(0)]
public MouseMotionEvent Motion;
[FieldOffset(0)]
public MouseButtonEvent Button;
[FieldOffset(0)]
public MouseWheelEvent Wheel;
[FieldOffset(0)]
public JoyAxisEvent JoyAxis;
[FieldOffset(0)]
public JoyBallEvent JoyBall;
[FieldOffset(0)]
public JoyHatEvent JoyHat;
[FieldOffset(0)]
public JoyButtonEvent JoyButton;
[FieldOffset(0)]
public JoyDeviceEvent JoyDevice;
[FieldOffset(0)]
public ControllerAxisEvent ControllerAxis;
[FieldOffset(0)]
public ControllerButtonEvent ControllerButton;
[FieldOffset(0)]
public ControllerDeviceEvent ControllerDevice;
#if false
[FieldOffset(0)]
public QuitEvent quit;
[FieldOffset(0)]
public UserEvent user;
[FieldOffset(0)]
public SysWMEvent syswm;
[FieldOffset(0)]
public TouchFingerEvent tfinger;
[FieldOffset(0)]
public MultiGestureEvent mgesture;
[FieldOffset(0)]
public DollarGestureEvent dgesture;
[FieldOffset(0)]
public DropEvent drop;
#endif
// Ensure the structure is big enough
// This hack is necessary to ensure compatibility
// with different SDL versions, which might have
// different sizeof(SDL_Event).
[FieldOffset(0)]
private unsafe fixed byte reserved[128];
}
[StructLayout(LayoutKind.Explicit)]
struct GameControllerButtonBind
{
[FieldOffset(0)]
public GameControllerBindType BindType;
[FieldOffset(4)]
public Button Button;
[FieldOffset(4)]
public GameControllerAxis Axis;
[FieldOffset(4)]
public int Hat;
[FieldOffset(8)]
public int HatMask;
}
struct JoyAxisEvent
{
public EventType Type;
public UInt32 Timestamp;
public Int32 Which; // SDL_JoystickID
public byte Axis;
byte padding1;
byte padding2;
byte padding3;
public Int16 Value;
UInt16 padding4;
}
struct JoyBallEvent
{
public EventType Type;
public uint Timestamp;
public int Which;
public byte Ball;
byte padding1;
byte padding2;
byte padding3;
public short Xrel;
public short Yrel;
}
struct JoyButtonEvent
{
public EventType Type;
public uint Timestamp;
public int Which;
public byte Button;
public State State;
byte padding1;
byte padding2;
}
struct JoyDeviceEvent
{
public EventType Type;
public uint Timestamp;
public int Which;
}
struct JoyHatEvent
{
public EventType Type;
public uint Timestamp;
public int Which;
public byte Hat;
public HatPosition Value;
byte padding1;
byte padding2;
}
struct JoystickGuid
{
unsafe fixed byte data[16];
public Guid ToGuid()
{
byte[] bytes = new byte[16];
unsafe
{
fixed (byte* pdata = data)
{
Marshal.Copy(new IntPtr(pdata), bytes, 0, bytes.Length);
}
}
return new Guid(bytes);
}
}
struct KeyboardEvent
{
public EventType Type;
public uint Timestamp;
public uint WindowID;
public State State;
public byte Repeat;
byte padding2;
byte padding3;
public Keysym Keysym;
}
struct Keysym
{
public Scancode Scancode;
public Keycode Sym;
public Keymod Mod;
[Obsolete]
public uint Unicode;
}
struct MouseButtonEvent
{
public EventType Type;
public UInt32 Timestamp;
public UInt32 WindowID;
public UInt32 Which;
public Button Button;
public State State;
public byte Clicks;
byte padding1;
public Int32 X;
public Int32 Y;
}
struct MouseMotionEvent
{
public EventType Type;
public uint Timestamp;
public uint WindowID;
public uint Which;
public ButtonFlags State;
public Int32 X;
public Int32 Y;
public Int32 Xrel;
public Int32 Yrel;
}
struct MouseWheelEvent
{
public EventType Type;
public uint Timestamp;
public uint WindowID;
public uint Which;
public int X;
public int Y;
public enum EventType : uint
{
/* Touch events */
FingerDown = 0x700,
FingerUp,
FingerMotion,
/* Gesture events */
DollarGesture = 0x800,
DollarRecord,
MultiGesture,
}
public const uint TouchMouseID = 0xffffffff;
}
struct Rect
{
public int X;
public int Y;
public int Width;
public int Height;
}
struct SysWMInfo
{
public Version Version;
public SysWMType Subsystem;
public SysInfo Info;
[StructLayout(LayoutKind.Explicit)]
public struct SysInfo
{
[FieldOffset(0)]
public WindowsInfo Windows;
[FieldOffset(0)]
public X11Info X11;
[FieldOffset(0)]
public WaylandInfo Wayland;
[FieldOffset(0)]
public DirectFBInfo DirectFB;
[FieldOffset(0)]
public CocoaInfo Cocoa;
[FieldOffset(0)]
public UIKitInfo UIKit;
public struct WindowsInfo
{
public IntPtr Window;
}
public struct X11Info
{
public IntPtr Display;
public IntPtr Window;
}
public struct WaylandInfo
{
public IntPtr Display;
public IntPtr Surface;
public IntPtr ShellSurface;
}
public struct DirectFBInfo
{
public IntPtr Dfb;
public IntPtr Window;
public IntPtr Surface;
}
public struct CocoaInfo
{
public IntPtr Window;
}
public struct UIKitInfo
{
public IntPtr Window;
}
}
}
struct TextEditingEvent
{
public const int TextSize = 32;
public EventType Type;
public UInt32 Timestamp;
public UInt32 WindowID;
public unsafe fixed byte Text[TextSize];
public Int32 Start;
public Int32 Length;
}
struct TextInputEvent
{
public const int TextSize = 32;
public EventType Type;
public UInt32 Timestamp;
public UInt32 WindowID;
public unsafe fixed byte Text[TextSize];
}
struct Version
{
public byte Major;
public byte Minor;
public byte Patch;
public int Number
{
get { return 1000 * Major + 100 * Minor + Patch; }
}
}
struct WindowEvent
{
public EventType Type;
public UInt32 Timestamp;
public UInt32 WindowID;
public WindowEventID Event;
byte padding1;
byte padding2;
byte padding3;
public Int32 Data1;
public Int32 Data2;
}
#endregion
}