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