1 | /* |
2 | Simple DirectMedia Layer |
3 | Copyright (C) 1997-2021 Sam Lantinga <slouken@libsdl.org> |
4 | |
5 | This software is provided 'as-is', without any express or implied |
6 | warranty. In no event will the authors be held liable for any damages |
7 | arising from the use of this software. |
8 | |
9 | Permission is granted to anyone to use this software for any purpose, |
10 | including commercial applications, and to alter it and redistribute it |
11 | freely, subject to the following restrictions: |
12 | |
13 | 1. The origin of this software must not be misrepresented; you must not |
14 | claim that you wrote the original software. If you use this software |
15 | in a product, an acknowledgment in the product documentation would be |
16 | appreciated but is not required. |
17 | 2. Altered source versions must be plainly marked as such, and must not be |
18 | misrepresented as being the original software. |
19 | 3. This notice may not be removed or altered from any source distribution. |
20 | */ |
21 | |
22 | #ifndef SDL_waylandtouch_h_ |
23 | #define SDL_waylandtouch_h_ |
24 | |
25 | #include "../../SDL_internal.h" |
26 | |
27 | #ifdef SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH |
28 | |
29 | #include "SDL_waylandvideo.h" |
30 | #include <stdint.h> |
31 | #include <stddef.h> |
32 | #include "wayland-util.h" |
33 | #include "SDL_waylanddyn.h" |
34 | |
35 | |
36 | void Wayland_touch_create(SDL_VideoData *data, uint32_t id); |
37 | void Wayland_touch_destroy(SDL_VideoData *data); |
38 | |
39 | struct qt_touch_extension; |
40 | |
41 | /* Autogenerated QT headers */ |
42 | |
43 | /* |
44 | Support for Wayland with QmlCompositor as Server |
45 | ================================================ |
46 | |
47 | The Wayland video driver has support for some additional features when |
48 | using QtWayland's "qmlcompositor" as Wayland server. This is needed for touch |
49 | input when running SDL applications under a qmlcompositor Wayland server. |
50 | |
51 | The files following headers have been |
52 | generated from the Wayland XML Protocol Definition in QtWayland as follows: |
53 | |
54 | Clone QtWayland from Git: |
55 | http://qt.gitorious.org/qt/qtwayland/ |
56 | |
57 | Generate headers and glue code: |
58 | for extension in touch-extension surface-extension windowmanager; do |
59 | wayland-scanner client-header < src/extensions/$extension.xml > wayland-qt-$extension.h |
60 | wayland-scanner code < src/extensions/$extension.xml > wayland-qt-$extension.c |
61 | done |
62 | |
63 | */ |
64 | |
65 | /* wayland-qt-surface-extension.h */ |
66 | |
67 | struct wl_client; |
68 | struct wl_resource; |
69 | |
70 | struct qt_surface_extension; |
71 | struct qt_extended_surface; |
72 | |
73 | extern const struct wl_interface qt_surface_extension_interface; |
74 | extern const struct wl_interface qt_extended_surface_interface; |
75 | |
76 | #define QT_SURFACE_EXTENSION_GET_EXTENDED_SURFACE 0 |
77 | |
78 | static inline void |
79 | qt_surface_extension_set_user_data(struct qt_surface_extension *qt_surface_extension, void *user_data) |
80 | { |
81 | wl_proxy_set_user_data((struct wl_proxy *) qt_surface_extension, user_data); |
82 | } |
83 | |
84 | static inline void * |
85 | qt_surface_extension_get_user_data(struct qt_surface_extension *qt_surface_extension) |
86 | { |
87 | return wl_proxy_get_user_data((struct wl_proxy *) qt_surface_extension); |
88 | } |
89 | |
90 | static inline void |
91 | qt_surface_extension_destroy(struct qt_surface_extension *qt_surface_extension) |
92 | { |
93 | WAYLAND_wl_proxy_destroy((struct wl_proxy *) qt_surface_extension); |
94 | } |
95 | |
96 | static inline struct qt_extended_surface * |
97 | qt_surface_extension_get_extended_surface(struct qt_surface_extension *qt_surface_extension, struct wl_surface *surface) |
98 | { |
99 | struct wl_proxy *id; |
100 | |
101 | id = wl_proxy_create((struct wl_proxy *) qt_surface_extension, |
102 | &qt_extended_surface_interface); |
103 | if (!id) |
104 | return NULL; |
105 | |
106 | WAYLAND_wl_proxy_marshal((struct wl_proxy *) qt_surface_extension, |
107 | QT_SURFACE_EXTENSION_GET_EXTENDED_SURFACE, id, surface); |
108 | |
109 | return (struct qt_extended_surface *) id; |
110 | } |
111 | |
112 | #ifndef QT_EXTENDED_SURFACE_ORIENTATION_ENUM |
113 | #define QT_EXTENDED_SURFACE_ORIENTATION_ENUM |
114 | enum qt_extended_surface_orientation { |
115 | QT_EXTENDED_SURFACE_ORIENTATION_PRIMARYORIENTATION = 0, |
116 | QT_EXTENDED_SURFACE_ORIENTATION_PORTRAITORIENTATION = 1, |
117 | QT_EXTENDED_SURFACE_ORIENTATION_LANDSCAPEORIENTATION = 2, |
118 | QT_EXTENDED_SURFACE_ORIENTATION_INVERTEDPORTRAITORIENTATION = 4, |
119 | QT_EXTENDED_SURFACE_ORIENTATION_INVERTEDLANDSCAPEORIENTATION = 8, |
120 | }; |
121 | #endif /* QT_EXTENDED_SURFACE_ORIENTATION_ENUM */ |
122 | |
123 | #ifndef QT_EXTENDED_SURFACE_WINDOWFLAG_ENUM |
124 | #define QT_EXTENDED_SURFACE_WINDOWFLAG_ENUM |
125 | enum qt_extended_surface_windowflag { |
126 | QT_EXTENDED_SURFACE_WINDOWFLAG_OVERRIDESSYSTEMGESTURES = 1, |
127 | QT_EXTENDED_SURFACE_WINDOWFLAG_STAYSONTOP = 2, |
128 | }; |
129 | #endif /* QT_EXTENDED_SURFACE_WINDOWFLAG_ENUM */ |
130 | |
131 | struct qt_extended_surface_listener { |
132 | /** |
133 | * onscreen_visibility - (none) |
134 | * @visible: (none) |
135 | */ |
136 | void (*onscreen_visibility)(void *data, |
137 | struct qt_extended_surface *qt_extended_surface, |
138 | int32_t visible); |
139 | /** |
140 | * set_generic_property - (none) |
141 | * @name: (none) |
142 | * @value: (none) |
143 | */ |
144 | void (*set_generic_property)(void *data, |
145 | struct qt_extended_surface *qt_extended_surface, |
146 | const char *name, |
147 | struct wl_array *value); |
148 | /** |
149 | * close - (none) |
150 | */ |
151 | void (*close)(void *data, |
152 | struct qt_extended_surface *qt_extended_surface); |
153 | }; |
154 | |
155 | static inline int |
156 | qt_extended_surface_add_listener(struct qt_extended_surface *qt_extended_surface, |
157 | const struct qt_extended_surface_listener *listener, void *data) |
158 | { |
159 | return wl_proxy_add_listener((struct wl_proxy *) qt_extended_surface, |
160 | (void (**)(void)) listener, data); |
161 | } |
162 | |
163 | #define QT_EXTENDED_SURFACE_UPDATE_GENERIC_PROPERTY 0 |
164 | #define QT_EXTENDED_SURFACE_SET_CONTENT_ORIENTATION 1 |
165 | #define QT_EXTENDED_SURFACE_SET_WINDOW_FLAGS 2 |
166 | |
167 | static inline void |
168 | qt_extended_surface_set_user_data(struct qt_extended_surface *qt_extended_surface, void *user_data) |
169 | { |
170 | WAYLAND_wl_proxy_set_user_data((struct wl_proxy *) qt_extended_surface, user_data); |
171 | } |
172 | |
173 | static inline void * |
174 | qt_extended_surface_get_user_data(struct qt_extended_surface *qt_extended_surface) |
175 | { |
176 | return WAYLAND_wl_proxy_get_user_data((struct wl_proxy *) qt_extended_surface); |
177 | } |
178 | |
179 | static inline void |
180 | qt_extended_surface_destroy(struct qt_extended_surface *qt_extended_surface) |
181 | { |
182 | WAYLAND_wl_proxy_destroy((struct wl_proxy *) qt_extended_surface); |
183 | } |
184 | |
185 | static inline void |
186 | qt_extended_surface_update_generic_property(struct qt_extended_surface *qt_extended_surface, const char *name, struct wl_array *value) |
187 | { |
188 | WAYLAND_wl_proxy_marshal((struct wl_proxy *) qt_extended_surface, |
189 | QT_EXTENDED_SURFACE_UPDATE_GENERIC_PROPERTY, name, value); |
190 | } |
191 | |
192 | static inline void |
193 | qt_extended_surface_set_content_orientation(struct qt_extended_surface *qt_extended_surface, int32_t orientation) |
194 | { |
195 | WAYLAND_wl_proxy_marshal((struct wl_proxy *) qt_extended_surface, |
196 | QT_EXTENDED_SURFACE_SET_CONTENT_ORIENTATION, orientation); |
197 | } |
198 | |
199 | static inline void |
200 | qt_extended_surface_set_window_flags(struct qt_extended_surface *qt_extended_surface, int32_t flags) |
201 | { |
202 | WAYLAND_wl_proxy_marshal((struct wl_proxy *) qt_extended_surface, |
203 | QT_EXTENDED_SURFACE_SET_WINDOW_FLAGS, flags); |
204 | } |
205 | |
206 | /* wayland-qt-touch-extension.h */ |
207 | |
208 | extern const struct wl_interface qt_touch_extension_interface; |
209 | |
210 | #ifndef QT_TOUCH_EXTENSION_FLAGS_ENUM |
211 | #define QT_TOUCH_EXTENSION_FLAGS_ENUM |
212 | enum qt_touch_extension_flags { |
213 | QT_TOUCH_EXTENSION_FLAGS_MOUSE_FROM_TOUCH = 0x1, |
214 | }; |
215 | #endif /* QT_TOUCH_EXTENSION_FLAGS_ENUM */ |
216 | |
217 | struct qt_touch_extension_listener { |
218 | /** |
219 | * touch - (none) |
220 | * @time: (none) |
221 | * @id: (none) |
222 | * @state: (none) |
223 | * @x: (none) |
224 | * @y: (none) |
225 | * @normalized_x: (none) |
226 | * @normalized_y: (none) |
227 | * @width: (none) |
228 | * @height: (none) |
229 | * @pressure: (none) |
230 | * @velocity_x: (none) |
231 | * @velocity_y: (none) |
232 | * @flags: (none) |
233 | * @rawdata: (none) |
234 | */ |
235 | void (*touch)(void *data, |
236 | struct qt_touch_extension *qt_touch_extension, |
237 | uint32_t time, |
238 | uint32_t id, |
239 | uint32_t state, |
240 | int32_t x, |
241 | int32_t y, |
242 | int32_t normalized_x, |
243 | int32_t normalized_y, |
244 | int32_t width, |
245 | int32_t height, |
246 | uint32_t pressure, |
247 | int32_t velocity_x, |
248 | int32_t velocity_y, |
249 | uint32_t flags, |
250 | struct wl_array *rawdata); |
251 | /** |
252 | * configure - (none) |
253 | * @flags: (none) |
254 | */ |
255 | void (*configure)(void *data, |
256 | struct qt_touch_extension *qt_touch_extension, |
257 | uint32_t flags); |
258 | }; |
259 | |
260 | static inline int |
261 | qt_touch_extension_add_listener(struct qt_touch_extension *qt_touch_extension, |
262 | const struct qt_touch_extension_listener *listener, void *data) |
263 | { |
264 | return wl_proxy_add_listener((struct wl_proxy *) qt_touch_extension, |
265 | (void (**)(void)) listener, data); |
266 | } |
267 | |
268 | #define QT_TOUCH_EXTENSION_DUMMY 0 |
269 | |
270 | static inline void |
271 | qt_touch_extension_set_user_data(struct qt_touch_extension *qt_touch_extension, void *user_data) |
272 | { |
273 | WAYLAND_wl_proxy_set_user_data((struct wl_proxy *) qt_touch_extension, user_data); |
274 | } |
275 | |
276 | static inline void * |
277 | qt_touch_extension_get_user_data(struct qt_touch_extension *qt_touch_extension) |
278 | { |
279 | return WAYLAND_wl_proxy_get_user_data((struct wl_proxy *) qt_touch_extension); |
280 | } |
281 | |
282 | static inline void |
283 | qt_touch_extension_destroy(struct qt_touch_extension *qt_touch_extension) |
284 | { |
285 | WAYLAND_wl_proxy_destroy((struct wl_proxy *) qt_touch_extension); |
286 | } |
287 | |
288 | static inline void |
289 | qt_touch_extension_dummy(struct qt_touch_extension *qt_touch_extension) |
290 | { |
291 | WAYLAND_wl_proxy_marshal((struct wl_proxy *) qt_touch_extension, |
292 | QT_TOUCH_EXTENSION_DUMMY); |
293 | } |
294 | |
295 | |
296 | /* wayland-qt-windowmanager.h */ |
297 | |
298 | extern const struct wl_interface qt_windowmanager_interface; |
299 | |
300 | struct qt_windowmanager_listener { |
301 | /** |
302 | * hints - (none) |
303 | * @show_is_fullscreen: (none) |
304 | */ |
305 | void (*hints)(void *data, |
306 | struct qt_windowmanager *qt_windowmanager, |
307 | int32_t show_is_fullscreen); |
308 | /** |
309 | * quit - (none) |
310 | */ |
311 | void (*quit)(void *data, |
312 | struct qt_windowmanager *qt_windowmanager); |
313 | }; |
314 | |
315 | static inline int |
316 | qt_windowmanager_add_listener(struct qt_windowmanager *qt_windowmanager, |
317 | const struct qt_windowmanager_listener *listener, void *data) |
318 | { |
319 | return wl_proxy_add_listener((struct wl_proxy *) qt_windowmanager, |
320 | (void (**)(void)) listener, data); |
321 | } |
322 | |
323 | #define QT_WINDOWMANAGER_OPEN_URL 0 |
324 | |
325 | static inline void |
326 | qt_windowmanager_set_user_data(struct qt_windowmanager *qt_windowmanager, void *user_data) |
327 | { |
328 | WAYLAND_wl_proxy_set_user_data((struct wl_proxy *) qt_windowmanager, user_data); |
329 | } |
330 | |
331 | static inline void * |
332 | qt_windowmanager_get_user_data(struct qt_windowmanager *qt_windowmanager) |
333 | { |
334 | return WAYLAND_wl_proxy_get_user_data((struct wl_proxy *) qt_windowmanager); |
335 | } |
336 | |
337 | static inline void |
338 | qt_windowmanager_destroy(struct qt_windowmanager *qt_windowmanager) |
339 | { |
340 | WAYLAND_wl_proxy_destroy((struct wl_proxy *) qt_windowmanager); |
341 | } |
342 | |
343 | static inline void |
344 | qt_windowmanager_open_url(struct qt_windowmanager *qt_windowmanager, uint32_t remaining, const char *url) |
345 | { |
346 | WAYLAND_wl_proxy_marshal((struct wl_proxy *) qt_windowmanager, |
347 | QT_WINDOWMANAGER_OPEN_URL, remaining, url); |
348 | } |
349 | |
350 | #endif /* SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH */ |
351 | |
352 | #endif /* SDL_waylandtouch_h_ */ |
353 | |