| /* |
| Simple DirectMedia Layer |
| Copyright (C) 1997-2023 Sam Lantinga <slouken@libsdl.org> |
| |
| This software is provided 'as-is', without any express or implied |
| warranty. In no event will the authors be held liable for any damages |
| arising from the use of this software. |
| |
| Permission is granted to anyone to use this software for any purpose, |
| including commercial applications, and to alter it and redistribute it |
| freely, subject to the following restrictions: |
| |
| 1. The origin of this software must not be misrepresented; you must not |
| claim that you wrote the original software. If you use this software |
| in a product, an acknowledgment in the product documentation would be |
| appreciated but is not required. |
| 2. Altered source versions must be plainly marked as such, and must not be |
| misrepresented as being the original software. |
| 3. This notice may not be removed or altered from any source distribution. |
| */ |
| |
| #ifndef SDL_waylandtouch_h_ |
| #define SDL_waylandtouch_h_ |
| |
| #include "../../SDL_internal.h" |
| |
| #ifdef SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH |
| |
| #include "SDL_waylandvideo.h" |
| #include <stdint.h> |
| #include <stddef.h> |
| #include "wayland-util.h" |
| |
| void Wayland_touch_create(SDL_VideoData *data, uint32_t id); |
| void Wayland_touch_destroy(SDL_VideoData *data); |
| |
| struct qt_touch_extension; |
| |
| /* Autogenerated QT headers */ |
| |
| /* |
| Support for Wayland with QmlCompositor as Server |
| ================================================ |
| |
| The Wayland video driver has support for some additional features when |
| using QtWayland's "qmlcompositor" as Wayland server. This is needed for touch |
| input when running SDL applications under a qmlcompositor Wayland server. |
| |
| The files following headers have been |
| generated from the Wayland XML Protocol Definition in QtWayland as follows: |
| |
| Clone QtWayland from Git: |
| http://qt.gitorious.org/qt/qtwayland/ |
| |
| Generate headers and glue code: |
| for extension in touch-extension surface-extension windowmanager; do |
| wayland-scanner client-header < src/extensions/$extension.xml > wayland-qt-$extension.h |
| wayland-scanner code < src/extensions/$extension.xml > wayland-qt-$extension.c |
| done |
| |
| */ |
| |
| /* wayland-qt-surface-extension.h */ |
| |
| struct wl_client; |
| struct wl_resource; |
| |
| struct qt_surface_extension; |
| struct qt_extended_surface; |
| |
| extern const struct wl_interface qt_surface_extension_interface; |
| extern const struct wl_interface qt_extended_surface_interface; |
| |
| #define QT_SURFACE_EXTENSION_GET_EXTENDED_SURFACE 0 |
| |
| static inline void qt_surface_extension_set_user_data(struct qt_surface_extension *qt_surface_extension, void *user_data) |
| { |
| wl_proxy_set_user_data((struct wl_proxy *)qt_surface_extension, user_data); |
| } |
| |
| static inline void *qt_surface_extension_get_user_data(struct qt_surface_extension *qt_surface_extension) |
| { |
| return wl_proxy_get_user_data((struct wl_proxy *)qt_surface_extension); |
| } |
| |
| static inline void qt_surface_extension_destroy(struct qt_surface_extension *qt_surface_extension) |
| { |
| WAYLAND_wl_proxy_destroy((struct wl_proxy *)qt_surface_extension); |
| } |
| |
| static inline struct qt_extended_surface *qt_surface_extension_get_extended_surface(struct qt_surface_extension *qt_surface_extension, struct wl_surface *surface) |
| { |
| struct wl_proxy *id; |
| |
| id = wl_proxy_create((struct wl_proxy *)qt_surface_extension, |
| &qt_extended_surface_interface); |
| if (id == NULL) |
| return NULL; |
| |
| WAYLAND_wl_proxy_marshal((struct wl_proxy *)qt_surface_extension, |
| QT_SURFACE_EXTENSION_GET_EXTENDED_SURFACE, id, surface); |
| |
| return (struct qt_extended_surface *)id; |
| } |
| |
| #ifndef QT_EXTENDED_SURFACE_ORIENTATION_ENUM |
| #define QT_EXTENDED_SURFACE_ORIENTATION_ENUM |
| enum qt_extended_surface_orientation |
| { |
| QT_EXTENDED_SURFACE_ORIENTATION_PRIMARYORIENTATION = 0, |
| QT_EXTENDED_SURFACE_ORIENTATION_PORTRAITORIENTATION = 1, |
| QT_EXTENDED_SURFACE_ORIENTATION_LANDSCAPEORIENTATION = 2, |
| QT_EXTENDED_SURFACE_ORIENTATION_INVERTEDPORTRAITORIENTATION = 4, |
| QT_EXTENDED_SURFACE_ORIENTATION_INVERTEDLANDSCAPEORIENTATION = 8, |
| }; |
| #endif /* QT_EXTENDED_SURFACE_ORIENTATION_ENUM */ |
| |
| #ifndef QT_EXTENDED_SURFACE_WINDOWFLAG_ENUM |
| #define QT_EXTENDED_SURFACE_WINDOWFLAG_ENUM |
| enum qt_extended_surface_windowflag |
| { |
| QT_EXTENDED_SURFACE_WINDOWFLAG_OVERRIDESSYSTEMGESTURES = 1, |
| QT_EXTENDED_SURFACE_WINDOWFLAG_STAYSONTOP = 2, |
| }; |
| #endif /* QT_EXTENDED_SURFACE_WINDOWFLAG_ENUM */ |
| |
| struct qt_extended_surface_listener |
| { |
| /** |
| * onscreen_visibility - (none) |
| * @visible: (none) |
| */ |
| void (*onscreen_visibility)(void *data, |
| struct qt_extended_surface *qt_extended_surface, |
| int32_t visible); |
| /** |
| * set_generic_property - (none) |
| * @name: (none) |
| * @value: (none) |
| */ |
| void (*set_generic_property)(void *data, |
| struct qt_extended_surface *qt_extended_surface, |
| const char *name, |
| struct wl_array *value); |
| /** |
| * close - (none) |
| */ |
| void (*close)(void *data, |
| struct qt_extended_surface *qt_extended_surface); |
| }; |
| |
| static inline int qt_extended_surface_add_listener(struct qt_extended_surface *qt_extended_surface, |
| const struct qt_extended_surface_listener *listener, void *data) |
| { |
| return wl_proxy_add_listener((struct wl_proxy *)qt_extended_surface, |
| (void (**)(void))listener, data); |
| } |
| |
| #define QT_EXTENDED_SURFACE_UPDATE_GENERIC_PROPERTY 0 |
| #define QT_EXTENDED_SURFACE_SET_CONTENT_ORIENTATION 1 |
| #define QT_EXTENDED_SURFACE_SET_WINDOW_FLAGS 2 |
| |
| static inline void qt_extended_surface_set_user_data(struct qt_extended_surface *qt_extended_surface, void *user_data) |
| { |
| WAYLAND_wl_proxy_set_user_data((struct wl_proxy *)qt_extended_surface, user_data); |
| } |
| |
| static inline void *qt_extended_surface_get_user_data(struct qt_extended_surface *qt_extended_surface) |
| { |
| return WAYLAND_wl_proxy_get_user_data((struct wl_proxy *)qt_extended_surface); |
| } |
| |
| static inline void qt_extended_surface_destroy(struct qt_extended_surface *qt_extended_surface) |
| { |
| WAYLAND_wl_proxy_destroy((struct wl_proxy *)qt_extended_surface); |
| } |
| |
| static inline void qt_extended_surface_update_generic_property(struct qt_extended_surface *qt_extended_surface, const char *name, struct wl_array *value) |
| { |
| WAYLAND_wl_proxy_marshal((struct wl_proxy *)qt_extended_surface, |
| QT_EXTENDED_SURFACE_UPDATE_GENERIC_PROPERTY, name, value); |
| } |
| |
| static inline void qt_extended_surface_set_content_orientation(struct qt_extended_surface *qt_extended_surface, int32_t orientation) |
| { |
| WAYLAND_wl_proxy_marshal((struct wl_proxy *)qt_extended_surface, |
| QT_EXTENDED_SURFACE_SET_CONTENT_ORIENTATION, orientation); |
| } |
| |
| static inline void qt_extended_surface_set_window_flags(struct qt_extended_surface *qt_extended_surface, int32_t flags) |
| { |
| WAYLAND_wl_proxy_marshal((struct wl_proxy *)qt_extended_surface, |
| QT_EXTENDED_SURFACE_SET_WINDOW_FLAGS, flags); |
| } |
| |
| /* wayland-qt-touch-extension.h */ |
| |
| extern const struct wl_interface qt_touch_extension_interface; |
| |
| #ifndef QT_TOUCH_EXTENSION_FLAGS_ENUM |
| #define QT_TOUCH_EXTENSION_FLAGS_ENUM |
| enum qt_touch_extension_flags |
| { |
| QT_TOUCH_EXTENSION_FLAGS_MOUSE_FROM_TOUCH = 0x1, |
| }; |
| #endif /* QT_TOUCH_EXTENSION_FLAGS_ENUM */ |
| |
| struct qt_touch_extension_listener |
| { |
| /** |
| * touch - (none) |
| * @time: (none) |
| * @id: (none) |
| * @state: (none) |
| * @x: (none) |
| * @y: (none) |
| * @normalized_x: (none) |
| * @normalized_y: (none) |
| * @width: (none) |
| * @height: (none) |
| * @pressure: (none) |
| * @velocity_x: (none) |
| * @velocity_y: (none) |
| * @flags: (none) |
| * @rawdata: (none) |
| */ |
| void (*touch)(void *data, |
| struct qt_touch_extension *qt_touch_extension, |
| uint32_t time, |
| uint32_t id, |
| uint32_t state, |
| int32_t x, |
| int32_t y, |
| int32_t normalized_x, |
| int32_t normalized_y, |
| int32_t width, |
| int32_t height, |
| uint32_t pressure, |
| int32_t velocity_x, |
| int32_t velocity_y, |
| uint32_t flags, |
| struct wl_array *rawdata); |
| /** |
| * configure - (none) |
| * @flags: (none) |
| */ |
| void (*configure)(void *data, |
| struct qt_touch_extension *qt_touch_extension, |
| uint32_t flags); |
| }; |
| |
| static inline int qt_touch_extension_add_listener(struct qt_touch_extension *qt_touch_extension, |
| const struct qt_touch_extension_listener *listener, void *data) |
| { |
| return wl_proxy_add_listener((struct wl_proxy *)qt_touch_extension, |
| (void (**)(void))listener, data); |
| } |
| |
| #define QT_TOUCH_EXTENSION_DUMMY 0 |
| |
| static inline void qt_touch_extension_set_user_data(struct qt_touch_extension *qt_touch_extension, void *user_data) |
| { |
| WAYLAND_wl_proxy_set_user_data((struct wl_proxy *)qt_touch_extension, user_data); |
| } |
| |
| static inline void *qt_touch_extension_get_user_data(struct qt_touch_extension *qt_touch_extension) |
| { |
| return WAYLAND_wl_proxy_get_user_data((struct wl_proxy *)qt_touch_extension); |
| } |
| |
| static inline void qt_touch_extension_destroy(struct qt_touch_extension *qt_touch_extension) |
| { |
| WAYLAND_wl_proxy_destroy((struct wl_proxy *)qt_touch_extension); |
| } |
| |
| static inline void qt_touch_extension_dummy(struct qt_touch_extension *qt_touch_extension) |
| { |
| WAYLAND_wl_proxy_marshal((struct wl_proxy *)qt_touch_extension, |
| QT_TOUCH_EXTENSION_DUMMY); |
| } |
| |
| /* wayland-qt-windowmanager.h */ |
| |
| extern const struct wl_interface qt_windowmanager_interface; |
| |
| struct qt_windowmanager_listener |
| { |
| /** |
| * hints - (none) |
| * @show_is_fullscreen: (none) |
| */ |
| void (*hints)(void *data, |
| struct qt_windowmanager *qt_windowmanager, |
| int32_t show_is_fullscreen); |
| /** |
| * quit - (none) |
| */ |
| void (*quit)(void *data, |
| struct qt_windowmanager *qt_windowmanager); |
| }; |
| |
| static inline int qt_windowmanager_add_listener(struct qt_windowmanager *qt_windowmanager, |
| const struct qt_windowmanager_listener *listener, void *data) |
| { |
| return wl_proxy_add_listener((struct wl_proxy *)qt_windowmanager, |
| (void (**)(void))listener, data); |
| } |
| |
| #define QT_WINDOWMANAGER_OPEN_URL 0 |
| |
| static inline void qt_windowmanager_set_user_data(struct qt_windowmanager *qt_windowmanager, void *user_data) |
| { |
| WAYLAND_wl_proxy_set_user_data((struct wl_proxy *)qt_windowmanager, user_data); |
| } |
| |
| static inline void *qt_windowmanager_get_user_data(struct qt_windowmanager *qt_windowmanager) |
| { |
| return WAYLAND_wl_proxy_get_user_data((struct wl_proxy *)qt_windowmanager); |
| } |
| |
| static inline void qt_windowmanager_destroy(struct qt_windowmanager *qt_windowmanager) |
| { |
| WAYLAND_wl_proxy_destroy((struct wl_proxy *)qt_windowmanager); |
| } |
| |
| static inline void qt_windowmanager_open_url(struct qt_windowmanager *qt_windowmanager, uint32_t remaining, const char *url) |
| { |
| WAYLAND_wl_proxy_marshal((struct wl_proxy *)qt_windowmanager, |
| QT_WINDOWMANAGER_OPEN_URL, remaining, url); |
| } |
| |
| #endif /* SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH */ |
| |
| #endif /* SDL_waylandtouch_h_ */ |