wayland_thread.h 43 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049
  1. /**************************************************************************/
  2. /* wayland_thread.h */
  3. /**************************************************************************/
  4. /* This file is part of: */
  5. /* GODOT ENGINE */
  6. /* https://godotengine.org */
  7. /**************************************************************************/
  8. /* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */
  9. /* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */
  10. /* */
  11. /* Permission is hereby granted, free of charge, to any person obtaining */
  12. /* a copy of this software and associated documentation files (the */
  13. /* "Software"), to deal in the Software without restriction, including */
  14. /* without limitation the rights to use, copy, modify, merge, publish, */
  15. /* distribute, sublicense, and/or sell copies of the Software, and to */
  16. /* permit persons to whom the Software is furnished to do so, subject to */
  17. /* the following conditions: */
  18. /* */
  19. /* The above copyright notice and this permission notice shall be */
  20. /* included in all copies or substantial portions of the Software. */
  21. /* */
  22. /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
  23. /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
  24. /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */
  25. /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
  26. /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
  27. /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
  28. /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
  29. /**************************************************************************/
  30. #pragma once
  31. #ifdef WAYLAND_ENABLED
  32. #include "key_mapping_xkb.h"
  33. #ifdef SOWRAP_ENABLED
  34. #include "wayland/dynwrappers/wayland-client-core-so_wrap.h"
  35. #include "wayland/dynwrappers/wayland-cursor-so_wrap.h"
  36. #include "wayland/dynwrappers/wayland-egl-core-so_wrap.h"
  37. #include "xkbcommon-so_wrap.h"
  38. #else
  39. #include <wayland-client-core.h>
  40. #include <wayland-cursor.h>
  41. #ifdef GLES3_ENABLED
  42. #include <wayland-egl-core.h>
  43. #endif
  44. #include <xkbcommon/xkbcommon.h>
  45. #endif // SOWRAP_ENABLED
  46. // These must go after the Wayland client include to work properly.
  47. #include "wayland/protocol/idle_inhibit.gen.h"
  48. #include "wayland/protocol/primary_selection.gen.h"
  49. // These three protocol headers name wl_pointer method arguments as `pointer`,
  50. // which is the same name as X11's pointer typedef. This trips some very
  51. // annoying shadowing warnings. A `#define` works around this issue.
  52. #define pointer wl_pointer
  53. #include "wayland/protocol/pointer_constraints.gen.h"
  54. #include "wayland/protocol/pointer_gestures.gen.h"
  55. #include "wayland/protocol/relative_pointer.gen.h"
  56. #undef pointer
  57. #include "wayland/protocol/fractional_scale.gen.h"
  58. #include "wayland/protocol/tablet.gen.h"
  59. #include "wayland/protocol/text_input.gen.h"
  60. #include "wayland/protocol/viewporter.gen.h"
  61. #include "wayland/protocol/wayland.gen.h"
  62. #include "wayland/protocol/xdg_activation.gen.h"
  63. #include "wayland/protocol/xdg_decoration.gen.h"
  64. #include "wayland/protocol/xdg_foreign_v2.gen.h"
  65. #include "wayland/protocol/xdg_shell.gen.h"
  66. #include "wayland/protocol/xdg_system_bell.gen.h"
  67. // NOTE: Deprecated.
  68. #include "wayland/protocol/xdg_foreign_v1.gen.h"
  69. #ifdef LIBDECOR_ENABLED
  70. #ifdef SOWRAP_ENABLED
  71. #include "dynwrappers/libdecor-so_wrap.h"
  72. #else
  73. #include <libdecor.h>
  74. #endif // SOWRAP_ENABLED
  75. #endif // LIBDECOR_ENABLED
  76. #include "core/os/thread.h"
  77. #include "servers/display_server.h"
  78. class WaylandThread {
  79. public:
  80. // Messages used for exchanging information between Godot's and Wayland's thread.
  81. class Message : public RefCounted {
  82. GDSOFTCLASS(Message, RefCounted);
  83. public:
  84. Message() {}
  85. virtual ~Message() = default;
  86. };
  87. // Message data for window rect changes.
  88. class WindowRectMessage : public Message {
  89. GDSOFTCLASS(WindowRectMessage, Message);
  90. public:
  91. // NOTE: This is in "scaled" terms. For example, if there's a 1920x1080 rect
  92. // with a scale factor of 2, the actual value of `rect` will be 3840x2160.
  93. Rect2i rect;
  94. };
  95. class WindowEventMessage : public Message {
  96. GDSOFTCLASS(WindowEventMessage, Message);
  97. public:
  98. DisplayServer::WindowEvent event;
  99. };
  100. class InputEventMessage : public Message {
  101. GDSOFTCLASS(InputEventMessage, Message);
  102. public:
  103. Ref<InputEvent> event;
  104. };
  105. class DropFilesEventMessage : public Message {
  106. GDSOFTCLASS(DropFilesEventMessage, Message);
  107. public:
  108. Vector<String> files;
  109. };
  110. class IMEUpdateEventMessage : public Message {
  111. GDSOFTCLASS(IMEUpdateEventMessage, Message);
  112. public:
  113. String text;
  114. Vector2i selection;
  115. };
  116. class IMECommitEventMessage : public Message {
  117. GDSOFTCLASS(IMECommitEventMessage, Message);
  118. public:
  119. String text;
  120. };
  121. struct RegistryState {
  122. WaylandThread *wayland_thread;
  123. // Core Wayland globals.
  124. struct wl_shm *wl_shm = nullptr;
  125. uint32_t wl_shm_name = 0;
  126. struct wl_compositor *wl_compositor = nullptr;
  127. uint32_t wl_compositor_name = 0;
  128. struct wl_subcompositor *wl_subcompositor = nullptr;
  129. uint32_t wl_subcompositor_name = 0;
  130. struct wl_data_device_manager *wl_data_device_manager = nullptr;
  131. uint32_t wl_data_device_manager_name = 0;
  132. List<struct wl_output *> wl_outputs;
  133. List<struct wl_seat *> wl_seats;
  134. // xdg-shell globals.
  135. struct xdg_wm_base *xdg_wm_base = nullptr;
  136. uint32_t xdg_wm_base_name = 0;
  137. // NOTE: Deprecated.
  138. struct zxdg_exporter_v1 *xdg_exporter_v1 = nullptr;
  139. uint32_t xdg_exporter_v1_name = 0;
  140. uint32_t xdg_exporter_v2_name = 0;
  141. struct zxdg_exporter_v2 *xdg_exporter_v2 = nullptr;
  142. // wayland-protocols globals.
  143. struct wp_viewporter *wp_viewporter = nullptr;
  144. uint32_t wp_viewporter_name = 0;
  145. struct wp_fractional_scale_manager_v1 *wp_fractional_scale_manager = nullptr;
  146. uint32_t wp_fractional_scale_manager_name = 0;
  147. struct zxdg_decoration_manager_v1 *xdg_decoration_manager = nullptr;
  148. uint32_t xdg_decoration_manager_name = 0;
  149. struct xdg_system_bell_v1 *xdg_system_bell = nullptr;
  150. uint32_t xdg_system_bell_name = 0;
  151. struct xdg_activation_v1 *xdg_activation = nullptr;
  152. uint32_t xdg_activation_name = 0;
  153. struct zwp_primary_selection_device_manager_v1 *wp_primary_selection_device_manager = nullptr;
  154. uint32_t wp_primary_selection_device_manager_name = 0;
  155. struct zwp_relative_pointer_manager_v1 *wp_relative_pointer_manager = nullptr;
  156. uint32_t wp_relative_pointer_manager_name = 0;
  157. struct zwp_pointer_constraints_v1 *wp_pointer_constraints = nullptr;
  158. uint32_t wp_pointer_constraints_name = 0;
  159. struct zwp_pointer_gestures_v1 *wp_pointer_gestures = nullptr;
  160. uint32_t wp_pointer_gestures_name = 0;
  161. struct zwp_idle_inhibit_manager_v1 *wp_idle_inhibit_manager = nullptr;
  162. uint32_t wp_idle_inhibit_manager_name = 0;
  163. struct zwp_tablet_manager_v2 *wp_tablet_manager = nullptr;
  164. uint32_t wp_tablet_manager_name = 0;
  165. struct zwp_text_input_manager_v3 *wp_text_input_manager = nullptr;
  166. uint32_t wp_text_input_manager_name = 0;
  167. };
  168. // General Wayland-specific states. Shouldn't be accessed directly.
  169. // TODO: Make private?
  170. struct WindowState {
  171. DisplayServer::WindowID id;
  172. Rect2i rect;
  173. DisplayServer::WindowMode mode = DisplayServer::WINDOW_MODE_WINDOWED;
  174. bool suspended = false;
  175. // These are true by default as it isn't guaranteed that we'll find an
  176. // xdg-shell implementation with wm_capabilities available. If and once we
  177. // receive a wm_capabilities event these will get reset and updated with
  178. // whatever the compositor says.
  179. bool can_minimize = false;
  180. bool can_maximize = false;
  181. bool can_fullscreen = false;
  182. HashSet<struct wl_output *> wl_outputs;
  183. // NOTE: If for whatever reason this callback is destroyed _while_ the event
  184. // thread is still running, it might be a good idea to set its user data to
  185. // `nullptr`. From some initial testing of mine, it looks like it might still
  186. // be called even after being destroyed, pointing to probably invalid window
  187. // data by then and segfaulting hard.
  188. struct wl_callback *frame_callback = nullptr;
  189. struct wl_surface *wl_surface = nullptr;
  190. struct xdg_surface *xdg_surface = nullptr;
  191. struct xdg_toplevel *xdg_toplevel = nullptr;
  192. struct wp_viewport *wp_viewport = nullptr;
  193. struct wp_fractional_scale_v1 *wp_fractional_scale = nullptr;
  194. // NOTE: Deprecated.
  195. struct zxdg_exported_v1 *xdg_exported_v1 = nullptr;
  196. struct zxdg_exported_v2 *xdg_exported_v2 = nullptr;
  197. String exported_handle;
  198. // Currently applied buffer scale.
  199. int buffer_scale = 1;
  200. // Buffer scale must be applied right before rendering but _after_ committing
  201. // everything else or otherwise we might have an inconsistent state (e.g.
  202. // double scale and odd resolution). This flag assists with that; when set,
  203. // on the next frame, we'll commit whatever is set in `buffer_scale`.
  204. bool buffer_scale_changed = false;
  205. // NOTE: The preferred buffer scale is currently only dynamically calculated.
  206. // It can be accessed by calling `window_state_get_preferred_buffer_scale`.
  207. // Override used by the fractional scale add-on object. If less or equal to 0
  208. // (default) then the normal output-based scale is used instead.
  209. double fractional_scale = 0;
  210. // What the compositor is recommending us.
  211. double preferred_fractional_scale = 0;
  212. struct zxdg_toplevel_decoration_v1 *xdg_toplevel_decoration = nullptr;
  213. struct zwp_idle_inhibitor_v1 *wp_idle_inhibitor = nullptr;
  214. #ifdef LIBDECOR_ENABLED
  215. // If this is null the xdg_* variables must be set and vice-versa. This way we
  216. // can handle this mess gracefully enough to hopefully being able of getting
  217. // rid of this cleanly once we have our own CSDs.
  218. struct libdecor_frame *libdecor_frame = nullptr;
  219. struct libdecor_configuration *pending_libdecor_configuration = nullptr;
  220. #endif
  221. RegistryState *registry;
  222. WaylandThread *wayland_thread;
  223. };
  224. // "High level" Godot-side screen data.
  225. struct ScreenData {
  226. // Geometry data.
  227. Point2i position;
  228. String make;
  229. String model;
  230. Size2i size;
  231. Size2i physical_size;
  232. float refresh_rate = -1;
  233. int scale = 1;
  234. };
  235. struct ScreenState {
  236. uint32_t wl_output_name = 0;
  237. ScreenData pending_data;
  238. ScreenData data;
  239. WaylandThread *wayland_thread;
  240. };
  241. enum class Gesture {
  242. NONE,
  243. MAGNIFY,
  244. };
  245. enum class PointerConstraint {
  246. NONE,
  247. LOCKED,
  248. CONFINED,
  249. };
  250. struct PointerData {
  251. Point2 position;
  252. uint32_t motion_time = 0;
  253. // Relative motion has its own optional event and so needs its own time.
  254. Vector2 relative_motion;
  255. uint32_t relative_motion_time = 0;
  256. BitField<MouseButtonMask> pressed_button_mask;
  257. MouseButton last_button_pressed = MouseButton::NONE;
  258. Point2 last_pressed_position;
  259. // This is needed to check for a new double click every time.
  260. bool double_click_begun = false;
  261. uint32_t button_time = 0;
  262. uint32_t button_serial = 0;
  263. uint32_t scroll_type = WL_POINTER_AXIS_SOURCE_WHEEL;
  264. // The amount "scrolled" in pixels, in each direction.
  265. Vector2 scroll_vector;
  266. // The amount of scroll "clicks" in each direction, in fractions of 120.
  267. Vector2i discrete_scroll_vector_120;
  268. uint32_t pinch_scale = 1;
  269. };
  270. struct TabletToolData {
  271. Point2 position;
  272. Vector2 tilt;
  273. uint32_t pressure = 0;
  274. BitField<MouseButtonMask> pressed_button_mask;
  275. MouseButton last_button_pressed = MouseButton::NONE;
  276. Point2 last_pressed_position;
  277. bool double_click_begun = false;
  278. // Note: the protocol doesn't have it (I guess that this isn't really meant to
  279. // be used as a mouse...), but we'll hack one in with the current ticks.
  280. uint64_t button_time = 0;
  281. uint64_t motion_time = 0;
  282. uint32_t proximity_serial = 0;
  283. struct wl_surface *proximal_surface = nullptr;
  284. };
  285. struct TabletToolState {
  286. struct wl_seat *wl_seat = nullptr;
  287. struct wl_surface *last_surface = nullptr;
  288. bool is_eraser = false;
  289. TabletToolData data_pending;
  290. TabletToolData data;
  291. };
  292. struct OfferState {
  293. HashSet<String> mime_types;
  294. };
  295. struct SeatState {
  296. RegistryState *registry = nullptr;
  297. WaylandThread *wayland_thread = nullptr;
  298. struct wl_seat *wl_seat = nullptr;
  299. uint32_t wl_seat_name = 0;
  300. // Pointer.
  301. struct wl_pointer *wl_pointer = nullptr;
  302. uint32_t pointer_enter_serial = 0;
  303. struct wl_surface *pointed_surface = nullptr;
  304. struct wl_surface *last_pointed_surface = nullptr;
  305. struct zwp_relative_pointer_v1 *wp_relative_pointer = nullptr;
  306. struct zwp_locked_pointer_v1 *wp_locked_pointer = nullptr;
  307. struct zwp_confined_pointer_v1 *wp_confined_pointer = nullptr;
  308. struct zwp_pointer_gesture_pinch_v1 *wp_pointer_gesture_pinch = nullptr;
  309. // NOTE: According to the wp_pointer_gestures protocol specification, there
  310. // can be only one active gesture at a time.
  311. Gesture active_gesture = Gesture::NONE;
  312. // Used for delta calculations.
  313. // NOTE: The wp_pointer_gestures protocol keeps track of the total scale of
  314. // the pinch gesture, while godot instead wants its delta.
  315. wl_fixed_t old_pinch_scale = 0;
  316. struct wl_surface *cursor_surface = nullptr;
  317. struct wl_callback *cursor_frame_callback = nullptr;
  318. uint32_t cursor_time_ms = 0;
  319. // This variable is needed to buffer all pointer changes until a
  320. // wl_pointer.frame event, as per Wayland's specification. Everything is
  321. // first set in `data_buffer` and then `data` is set with its contents on
  322. // an input frame event. All methods should generally read from
  323. // `pointer_data` and write to `data_buffer`.
  324. PointerData pointer_data_buffer;
  325. PointerData pointer_data;
  326. // Keyboard.
  327. struct wl_keyboard *wl_keyboard = nullptr;
  328. struct xkb_context *xkb_context = nullptr;
  329. struct xkb_keymap *xkb_keymap = nullptr;
  330. struct xkb_state *xkb_state = nullptr;
  331. const char *keymap_buffer = nullptr;
  332. uint32_t keymap_buffer_size = 0;
  333. HashMap<xkb_keycode_t, Key> pressed_keycodes;
  334. xkb_layout_index_t current_layout_index = 0;
  335. int32_t repeat_key_delay_msec = 0;
  336. int32_t repeat_start_delay_msec = 0;
  337. xkb_keycode_t repeating_keycode = XKB_KEYCODE_INVALID;
  338. uint64_t last_repeat_start_msec = 0;
  339. uint64_t last_repeat_msec = 0;
  340. bool shift_pressed = false;
  341. bool ctrl_pressed = false;
  342. bool alt_pressed = false;
  343. bool meta_pressed = false;
  344. uint32_t last_key_pressed_serial = 0;
  345. struct wl_data_device *wl_data_device = nullptr;
  346. // Drag and drop.
  347. struct wl_data_offer *wl_data_offer_dnd = nullptr;
  348. uint32_t dnd_enter_serial = 0;
  349. // Clipboard.
  350. struct wl_data_source *wl_data_source_selection = nullptr;
  351. Vector<uint8_t> selection_data;
  352. struct wl_data_offer *wl_data_offer_selection = nullptr;
  353. // Primary selection.
  354. struct zwp_primary_selection_device_v1 *wp_primary_selection_device = nullptr;
  355. struct zwp_primary_selection_source_v1 *wp_primary_selection_source = nullptr;
  356. Vector<uint8_t> primary_data;
  357. struct zwp_primary_selection_offer_v1 *wp_primary_selection_offer = nullptr;
  358. // Tablet.
  359. struct zwp_tablet_seat_v2 *wp_tablet_seat = nullptr;
  360. List<struct zwp_tablet_tool_v2 *> tablet_tools;
  361. // IME.
  362. struct zwp_text_input_v3 *wp_text_input = nullptr;
  363. bool ime_enabled = false;
  364. bool ime_active = false;
  365. String ime_text;
  366. String ime_text_commit;
  367. Vector2i ime_cursor;
  368. Rect2i ime_rect;
  369. };
  370. struct CustomCursor {
  371. struct wl_buffer *wl_buffer = nullptr;
  372. uint32_t *buffer_data = nullptr;
  373. uint32_t buffer_data_size = 0;
  374. Point2i hotspot;
  375. };
  376. private:
  377. struct ThreadData {
  378. SafeFlag thread_done;
  379. Mutex mutex;
  380. struct wl_display *wl_display = nullptr;
  381. };
  382. // FIXME: Is this the right thing to do?
  383. inline static const char *proxy_tag = "godot";
  384. Thread events_thread;
  385. ThreadData thread_data;
  386. WindowState main_window;
  387. List<Ref<Message>> messages;
  388. String cursor_theme_name;
  389. int unscaled_cursor_size = 24;
  390. // NOTE: Regarding screen scale handling, the cursor cache is currently
  391. // "static", by which I mean that we try to change it as little as possible and
  392. // thus will be as big as the largest screen. This is mainly due to the fact
  393. // that doing it dynamically doesn't look like it's worth it to me currently,
  394. // especially as usually screen scales don't change continuously.
  395. int cursor_scale = 1;
  396. struct wl_cursor_theme *wl_cursor_theme = nullptr;
  397. struct wl_cursor *wl_cursors[DisplayServer::CURSOR_MAX] = {};
  398. HashMap<DisplayServer::CursorShape, CustomCursor> custom_cursors;
  399. DisplayServer::CursorShape cursor_shape = DisplayServer::CURSOR_ARROW;
  400. bool cursor_visible = true;
  401. PointerConstraint pointer_constraint = PointerConstraint::NONE;
  402. struct wl_display *wl_display = nullptr;
  403. struct wl_registry *wl_registry = nullptr;
  404. struct wl_seat *wl_seat_current = nullptr;
  405. bool frame = true;
  406. RegistryState registry;
  407. bool initialized = false;
  408. #ifdef LIBDECOR_ENABLED
  409. struct libdecor *libdecor_context = nullptr;
  410. #endif // LIBDECOR_ENABLED
  411. // Main polling method.
  412. static void _poll_events_thread(void *p_data);
  413. // Core Wayland event handlers.
  414. static void _wl_registry_on_global(void *data, struct wl_registry *wl_registry, uint32_t name, const char *interface, uint32_t version);
  415. static void _wl_registry_on_global_remove(void *data, struct wl_registry *wl_registry, uint32_t name);
  416. static void _wl_surface_on_enter(void *data, struct wl_surface *wl_surface, struct wl_output *wl_output);
  417. static void _wl_surface_on_leave(void *data, struct wl_surface *wl_surface, struct wl_output *wl_output);
  418. static void _wl_surface_on_preferred_buffer_scale(void *data, struct wl_surface *wl_surface, int32_t factor);
  419. static void _wl_surface_on_preferred_buffer_transform(void *data, struct wl_surface *wl_surface, uint32_t transform);
  420. static void _frame_wl_callback_on_done(void *data, struct wl_callback *wl_callback, uint32_t callback_data);
  421. static void _wl_output_on_geometry(void *data, struct wl_output *wl_output, int32_t x, int32_t y, int32_t physical_width, int32_t physical_height, int32_t subpixel, const char *make, const char *model, int32_t transform);
  422. static void _wl_output_on_mode(void *data, struct wl_output *wl_output, uint32_t flags, int32_t width, int32_t height, int32_t refresh);
  423. static void _wl_output_on_done(void *data, struct wl_output *wl_output);
  424. static void _wl_output_on_scale(void *data, struct wl_output *wl_output, int32_t factor);
  425. static void _wl_output_on_name(void *data, struct wl_output *wl_output, const char *name);
  426. static void _wl_output_on_description(void *data, struct wl_output *wl_output, const char *description);
  427. static void _wl_seat_on_capabilities(void *data, struct wl_seat *wl_seat, uint32_t capabilities);
  428. static void _wl_seat_on_name(void *data, struct wl_seat *wl_seat, const char *name);
  429. static void _cursor_frame_callback_on_done(void *data, struct wl_callback *wl_callback, uint32_t time_ms);
  430. static void _wl_pointer_on_enter(void *data, struct wl_pointer *wl_pointer, uint32_t serial, struct wl_surface *surface, wl_fixed_t surface_x, wl_fixed_t surface_y);
  431. static void _wl_pointer_on_leave(void *data, struct wl_pointer *wl_pointer, uint32_t serial, struct wl_surface *surface);
  432. static void _wl_pointer_on_motion(void *data, struct wl_pointer *wl_pointer, uint32_t time, wl_fixed_t surface_x, wl_fixed_t surface_y);
  433. static void _wl_pointer_on_button(void *data, struct wl_pointer *wl_pointer, uint32_t serial, uint32_t time, uint32_t button, uint32_t state);
  434. static void _wl_pointer_on_axis(void *data, struct wl_pointer *wl_pointer, uint32_t time, uint32_t axis, wl_fixed_t value);
  435. static void _wl_pointer_on_frame(void *data, struct wl_pointer *wl_pointer);
  436. static void _wl_pointer_on_axis_source(void *data, struct wl_pointer *wl_pointer, uint32_t axis_source);
  437. static void _wl_pointer_on_axis_stop(void *data, struct wl_pointer *wl_pointer, uint32_t time, uint32_t axis);
  438. static void _wl_pointer_on_axis_discrete(void *data, struct wl_pointer *wl_pointer, uint32_t axis, int32_t discrete);
  439. static void _wl_pointer_on_axis_value120(void *data, struct wl_pointer *wl_pointer, uint32_t axis, int32_t value120);
  440. static void _wl_pointer_on_axis_relative_direction(void *data, struct wl_pointer *wl_pointer, uint32_t axis, uint32_t direction);
  441. static void _wl_keyboard_on_keymap(void *data, struct wl_keyboard *wl_keyboard, uint32_t format, int32_t fd, uint32_t size);
  442. static void _wl_keyboard_on_enter(void *data, struct wl_keyboard *wl_keyboard, uint32_t serial, struct wl_surface *surface, struct wl_array *keys);
  443. static void _wl_keyboard_on_leave(void *data, struct wl_keyboard *wl_keyboard, uint32_t serial, struct wl_surface *surface);
  444. static void _wl_keyboard_on_key(void *data, struct wl_keyboard *wl_keyboard, uint32_t serial, uint32_t time, uint32_t key, uint32_t state);
  445. static void _wl_keyboard_on_modifiers(void *data, struct wl_keyboard *wl_keyboard, uint32_t serial, uint32_t mods_depressed, uint32_t mods_latched, uint32_t mods_locked, uint32_t group);
  446. static void _wl_keyboard_on_repeat_info(void *data, struct wl_keyboard *wl_keyboard, int32_t rate, int32_t delay);
  447. static void _wl_data_device_on_data_offer(void *data, struct wl_data_device *wl_data_device, struct wl_data_offer *id);
  448. static void _wl_data_device_on_enter(void *data, struct wl_data_device *wl_data_device, uint32_t serial, struct wl_surface *surface, wl_fixed_t x, wl_fixed_t y, struct wl_data_offer *id);
  449. static void _wl_data_device_on_leave(void *data, struct wl_data_device *wl_data_device);
  450. static void _wl_data_device_on_motion(void *data, struct wl_data_device *wl_data_device, uint32_t time, wl_fixed_t x, wl_fixed_t y);
  451. static void _wl_data_device_on_drop(void *data, struct wl_data_device *wl_data_device);
  452. static void _wl_data_device_on_selection(void *data, struct wl_data_device *wl_data_device, struct wl_data_offer *id);
  453. static void _wl_data_offer_on_offer(void *data, struct wl_data_offer *wl_data_offer, const char *mime_type);
  454. static void _wl_data_offer_on_source_actions(void *data, struct wl_data_offer *wl_data_offer, uint32_t source_actions);
  455. static void _wl_data_offer_on_action(void *data, struct wl_data_offer *wl_data_offer, uint32_t dnd_action);
  456. static void _wl_data_source_on_target(void *data, struct wl_data_source *wl_data_source, const char *mime_type);
  457. static void _wl_data_source_on_send(void *data, struct wl_data_source *wl_data_source, const char *mime_type, int32_t fd);
  458. static void _wl_data_source_on_cancelled(void *data, struct wl_data_source *wl_data_source);
  459. static void _wl_data_source_on_dnd_drop_performed(void *data, struct wl_data_source *wl_data_source);
  460. static void _wl_data_source_on_dnd_finished(void *data, struct wl_data_source *wl_data_source);
  461. static void _wl_data_source_on_action(void *data, struct wl_data_source *wl_data_source, uint32_t dnd_action);
  462. // xdg-shell event handlers.
  463. static void _xdg_wm_base_on_ping(void *data, struct xdg_wm_base *xdg_wm_base, uint32_t serial);
  464. static void _xdg_surface_on_configure(void *data, struct xdg_surface *xdg_surface, uint32_t serial);
  465. static void _xdg_toplevel_on_configure(void *data, struct xdg_toplevel *xdg_toplevel, int32_t width, int32_t height, struct wl_array *states);
  466. static void _xdg_toplevel_on_close(void *data, struct xdg_toplevel *xdg_toplevel);
  467. static void _xdg_toplevel_on_configure_bounds(void *data, struct xdg_toplevel *xdg_toplevel, int32_t width, int32_t height);
  468. static void _xdg_toplevel_on_wm_capabilities(void *data, struct xdg_toplevel *xdg_toplevel, struct wl_array *capabilities);
  469. // wayland-protocols event handlers.
  470. static void _wp_fractional_scale_on_preferred_scale(void *data, struct wp_fractional_scale_v1 *wp_fractional_scale_v1, uint32_t scale);
  471. static void _wp_relative_pointer_on_relative_motion(void *data, struct zwp_relative_pointer_v1 *wp_relative_pointer_v1, uint32_t uptime_hi, uint32_t uptime_lo, wl_fixed_t dx, wl_fixed_t dy, wl_fixed_t dx_unaccel, wl_fixed_t dy_unaccel);
  472. static void _wp_pointer_gesture_pinch_on_begin(void *data, struct zwp_pointer_gesture_pinch_v1 *wp_pointer_gesture_pinch_v1, uint32_t serial, uint32_t time, struct wl_surface *surface, uint32_t fingers);
  473. static void _wp_pointer_gesture_pinch_on_update(void *data, struct zwp_pointer_gesture_pinch_v1 *wp_pointer_gesture_pinch_v1, uint32_t time, wl_fixed_t dx, wl_fixed_t dy, wl_fixed_t scale, wl_fixed_t rotation);
  474. static void _wp_pointer_gesture_pinch_on_end(void *data, struct zwp_pointer_gesture_pinch_v1 *zp_pointer_gesture_pinch_v1, uint32_t serial, uint32_t time, int32_t cancelled);
  475. static void _wp_primary_selection_device_on_data_offer(void *data, struct zwp_primary_selection_device_v1 *wp_primary_selection_device_v1, struct zwp_primary_selection_offer_v1 *offer);
  476. static void _wp_primary_selection_device_on_selection(void *data, struct zwp_primary_selection_device_v1 *wp_primary_selection_device_v1, struct zwp_primary_selection_offer_v1 *id);
  477. static void _wp_primary_selection_offer_on_offer(void *data, struct zwp_primary_selection_offer_v1 *wp_primary_selection_offer_v1, const char *mime_type);
  478. static void _wp_primary_selection_source_on_send(void *data, struct zwp_primary_selection_source_v1 *wp_primary_selection_source_v1, const char *mime_type, int32_t fd);
  479. static void _wp_primary_selection_source_on_cancelled(void *data, struct zwp_primary_selection_source_v1 *wp_primary_selection_source_v1);
  480. static void _wp_tablet_seat_on_tablet_added(void *data, struct zwp_tablet_seat_v2 *wp_tablet_seat_v2, struct zwp_tablet_v2 *id);
  481. static void _wp_tablet_seat_on_tool_added(void *data, struct zwp_tablet_seat_v2 *wp_tablet_seat_v2, struct zwp_tablet_tool_v2 *id);
  482. static void _wp_tablet_seat_on_pad_added(void *data, struct zwp_tablet_seat_v2 *wp_tablet_seat_v2, struct zwp_tablet_pad_v2 *id);
  483. static void _wp_tablet_tool_on_type(void *data, struct zwp_tablet_tool_v2 *wp_tablet_tool_v2, uint32_t tool_type);
  484. static void _wp_tablet_tool_on_hardware_serial(void *data, struct zwp_tablet_tool_v2 *wp_tablet_tool_v2, uint32_t hardware_serial_hi, uint32_t hardware_serial_lo);
  485. static void _wp_tablet_tool_on_hardware_id_wacom(void *data, struct zwp_tablet_tool_v2 *wp_tablet_tool_v2, uint32_t hardware_id_hi, uint32_t hardware_id_lo);
  486. static void _wp_tablet_tool_on_capability(void *data, struct zwp_tablet_tool_v2 *wp_tablet_tool_v2, uint32_t capability);
  487. static void _wp_tablet_tool_on_done(void *data, struct zwp_tablet_tool_v2 *wp_tablet_tool_v2);
  488. static void _wp_tablet_tool_on_removed(void *data, struct zwp_tablet_tool_v2 *wp_tablet_tool_v2);
  489. static void _wp_tablet_tool_on_proximity_in(void *data, struct zwp_tablet_tool_v2 *wp_tablet_tool_v2, uint32_t serial, struct zwp_tablet_v2 *tablet, struct wl_surface *surface);
  490. static void _wp_tablet_tool_on_proximity_out(void *data, struct zwp_tablet_tool_v2 *wp_tablet_tool_v2);
  491. static void _wp_tablet_tool_on_down(void *data, struct zwp_tablet_tool_v2 *wp_tablet_tool_v2, uint32_t serial);
  492. static void _wp_tablet_tool_on_up(void *data, struct zwp_tablet_tool_v2 *wp_tablet_tool_v2);
  493. static void _wp_tablet_tool_on_motion(void *data, struct zwp_tablet_tool_v2 *wp_tablet_tool_v2, wl_fixed_t x, wl_fixed_t y);
  494. static void _wp_tablet_tool_on_pressure(void *data, struct zwp_tablet_tool_v2 *wp_tablet_tool_v2, uint32_t pressure);
  495. static void _wp_tablet_tool_on_distance(void *data, struct zwp_tablet_tool_v2 *wp_tablet_tool_v2, uint32_t distance);
  496. static void _wp_tablet_tool_on_tilt(void *data, struct zwp_tablet_tool_v2 *wp_tablet_tool_v2, wl_fixed_t tilt_x, wl_fixed_t tilt_y);
  497. static void _wp_tablet_tool_on_rotation(void *data, struct zwp_tablet_tool_v2 *wp_tablet_tool_v2, wl_fixed_t degrees);
  498. static void _wp_tablet_tool_on_slider(void *data, struct zwp_tablet_tool_v2 *wp_tablet_tool_v2, int32_t position);
  499. static void _wp_tablet_tool_on_wheel(void *data, struct zwp_tablet_tool_v2 *wp_tablet_tool_v2, wl_fixed_t degrees, int32_t clicks);
  500. static void _wp_tablet_tool_on_button(void *data, struct zwp_tablet_tool_v2 *wp_tablet_tool_v2, uint32_t serial, uint32_t button, uint32_t state);
  501. static void _wp_tablet_tool_on_frame(void *data, struct zwp_tablet_tool_v2 *wp_tablet_tool_v2, uint32_t time);
  502. static void _wp_text_input_on_enter(void *data, struct zwp_text_input_v3 *wp_text_input_v3, struct wl_surface *surface);
  503. static void _wp_text_input_on_leave(void *data, struct zwp_text_input_v3 *wp_text_input_v3, struct wl_surface *surface);
  504. static void _wp_text_input_on_preedit_string(void *data, struct zwp_text_input_v3 *wp_text_input_v3, const char *text, int32_t cursor_begin, int32_t cursor_end);
  505. static void _wp_text_input_on_commit_string(void *data, struct zwp_text_input_v3 *wp_text_input_v3, const char *text);
  506. static void _wp_text_input_on_delete_surrounding_text(void *data, struct zwp_text_input_v3 *wp_text_input_v3, uint32_t before_length, uint32_t after_length);
  507. static void _wp_text_input_on_done(void *data, struct zwp_text_input_v3 *wp_text_input_v3, uint32_t serial);
  508. static void _xdg_toplevel_decoration_on_configure(void *data, struct zxdg_toplevel_decoration_v1 *xdg_toplevel_decoration, uint32_t mode);
  509. // NOTE: Deprecated.
  510. static void _xdg_exported_v1_on_handle(void *data, zxdg_exported_v1 *exported, const char *handle);
  511. static void _xdg_exported_v2_on_handle(void *data, zxdg_exported_v2 *exported, const char *handle);
  512. static void _xdg_activation_token_on_done(void *data, struct xdg_activation_token_v1 *xdg_activation_token, const char *token);
  513. // Core Wayland event listeners.
  514. static constexpr struct wl_registry_listener wl_registry_listener = {
  515. .global = _wl_registry_on_global,
  516. .global_remove = _wl_registry_on_global_remove,
  517. };
  518. static constexpr struct wl_surface_listener wl_surface_listener = {
  519. .enter = _wl_surface_on_enter,
  520. .leave = _wl_surface_on_leave,
  521. .preferred_buffer_scale = _wl_surface_on_preferred_buffer_scale,
  522. .preferred_buffer_transform = _wl_surface_on_preferred_buffer_transform,
  523. };
  524. static constexpr struct wl_callback_listener frame_wl_callback_listener = {
  525. .done = _frame_wl_callback_on_done,
  526. };
  527. static constexpr struct wl_output_listener wl_output_listener = {
  528. .geometry = _wl_output_on_geometry,
  529. .mode = _wl_output_on_mode,
  530. .done = _wl_output_on_done,
  531. .scale = _wl_output_on_scale,
  532. .name = _wl_output_on_name,
  533. .description = _wl_output_on_description,
  534. };
  535. static constexpr struct wl_seat_listener wl_seat_listener = {
  536. .capabilities = _wl_seat_on_capabilities,
  537. .name = _wl_seat_on_name,
  538. };
  539. static constexpr struct wl_callback_listener cursor_frame_callback_listener = {
  540. .done = _cursor_frame_callback_on_done,
  541. };
  542. static constexpr struct wl_pointer_listener wl_pointer_listener = {
  543. .enter = _wl_pointer_on_enter,
  544. .leave = _wl_pointer_on_leave,
  545. .motion = _wl_pointer_on_motion,
  546. .button = _wl_pointer_on_button,
  547. .axis = _wl_pointer_on_axis,
  548. .frame = _wl_pointer_on_frame,
  549. .axis_source = _wl_pointer_on_axis_source,
  550. .axis_stop = _wl_pointer_on_axis_stop,
  551. .axis_discrete = _wl_pointer_on_axis_discrete,
  552. .axis_value120 = _wl_pointer_on_axis_value120,
  553. .axis_relative_direction = _wl_pointer_on_axis_relative_direction,
  554. };
  555. static constexpr struct wl_keyboard_listener wl_keyboard_listener = {
  556. .keymap = _wl_keyboard_on_keymap,
  557. .enter = _wl_keyboard_on_enter,
  558. .leave = _wl_keyboard_on_leave,
  559. .key = _wl_keyboard_on_key,
  560. .modifiers = _wl_keyboard_on_modifiers,
  561. .repeat_info = _wl_keyboard_on_repeat_info,
  562. };
  563. static constexpr struct wl_data_device_listener wl_data_device_listener = {
  564. .data_offer = _wl_data_device_on_data_offer,
  565. .enter = _wl_data_device_on_enter,
  566. .leave = _wl_data_device_on_leave,
  567. .motion = _wl_data_device_on_motion,
  568. .drop = _wl_data_device_on_drop,
  569. .selection = _wl_data_device_on_selection,
  570. };
  571. static constexpr struct wl_data_offer_listener wl_data_offer_listener = {
  572. .offer = _wl_data_offer_on_offer,
  573. .source_actions = _wl_data_offer_on_source_actions,
  574. .action = _wl_data_offer_on_action,
  575. };
  576. static constexpr struct wl_data_source_listener wl_data_source_listener = {
  577. .target = _wl_data_source_on_target,
  578. .send = _wl_data_source_on_send,
  579. .cancelled = _wl_data_source_on_cancelled,
  580. .dnd_drop_performed = _wl_data_source_on_dnd_drop_performed,
  581. .dnd_finished = _wl_data_source_on_dnd_finished,
  582. .action = _wl_data_source_on_action,
  583. };
  584. // xdg-shell event listeners.
  585. static constexpr struct xdg_wm_base_listener xdg_wm_base_listener = {
  586. .ping = _xdg_wm_base_on_ping,
  587. };
  588. static constexpr struct xdg_surface_listener xdg_surface_listener = {
  589. .configure = _xdg_surface_on_configure,
  590. };
  591. static constexpr struct xdg_toplevel_listener xdg_toplevel_listener = {
  592. .configure = _xdg_toplevel_on_configure,
  593. .close = _xdg_toplevel_on_close,
  594. .configure_bounds = _xdg_toplevel_on_configure_bounds,
  595. .wm_capabilities = _xdg_toplevel_on_wm_capabilities,
  596. };
  597. // wayland-protocols event listeners.
  598. static constexpr struct wp_fractional_scale_v1_listener wp_fractional_scale_listener = {
  599. .preferred_scale = _wp_fractional_scale_on_preferred_scale,
  600. };
  601. static constexpr struct zwp_relative_pointer_v1_listener wp_relative_pointer_listener = {
  602. .relative_motion = _wp_relative_pointer_on_relative_motion,
  603. };
  604. static constexpr struct zwp_pointer_gesture_pinch_v1_listener wp_pointer_gesture_pinch_listener = {
  605. .begin = _wp_pointer_gesture_pinch_on_begin,
  606. .update = _wp_pointer_gesture_pinch_on_update,
  607. .end = _wp_pointer_gesture_pinch_on_end,
  608. };
  609. static constexpr struct zwp_primary_selection_device_v1_listener wp_primary_selection_device_listener = {
  610. .data_offer = _wp_primary_selection_device_on_data_offer,
  611. .selection = _wp_primary_selection_device_on_selection,
  612. };
  613. static constexpr struct zwp_primary_selection_offer_v1_listener wp_primary_selection_offer_listener = {
  614. .offer = _wp_primary_selection_offer_on_offer,
  615. };
  616. static constexpr struct zwp_primary_selection_source_v1_listener wp_primary_selection_source_listener = {
  617. .send = _wp_primary_selection_source_on_send,
  618. .cancelled = _wp_primary_selection_source_on_cancelled,
  619. };
  620. static constexpr struct zwp_tablet_seat_v2_listener wp_tablet_seat_listener = {
  621. .tablet_added = _wp_tablet_seat_on_tablet_added,
  622. .tool_added = _wp_tablet_seat_on_tool_added,
  623. .pad_added = _wp_tablet_seat_on_pad_added,
  624. };
  625. static constexpr struct zwp_tablet_tool_v2_listener wp_tablet_tool_listener = {
  626. .type = _wp_tablet_tool_on_type,
  627. .hardware_serial = _wp_tablet_tool_on_hardware_serial,
  628. .hardware_id_wacom = _wp_tablet_tool_on_hardware_id_wacom,
  629. .capability = _wp_tablet_tool_on_capability,
  630. .done = _wp_tablet_tool_on_done,
  631. .removed = _wp_tablet_tool_on_removed,
  632. .proximity_in = _wp_tablet_tool_on_proximity_in,
  633. .proximity_out = _wp_tablet_tool_on_proximity_out,
  634. .down = _wp_tablet_tool_on_down,
  635. .up = _wp_tablet_tool_on_up,
  636. .motion = _wp_tablet_tool_on_motion,
  637. .pressure = _wp_tablet_tool_on_pressure,
  638. .distance = _wp_tablet_tool_on_distance,
  639. .tilt = _wp_tablet_tool_on_tilt,
  640. .rotation = _wp_tablet_tool_on_rotation,
  641. .slider = _wp_tablet_tool_on_slider,
  642. .wheel = _wp_tablet_tool_on_wheel,
  643. .button = _wp_tablet_tool_on_button,
  644. .frame = _wp_tablet_tool_on_frame,
  645. };
  646. static constexpr struct zwp_text_input_v3_listener wp_text_input_listener = {
  647. .enter = _wp_text_input_on_enter,
  648. .leave = _wp_text_input_on_leave,
  649. .preedit_string = _wp_text_input_on_preedit_string,
  650. .commit_string = _wp_text_input_on_commit_string,
  651. .delete_surrounding_text = _wp_text_input_on_delete_surrounding_text,
  652. .done = _wp_text_input_on_done,
  653. };
  654. // NOTE: Deprecated.
  655. static constexpr struct zxdg_exported_v1_listener xdg_exported_v1_listener = {
  656. .handle = _xdg_exported_v1_on_handle,
  657. };
  658. static constexpr struct zxdg_exported_v2_listener xdg_exported_v2_listener = {
  659. .handle = _xdg_exported_v2_on_handle,
  660. };
  661. static constexpr struct zxdg_toplevel_decoration_v1_listener xdg_toplevel_decoration_listener = {
  662. .configure = _xdg_toplevel_decoration_on_configure,
  663. };
  664. static constexpr struct xdg_activation_token_v1_listener xdg_activation_token_listener = {
  665. .done = _xdg_activation_token_on_done,
  666. };
  667. #ifdef LIBDECOR_ENABLED
  668. // libdecor event handlers.
  669. static void libdecor_on_error(struct libdecor *context, enum libdecor_error error, const char *message);
  670. static void libdecor_frame_on_configure(struct libdecor_frame *frame, struct libdecor_configuration *configuration, void *user_data);
  671. static void libdecor_frame_on_close(struct libdecor_frame *frame, void *user_data);
  672. static void libdecor_frame_on_commit(struct libdecor_frame *frame, void *user_data);
  673. static void libdecor_frame_on_dismiss_popup(struct libdecor_frame *frame, const char *seat_name, void *user_data);
  674. // libdecor event listeners.
  675. static constexpr struct libdecor_interface libdecor_interface = {
  676. .error = libdecor_on_error,
  677. .reserved0 = nullptr,
  678. .reserved1 = nullptr,
  679. .reserved2 = nullptr,
  680. .reserved3 = nullptr,
  681. .reserved4 = nullptr,
  682. .reserved5 = nullptr,
  683. .reserved6 = nullptr,
  684. .reserved7 = nullptr,
  685. .reserved8 = nullptr,
  686. .reserved9 = nullptr,
  687. };
  688. static constexpr struct libdecor_frame_interface libdecor_frame_interface = {
  689. .configure = libdecor_frame_on_configure,
  690. .close = libdecor_frame_on_close,
  691. .commit = libdecor_frame_on_commit,
  692. .dismiss_popup = libdecor_frame_on_dismiss_popup,
  693. .reserved0 = nullptr,
  694. .reserved1 = nullptr,
  695. .reserved2 = nullptr,
  696. .reserved3 = nullptr,
  697. .reserved4 = nullptr,
  698. .reserved5 = nullptr,
  699. .reserved6 = nullptr,
  700. .reserved7 = nullptr,
  701. .reserved8 = nullptr,
  702. .reserved9 = nullptr,
  703. };
  704. #endif // LIBDECOR_ENABLED
  705. static Vector<uint8_t> _read_fd(int fd);
  706. static int _allocate_shm_file(size_t size);
  707. static Vector<uint8_t> _wl_data_offer_read(struct wl_display *wl_display, const char *p_mime, struct wl_data_offer *wl_data_offer);
  708. static Vector<uint8_t> _wp_primary_selection_offer_read(struct wl_display *wl_display, const char *p_mime, struct zwp_primary_selection_offer_v1 *wp_primary_selection_offer);
  709. static void _seat_state_set_current(WaylandThread::SeatState &p_ss);
  710. static Ref<InputEventKey> _seat_state_get_key_event(SeatState *p_ss, xkb_keycode_t p_keycode, bool p_pressed);
  711. static Ref<InputEventKey> _seat_state_get_unstuck_key_event(SeatState *p_ss, xkb_keycode_t p_keycode, bool p_pressed, Key p_key);
  712. static void _wayland_state_update_cursor();
  713. void _set_current_seat(struct wl_seat *p_seat);
  714. bool _load_cursor_theme(int p_cursor_size);
  715. void _update_scale(int p_scale);
  716. public:
  717. Mutex &mutex = thread_data.mutex;
  718. struct wl_display *get_wl_display() const;
  719. // Core Wayland utilities for integrating with our own data structures.
  720. static bool wl_proxy_is_godot(struct wl_proxy *p_proxy);
  721. static void wl_proxy_tag_godot(struct wl_proxy *p_proxy);
  722. static WindowState *wl_surface_get_window_state(struct wl_surface *p_surface);
  723. static ScreenState *wl_output_get_screen_state(struct wl_output *p_output);
  724. static SeatState *wl_seat_get_seat_state(struct wl_seat *p_seat);
  725. static TabletToolState *wp_tablet_tool_get_state(struct zwp_tablet_tool_v2 *p_tool);
  726. static OfferState *wl_data_offer_get_offer_state(struct wl_data_offer *p_offer);
  727. static OfferState *wp_primary_selection_offer_get_offer_state(struct zwp_primary_selection_offer_v1 *p_offer);
  728. void seat_state_unlock_pointer(SeatState *p_ss);
  729. void seat_state_lock_pointer(SeatState *p_ss);
  730. void seat_state_set_hint(SeatState *p_ss, int p_x, int p_y);
  731. void seat_state_confine_pointer(SeatState *p_ss);
  732. static void seat_state_update_cursor(SeatState *p_ss);
  733. void seat_state_echo_keys(SeatState *p_ss);
  734. static int window_state_get_preferred_buffer_scale(WindowState *p_ws);
  735. static double window_state_get_scale_factor(WindowState *p_ws);
  736. static void window_state_update_size(WindowState *p_ws, int p_width, int p_height);
  737. static Vector2i scale_vector2i(const Vector2i &p_vector, double p_amount);
  738. void push_message(Ref<Message> message);
  739. bool has_message();
  740. Ref<Message> pop_message();
  741. void beep() const;
  742. void window_create(DisplayServer::WindowID p_window_id, int p_width, int p_height);
  743. struct wl_surface *window_get_wl_surface(DisplayServer::WindowID p_window_id) const;
  744. void window_start_resize(DisplayServer::WindowResizeEdge p_edge, DisplayServer::WindowID p_window);
  745. void window_set_max_size(DisplayServer::WindowID p_window_id, const Size2i &p_size);
  746. void window_set_min_size(DisplayServer::WindowID p_window_id, const Size2i &p_size);
  747. bool window_can_set_mode(DisplayServer::WindowID p_window_id, DisplayServer::WindowMode p_window_mode) const;
  748. void window_try_set_mode(DisplayServer::WindowID p_window_id, DisplayServer::WindowMode p_window_mode);
  749. DisplayServer::WindowMode window_get_mode(DisplayServer::WindowID p_window_id) const;
  750. void window_set_borderless(DisplayServer::WindowID p_window_id, bool p_borderless);
  751. void window_set_title(DisplayServer::WindowID p_window_id, const String &p_title);
  752. void window_set_app_id(DisplayServer::WindowID p_window_id, const String &p_app_id);
  753. bool window_is_focused(DisplayServer::WindowID p_window_id);
  754. // Optional - requires xdg_activation_v1
  755. void window_request_attention(DisplayServer::WindowID p_window_id);
  756. void window_start_drag(DisplayServer::WindowID p_window_id);
  757. // Optional - require idle_inhibit_unstable_v1
  758. void window_set_idle_inhibition(DisplayServer::WindowID p_window_id, bool p_enable);
  759. bool window_get_idle_inhibition(DisplayServer::WindowID p_window_id) const;
  760. ScreenData screen_get_data(int p_screen) const;
  761. int get_screen_count() const;
  762. void pointer_set_constraint(PointerConstraint p_constraint);
  763. void pointer_set_hint(const Point2i &p_hint);
  764. PointerConstraint pointer_get_constraint() const;
  765. DisplayServer::WindowID pointer_get_pointed_window_id() const;
  766. BitField<MouseButtonMask> pointer_get_button_mask() const;
  767. void cursor_set_visible(bool p_visible);
  768. void cursor_set_shape(DisplayServer::CursorShape p_cursor_shape);
  769. void cursor_set_custom_shape(DisplayServer::CursorShape p_cursor_shape);
  770. void cursor_shape_set_custom_image(DisplayServer::CursorShape p_cursor_shape, Ref<Image> p_image, const Point2i &p_hotspot);
  771. void cursor_shape_clear_custom_image(DisplayServer::CursorShape p_cursor_shape);
  772. void window_set_ime_active(const bool p_active, DisplayServer::WindowID p_window_id);
  773. void window_set_ime_position(const Point2i &p_pos, DisplayServer::WindowID p_window_id);
  774. int keyboard_get_layout_count() const;
  775. int keyboard_get_current_layout_index() const;
  776. void keyboard_set_current_layout_index(int p_index);
  777. String keyboard_get_layout_name(int p_index) const;
  778. Key keyboard_get_key_from_physical(Key p_key) const;
  779. void keyboard_echo_keys();
  780. bool selection_has_mime(const String &p_mime) const;
  781. Vector<uint8_t> selection_get_mime(const String &p_mime) const;
  782. void selection_set_text(const String &p_text);
  783. // Optional primary support - requires wp_primary_selection_unstable_v1
  784. bool primary_has_mime(const String &p_mime) const;
  785. Vector<uint8_t> primary_get_mime(const String &p_mime) const;
  786. void primary_set_text(const String &p_text);
  787. void commit_surfaces();
  788. void set_frame();
  789. bool get_reset_frame();
  790. bool wait_frame_suspend_ms(int p_timeout);
  791. bool is_suspended() const;
  792. Error init();
  793. void destroy();
  794. };
  795. #endif // WAYLAND_ENABLED