| /* |
| Simple DirectMedia Layer |
| Copyright (C) 1997-2024 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. |
| */ |
| |
| #include "SDL_internal.h" |
| |
| #ifndef SDL_waylandevents_h_ |
| #define SDL_waylandevents_h_ |
| |
| #include "../../events/SDL_mouse_c.h" |
| #include "../../events/SDL_pen_c.h" |
| |
| #include "SDL_waylandvideo.h" |
| #include "SDL_waylandwindow.h" |
| #include "SDL_waylanddatamanager.h" |
| #include "SDL_waylandkeyboard.h" |
| |
| enum SDL_WaylandAxisEvent |
| { |
| AXIS_EVENT_CONTINUOUS = 0, |
| AXIS_EVENT_DISCRETE, |
| AXIS_EVENT_VALUE120 |
| }; |
| |
| struct SDL_WaylandTabletSeat; |
| |
| struct SDL_WaylandTabletObjectListNode |
| { |
| void *object; |
| struct SDL_WaylandTabletObjectListNode *next; |
| }; |
| |
| struct SDL_WaylandTabletInput |
| { |
| struct SDL_WaylandInput *sdlWaylandInput; |
| struct zwp_tablet_seat_v2 *seat; |
| |
| struct SDL_WaylandTabletObjectListNode *tablets; |
| struct SDL_WaylandTabletObjectListNode *tools; |
| struct SDL_WaylandTabletObjectListNode *pads; |
| |
| Uint32 id; |
| Uint32 num_pens; /* next pen ID is num_pens+1 */ |
| struct SDL_WaylandCurrentPen |
| { |
| SDL_Pen *builder; /* pen that is being defined or receiving updates, if any */ |
| SDL_bool builder_guid_complete; /* have complete/precise GUID information */ |
| SDL_PenStatusInfo update_status; /* collects pen update information before sending event */ |
| Uint16 buttons_pressed; /* Mask of newly pressed buttons, plus SDL_PEN_DOWN_MASK for PEN_DOWN */ |
| Uint16 buttons_released; /* Mask of newly pressed buttons, plus SDL_PEN_DOWN_MASK for PEN_UP */ |
| Uint32 serial; /* Most recent serial event number observed, or 0 */ |
| SDL_WindowData *update_window; /* NULL while no event is in progress, otherwise the affected window */ |
| } current_pen; |
| |
| SDL_WindowData *tool_focus; |
| uint32_t tool_prox_serial; |
| |
| /* Last motion end location (kept separate from sx_w, sy_w for the mouse pointer) */ |
| wl_fixed_t sx_w; |
| wl_fixed_t sy_w; |
| }; |
| |
| typedef struct |
| { |
| int32_t repeat_rate; /* Repeat rate in range of [1, 1000] character(s) per second */ |
| int32_t repeat_delay_ms; /* Time to first repeat event in milliseconds */ |
| Uint32 keyboard_id; /* ID of the source keyboard. */ |
| SDL_bool is_initialized; |
| |
| SDL_bool is_key_down; |
| uint32_t key; |
| Uint64 wl_press_time_ns; /* Key press time as reported by the Wayland API */ |
| Uint64 sdl_press_time_ns; /* Key press time expressed in SDL ticks */ |
| Uint64 next_repeat_ns; /* Next repeat event in nanoseconds */ |
| uint32_t scancode; |
| char text[8]; |
| } SDL_WaylandKeyboardRepeat; |
| |
| struct SDL_WaylandInput |
| { |
| SDL_VideoData *display; |
| struct wl_seat *seat; |
| struct wl_pointer *pointer; |
| struct wl_touch *touch; |
| struct wl_keyboard *keyboard; |
| SDL_WaylandDataDevice *data_device; |
| SDL_WaylandPrimarySelectionDevice *primary_selection_device; |
| SDL_WaylandTextInput *text_input; |
| struct wp_cursor_shape_device_v1 *cursor_shape; |
| struct zwp_relative_pointer_v1 *relative_pointer; |
| struct zwp_input_timestamps_v1 *keyboard_timestamps; |
| struct zwp_input_timestamps_v1 *pointer_timestamps; |
| struct zwp_input_timestamps_v1 *touch_timestamps; |
| SDL_WindowData *pointer_focus; |
| SDL_WindowData *keyboard_focus; |
| struct Wayland_CursorData *current_cursor; |
| Uint32 keyboard_id; |
| Uint32 pointer_id; |
| uint32_t pointer_enter_serial; |
| |
| /* High-resolution event timestamps */ |
| Uint64 keyboard_timestamp_ns; |
| Uint64 pointer_timestamp_ns; |
| Uint64 touch_timestamp_ns; |
| |
| /* Last motion location */ |
| wl_fixed_t sx_w; |
| wl_fixed_t sy_w; |
| |
| uint32_t buttons_pressed; |
| |
| /* The serial of the last implicit grab event for window activation and selection data. */ |
| Uint32 last_implicit_grab_serial; |
| |
| struct |
| { |
| struct xkb_keymap *keymap; |
| struct xkb_state *state; |
| struct xkb_compose_table *compose_table; |
| struct xkb_compose_state *compose_state; |
| |
| /* Keyboard layout "group" */ |
| uint32_t current_group; |
| |
| /* Modifier bitshift values */ |
| uint32_t idx_shift; |
| uint32_t idx_ctrl; |
| uint32_t idx_alt; |
| uint32_t idx_gui; |
| uint32_t idx_mode; |
| uint32_t idx_num; |
| uint32_t idx_caps; |
| |
| /* Current system modifier flags */ |
| uint32_t wl_pressed_modifiers; |
| uint32_t wl_locked_modifiers; |
| } xkb; |
| |
| /* information about axis events on current frame */ |
| struct |
| { |
| enum SDL_WaylandAxisEvent x_axis_type; |
| float x; |
| |
| enum SDL_WaylandAxisEvent y_axis_type; |
| float y; |
| |
| /* Event timestamp in nanoseconds */ |
| Uint64 timestamp_ns; |
| SDL_MouseWheelDirection direction; |
| } pointer_curr_axis_info; |
| |
| SDL_WaylandKeyboardRepeat keyboard_repeat; |
| |
| struct SDL_WaylandTabletInput *tablet; |
| |
| /* are we forcing relative mouse mode? */ |
| SDL_bool cursor_visible; |
| SDL_bool relative_mode_override; |
| SDL_bool warp_emulation_prohibited; |
| SDL_bool keyboard_is_virtual; |
| |
| /* Current SDL modifier flags */ |
| SDL_Keymod pressed_modifiers; |
| SDL_Keymod locked_modifiers; |
| }; |
| |
| struct SDL_WaylandTool |
| { |
| SDL_PenID penid; |
| struct SDL_WaylandTabletInput *tablet; |
| }; |
| |
| extern Uint64 Wayland_GetTouchTimestamp(struct SDL_WaylandInput *input, Uint32 wl_timestamp_ms); |
| |
| extern void Wayland_PumpEvents(SDL_VideoDevice *_this); |
| extern void Wayland_SendWakeupEvent(SDL_VideoDevice *_this, SDL_Window *window); |
| extern int Wayland_WaitEventTimeout(SDL_VideoDevice *_this, Sint64 timeoutNS); |
| |
| extern void Wayland_create_data_device(SDL_VideoData *d); |
| extern void Wayland_create_primary_selection_device(SDL_VideoData *d); |
| extern void Wayland_create_text_input(SDL_VideoData *d); |
| |
| extern void Wayland_input_initialize_seat(SDL_VideoData *d); |
| extern void Wayland_display_destroy_input(SDL_VideoData *d); |
| |
| extern int Wayland_input_enable_relative_pointer(struct SDL_WaylandInput *input); |
| extern int Wayland_input_disable_relative_pointer(struct SDL_WaylandInput *input); |
| |
| extern int Wayland_input_lock_pointer(struct SDL_WaylandInput *input, SDL_Window *window); |
| extern int Wayland_input_unlock_pointer(struct SDL_WaylandInput *input, SDL_Window *window); |
| |
| extern int Wayland_input_confine_pointer(struct SDL_WaylandInput *input, SDL_Window *window); |
| extern int Wayland_input_unconfine_pointer(struct SDL_WaylandInput *input, SDL_Window *window); |
| |
| extern int Wayland_input_grab_keyboard(SDL_Window *window, struct SDL_WaylandInput *input); |
| extern int Wayland_input_ungrab_keyboard(SDL_Window *window); |
| |
| extern void Wayland_input_add_tablet(struct SDL_WaylandInput *input, struct SDL_WaylandTabletManager *tablet_manager); |
| extern void Wayland_input_destroy_tablet(struct SDL_WaylandInput *input); |
| |
| extern void Wayland_RegisterTimestampListeners(struct SDL_WaylandInput *input); |
| extern void Wayland_CreateCursorShapeDevice(struct SDL_WaylandInput *input); |
| |
| /* The implicit grab serial needs to be updated on: |
| * - Keyboard key down/up |
| * - Mouse button down |
| * - Touch event down |
| * - Tablet tool down |
| * - Tablet tool button down/up |
| */ |
| extern void Wayland_UpdateImplicitGrabSerial(struct SDL_WaylandInput *input, Uint32 serial); |
| |
| #endif /* SDL_waylandevents_h_ */ |