1 
2 //          Copyright Michael D. Parker 2018.
3 // Distributed under the Boost Software License, Version 1.0.
4 //    (See accompanying file LICENSE_1_0.txt or copy at
5 //          http://www.boost.org/LICENSE_1_0.txt)
6 
7 module bindbc.sdl.bind.sdlsyswm;
8 
9 import core.stdc.config : c_long;
10 import bindbc.sdl.config;
11 import bindbc.sdl.bind.sdlstdinc : SDL_bool;
12 import bindbc.sdl.bind.sdlversion : SDL_version;
13 import bindbc.sdl.bind.sdlvideo : SDL_Window;
14 
15 static if(sdlSupport >= SDLSupport.sdl205) {
16     enum SDL_SYSWM_TYPE {
17         SDL_SYSWM_UNKNOWN,
18         SDL_SYSWM_WINDOWS,
19         SDL_SYSWM_X11,
20         SDL_SYSWM_DIRECTFB,
21         SDL_SYSWM_COCOA,
22         SDL_SYSWM_UIKIT,
23         SDL_SYSWM_WAYLAND,
24         SDL_SYSWM_MIR,
25         SDL_SYSWM_WINRT,
26         SDL_SYSWM_ANDROID,
27         SDL_SYSWM_VIVANTE,
28         SDL_SYSWM_OS2,
29     }
30 }
31 else static if(sdlSupport >= SDLSupport.sdl205) {
32     enum SDL_SYSWM_TYPE {
33         SDL_SYSWM_UNKNOWN,
34         SDL_SYSWM_WINDOWS,
35         SDL_SYSWM_X11,
36         SDL_SYSWM_DIRECTFB,
37         SDL_SYSWM_COCOA,
38         SDL_SYSWM_UIKIT,
39         SDL_SYSWM_WAYLAND,
40         SDL_SYSWM_MIR,
41         SDL_SYSWM_WINRT,
42         SDL_SYSWM_ANDROID,
43         SDL_SYSWM_VIVANTE,
44     }
45 }
46 else static if(sdlSupport >= SDLSupport.sdl204) {
47     enum SDL_SYSWM_TYPE {
48         SDL_SYSWM_UNKNOWN,
49         SDL_SYSWM_WINDOWS,
50         SDL_SYSWM_X11,
51         SDL_SYSWM_DIRECTFB,
52         SDL_SYSWM_COCOA,
53         SDL_SYSWM_UIKIT,
54         SDL_SYSWM_WAYLAND,
55         SDL_SYSWM_MIR,
56         SDL_SYSWM_WINRT,
57         SDL_SYSWM_ANDROID,
58     }
59 }
60 else static if(sdlSupport >= SDLSupport.sdl203) {
61     enum SDL_SYSWM_TYPE {
62         SDL_SYSWM_UNKNOWN,
63         SDL_SYSWM_WINDOWS,
64         SDL_SYSWM_X11,
65         SDL_SYSWM_DIRECTFB,
66         SDL_SYSWM_COCOA,
67         SDL_SYSWM_UIKIT,
68         SDL_SYSWM_WAYLAND,
69         SDL_SYSWM_MIR,
70         SDL_SYSWM_WINRT,
71     }
72 }
73 else static if(sdlSupport >= SDLSupport.sdl202) {
74     enum SDL_SYSWM_TYPE {
75         SDL_SYSWM_UNKNOWN,
76         SDL_SYSWM_WINDOWS,
77         SDL_SYSWM_X11,
78         SDL_SYSWM_DIRECTFB,
79         SDL_SYSWM_COCOA,
80         SDL_SYSWM_UIKIT,
81         SDL_SYSWM_WAYLAND,
82         SDL_SYSWM_MIR,
83     }
84 }
85 else {
86     enum SDL_SYSWM_TYPE {
87         SDL_SYSWM_UNKNOWN,
88         SDL_SYSWM_WINDOWS,
89         SDL_SYSWM_X11,
90         SDL_SYSWM_DIRECTFB,
91         SDL_SYSWM_COCOA,
92         SDL_SYSWM_UIKIT,
93     }
94 }
95 mixin(expandEnum!SDL_SYSWM_TYPE);
96 
97 version(Windows) {
98     // I don't want to import core.sys.windows.windows just for these
99     version(Win64) {
100         alias wparam = ulong;
101         alias lparam = long;
102     }else {
103         alias wparam = uint;
104         alias lparam = int;
105     }
106 }
107 
108 struct SDL_SysWMmsg {
109     SDL_version version_;
110     SDL_SYSWM_TYPE subsystem;
111     union msg_ {
112         version(Windows) {
113             struct win_ {
114                 void* hwnd;
115                 uint msg;
116                 wparam wParam;
117                 lparam lParam;
118             }
119             win_ win;
120         }
121         else version(OSX) {
122             struct cocoa_ {
123                 int dummy;
124             }
125             cocoa_ cocoa;
126         }
127         else version(linux) {
128             struct dfb_ {
129                 void* event;
130             }
131             dfb_ dfb;
132         }
133 
134         version(Posix) {
135             struct x11_ {
136                 c_long[24] pad; // sufficient size for any X11 event
137             }
138             x11_ x11;
139         }
140 
141         static if(sdlSupport >= SDLSupport.sdl205) {
142             struct vivante_ {
143                 int dummy;
144             }
145             vivante_ vivante;
146         }
147 
148         int dummy;
149     }
150     msg_ msg;
151 }
152 
153 struct SDL_SysWMinfo {
154     SDL_version version_;
155     SDL_SYSWM_TYPE subsystem;
156 
157     union info_ {
158         version(Windows) {
159             struct win_ {
160                void* window;
161                static if(sdlSupport >= SDLSupport.sdl204) void* hdc;
162                static if(sdlSupport >= SDLSupport.sdl206) void* hinstance;
163             }
164             win_ win;
165         }
166         else version(OSX) {
167             struct cocoa_ {
168                void* window;
169             }
170             cocoa_ cocoa;
171 
172             struct uikit_ {
173                 void *window;
174             }
175             uikit_ uikit;
176 
177         }
178         else version(linux) {
179             struct dfb_ {
180                 void *dfb;
181                 void *window;
182                 void *surface;
183             }
184             dfb_ dfb;
185 
186             static if(sdlSupport >= SDLSupport.sdl202) {
187                 struct wl_ {
188                     void *display;
189                     void *surface;
190                     void *shell_surface;
191                 }
192                 wl_ wl;
193 
194                 struct mir_ {
195                     void *connection;
196                     void *surface;
197                 }
198                 mir_ mir;
199             }
200         }
201 
202         version(Posix) {
203             struct x11_ {
204                 void* display;
205                 uint window;
206             }
207             x11_ x11;
208         }
209 
210         static if(sdlSupport >= SDLSupport.sdl204) {
211             version(Android) {
212                 struct android_ {
213                     void* window;
214                     void* surface;
215                 }
216                 android_ android;
217             }
218         }
219 
220         static if(sdlSupport >= SDLSupport.sdl206) ubyte[64] dummy;
221         else int dummy;
222     }
223     info_ info;
224 }
225 
226 version(BindSDL_Static) {
227     extern(C) @nogc nothrow {
228         SDL_bool SDL_GetWindowWMInfo(SDL_Window*,SDL_SysWMinfo*);
229     }
230 }
231 else {
232     extern(C) @nogc nothrow {
233         alias pSDL_GetWindowWMInfo = SDL_bool function(SDL_Window*,SDL_SysWMinfo*);
234     }
235 
236     __gshared {
237         pSDL_GetWindowWMInfo SDL_GetWindowWMInfo;
238     }
239 }