1 /+
2 +            Copyright 2022 – 2023 Aya Partridge
3 +          Copyright 2018 - 2022 Michael D. Parker
4 + Distributed under the Boost Software License, Version 1.0.
5 +     (See accompanying file LICENSE_1_0.txt or copy at
6 +           http://www.boost.org/LICENSE_1_0.txt)
7 +/
8 module sdl.system;
9 
10 import bindbc.sdl.config;
11 import bindbc.sdl.codegen;
12 
13 import sdl.render: SDL_Renderer;
14 import sdl.stdinc: SDL_bool;
15 
16 version(Windows) version = Win32_GDK;
17 version(WinGDK)  version = Win32_GDK;
18 
19 version(Win32_GDK){
20 	static if(sdlSupport >= SDLSupport.v2_0_1):
21 	struct IDirect3DDevice9;
22 	
23 	static if(sdlSupport >= SDLSupport.v2_0_4):
24 	alias SDL_WindowsMessageHook = extern(C) void function(void* userdata, void* hWnd, uint message, ulong wParam, long lParam) nothrow;
25 	
26 	static if(sdlSupport >= SDLSupport.v2_0_16):
27 	struct ID3D11Device;
28 	
29 	static if(sdlSupport >= SDLSupport.v2_24):
30 	struct ID3D12Device;
31 }
32 version(Android){
33 	enum: int{
34 		SDL_ANDROID_EXTERNAL_STORAGE_READ   = 0x01,
35 		SDL_ANDROID_EXTERNAL_STORAGE_WRITE  = 0x02,
36 	}
37 }
38 version(WinRT){
39 	static if(sdlSupport >= SDLSupport.v2_0_3):
40 	alias SDL_WinRT_Path = int;
41 	enum: SDL_WinRT_Path{
42 		SDL_WINRT_PATH_INSTALLED_LOCATION,
43 		SDL_WINRT_PATH_LOCAL_FOLDER,
44 		SDL_WINRT_PATH_ROAMING_FOLDER,
45 		SDL_WINRT_PATH_TEMP_FOLDER,
46 	}
47 	
48 	static if(sdlSupport >= SDLSupport.v2_0_8):
49 	alias SDL_WinRT_DeviceFamily = int;
50 	enum: SDL_WinRT_DeviceFamily{
51 		SDL_WINRT_DEVICEFAMILY_UNKNOWN,
52 		SDL_WINRT_DEVICEFAMILY_DESKTOP,
53 		SDL_WINRT_DEVICEFAMILY_MOBILE,
54 		SDL_WINRT_DEVICEFAMILY_XBOX,
55 	}
56 }
57 version(WinGDK){
58 	static if(sdlSupport >= SDLSupport.v2_24):
59 	private struct XTaskQueueObject;
60 	alias XTaskQueueHandle = XTaskQueueObject*;
61 }
62 
63 mixin(joinFnBinds((){
64 	string[][] ret;
65 	static if(sdlSupport >= SDLSupport.v2_0_9){
66 		ret ~= makeFnBinds([
67 			[q{SDL_bool}, q{SDL_IsTablet}, q{}],
68 		]);
69 	}
70 	static if(sdlSupport >= SDLSupport.v2_0_12){
71 		ret ~= makeFnBinds([
72 			[q{void}, q{SDL_OnApplicationWillTerminate}, q{}],
73 			[q{void}, q{SDL_OnApplicationDidReceiveMemoryWarning}, q{}],
74 			[q{void}, q{SDL_OnApplicationWillResignActive}, q{}],
75 			[q{void}, q{SDL_OnApplicationDidEnterBackground}, q{}],
76 			[q{void}, q{SDL_OnApplicationWillEnterForeground}, q{}],
77 			[q{void}, q{SDL_OnApplicationDidBecomeActive}, q{}],
78 		]);
79 	}
80 	version(Win32_GDK){
81 		static if(sdlSupport >= SDLSupport.v2_0_1){
82 			ret ~= makeFnBinds([
83 				[q{int}, q{SDL_Direct3D9GetAdapterIndex}, q{int displayIndex}],
84 				[q{IDirect3DDevice9*}, q{SDL_RenderGetD3D9Device}, q{SDL_Renderer* renderer}],
85 			]);
86 		}
87 		static if(sdlSupport >= SDLSupport.v2_0_2){
88 			ret ~= makeFnBinds([
89 				[q{SDL_bool}, q{SDL_DXGIGetOutputInfo}, q{int displayIndex, int* adapterIndex, int* outputIndex}],
90 			]);
91 		}
92 		static if(sdlSupport >= SDLSupport.v2_0_4){
93 			ret ~= makeFnBinds([
94 				[q{void}, q{SDL_SetWindowsMessageHook}, q{SDL_WindowsMessageHook callback, void* userdata}],
95 			]);
96 		}
97 		static if(sdlSupport >= SDLSupport.v2_0_16){
98 			ret ~= makeFnBinds([
99 				[q{void}, q{SDL_RenderGetD3D11Device}, q{SDL_Renderer* renderer}],
100 			]);
101 		}
102 	}
103 	version(linux){
104 		static if(sdlSupport >= SDLSupport.v2_0_9){
105 			ret ~= makeFnBinds([
106 				[q{int}, q{SDL_LinuxSetThreadPriority}, q{long threadID, int priority}],
107 			]);
108 		}
109 		static if(sdlSupport >= SDLSupport.v2_0_18){
110 			ret ~= makeFnBinds([
111 				[q{int}, q{SDL_LinuxSetThreadPriorityAndPolicy}, q{long threadID, int sdlPriority, int schedPolicy}],
112 			]);
113 		}
114 	}
115 	version(iOS){
116 		ret ~= makeFnBinds([
117 			[q{int}, q{SDL_iPhoneSetAnimationCallback}, q{SDL_Window* window, int interval, void function(void*) callback, void* callbackParam}],
118 			[q{void}, q{SDL_iPhoneSetEventPump}, q{SDL_bool enabled}],
119 		]);
120 		static if(sdlSupport >= SDLSupport.v2_0_12){
121 			ret ~= makeFnBinds([
122 				[q{void}, q{SDL_OnApplicationDidChangeStatusBarOrientation}, q{}],
123 			]);
124 		}
125 	}
126 	version(Android){
127 		ret ~= makeFnBinds([
128 			[q{void*}, q{SDL_AndroidGetJNIEnv}, q{}],
129 			[q{void*}, q{SDL_AndroidGetActivity}, q{}],
130 			[q{const(char)*}, q{SDL_AndroidGetInternalStoragePath}, q{}],
131 			[q{int}, q{SDL_AndroidGetExternalStorageState}, q{}],
132 			[q{const(char)*}, q{SDL_AndroidGetExternalStoragePath}, q{}],
133 		]);
134 		static if(sdlSupport >= SDLSupport.v2_0_8){
135 			ret ~= makeFnBinds([
136 				[q{SDL_bool}, q{SDL_IsAndroidTV}, q{}],
137 			]);
138 		}
139 		static if(sdlSupport >= SDLSupport.v2_0_9){
140 			ret ~= makeFnBinds([
141 				[q{SDL_bool}, q{SDL_IsChromebook}, q{}],
142 				[q{SDL_bool}, q{SDL_IsDeXMode}, q{}],
143 				[q{void}, q{SDL_AndroidBackButton}, q{}],
144 			]);
145 		}
146 		static if(sdlSupport >= SDLSupport.v2_0_12){
147 			ret ~= makeFnBinds([
148 				[q{int}, q{SDL_GetAndroidSDKVersion}, q{}],
149 			]);
150 		}
151 		static if(sdlSupport >= SDLSupport.v2_0_14){
152 			ret ~= makeFnBinds([
153 				[q{SDL_bool}, q{SDL_AndroidRequestPermission}, q{const(char)* permission}],
154 			]);
155 		}
156 		static if(sdlSupport >= SDLSupport.v2_0_16){
157 			ret ~= makeFnBinds([
158 				[q{int}, q{SDL_AndroidShowToast}, q{const(char)* message, int duration, int gravity, int xoffset, int yoffset}],
159 			]);
160 		}
161 		static if(sdlSupport >= SDLSupport.v2_0_22){
162 			ret ~= makeFnBinds([
163 				[q{int}, q{SDL_AndroidSendMessage}, q{uint command, int param}],
164 			]);
165 		}
166 	}
167 	version(WinRT){
168 		static if(sdlSupport >= SDLSupport.v2_0_3){
169 			ret ~= makeFnBinds([
170 				[q{wchar_t*}, q{SDL_WinRTGetFSPathUNICODE}, q{SDL_WinRT_Path pathType}],
171 				[q{const(char)*}, q{SDL_WinRTGetFSPathUTF8}, q{SDL_WinRT_Path pathType}],
172 			]);
173 		}
174 		static if(sdlSupport >= SDLSupport.v2_0_8){
175 			ret ~= makeFnBinds([
176 				[q{SDL_WinRT_DeviceFamily}, q{SDL_WinRTGetDeviceFamily}, q{}],
177 			]);
178 		}
179 	}
180 	version(WinGDK){
181 		static if(sdlSupport >= SDLSupport.v2_24){
182 			ret ~= makeFnBinds([
183 				[q{int}, q{SDL_GDKGetTaskQueue}, q{XTaskQueueHandle* outTaskQueue}],
184 			]);
185 		}
186 	}
187 	return ret;
188 }()));
189 
190 version(iOS){
191 	static if(sdlSupport >= SDLSupport.v2_0_4):
192 	alias SDL_iOSSetAnimationCallback = SDL_iPhoneSetAnimationCallback;
193 	alias SDL_iOSSetEventPump = SDL_iPhoneSetEventPump;
194 }