SDL 2.0
SDL_waylandtouch.c
Go to the documentation of this file.
1/*
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2019 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/* Contributed by Thomas Perl <thomas.perl@jollamobile.com> */
23
24#include "../../SDL_internal.h"
25
26#ifdef SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH
27
28#include "SDL_log.h"
29#include "SDL_waylandtouch.h"
30#include "../../events/SDL_touch_c.h"
31
32struct SDL_WaylandTouch {
33 struct qt_touch_extension *touch_extension;
34};
35
36
37/**
38 * Qt TouchPointState
39 * adapted from qtbase/src/corelib/global/qnamespace.h
40 **/
41enum QtWaylandTouchPointState {
42 QtWaylandTouchPointPressed = 0x01,
43 QtWaylandTouchPointMoved = 0x02,
44 /*
45 Never sent by the server:
46 QtWaylandTouchPointStationary = 0x04,
47 */
48 QtWaylandTouchPointReleased = 0x08,
49};
50
51static void
52touch_handle_touch(void *data,
53 struct qt_touch_extension *qt_touch_extension,
55 uint32_t id,
57 int32_t x,
58 int32_t y,
59 int32_t normalized_x,
60 int32_t normalized_y,
63 uint32_t pressure,
64 int32_t velocity_x,
65 int32_t velocity_y,
67 struct wl_array *rawdata)
68{
69 /**
70 * Event is assembled in QtWayland in TouchExtensionGlobal::postTouchEvent
71 * (src/compositor/wayland_wrapper/qwltouch.cpp)
72 **/
73
74 float FIXED_TO_FLOAT = 1. / 10000.;
75 float xf = FIXED_TO_FLOAT * x;
76 float yf = FIXED_TO_FLOAT * y;
77
78 float PRESSURE_TO_FLOAT = 1. / 255.;
79 float pressuref = PRESSURE_TO_FLOAT * pressure;
80
81 uint32_t touchState = state & 0xFFFF;
82 /*
83 Other fields that are sent by the server (qwltouch.cpp),
84 but not used at the moment can be decoded in this way:
85
86 uint32_t sentPointCount = state >> 16;
87 uint32_t touchFlags = flags & 0xFFFF;
88 uint32_t capabilities = flags >> 16;
89 */
90
91 SDL_TouchID deviceId = 1;
92 if (SDL_AddTouch(deviceId, SDL_TOUCH_DEVICE_DIRECT, "qt_touch_extension") < 0) {
93 SDL_Log("error: can't add touch %s, %d", __FILE__, __LINE__);
94 }
95
96 switch (touchState) {
97 case QtWaylandTouchPointPressed:
98 case QtWaylandTouchPointReleased:
99 SDL_SendTouch(deviceId, (SDL_FingerID)id,
100 (touchState == QtWaylandTouchPointPressed) ? SDL_TRUE : SDL_FALSE,
101 xf, yf, pressuref);
102 break;
103 case QtWaylandTouchPointMoved:
104 SDL_SendTouchMotion(deviceId, (SDL_FingerID)id, xf, yf, pressuref);
105 break;
106 default:
107 /* Should not happen */
108 break;
109 }
110}
111
112static void
113touch_handle_configure(void *data,
114 struct qt_touch_extension *qt_touch_extension,
116{
117}
118
119
120/* wayland-qt-touch-extension.c BEGINS */
121
122static const struct qt_touch_extension_listener touch_listener = {
123 touch_handle_touch,
124 touch_handle_configure,
125};
126
127static const struct wl_interface *qt_touch_extension_types[] = {
128 NULL,
129 NULL,
130 NULL,
131 NULL,
132 NULL,
133 NULL,
134 NULL,
135 NULL,
136 NULL,
137 NULL,
138 NULL,
139 NULL,
140 NULL,
141 NULL,
142};
143
144static const struct wl_message qt_touch_extension_requests[] = {
145 { "dummy", "", qt_touch_extension_types + 0 },
146};
147
148static const struct wl_message qt_touch_extension_events[] = {
149 { "touch", "uuuiiiiiiuiiua", qt_touch_extension_types + 0 },
150 { "configure", "u", qt_touch_extension_types + 0 },
151};
152
153WL_EXPORT const struct wl_interface qt_touch_extension_interface = {
154 "qt_touch_extension", 1,
155 1, qt_touch_extension_requests,
156 2, qt_touch_extension_events,
157};
158
159/* wayland-qt-touch-extension.c ENDS */
160
161/* wayland-qt-windowmanager.c BEGINS */
162static const struct wl_interface *qt_windowmanager_types[] = {
163 NULL,
164 NULL,
165};
166
167static const struct wl_message qt_windowmanager_requests[] = {
168 { "open_url", "us", qt_windowmanager_types + 0 },
169};
170
171static const struct wl_message qt_windowmanager_events[] = {
172 { "hints", "i", qt_windowmanager_types + 0 },
173 { "quit", "", qt_windowmanager_types + 0 },
174};
175
176WL_EXPORT const struct wl_interface qt_windowmanager_interface = {
177 "qt_windowmanager", 1,
178 1, qt_windowmanager_requests,
179 2, qt_windowmanager_events,
180};
181/* wayland-qt-windowmanager.c ENDS */
182
183/* wayland-qt-surface-extension.c BEGINS */
184extern const struct wl_interface qt_extended_surface_interface;
185#ifndef SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC
186extern const struct wl_interface wl_surface_interface;
187#endif
188
189static const struct wl_interface *qt_surface_extension_types[] = {
190 NULL,
191 NULL,
192 &qt_extended_surface_interface,
193#ifdef SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC
194 /* FIXME: Set this dynamically to (*WAYLAND_wl_surface_interface) ?
195 * The value comes from auto generated code and does
196 * not appear to actually be used anywhere
197 */
198 NULL,
199#else
201#endif
202};
203
204static const struct wl_message qt_surface_extension_requests[] = {
205 { "get_extended_surface", "no", qt_surface_extension_types + 2 },
206};
207
208WL_EXPORT const struct wl_interface qt_surface_extension_interface = {
209 "qt_surface_extension", 1,
210 1, qt_surface_extension_requests,
211 0, NULL,
212};
213
214static const struct wl_message qt_extended_surface_requests[] = {
215 { "update_generic_property", "sa", qt_surface_extension_types + 0 },
216 { "set_content_orientation", "i", qt_surface_extension_types + 0 },
217 { "set_window_flags", "i", qt_surface_extension_types + 0 },
218};
219
220static const struct wl_message qt_extended_surface_events[] = {
221 { "onscreen_visibility", "i", qt_surface_extension_types + 0 },
222 { "set_generic_property", "sa", qt_surface_extension_types + 0 },
223 { "close", "", qt_surface_extension_types + 0 },
224};
225
226WL_EXPORT const struct wl_interface qt_extended_surface_interface = {
227 "qt_extended_surface", 1,
228 3, qt_extended_surface_requests,
229 3, qt_extended_surface_events,
230};
231
232/* wayland-qt-surface-extension.c ENDS */
233
234void
235Wayland_touch_create(SDL_VideoData *data, uint32_t id)
236{
237 struct SDL_WaylandTouch *touch;
238
239 if (data->touch) {
240 Wayland_touch_destroy(data);
241 }
242
243 /* !!! FIXME: check for failure, call SDL_OutOfMemory() */
244 data->touch = SDL_malloc(sizeof(struct SDL_WaylandTouch));
245
246 touch = data->touch;
247 touch->touch_extension = wl_registry_bind(data->registry, id, &qt_touch_extension_interface, 1);
248 qt_touch_extension_add_listener(touch->touch_extension, &touch_listener, data);
249}
250
251void
252Wayland_touch_destroy(SDL_VideoData *data)
253{
254 if (data->touch) {
255 struct SDL_WaylandTouch *touch = data->touch;
256 if (touch->touch_extension) {
257 qt_touch_extension_destroy(touch->touch_extension);
258 }
259
260 SDL_free(data->touch);
261 data->touch = NULL;
262 }
263}
264
265#endif /* SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH */
unsigned int uint32_t
signed int int32_t
#define SDL_malloc
#define SDL_free
#define SDL_Log
GLint GLint GLint GLint GLint GLint y
Definition: SDL_opengl.h:1574
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: SDL_opengl.h:1974
GLint GLint GLsizei width
Definition: SDL_opengl.h:1572
GLint GLint GLint GLint GLint x
Definition: SDL_opengl.h:1574
GLint GLint GLsizei GLsizei height
Definition: SDL_opengl.h:1572
GLbitfield flags
@ SDL_TRUE
Definition: SDL_stdinc.h:164
@ SDL_FALSE
Definition: SDL_stdinc.h:163
int SDL_SendTouch(SDL_TouchID id, SDL_FingerID fingerid, SDL_bool down, float x, float y, float pressure)
Definition: SDL_touch.c:242
int SDL_SendTouchMotion(SDL_TouchID id, SDL_FingerID fingerid, float x, float y, float pressure)
Definition: SDL_touch.c:364
int SDL_AddTouch(SDL_TouchID touchID, SDL_TouchDeviceType type, const char *name)
Definition: SDL_touch.c:155
Sint64 SDL_FingerID
Definition: SDL_touch.h:42
@ SDL_TOUCH_DEVICE_DIRECT
Definition: SDL_touch.h:47
Sint64 SDL_TouchID
Definition: SDL_touch.h:41
struct xkb_state * state
#define NULL
Definition: begin_code.h:167
EGLSurface EGLnsecsANDROID time
Definition: eglext.h:518
static void * wl_registry_bind(struct wl_registry *wl_registry, uint32_t name, const struct wl_interface *interface, uint32_t version)
const struct wl_interface wl_surface_interface