accessibility_driver_accesskit.cpp 68 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672
  1. /**************************************************************************/
  2. /* accessibility_driver_accesskit.cpp */
  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. #ifdef ACCESSKIT_ENABLED
  31. #include "accessibility_driver_accesskit.h"
  32. #include "core/config/project_settings.h"
  33. #include "core/io/file_access.h"
  34. #include "core/version.h"
  35. #include "servers/text/text_server.h"
  36. AccessibilityDriverAccessKit *AccessibilityDriverAccessKit::singleton = nullptr;
  37. _FORCE_INLINE_ accesskit_role AccessibilityDriverAccessKit::_accessibility_role(DisplayServer::AccessibilityRole p_role) const {
  38. if (role_map.has(p_role)) {
  39. return role_map[p_role];
  40. }
  41. return ACCESSKIT_ROLE_UNKNOWN;
  42. }
  43. _FORCE_INLINE_ accesskit_action AccessibilityDriverAccessKit::_accessibility_action(DisplayServer::AccessibilityAction p_action) const {
  44. if (action_map.has(p_action)) {
  45. return action_map[p_action];
  46. }
  47. return ACCESSKIT_ACTION_CLICK;
  48. }
  49. bool AccessibilityDriverAccessKit::window_create(DisplayServer::WindowID p_window_id, void *p_handle) {
  50. ERR_FAIL_COND_V(windows.has(p_window_id), false);
  51. WindowData &wd = windows[p_window_id];
  52. AccessibilityElement *ae = memnew(AccessibilityElement);
  53. ae->role = ACCESSKIT_ROLE_WINDOW;
  54. ae->window_id = p_window_id;
  55. wd.root_id = rid_owner.make_rid(ae);
  56. #ifdef WINDOWS_ENABLED
  57. wd.adapter = accesskit_windows_subclassing_adapter_new(static_cast<HWND>(p_handle), &_accessibility_initial_tree_update_callback, (void *)(size_t)p_window_id, &_accessibility_action_callback, (void *)(size_t)p_window_id);
  58. #endif
  59. #ifdef MACOS_ENABLED
  60. wd.adapter = accesskit_macos_subclassing_adapter_for_window(p_handle, &_accessibility_initial_tree_update_callback, (void *)(size_t)p_window_id, &_accessibility_action_callback, (void *)(size_t)p_window_id);
  61. #endif
  62. #ifdef LINUXBSD_ENABLED
  63. wd.adapter = accesskit_unix_adapter_new(&_accessibility_initial_tree_update_callback, (void *)(size_t)p_window_id, &_accessibility_action_callback, (void *)(size_t)p_window_id, &_accessibility_deactivation_callback, (void *)(size_t)p_window_id);
  64. #endif
  65. if (wd.adapter == nullptr) {
  66. memdelete(ae);
  67. rid_owner.free(wd.root_id);
  68. windows.erase(p_window_id);
  69. return false;
  70. } else {
  71. return true;
  72. }
  73. }
  74. void AccessibilityDriverAccessKit::window_destroy(DisplayServer::WindowID p_window_id) {
  75. WindowData *wd = windows.getptr(p_window_id);
  76. ERR_FAIL_NULL(wd);
  77. #ifdef WINDOWS_ENABLED
  78. accesskit_windows_subclassing_adapter_free(wd->adapter);
  79. #endif
  80. #ifdef MACOS_ENABLED
  81. accesskit_macos_subclassing_adapter_free(wd->adapter);
  82. #endif
  83. #ifdef LINUXBSD_ENABLED
  84. accesskit_unix_adapter_free(wd->adapter);
  85. #endif
  86. accessibility_free_element(wd->root_id);
  87. windows.erase(p_window_id);
  88. }
  89. void AccessibilityDriverAccessKit::_accessibility_deactivation_callback(void *p_user_data) {
  90. // NOP
  91. }
  92. void AccessibilityDriverAccessKit::_accessibility_action_callback(struct accesskit_action_request *p_request, void *p_user_data) {
  93. DisplayServer::WindowID window_id = (DisplayServer::WindowID)(size_t)p_user_data;
  94. ERR_FAIL_COND(!singleton->windows.has(window_id));
  95. RID rid = RID::from_uint64(p_request->target);
  96. AccessibilityElement *ae = singleton->rid_owner.get_or_null(rid);
  97. ERR_FAIL_NULL(ae);
  98. Variant rq_data;
  99. if (!ae->actions.has(p_request->action) && ae->role == ACCESSKIT_ROLE_TEXT_RUN && p_request->action == ACCESSKIT_ACTION_SCROLL_INTO_VIEW) {
  100. AccessibilityElement *root_ae = singleton->rid_owner.get_or_null(ae->parent);
  101. ERR_FAIL_NULL(root_ae);
  102. ae = root_ae;
  103. rq_data = ae->run;
  104. }
  105. if (ae->actions.has(p_request->action)) {
  106. Callable &cb = ae->actions[p_request->action];
  107. if (cb.is_valid()) {
  108. if (p_request->data.has_value) {
  109. switch (p_request->data.value.tag) {
  110. case ACCESSKIT_ACTION_DATA_CUSTOM_ACTION: {
  111. rq_data = p_request->data.value.custom_action;
  112. } break;
  113. case ACCESSKIT_ACTION_DATA_VALUE: {
  114. rq_data = String::utf8(p_request->data.value.value);
  115. } break;
  116. case ACCESSKIT_ACTION_DATA_NUMERIC_VALUE: {
  117. rq_data = p_request->data.value.numeric_value;
  118. } break;
  119. case ACCESSKIT_ACTION_DATA_SCROLL_HINT: {
  120. switch (p_request->data.value.scroll_hint) {
  121. case ACCESSKIT_SCROLL_HINT_TOP_LEFT: {
  122. rq_data = DisplayServer::SCROLL_HINT_TOP_LEFT;
  123. } break;
  124. case ACCESSKIT_SCROLL_HINT_BOTTOM_RIGHT: {
  125. rq_data = DisplayServer::SCROLL_HINT_BOTTOM_RIGHT;
  126. } break;
  127. case ACCESSKIT_SCROLL_HINT_TOP_EDGE: {
  128. rq_data = DisplayServer::SCROLL_HINT_TOP_EDGE;
  129. } break;
  130. case ACCESSKIT_SCROLL_HINT_BOTTOM_EDGE: {
  131. rq_data = DisplayServer::SCROLL_HINT_BOTTOM_EDGE;
  132. } break;
  133. case ACCESSKIT_SCROLL_HINT_LEFT_EDGE: {
  134. rq_data = DisplayServer::SCROLL_HINT_LEFT_EDGE;
  135. } break;
  136. case ACCESSKIT_SCROLL_HINT_RIGHT_EDGE: {
  137. rq_data = DisplayServer::SCROLL_HINT_RIGHT_EDGE;
  138. } break;
  139. default:
  140. break;
  141. }
  142. } break;
  143. case ACCESSKIT_ACTION_DATA_SCROLL_UNIT: {
  144. if (p_request->data.value.scroll_unit == ACCESSKIT_SCROLL_UNIT_ITEM) {
  145. rq_data = DisplayServer::SCROLL_UNIT_ITEM;
  146. } else if (p_request->data.value.scroll_unit == ACCESSKIT_SCROLL_UNIT_PAGE) {
  147. rq_data = DisplayServer::SCROLL_UNIT_PAGE;
  148. }
  149. } break;
  150. case ACCESSKIT_ACTION_DATA_SCROLL_TO_POINT: {
  151. rq_data = Point2(p_request->data.value.scroll_to_point.x, p_request->data.value.scroll_to_point.y);
  152. } break;
  153. case ACCESSKIT_ACTION_DATA_SET_SCROLL_OFFSET: {
  154. rq_data = Point2(p_request->data.value.set_scroll_offset.x, p_request->data.value.set_scroll_offset.y);
  155. } break;
  156. case ACCESSKIT_ACTION_DATA_SET_TEXT_SELECTION: {
  157. Dictionary sel;
  158. RID start_rid = RID::from_uint64(p_request->data.value.set_text_selection.anchor.node);
  159. AccessibilityElement *start_ae = singleton->rid_owner.get_or_null(start_rid);
  160. ERR_FAIL_NULL(start_ae);
  161. RID end_rid = RID::from_uint64(p_request->data.value.set_text_selection.focus.node);
  162. AccessibilityElement *end_ae = singleton->rid_owner.get_or_null(end_rid);
  163. ERR_FAIL_NULL(end_ae);
  164. sel["start_element"] = start_ae->parent;
  165. sel["start_char"] = (int64_t)p_request->data.value.set_text_selection.anchor.character_index + start_ae->run.x;
  166. sel["end_element"] = end_ae->parent;
  167. sel["end_char"] = (int64_t)p_request->data.value.set_text_selection.focus.character_index + end_ae->run.x;
  168. rq_data = sel;
  169. } break;
  170. }
  171. }
  172. cb.call_deferred(rq_data);
  173. }
  174. }
  175. }
  176. accesskit_tree_update *AccessibilityDriverAccessKit::_accessibility_initial_tree_update_callback(void *p_user_data) {
  177. DisplayServer::WindowID window_id = (DisplayServer::WindowID)(size_t)p_user_data;
  178. WindowData *wd = singleton->windows.getptr(window_id);
  179. ERR_FAIL_NULL_V(wd, nullptr);
  180. accesskit_node *win_node = accesskit_node_new(ACCESSKIT_ROLE_WINDOW);
  181. accesskit_node_set_label(win_node, "Godot Engine");
  182. accesskit_node_set_busy(win_node);
  183. accesskit_node_id win_id = (accesskit_node_id)wd->root_id.get_id();
  184. accesskit_tree_update *tree_update = accesskit_tree_update_with_capacity_and_focus(1, win_id);
  185. accesskit_tree_update_set_tree(tree_update, accesskit_tree_new(win_id));
  186. accesskit_tree_update_push_node(tree_update, win_id, win_node);
  187. return tree_update;
  188. }
  189. RID AccessibilityDriverAccessKit::accessibility_create_element(DisplayServer::WindowID p_window_id, DisplayServer::AccessibilityRole p_role) {
  190. AccessibilityElement *ae = memnew(AccessibilityElement);
  191. ae->role = _accessibility_role(p_role);
  192. ae->window_id = p_window_id;
  193. RID rid = rid_owner.make_rid(ae);
  194. return rid;
  195. }
  196. RID AccessibilityDriverAccessKit::accessibility_create_sub_element(const RID &p_parent_rid, DisplayServer::AccessibilityRole p_role, int p_insert_pos) {
  197. AccessibilityElement *parent_ae = rid_owner.get_or_null(p_parent_rid);
  198. ERR_FAIL_NULL_V(parent_ae, RID());
  199. WindowData *wd = windows.getptr(parent_ae->window_id);
  200. ERR_FAIL_NULL_V(wd, RID());
  201. AccessibilityElement *ae = memnew(AccessibilityElement);
  202. ae->role = _accessibility_role(p_role);
  203. ae->window_id = parent_ae->window_id;
  204. ae->parent = p_parent_rid;
  205. ae->node = accesskit_node_new(ae->role);
  206. RID rid = rid_owner.make_rid(ae);
  207. if (p_insert_pos == -1) {
  208. parent_ae->children.push_back(rid);
  209. } else {
  210. parent_ae->children.insert(p_insert_pos, rid);
  211. }
  212. wd->update.insert(rid);
  213. return rid;
  214. }
  215. RID AccessibilityDriverAccessKit::accessibility_create_sub_text_edit_elements(const RID &p_parent_rid, const RID &p_shaped_text, float p_min_height, int p_insert_pos) {
  216. AccessibilityElement *parent_ae = rid_owner.get_or_null(p_parent_rid);
  217. ERR_FAIL_NULL_V(parent_ae, RID());
  218. WindowData *wd = windows.getptr(parent_ae->window_id);
  219. ERR_FAIL_NULL_V(wd, RID());
  220. AccessibilityElement *root_ae = memnew(AccessibilityElement);
  221. root_ae->role = ACCESSKIT_ROLE_GENERIC_CONTAINER;
  222. root_ae->window_id = parent_ae->window_id;
  223. root_ae->parent = p_parent_rid;
  224. root_ae->node = accesskit_node_new(root_ae->role);
  225. RID root_rid = rid_owner.make_rid(root_ae);
  226. if (p_insert_pos == -1) {
  227. parent_ae->children.push_back(root_rid);
  228. } else {
  229. parent_ae->children.insert(p_insert_pos, root_rid);
  230. }
  231. wd->update.insert(root_rid);
  232. float text_width = 0;
  233. float text_height = p_min_height;
  234. Vector<int32_t> words;
  235. int64_t run_count = 0; // Note: runs in visual order.
  236. const Glyph *gl = nullptr;
  237. int64_t gl_count = 0;
  238. int64_t gl_index = 0;
  239. float run_off_x = 0.0;
  240. Vector2i full_range;
  241. if (p_shaped_text.is_valid()) {
  242. text_width = TS->shaped_text_get_size(p_shaped_text).x;
  243. text_height = MAX(text_height, TS->shaped_text_get_size(p_shaped_text).y);
  244. words = TS->shaped_text_get_word_breaks(p_shaped_text);
  245. run_count = TS->shaped_get_run_count(p_shaped_text);
  246. gl = TS->shaped_text_get_glyphs(p_shaped_text);
  247. gl_count = TS->shaped_text_get_glyph_count(p_shaped_text);
  248. full_range = TS->shaped_text_get_range(p_shaped_text);
  249. }
  250. accesskit_rect root_rect;
  251. root_rect.x0 = 0;
  252. root_rect.y0 = 0;
  253. root_rect.x1 = text_width;
  254. root_rect.y1 = MAX(p_min_height, text_height);
  255. accesskit_node_set_bounds(root_ae->node, root_rect);
  256. // Create text element for each run.
  257. Vector<AccessibilityElement *> text_elements;
  258. for (int64_t i = 0; i < run_count; i++) {
  259. const Vector2i range = TS->shaped_get_run_range(p_shaped_text, i);
  260. String t = TS->shaped_get_run_text(p_shaped_text, i);
  261. if (t.is_empty()) {
  262. continue;
  263. }
  264. AccessibilityElement *ae = memnew(AccessibilityElement);
  265. ae->role = ACCESSKIT_ROLE_TEXT_RUN;
  266. ae->window_id = parent_ae->window_id;
  267. ae->parent = root_rid;
  268. ae->run = Vector3i(range.x, range.y, i);
  269. ae->node = accesskit_node_new(ae->role);
  270. text_elements.push_back(ae);
  271. // UTF-8 text and char lengths.
  272. Vector<uint8_t> char_lengths;
  273. CharString text = t.utf8(&char_lengths);
  274. accesskit_node_set_value(ae->node, text.ptr());
  275. accesskit_node_set_character_lengths(ae->node, char_lengths.size(), char_lengths.ptr());
  276. // Word sizes.
  277. Vector<uint8_t> word_lengths;
  278. int32_t prev = ae->run.x;
  279. int32_t total = 0;
  280. for (int j = 0; j < words.size(); j += 2) {
  281. if (words[j] < ae->run.x) {
  282. continue;
  283. }
  284. if (words[j] >= ae->run.y) {
  285. break;
  286. }
  287. int32_t wlen = words[j] - prev;
  288. while (wlen > 255) {
  289. word_lengths.push_back(255);
  290. wlen -= 255;
  291. total += 255;
  292. }
  293. if (wlen > 0) {
  294. word_lengths.push_back(wlen);
  295. total += wlen;
  296. }
  297. prev = words[j];
  298. }
  299. if (total < t.length()) {
  300. word_lengths.push_back(t.length() - total);
  301. }
  302. accesskit_node_set_word_lengths(ae->node, word_lengths.size(), word_lengths.ptr());
  303. // Char widths and positions.
  304. Vector<float> char_positions;
  305. Vector<float> char_widths;
  306. char_positions.resize_initialized(t.length());
  307. float *positions_ptr = char_positions.ptrw();
  308. char_widths.resize_initialized(t.length());
  309. float *widths_ptr = char_widths.ptrw();
  310. float size_x = 0.0;
  311. for (int j = gl_index; j < gl_count; j += gl[j].count) {
  312. if (gl[j].start >= ae->run.y) {
  313. gl_index = j;
  314. break;
  315. }
  316. float advance = 0.0; // Graphame advance.
  317. for (int k = 0; k < gl[j].count; k++) {
  318. advance += gl[j + k].advance;
  319. }
  320. int chars = gl[j].end - gl[j].start;
  321. float adv_per_char = advance / (float)chars;
  322. for (int k = 0; k < chars; k++) {
  323. int index = gl[j].start + k - ae->run.x;
  324. ERR_CONTINUE(index < 0 || index >= t.length());
  325. positions_ptr[index] = size_x + adv_per_char * k;
  326. widths_ptr[index] = adv_per_char;
  327. }
  328. size_x += advance * gl[j].repeat;
  329. }
  330. positions_ptr[t.length() - 1] = size_x;
  331. widths_ptr[t.length() - 1] = 1.0;
  332. accesskit_node_set_character_positions(ae->node, char_positions.size(), char_positions.ptr());
  333. accesskit_node_set_character_widths(ae->node, char_widths.size(), char_widths.ptr());
  334. RID font_rid = TS->shaped_get_run_font_rid(p_shaped_text, i);
  335. if (font_rid != RID()) {
  336. CharString font_name = TS->font_get_name(font_rid).utf8();
  337. if (font_name.length() > 0) {
  338. accesskit_node_set_font_family(ae->node, font_name.ptr());
  339. }
  340. if (TS->font_get_style(font_rid).has_flag(TextServer::FONT_BOLD)) {
  341. accesskit_node_set_bold(ae->node);
  342. }
  343. if (TS->font_get_style(font_rid).has_flag(TextServer::FONT_ITALIC)) {
  344. accesskit_node_set_italic(ae->node);
  345. }
  346. accesskit_node_set_font_weight(ae->node, TS->font_get_weight(font_rid));
  347. }
  348. accesskit_node_set_font_size(ae->node, TS->shaped_get_run_font_size(p_shaped_text, i));
  349. CharString language = TS->shaped_get_run_language(p_shaped_text, i).utf8();
  350. if (language.length() > 0) {
  351. accesskit_node_set_language(ae->node, language.ptr());
  352. }
  353. accesskit_node_set_text_direction(ae->node, ACCESSKIT_TEXT_DIRECTION_LEFT_TO_RIGHT);
  354. accesskit_rect rect;
  355. rect.x0 = run_off_x;
  356. rect.y0 = 0;
  357. rect.x1 = run_off_x + size_x;
  358. rect.y1 = text_height;
  359. accesskit_node_set_bounds(ae->node, rect);
  360. accesskit_node_add_action(ae->node, ACCESSKIT_ACTION_SCROLL_INTO_VIEW);
  361. run_off_x += size_x;
  362. }
  363. {
  364. // Add "\n" at the end.
  365. AccessibilityElement *ae = memnew(AccessibilityElement);
  366. ae->role = ACCESSKIT_ROLE_TEXT_RUN;
  367. ae->window_id = parent_ae->window_id;
  368. ae->parent = root_rid;
  369. ae->run = Vector3i(full_range.y, full_range.y, run_count);
  370. ae->node = accesskit_node_new(ae->role);
  371. text_elements.push_back(ae);
  372. Vector<uint8_t> char_lengths;
  373. char_lengths.push_back(1);
  374. accesskit_node_set_value(ae->node, "\n");
  375. accesskit_node_set_character_lengths(ae->node, char_lengths.size(), char_lengths.ptr());
  376. Vector<float> char_positions;
  377. Vector<float> char_widths;
  378. char_positions.push_back(0.0);
  379. char_widths.push_back(1.0);
  380. accesskit_node_set_character_positions(ae->node, char_positions.size(), char_positions.ptr());
  381. accesskit_node_set_character_widths(ae->node, char_widths.size(), char_widths.ptr());
  382. accesskit_node_set_text_direction(ae->node, ACCESSKIT_TEXT_DIRECTION_LEFT_TO_RIGHT);
  383. accesskit_rect rect;
  384. rect.x0 = run_off_x;
  385. rect.y0 = 0;
  386. rect.x1 = run_off_x + 1;
  387. rect.y1 = text_height;
  388. accesskit_node_set_bounds(ae->node, rect);
  389. }
  390. // Sort runs in logical order.
  391. struct RunCompare {
  392. _FORCE_INLINE_ bool operator()(const AccessibilityElement *l, const AccessibilityElement *r) const {
  393. return l->run.x < r->run.x;
  394. }
  395. };
  396. text_elements.sort_custom<RunCompare>();
  397. for (AccessibilityElement *text_element : text_elements) {
  398. RID rid = rid_owner.make_rid(text_element);
  399. root_ae->children.push_back(rid);
  400. wd->update.insert(rid);
  401. }
  402. return root_rid;
  403. }
  404. bool AccessibilityDriverAccessKit::accessibility_has_element(const RID &p_id) const {
  405. return rid_owner.owns(p_id);
  406. }
  407. void AccessibilityDriverAccessKit::_free_recursive(WindowData *p_wd, const RID &p_id) {
  408. if (p_wd && p_wd->update.has(p_id)) {
  409. p_wd->update.erase(p_id);
  410. }
  411. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  412. for (const RID &rid : ae->children) {
  413. _free_recursive(p_wd, rid);
  414. }
  415. if (ae->node) {
  416. accesskit_node_free(ae->node);
  417. }
  418. memdelete(ae);
  419. rid_owner.free(p_id);
  420. }
  421. void AccessibilityDriverAccessKit::accessibility_free_element(const RID &p_id) {
  422. ERR_FAIL_COND_MSG(in_accessibility_update, "Element can't be removed inside NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  423. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  424. if (ae) {
  425. WindowData *wd = windows.getptr(ae->window_id);
  426. AccessibilityElement *parent_ae = rid_owner.get_or_null(ae->parent);
  427. if (parent_ae) {
  428. parent_ae->children.erase(p_id);
  429. }
  430. _free_recursive(wd, p_id);
  431. }
  432. }
  433. void AccessibilityDriverAccessKit::accessibility_element_set_meta(const RID &p_id, const Variant &p_meta) {
  434. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  435. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  436. ERR_FAIL_NULL(ae);
  437. ae->meta = p_meta;
  438. }
  439. Variant AccessibilityDriverAccessKit::accessibility_element_get_meta(const RID &p_id) const {
  440. const AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  441. ERR_FAIL_NULL_V(ae, Variant());
  442. return ae->meta;
  443. }
  444. void AccessibilityDriverAccessKit::accessibility_update_set_focus(const RID &p_id) {
  445. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  446. if (p_id.is_valid() && rid_owner.owns(p_id)) {
  447. focus = p_id;
  448. } else {
  449. focus = RID();
  450. }
  451. }
  452. RID AccessibilityDriverAccessKit::accessibility_get_window_root(DisplayServer::WindowID p_window_id) const {
  453. const WindowData *wd = windows.getptr(p_window_id);
  454. ERR_FAIL_NULL_V(wd, RID());
  455. return wd->root_id;
  456. }
  457. accesskit_tree_update *AccessibilityDriverAccessKit::_accessibility_build_tree_update(void *p_user_data) {
  458. DisplayServer::WindowID window_id = (DisplayServer::WindowID)(size_t)p_user_data;
  459. ERR_FAIL_COND_V(!singleton->windows.has(window_id), nullptr);
  460. WindowData &wd = singleton->windows[window_id];
  461. singleton->in_accessibility_update = true;
  462. if (singleton->update_cb.is_valid()) {
  463. singleton->update_cb.call(window_id);
  464. }
  465. singleton->in_accessibility_update = false;
  466. AccessibilityElement *focus_ae = singleton->rid_owner.get_or_null(singleton->focus);
  467. uint32_t update_size = wd.update.size();
  468. accesskit_node_id ac_focus = (accesskit_node_id)wd.root_id.get_id();
  469. if (focus_ae && focus_ae->window_id == window_id) {
  470. ac_focus = (accesskit_node_id)singleton->focus.get_id();
  471. }
  472. accesskit_tree_update *tree_update = (update_size > 0) ? accesskit_tree_update_with_capacity_and_focus(update_size, ac_focus) : accesskit_tree_update_with_focus(ac_focus);
  473. for (const RID &rid : wd.update) {
  474. AccessibilityElement *ae = singleton->rid_owner.get_or_null(rid);
  475. if (ae && ae->node) {
  476. for (const RID &child_rid : ae->children) {
  477. accesskit_node_push_child(ae->node, (accesskit_node_id)child_rid.get_id());
  478. }
  479. accesskit_tree_update_push_node(tree_update, (accesskit_node_id)rid.get_id(), ae->node);
  480. ae->node = nullptr;
  481. }
  482. }
  483. wd.update.clear();
  484. return tree_update;
  485. }
  486. void AccessibilityDriverAccessKit::accessibility_update_if_active(const Callable &p_callable) {
  487. ERR_FAIL_COND(!p_callable.is_valid());
  488. update_cb = p_callable;
  489. for (KeyValue<DisplayServer::WindowID, WindowData> &window : windows) {
  490. #ifdef WINDOWS_ENABLED
  491. accesskit_windows_queued_events *events = accesskit_windows_subclassing_adapter_update_if_active(window.value.adapter, _accessibility_build_tree_update, (void *)(size_t)window.key);
  492. if (events) {
  493. accesskit_windows_queued_events_raise(events);
  494. }
  495. #endif
  496. #ifdef MACOS_ENABLED
  497. accesskit_macos_queued_events *events = accesskit_macos_subclassing_adapter_update_if_active(window.value.adapter, _accessibility_build_tree_update, (void *)(size_t)window.key);
  498. if (events) {
  499. accesskit_macos_queued_events_raise(events);
  500. }
  501. #endif
  502. #ifdef LINUXBSD_ENABLED
  503. accesskit_unix_adapter_update_if_active(window.value.adapter, _accessibility_build_tree_update, (void *)(size_t)window.key);
  504. #endif
  505. }
  506. update_cb = Callable();
  507. }
  508. _FORCE_INLINE_ void AccessibilityDriverAccessKit::_ensure_node(const RID &p_id, AccessibilityElement *p_ae) {
  509. if (unlikely(!p_ae->node)) {
  510. WindowData *wd = windows.getptr(p_ae->window_id);
  511. ERR_FAIL_NULL(wd);
  512. wd->update.insert(p_id);
  513. p_ae->node = accesskit_node_new(p_ae->role);
  514. }
  515. }
  516. void AccessibilityDriverAccessKit::accessibility_set_window_rect(DisplayServer::WindowID p_window_id, const Rect2 &p_rect_out, const Rect2 &p_rect_in) {
  517. #ifdef LINUXBSD_ENABLED
  518. const WindowData *wd = windows.getptr(p_window_id);
  519. ERR_FAIL_NULL(wd);
  520. accesskit_rect outer_bounds = { p_rect_out.position.x, p_rect_out.position.y, p_rect_out.position.x + p_rect_out.size.width, p_rect_out.position.y + p_rect_out.size.height };
  521. accesskit_rect inner_bounds = { p_rect_in.position.x, p_rect_in.position.y, p_rect_in.position.x + p_rect_in.size.width, p_rect_in.position.y + p_rect_in.size.height };
  522. accesskit_unix_adapter_set_root_window_bounds(wd->adapter, outer_bounds, inner_bounds);
  523. #endif
  524. }
  525. void AccessibilityDriverAccessKit::accessibility_set_window_focused(DisplayServer::WindowID p_window_id, bool p_focused) {
  526. const WindowData *wd = windows.getptr(p_window_id);
  527. ERR_FAIL_NULL(wd);
  528. #ifdef LINUXBSD_ENABLED
  529. accesskit_unix_adapter_update_window_focus_state(wd->adapter, p_focused);
  530. #endif
  531. #ifdef MACOS_ENABLED
  532. accesskit_macos_queued_events *events = accesskit_macos_subclassing_adapter_update_view_focus_state(wd->adapter, p_focused);
  533. if (events != nullptr) {
  534. accesskit_macos_queued_events_raise(events);
  535. }
  536. #endif
  537. // Note: On Windows, the subclassing adapter takes care of this.
  538. }
  539. void AccessibilityDriverAccessKit::accessibility_update_set_role(const RID &p_id, DisplayServer::AccessibilityRole p_role) {
  540. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  541. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  542. ERR_FAIL_NULL(ae);
  543. if (ae->role == _accessibility_role(p_role)) {
  544. return;
  545. }
  546. ae->role = _accessibility_role(p_role);
  547. _ensure_node(p_id, ae);
  548. accesskit_node_set_role(ae->node, ae->role);
  549. }
  550. void AccessibilityDriverAccessKit::accessibility_update_set_name(const RID &p_id, const String &p_name) {
  551. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  552. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  553. ERR_FAIL_NULL(ae);
  554. _ensure_node(p_id, ae);
  555. ae->name = p_name;
  556. String full_name = ae->name + " " + ae->name_extra_info;
  557. if (!full_name.is_empty()) {
  558. accesskit_node_set_label(ae->node, full_name.utf8().ptr());
  559. } else {
  560. accesskit_node_clear_label(ae->node);
  561. }
  562. }
  563. void AccessibilityDriverAccessKit::accessibility_update_set_extra_info(const RID &p_id, const String &p_name_extra_info) {
  564. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  565. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  566. ERR_FAIL_NULL(ae);
  567. _ensure_node(p_id, ae);
  568. ae->name_extra_info = p_name_extra_info;
  569. String full_name = ae->name + " " + ae->name_extra_info;
  570. if (!full_name.is_empty()) {
  571. accesskit_node_set_label(ae->node, full_name.utf8().ptr());
  572. } else {
  573. accesskit_node_clear_label(ae->node);
  574. }
  575. }
  576. void AccessibilityDriverAccessKit::accessibility_update_set_description(const RID &p_id, const String &p_description) {
  577. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  578. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  579. ERR_FAIL_NULL(ae);
  580. _ensure_node(p_id, ae);
  581. if (!p_description.is_empty()) {
  582. accesskit_node_set_description(ae->node, p_description.utf8().ptr());
  583. } else {
  584. accesskit_node_clear_description(ae->node);
  585. }
  586. }
  587. void AccessibilityDriverAccessKit::accessibility_update_set_value(const RID &p_id, const String &p_value) {
  588. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  589. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  590. ERR_FAIL_NULL(ae);
  591. _ensure_node(p_id, ae);
  592. if (!p_value.is_empty()) {
  593. Vector<uint8_t> ch_length;
  594. accesskit_node_set_value(ae->node, p_value.utf8(&ch_length).ptr());
  595. accesskit_node_set_character_lengths(ae->node, ch_length.size(), ch_length.ptr());
  596. } else {
  597. accesskit_node_clear_value(ae->node);
  598. accesskit_node_clear_character_lengths(ae->node);
  599. }
  600. }
  601. void AccessibilityDriverAccessKit::accessibility_update_set_tooltip(const RID &p_id, const String &p_tooltip) {
  602. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  603. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  604. ERR_FAIL_NULL(ae);
  605. _ensure_node(p_id, ae);
  606. if (!p_tooltip.is_empty()) {
  607. accesskit_node_set_tooltip(ae->node, p_tooltip.utf8().ptr());
  608. } else {
  609. accesskit_node_clear_tooltip(ae->node);
  610. }
  611. }
  612. void AccessibilityDriverAccessKit::accessibility_update_set_bounds(const RID &p_id, const Rect2 &p_rect) {
  613. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  614. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  615. ERR_FAIL_NULL(ae);
  616. _ensure_node(p_id, ae);
  617. accesskit_rect rect;
  618. rect.x0 = p_rect.position.x;
  619. rect.y0 = p_rect.position.y;
  620. rect.x1 = p_rect.position.x + p_rect.size.x;
  621. rect.y1 = p_rect.position.y + p_rect.size.y;
  622. accesskit_node_set_bounds(ae->node, rect);
  623. }
  624. void AccessibilityDriverAccessKit::accessibility_update_set_transform(const RID &p_id, const Transform2D &p_transform) {
  625. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  626. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  627. ERR_FAIL_NULL(ae);
  628. _ensure_node(p_id, ae);
  629. accesskit_affine transform = { p_transform.columns[0][0], p_transform.columns[0][1], p_transform.columns[1][0], p_transform.columns[1][1], p_transform.columns[2][0], p_transform.columns[2][1] };
  630. accesskit_node_set_transform(ae->node, transform);
  631. }
  632. void AccessibilityDriverAccessKit::accessibility_update_add_child(const RID &p_id, const RID &p_child_id) {
  633. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  634. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  635. ERR_FAIL_NULL(ae);
  636. AccessibilityElement *other_ae = rid_owner.get_or_null(p_child_id);
  637. ERR_FAIL_NULL(other_ae);
  638. ERR_FAIL_COND(other_ae->window_id != ae->window_id);
  639. _ensure_node(p_id, ae);
  640. accesskit_node_push_child(ae->node, (accesskit_node_id)p_child_id.get_id());
  641. }
  642. void AccessibilityDriverAccessKit::accessibility_update_add_related_controls(const RID &p_id, const RID &p_related_id) {
  643. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  644. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  645. ERR_FAIL_NULL(ae);
  646. AccessibilityElement *other_ae = rid_owner.get_or_null(p_related_id);
  647. ERR_FAIL_NULL(other_ae);
  648. ERR_FAIL_COND(other_ae->window_id != ae->window_id);
  649. _ensure_node(p_id, ae);
  650. accesskit_node_push_controlled(ae->node, (accesskit_node_id)p_related_id.get_id());
  651. }
  652. void AccessibilityDriverAccessKit::accessibility_update_add_related_details(const RID &p_id, const RID &p_related_id) {
  653. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  654. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  655. ERR_FAIL_NULL(ae);
  656. AccessibilityElement *other_ae = rid_owner.get_or_null(p_related_id);
  657. ERR_FAIL_NULL(other_ae);
  658. ERR_FAIL_COND(other_ae->window_id != ae->window_id);
  659. _ensure_node(p_id, ae);
  660. accesskit_node_push_detail(ae->node, (accesskit_node_id)p_related_id.get_id());
  661. }
  662. void AccessibilityDriverAccessKit::accessibility_update_add_related_described_by(const RID &p_id, const RID &p_related_id) {
  663. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  664. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  665. ERR_FAIL_NULL(ae);
  666. AccessibilityElement *other_ae = rid_owner.get_or_null(p_related_id);
  667. ERR_FAIL_NULL(other_ae);
  668. ERR_FAIL_COND(other_ae->window_id != ae->window_id);
  669. _ensure_node(p_id, ae);
  670. accesskit_node_push_described_by(ae->node, (accesskit_node_id)p_related_id.get_id());
  671. }
  672. void AccessibilityDriverAccessKit::accessibility_update_add_related_flow_to(const RID &p_id, const RID &p_related_id) {
  673. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  674. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  675. ERR_FAIL_NULL(ae);
  676. AccessibilityElement *other_ae = rid_owner.get_or_null(p_related_id);
  677. ERR_FAIL_NULL(other_ae);
  678. ERR_FAIL_COND(other_ae->window_id != ae->window_id);
  679. _ensure_node(p_id, ae);
  680. accesskit_node_push_flow_to(ae->node, (accesskit_node_id)p_related_id.get_id());
  681. }
  682. void AccessibilityDriverAccessKit::accessibility_update_add_related_labeled_by(const RID &p_id, const RID &p_related_id) {
  683. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  684. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  685. ERR_FAIL_NULL(ae);
  686. AccessibilityElement *other_ae = rid_owner.get_or_null(p_related_id);
  687. ERR_FAIL_NULL(other_ae);
  688. ERR_FAIL_COND(other_ae->window_id != ae->window_id);
  689. _ensure_node(p_id, ae);
  690. accesskit_node_push_labelled_by(ae->node, (accesskit_node_id)p_related_id.get_id());
  691. }
  692. void AccessibilityDriverAccessKit::accessibility_update_add_related_radio_group(const RID &p_id, const RID &p_related_id) {
  693. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  694. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  695. ERR_FAIL_NULL(ae);
  696. AccessibilityElement *other_ae = rid_owner.get_or_null(p_related_id);
  697. ERR_FAIL_NULL(other_ae);
  698. ERR_FAIL_COND(other_ae->window_id != ae->window_id);
  699. _ensure_node(p_id, ae);
  700. accesskit_node_push_to_radio_group(ae->node, (accesskit_node_id)p_related_id.get_id());
  701. }
  702. void AccessibilityDriverAccessKit::accessibility_update_set_active_descendant(const RID &p_id, const RID &p_other_id) {
  703. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  704. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  705. ERR_FAIL_NULL(ae);
  706. AccessibilityElement *other_ae = rid_owner.get_or_null(p_other_id);
  707. ERR_FAIL_NULL(other_ae);
  708. ERR_FAIL_COND(other_ae->window_id != ae->window_id);
  709. _ensure_node(p_id, ae);
  710. accesskit_node_set_active_descendant(ae->node, (accesskit_node_id)p_other_id.get_id());
  711. }
  712. void AccessibilityDriverAccessKit::accessibility_update_set_next_on_line(const RID &p_id, const RID &p_other_id) {
  713. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  714. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  715. ERR_FAIL_NULL(ae);
  716. AccessibilityElement *other_ae = rid_owner.get_or_null(p_other_id);
  717. ERR_FAIL_NULL(other_ae);
  718. ERR_FAIL_COND(other_ae->window_id != ae->window_id);
  719. _ensure_node(p_id, ae);
  720. accesskit_node_set_next_on_line(ae->node, (accesskit_node_id)p_other_id.get_id());
  721. }
  722. void AccessibilityDriverAccessKit::accessibility_update_set_previous_on_line(const RID &p_id, const RID &p_other_id) {
  723. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  724. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  725. ERR_FAIL_NULL(ae);
  726. AccessibilityElement *other_ae = rid_owner.get_or_null(p_other_id);
  727. ERR_FAIL_NULL(other_ae);
  728. ERR_FAIL_COND(other_ae->window_id != ae->window_id);
  729. _ensure_node(p_id, ae);
  730. accesskit_node_set_previous_on_line(ae->node, (accesskit_node_id)p_other_id.get_id());
  731. }
  732. void AccessibilityDriverAccessKit::accessibility_update_set_member_of(const RID &p_id, const RID &p_group_id) {
  733. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  734. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  735. ERR_FAIL_NULL(ae);
  736. AccessibilityElement *other_ae = rid_owner.get_or_null(p_group_id);
  737. ERR_FAIL_NULL(other_ae);
  738. ERR_FAIL_COND(other_ae->window_id != ae->window_id);
  739. _ensure_node(p_id, ae);
  740. accesskit_node_set_member_of(ae->node, (accesskit_node_id)p_group_id.get_id());
  741. }
  742. void AccessibilityDriverAccessKit::accessibility_update_set_in_page_link_target(const RID &p_id, const RID &p_other_id) {
  743. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  744. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  745. ERR_FAIL_NULL(ae);
  746. AccessibilityElement *other_ae = rid_owner.get_or_null(p_other_id);
  747. ERR_FAIL_NULL(other_ae);
  748. ERR_FAIL_COND(other_ae->window_id != ae->window_id);
  749. _ensure_node(p_id, ae);
  750. accesskit_node_set_in_page_link_target(ae->node, (accesskit_node_id)p_other_id.get_id());
  751. }
  752. void AccessibilityDriverAccessKit::accessibility_update_set_error_message(const RID &p_id, const RID &p_other_id) {
  753. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  754. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  755. ERR_FAIL_NULL(ae);
  756. AccessibilityElement *other_ae = rid_owner.get_or_null(p_other_id);
  757. ERR_FAIL_NULL(other_ae);
  758. ERR_FAIL_COND(other_ae->window_id != ae->window_id);
  759. _ensure_node(p_id, ae);
  760. accesskit_node_set_error_message(ae->node, (accesskit_node_id)p_other_id.get_id());
  761. }
  762. void AccessibilityDriverAccessKit::accessibility_update_set_live(const RID &p_id, DisplayServer::AccessibilityLiveMode p_live) {
  763. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  764. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  765. ERR_FAIL_NULL(ae);
  766. _ensure_node(p_id, ae);
  767. switch (p_live) {
  768. case DisplayServer::AccessibilityLiveMode::LIVE_OFF: {
  769. accesskit_node_set_live(ae->node, ACCESSKIT_LIVE_OFF);
  770. } break;
  771. case DisplayServer::AccessibilityLiveMode::LIVE_POLITE: {
  772. accesskit_node_set_live(ae->node, ACCESSKIT_LIVE_POLITE);
  773. } break;
  774. case DisplayServer::AccessibilityLiveMode::LIVE_ASSERTIVE: {
  775. accesskit_node_set_live(ae->node, ACCESSKIT_LIVE_ASSERTIVE);
  776. } break;
  777. }
  778. }
  779. void AccessibilityDriverAccessKit::accessibility_update_add_action(const RID &p_id, DisplayServer::AccessibilityAction p_action, const Callable &p_callable) {
  780. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  781. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  782. ERR_FAIL_NULL(ae);
  783. _ensure_node(p_id, ae);
  784. ae->actions[_accessibility_action(p_action)] = p_callable;
  785. accesskit_node_add_action(ae->node, _accessibility_action(p_action));
  786. }
  787. void AccessibilityDriverAccessKit::accessibility_update_add_custom_action(const RID &p_id, int p_action_id, const String &p_action_description) {
  788. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  789. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  790. ERR_FAIL_NULL(ae);
  791. _ensure_node(p_id, ae);
  792. if (!p_action_description.is_empty()) {
  793. accesskit_custom_action ca = accesskit_custom_action_new(p_action_id, p_action_description.utf8().ptr());
  794. accesskit_node_push_custom_action(ae->node, ca);
  795. } else {
  796. String cs_name = vformat("Custom Action %d", p_action_id);
  797. accesskit_custom_action ca = accesskit_custom_action_new(p_action_id, cs_name.utf8().ptr());
  798. accesskit_node_push_custom_action(ae->node, ca);
  799. }
  800. }
  801. void AccessibilityDriverAccessKit::accessibility_update_set_table_row_count(const RID &p_id, int p_count) {
  802. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  803. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  804. ERR_FAIL_NULL(ae);
  805. _ensure_node(p_id, ae);
  806. accesskit_node_set_row_count(ae->node, p_count);
  807. }
  808. void AccessibilityDriverAccessKit::accessibility_update_set_table_column_count(const RID &p_id, int p_count) {
  809. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  810. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  811. ERR_FAIL_NULL(ae);
  812. _ensure_node(p_id, ae);
  813. accesskit_node_set_column_count(ae->node, p_count);
  814. }
  815. void AccessibilityDriverAccessKit::accessibility_update_set_table_row_index(const RID &p_id, int p_index) {
  816. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  817. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  818. ERR_FAIL_NULL(ae);
  819. _ensure_node(p_id, ae);
  820. accesskit_node_set_row_index(ae->node, p_index);
  821. }
  822. void AccessibilityDriverAccessKit::accessibility_update_set_table_column_index(const RID &p_id, int p_index) {
  823. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  824. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  825. ERR_FAIL_NULL(ae);
  826. _ensure_node(p_id, ae);
  827. accesskit_node_set_column_index(ae->node, p_index);
  828. }
  829. void AccessibilityDriverAccessKit::accessibility_update_set_table_cell_position(const RID &p_id, int p_row_index, int p_column_index) {
  830. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  831. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  832. ERR_FAIL_NULL(ae);
  833. _ensure_node(p_id, ae);
  834. accesskit_node_set_row_index(ae->node, p_row_index);
  835. accesskit_node_set_column_index(ae->node, p_column_index);
  836. }
  837. void AccessibilityDriverAccessKit::accessibility_update_set_table_cell_span(const RID &p_id, int p_row_span, int p_column_span) {
  838. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  839. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  840. ERR_FAIL_NULL(ae);
  841. _ensure_node(p_id, ae);
  842. accesskit_node_set_row_span(ae->node, p_row_span);
  843. accesskit_node_set_column_span(ae->node, p_column_span);
  844. }
  845. void AccessibilityDriverAccessKit::accessibility_update_set_list_item_count(const RID &p_id, int p_size) {
  846. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  847. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  848. ERR_FAIL_NULL(ae);
  849. _ensure_node(p_id, ae);
  850. accesskit_node_set_size_of_set(ae->node, p_size);
  851. }
  852. void AccessibilityDriverAccessKit::accessibility_update_set_list_item_index(const RID &p_id, int p_index) {
  853. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  854. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  855. ERR_FAIL_NULL(ae);
  856. _ensure_node(p_id, ae);
  857. accesskit_node_set_position_in_set(ae->node, p_index);
  858. }
  859. void AccessibilityDriverAccessKit::accessibility_update_set_list_item_level(const RID &p_id, int p_level) {
  860. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  861. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  862. ERR_FAIL_NULL(ae);
  863. _ensure_node(p_id, ae);
  864. accesskit_node_set_level(ae->node, p_level);
  865. }
  866. void AccessibilityDriverAccessKit::accessibility_update_set_list_item_selected(const RID &p_id, bool p_selected) {
  867. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  868. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  869. ERR_FAIL_NULL(ae);
  870. _ensure_node(p_id, ae);
  871. accesskit_node_set_selected(ae->node, p_selected);
  872. }
  873. void AccessibilityDriverAccessKit::accessibility_update_set_list_item_expanded(const RID &p_id, bool p_expanded) {
  874. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  875. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  876. ERR_FAIL_NULL(ae);
  877. _ensure_node(p_id, ae);
  878. accesskit_node_set_expanded(ae->node, p_expanded);
  879. }
  880. void AccessibilityDriverAccessKit::accessibility_update_set_popup_type(const RID &p_id, DisplayServer::AccessibilityPopupType p_popup) {
  881. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  882. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  883. ERR_FAIL_NULL(ae);
  884. _ensure_node(p_id, ae);
  885. switch (p_popup) {
  886. case DisplayServer::AccessibilityPopupType::POPUP_MENU: {
  887. accesskit_node_set_has_popup(ae->node, ACCESSKIT_HAS_POPUP_MENU);
  888. } break;
  889. case DisplayServer::AccessibilityPopupType::POPUP_LIST: {
  890. accesskit_node_set_has_popup(ae->node, ACCESSKIT_HAS_POPUP_LISTBOX);
  891. } break;
  892. case DisplayServer::AccessibilityPopupType::POPUP_TREE: {
  893. accesskit_node_set_has_popup(ae->node, ACCESSKIT_HAS_POPUP_TREE);
  894. } break;
  895. case DisplayServer::AccessibilityPopupType::POPUP_DIALOG: {
  896. accesskit_node_set_has_popup(ae->node, ACCESSKIT_HAS_POPUP_DIALOG);
  897. } break;
  898. }
  899. }
  900. void AccessibilityDriverAccessKit::accessibility_update_set_checked(const RID &p_id, bool p_checekd) {
  901. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  902. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  903. ERR_FAIL_NULL(ae);
  904. _ensure_node(p_id, ae);
  905. if (p_checekd) {
  906. accesskit_node_set_toggled(ae->node, ACCESSKIT_TOGGLED_TRUE);
  907. } else {
  908. accesskit_node_set_toggled(ae->node, ACCESSKIT_TOGGLED_FALSE);
  909. }
  910. }
  911. void AccessibilityDriverAccessKit::accessibility_update_set_num_value(const RID &p_id, double p_position) {
  912. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  913. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  914. ERR_FAIL_NULL(ae);
  915. _ensure_node(p_id, ae);
  916. accesskit_node_set_numeric_value(ae->node, p_position);
  917. }
  918. void AccessibilityDriverAccessKit::accessibility_update_set_num_range(const RID &p_id, double p_min, double p_max) {
  919. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  920. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  921. ERR_FAIL_NULL(ae);
  922. _ensure_node(p_id, ae);
  923. accesskit_node_set_min_numeric_value(ae->node, p_min);
  924. accesskit_node_set_max_numeric_value(ae->node, p_max);
  925. }
  926. void AccessibilityDriverAccessKit::accessibility_update_set_num_step(const RID &p_id, double p_step) {
  927. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  928. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  929. ERR_FAIL_NULL(ae);
  930. _ensure_node(p_id, ae);
  931. accesskit_node_set_numeric_value_step(ae->node, p_step);
  932. }
  933. void AccessibilityDriverAccessKit::accessibility_update_set_num_jump(const RID &p_id, double p_jump) {
  934. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  935. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  936. ERR_FAIL_NULL(ae);
  937. _ensure_node(p_id, ae);
  938. accesskit_node_set_numeric_value_jump(ae->node, p_jump);
  939. }
  940. void AccessibilityDriverAccessKit::accessibility_update_set_scroll_x(const RID &p_id, double p_position) {
  941. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  942. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  943. ERR_FAIL_NULL(ae);
  944. _ensure_node(p_id, ae);
  945. accesskit_node_set_scroll_x(ae->node, p_position);
  946. }
  947. void AccessibilityDriverAccessKit::accessibility_update_set_scroll_x_range(const RID &p_id, double p_min, double p_max) {
  948. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  949. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  950. ERR_FAIL_NULL(ae);
  951. _ensure_node(p_id, ae);
  952. accesskit_node_set_scroll_x_min(ae->node, p_min);
  953. accesskit_node_set_scroll_x_max(ae->node, p_max);
  954. }
  955. void AccessibilityDriverAccessKit::accessibility_update_set_scroll_y(const RID &p_id, double p_position) {
  956. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  957. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  958. ERR_FAIL_NULL(ae);
  959. _ensure_node(p_id, ae);
  960. accesskit_node_set_scroll_y(ae->node, p_position);
  961. }
  962. void AccessibilityDriverAccessKit::accessibility_update_set_scroll_y_range(const RID &p_id, double p_min, double p_max) {
  963. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  964. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  965. ERR_FAIL_NULL(ae);
  966. _ensure_node(p_id, ae);
  967. accesskit_node_set_scroll_y_min(ae->node, p_min);
  968. accesskit_node_set_scroll_y_max(ae->node, p_max);
  969. }
  970. void AccessibilityDriverAccessKit::accessibility_update_set_text_decorations(const RID &p_id, bool p_underline, bool p_strikethrough, bool p_overline) {
  971. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  972. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  973. ERR_FAIL_NULL(ae);
  974. _ensure_node(p_id, ae);
  975. if (p_underline) {
  976. accesskit_node_set_underline(ae->node, ACCESSKIT_TEXT_DECORATION_SOLID);
  977. } else {
  978. accesskit_node_clear_underline(ae->node);
  979. }
  980. if (p_overline) {
  981. accesskit_node_set_overline(ae->node, ACCESSKIT_TEXT_DECORATION_SOLID);
  982. } else {
  983. accesskit_node_clear_overline(ae->node);
  984. }
  985. if (p_strikethrough) {
  986. accesskit_node_set_strikethrough(ae->node, ACCESSKIT_TEXT_DECORATION_SOLID);
  987. } else {
  988. accesskit_node_clear_strikethrough(ae->node);
  989. }
  990. }
  991. void AccessibilityDriverAccessKit::accessibility_update_set_text_align(const RID &p_id, HorizontalAlignment p_align) {
  992. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  993. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  994. ERR_FAIL_NULL(ae);
  995. _ensure_node(p_id, ae);
  996. switch (p_align) {
  997. case HORIZONTAL_ALIGNMENT_LEFT: {
  998. accesskit_node_set_text_align(ae->node, ACCESSKIT_TEXT_ALIGN_LEFT);
  999. } break;
  1000. case HORIZONTAL_ALIGNMENT_CENTER: {
  1001. accesskit_node_set_text_align(ae->node, ACCESSKIT_TEXT_ALIGN_RIGHT);
  1002. } break;
  1003. case HORIZONTAL_ALIGNMENT_RIGHT: {
  1004. accesskit_node_set_text_align(ae->node, ACCESSKIT_TEXT_ALIGN_CENTER);
  1005. } break;
  1006. case HORIZONTAL_ALIGNMENT_FILL: {
  1007. accesskit_node_set_text_align(ae->node, ACCESSKIT_TEXT_ALIGN_JUSTIFY);
  1008. } break;
  1009. }
  1010. }
  1011. void AccessibilityDriverAccessKit::accessibility_update_set_text_selection(const RID &p_id, const RID &p_text_start_id, int p_start_char, const RID &p_text_end_id, int p_end_char) {
  1012. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  1013. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  1014. ERR_FAIL_NULL(ae);
  1015. AccessibilityElement *start_ae = rid_owner.get_or_null(p_text_start_id);
  1016. ERR_FAIL_NULL(start_ae);
  1017. ERR_FAIL_COND(start_ae->window_id != ae->window_id);
  1018. AccessibilityElement *end_ae = rid_owner.get_or_null(p_text_end_id);
  1019. ERR_FAIL_NULL(end_ae);
  1020. ERR_FAIL_COND(end_ae->window_id != ae->window_id);
  1021. int start_pos = p_start_char;
  1022. int end_pos = p_end_char;
  1023. RID start_rid;
  1024. RID end_rid;
  1025. for (const RID &rid : start_ae->children) {
  1026. const AccessibilityElement *child_ae = rid_owner.get_or_null(rid);
  1027. if (child_ae && child_ae->role == ACCESSKIT_ROLE_TEXT_RUN) {
  1028. if (p_start_char >= child_ae->run.x && p_start_char <= child_ae->run.y) {
  1029. start_rid = rid;
  1030. start_pos = p_start_char - child_ae->run.x;
  1031. break;
  1032. }
  1033. }
  1034. }
  1035. for (const RID &rid : end_ae->children) {
  1036. const AccessibilityElement *child_ae = rid_owner.get_or_null(rid);
  1037. if (child_ae && child_ae->role == ACCESSKIT_ROLE_TEXT_RUN) {
  1038. if (p_end_char >= child_ae->run.x && p_end_char <= child_ae->run.y) {
  1039. end_rid = rid;
  1040. end_pos = p_end_char - child_ae->run.x;
  1041. break;
  1042. }
  1043. }
  1044. }
  1045. ERR_FAIL_COND(start_rid.is_null() && end_rid.is_null());
  1046. _ensure_node(p_id, ae);
  1047. accesskit_text_selection sel;
  1048. sel.anchor.node = (accesskit_node_id)start_rid.get_id();
  1049. sel.anchor.character_index = start_pos;
  1050. sel.focus.node = (accesskit_node_id)end_rid.get_id();
  1051. sel.focus.character_index = end_pos;
  1052. accesskit_node_set_text_selection(ae->node, sel);
  1053. }
  1054. void AccessibilityDriverAccessKit::accessibility_update_set_flag(const RID &p_id, DisplayServer::AccessibilityFlags p_flag, bool p_value) {
  1055. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  1056. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  1057. ERR_FAIL_NULL(ae);
  1058. _ensure_node(p_id, ae);
  1059. switch (p_flag) {
  1060. case DisplayServer::AccessibilityFlags::FLAG_HIDDEN: {
  1061. if (p_value) {
  1062. accesskit_node_set_hidden(ae->node);
  1063. } else {
  1064. accesskit_node_clear_hidden(ae->node);
  1065. }
  1066. } break;
  1067. case DisplayServer::AccessibilityFlags::FLAG_MULTISELECTABLE: {
  1068. if (p_value) {
  1069. accesskit_node_set_multiselectable(ae->node);
  1070. } else {
  1071. accesskit_node_clear_multiselectable(ae->node);
  1072. }
  1073. } break;
  1074. case DisplayServer::AccessibilityFlags::FLAG_REQUIRED: {
  1075. if (p_value) {
  1076. accesskit_node_set_required(ae->node);
  1077. } else {
  1078. accesskit_node_clear_required(ae->node);
  1079. }
  1080. } break;
  1081. case DisplayServer::AccessibilityFlags::FLAG_VISITED: {
  1082. if (p_value) {
  1083. accesskit_node_set_visited(ae->node);
  1084. } else {
  1085. accesskit_node_clear_visited(ae->node);
  1086. }
  1087. } break;
  1088. case DisplayServer::AccessibilityFlags::FLAG_BUSY: {
  1089. if (p_value) {
  1090. accesskit_node_set_busy(ae->node);
  1091. } else {
  1092. accesskit_node_clear_busy(ae->node);
  1093. }
  1094. } break;
  1095. case DisplayServer::AccessibilityFlags::FLAG_MODAL: {
  1096. if (p_value) {
  1097. accesskit_node_set_modal(ae->node);
  1098. } else {
  1099. accesskit_node_clear_modal(ae->node);
  1100. }
  1101. } break;
  1102. case DisplayServer::AccessibilityFlags::FLAG_TOUCH_PASSTHROUGH: {
  1103. if (p_value) {
  1104. accesskit_node_set_touch_transparent(ae->node);
  1105. } else {
  1106. accesskit_node_clear_touch_transparent(ae->node);
  1107. }
  1108. } break;
  1109. case DisplayServer::AccessibilityFlags::FLAG_READONLY: {
  1110. if (p_value) {
  1111. accesskit_node_set_read_only(ae->node);
  1112. } else {
  1113. accesskit_node_clear_read_only(ae->node);
  1114. }
  1115. } break;
  1116. case DisplayServer::AccessibilityFlags::FLAG_DISABLED: {
  1117. if (p_value) {
  1118. accesskit_node_set_disabled(ae->node);
  1119. } else {
  1120. accesskit_node_clear_disabled(ae->node);
  1121. }
  1122. } break;
  1123. case DisplayServer::AccessibilityFlags::FLAG_CLIPS_CHILDREN: {
  1124. if (p_value) {
  1125. accesskit_node_set_clips_children(ae->node);
  1126. } else {
  1127. accesskit_node_clear_clips_children(ae->node);
  1128. }
  1129. } break;
  1130. }
  1131. }
  1132. void AccessibilityDriverAccessKit::accessibility_update_set_classname(const RID &p_id, const String &p_classname) {
  1133. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  1134. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  1135. ERR_FAIL_NULL(ae);
  1136. _ensure_node(p_id, ae);
  1137. if (!p_classname.is_empty()) {
  1138. accesskit_node_set_class_name(ae->node, p_classname.utf8().ptr());
  1139. } else {
  1140. accesskit_node_clear_class_name(ae->node);
  1141. }
  1142. }
  1143. void AccessibilityDriverAccessKit::accessibility_update_set_placeholder(const RID &p_id, const String &p_placeholder) {
  1144. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  1145. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  1146. ERR_FAIL_NULL(ae);
  1147. _ensure_node(p_id, ae);
  1148. if (!p_placeholder.is_empty()) {
  1149. accesskit_node_set_placeholder(ae->node, p_placeholder.utf8().ptr());
  1150. } else {
  1151. accesskit_node_clear_placeholder(ae->node);
  1152. }
  1153. }
  1154. void AccessibilityDriverAccessKit::accessibility_update_set_language(const RID &p_id, const String &p_language) {
  1155. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  1156. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  1157. ERR_FAIL_NULL(ae);
  1158. _ensure_node(p_id, ae);
  1159. accesskit_node_set_language(ae->node, p_language.utf8().ptr());
  1160. }
  1161. void AccessibilityDriverAccessKit::accessibility_update_set_text_orientation(const RID &p_id, bool p_vertical) {
  1162. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  1163. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  1164. ERR_FAIL_NULL(ae);
  1165. _ensure_node(p_id, ae);
  1166. if (p_vertical) {
  1167. accesskit_node_set_text_direction(ae->node, ACCESSKIT_TEXT_DIRECTION_TOP_TO_BOTTOM);
  1168. } else {
  1169. accesskit_node_set_text_direction(ae->node, ACCESSKIT_TEXT_DIRECTION_LEFT_TO_RIGHT);
  1170. }
  1171. }
  1172. void AccessibilityDriverAccessKit::accessibility_update_set_list_orientation(const RID &p_id, bool p_vertical) {
  1173. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  1174. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  1175. ERR_FAIL_NULL(ae);
  1176. _ensure_node(p_id, ae);
  1177. if (p_vertical) {
  1178. accesskit_node_set_orientation(ae->node, ACCESSKIT_ORIENTATION_VERTICAL);
  1179. } else {
  1180. accesskit_node_set_orientation(ae->node, ACCESSKIT_ORIENTATION_HORIZONTAL);
  1181. }
  1182. }
  1183. void AccessibilityDriverAccessKit::accessibility_update_set_shortcut(const RID &p_id, const String &p_shortcut) {
  1184. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  1185. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  1186. ERR_FAIL_NULL(ae);
  1187. _ensure_node(p_id, ae);
  1188. if (!p_shortcut.is_empty()) {
  1189. accesskit_node_set_keyboard_shortcut(ae->node, p_shortcut.utf8().ptr());
  1190. } else {
  1191. accesskit_node_clear_keyboard_shortcut(ae->node);
  1192. }
  1193. }
  1194. void AccessibilityDriverAccessKit::accessibility_update_set_url(const RID &p_id, const String &p_url) {
  1195. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  1196. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  1197. ERR_FAIL_NULL(ae);
  1198. _ensure_node(p_id, ae);
  1199. if (!p_url.is_empty()) {
  1200. accesskit_node_set_url(ae->node, p_url.utf8().ptr());
  1201. } else {
  1202. accesskit_node_clear_url(ae->node);
  1203. }
  1204. }
  1205. void AccessibilityDriverAccessKit::accessibility_update_set_role_description(const RID &p_id, const String &p_description) {
  1206. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  1207. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  1208. ERR_FAIL_NULL(ae);
  1209. _ensure_node(p_id, ae);
  1210. if (!p_description.is_empty()) {
  1211. accesskit_node_set_role_description(ae->node, p_description.utf8().ptr());
  1212. } else {
  1213. accesskit_node_clear_role_description(ae->node);
  1214. }
  1215. }
  1216. void AccessibilityDriverAccessKit::accessibility_update_set_state_description(const RID &p_id, const String &p_description) {
  1217. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  1218. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  1219. ERR_FAIL_NULL(ae);
  1220. _ensure_node(p_id, ae);
  1221. if (!p_description.is_empty()) {
  1222. accesskit_node_set_state_description(ae->node, p_description.utf8().ptr());
  1223. } else {
  1224. accesskit_node_clear_state_description(ae->node);
  1225. }
  1226. }
  1227. void AccessibilityDriverAccessKit::accessibility_update_set_color_value(const RID &p_id, const Color &p_color) {
  1228. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  1229. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  1230. ERR_FAIL_NULL(ae);
  1231. _ensure_node(p_id, ae);
  1232. accesskit_node_set_color_value(ae->node, p_color.to_rgba32());
  1233. }
  1234. void AccessibilityDriverAccessKit::accessibility_update_set_background_color(const RID &p_id, const Color &p_color) {
  1235. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  1236. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  1237. ERR_FAIL_NULL(ae);
  1238. _ensure_node(p_id, ae);
  1239. accesskit_node_set_background_color(ae->node, p_color.to_rgba32());
  1240. }
  1241. void AccessibilityDriverAccessKit::accessibility_update_set_foreground_color(const RID &p_id, const Color &p_color) {
  1242. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  1243. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  1244. ERR_FAIL_NULL(ae);
  1245. _ensure_node(p_id, ae);
  1246. accesskit_node_set_foreground_color(ae->node, p_color.to_rgba32());
  1247. }
  1248. Error AccessibilityDriverAccessKit::init() {
  1249. #ifdef ACCESSKIT_DYNAMIC
  1250. #ifdef DEBUG_ENABLED
  1251. int dylibloader_verbose = 1;
  1252. #else
  1253. int dylibloader_verbose = 0;
  1254. #endif
  1255. void *library_handle = nullptr;
  1256. String path;
  1257. String arch = Engine::get_singleton()->get_architecture_name();
  1258. #ifdef LINUXBSD_ENABLED
  1259. path = OS::get_singleton()->get_executable_path().get_base_dir().path_join("libaccesskit." + arch + ".so");
  1260. if (!FileAccess::exists(path)) {
  1261. path = OS::get_singleton()->get_executable_path().get_base_dir().path_join("../lib").path_join("libaccesskit." + arch + ".so");
  1262. }
  1263. if (!FileAccess::exists(path)) {
  1264. path = OS::get_singleton()->get_executable_path().get_base_dir().path_join("libaccesskit.so");
  1265. }
  1266. if (!FileAccess::exists(path)) {
  1267. path = OS::get_singleton()->get_executable_path().get_base_dir().path_join("../lib").path_join("libaccesskit.so");
  1268. }
  1269. if (!FileAccess::exists(path)) {
  1270. return ERR_CANT_CREATE;
  1271. }
  1272. #endif
  1273. #ifdef MACOS_ENABLED
  1274. path = OS::get_singleton()->get_executable_path().get_base_dir().path_join("libaccesskit." + arch + ".dylib");
  1275. if (!FileAccess::exists(path)) {
  1276. path = OS::get_singleton()->get_executable_path().get_base_dir().path_join("../Frameworks").path_join("libaccesskit." + arch + ".dylib");
  1277. }
  1278. if (!FileAccess::exists(path)) {
  1279. path = OS::get_singleton()->get_executable_path().get_base_dir().path_join("libaccesskit.dylib");
  1280. }
  1281. if (!FileAccess::exists(path)) {
  1282. path = OS::get_singleton()->get_executable_path().get_base_dir().path_join("../Frameworks").path_join("libaccesskit.dylib");
  1283. }
  1284. if (!FileAccess::exists(path)) {
  1285. return ERR_CANT_CREATE;
  1286. }
  1287. #endif
  1288. #ifdef WINDOWS_ENABLED
  1289. path = OS::get_singleton()->get_executable_path().get_base_dir().path_join("accesskit." + arch + ".dll");
  1290. if (!FileAccess::exists(path)) {
  1291. path = OS::get_singleton()->get_executable_path().get_base_dir().path_join("accesskit.dll");
  1292. }
  1293. if (!FileAccess::exists(path)) {
  1294. return ERR_CANT_CREATE;
  1295. }
  1296. #endif
  1297. Error err = OS::get_singleton()->open_dynamic_library(path, library_handle);
  1298. if (err == OK && initialize_libaccesskit(dylibloader_verbose, library_handle) == 0) {
  1299. print_verbose("AccessKit loaded.");
  1300. } else {
  1301. return ERR_CANT_CREATE;
  1302. }
  1303. #endif
  1304. #ifdef MACOS_ENABLED
  1305. //accesskit_macos_add_focus_forwarder_to_window_class("GodotWindow");
  1306. #endif
  1307. return OK;
  1308. }
  1309. AccessibilityDriverAccessKit::AccessibilityDriverAccessKit() {
  1310. singleton = this;
  1311. role_map[DisplayServer::AccessibilityRole::ROLE_UNKNOWN] = ACCESSKIT_ROLE_UNKNOWN;
  1312. role_map[DisplayServer::AccessibilityRole::ROLE_DEFAULT_BUTTON] = ACCESSKIT_ROLE_DEFAULT_BUTTON;
  1313. role_map[DisplayServer::AccessibilityRole::ROLE_AUDIO] = ACCESSKIT_ROLE_AUDIO;
  1314. role_map[DisplayServer::AccessibilityRole::ROLE_VIDEO] = ACCESSKIT_ROLE_VIDEO;
  1315. role_map[DisplayServer::AccessibilityRole::ROLE_STATIC_TEXT] = ACCESSKIT_ROLE_LABEL;
  1316. role_map[DisplayServer::AccessibilityRole::ROLE_CONTAINER] = ACCESSKIT_ROLE_GENERIC_CONTAINER;
  1317. role_map[DisplayServer::AccessibilityRole::ROLE_PANEL] = ACCESSKIT_ROLE_PANE;
  1318. role_map[DisplayServer::AccessibilityRole::ROLE_BUTTON] = ACCESSKIT_ROLE_BUTTON;
  1319. role_map[DisplayServer::AccessibilityRole::ROLE_LINK] = ACCESSKIT_ROLE_LINK;
  1320. role_map[DisplayServer::AccessibilityRole::ROLE_CHECK_BOX] = ACCESSKIT_ROLE_CHECK_BOX;
  1321. role_map[DisplayServer::AccessibilityRole::ROLE_RADIO_BUTTON] = ACCESSKIT_ROLE_RADIO_BUTTON;
  1322. role_map[DisplayServer::AccessibilityRole::ROLE_CHECK_BUTTON] = ACCESSKIT_ROLE_SWITCH;
  1323. role_map[DisplayServer::AccessibilityRole::ROLE_SCROLL_BAR] = ACCESSKIT_ROLE_SCROLL_BAR;
  1324. role_map[DisplayServer::AccessibilityRole::ROLE_SCROLL_VIEW] = ACCESSKIT_ROLE_SCROLL_VIEW;
  1325. role_map[DisplayServer::AccessibilityRole::ROLE_SPLITTER] = ACCESSKIT_ROLE_SPLITTER;
  1326. role_map[DisplayServer::AccessibilityRole::ROLE_SLIDER] = ACCESSKIT_ROLE_SLIDER;
  1327. role_map[DisplayServer::AccessibilityRole::ROLE_SPIN_BUTTON] = ACCESSKIT_ROLE_SPIN_BUTTON;
  1328. role_map[DisplayServer::AccessibilityRole::ROLE_PROGRESS_INDICATOR] = ACCESSKIT_ROLE_PROGRESS_INDICATOR;
  1329. role_map[DisplayServer::AccessibilityRole::ROLE_TEXT_FIELD] = ACCESSKIT_ROLE_TEXT_INPUT;
  1330. role_map[DisplayServer::AccessibilityRole::ROLE_MULTILINE_TEXT_FIELD] = ACCESSKIT_ROLE_MULTILINE_TEXT_INPUT;
  1331. role_map[DisplayServer::AccessibilityRole::ROLE_COLOR_PICKER] = ACCESSKIT_ROLE_COLOR_WELL;
  1332. role_map[DisplayServer::AccessibilityRole::ROLE_TABLE] = ACCESSKIT_ROLE_TABLE;
  1333. role_map[DisplayServer::AccessibilityRole::ROLE_CELL] = ACCESSKIT_ROLE_CELL;
  1334. role_map[DisplayServer::AccessibilityRole::ROLE_ROW] = ACCESSKIT_ROLE_ROW;
  1335. role_map[DisplayServer::AccessibilityRole::ROLE_ROW_GROUP] = ACCESSKIT_ROLE_ROW_GROUP;
  1336. role_map[DisplayServer::AccessibilityRole::ROLE_ROW_HEADER] = ACCESSKIT_ROLE_ROW_HEADER;
  1337. role_map[DisplayServer::AccessibilityRole::ROLE_COLUMN_HEADER] = ACCESSKIT_ROLE_COLUMN_HEADER;
  1338. role_map[DisplayServer::AccessibilityRole::ROLE_TREE] = ACCESSKIT_ROLE_TREE;
  1339. role_map[DisplayServer::AccessibilityRole::ROLE_TREE_ITEM] = ACCESSKIT_ROLE_TREE_ITEM;
  1340. role_map[DisplayServer::AccessibilityRole::ROLE_LIST] = ACCESSKIT_ROLE_LIST;
  1341. role_map[DisplayServer::AccessibilityRole::ROLE_LIST_ITEM] = ACCESSKIT_ROLE_LIST_ITEM;
  1342. role_map[DisplayServer::AccessibilityRole::ROLE_LIST_BOX] = ACCESSKIT_ROLE_LIST_BOX;
  1343. role_map[DisplayServer::AccessibilityRole::ROLE_LIST_BOX_OPTION] = ACCESSKIT_ROLE_LIST_BOX_OPTION;
  1344. role_map[DisplayServer::AccessibilityRole::ROLE_TAB_BAR] = ACCESSKIT_ROLE_TAB_LIST;
  1345. role_map[DisplayServer::AccessibilityRole::ROLE_TAB] = ACCESSKIT_ROLE_TAB;
  1346. role_map[DisplayServer::AccessibilityRole::ROLE_TAB_PANEL] = ACCESSKIT_ROLE_TAB_PANEL;
  1347. role_map[DisplayServer::AccessibilityRole::ROLE_MENU_BAR] = ACCESSKIT_ROLE_MENU_BAR;
  1348. role_map[DisplayServer::AccessibilityRole::ROLE_MENU] = ACCESSKIT_ROLE_MENU;
  1349. role_map[DisplayServer::AccessibilityRole::ROLE_MENU_ITEM] = ACCESSKIT_ROLE_MENU_ITEM;
  1350. role_map[DisplayServer::AccessibilityRole::ROLE_MENU_ITEM_CHECK_BOX] = ACCESSKIT_ROLE_MENU_ITEM_CHECK_BOX;
  1351. role_map[DisplayServer::AccessibilityRole::ROLE_MENU_ITEM_RADIO] = ACCESSKIT_ROLE_MENU_ITEM_RADIO;
  1352. role_map[DisplayServer::AccessibilityRole::ROLE_IMAGE] = ACCESSKIT_ROLE_IMAGE;
  1353. role_map[DisplayServer::AccessibilityRole::ROLE_WINDOW] = ACCESSKIT_ROLE_WINDOW;
  1354. role_map[DisplayServer::AccessibilityRole::ROLE_TITLE_BAR] = ACCESSKIT_ROLE_TITLE_BAR;
  1355. role_map[DisplayServer::AccessibilityRole::ROLE_DIALOG] = ACCESSKIT_ROLE_DIALOG;
  1356. role_map[DisplayServer::AccessibilityRole::ROLE_TOOLTIP] = ACCESSKIT_ROLE_TOOLTIP;
  1357. action_map[DisplayServer::AccessibilityAction::ACTION_CLICK] = ACCESSKIT_ACTION_CLICK;
  1358. action_map[DisplayServer::AccessibilityAction::ACTION_FOCUS] = ACCESSKIT_ACTION_FOCUS;
  1359. action_map[DisplayServer::AccessibilityAction::ACTION_BLUR] = ACCESSKIT_ACTION_BLUR;
  1360. action_map[DisplayServer::AccessibilityAction::ACTION_COLLAPSE] = ACCESSKIT_ACTION_COLLAPSE;
  1361. action_map[DisplayServer::AccessibilityAction::ACTION_EXPAND] = ACCESSKIT_ACTION_EXPAND;
  1362. action_map[DisplayServer::AccessibilityAction::ACTION_DECREMENT] = ACCESSKIT_ACTION_DECREMENT;
  1363. action_map[DisplayServer::AccessibilityAction::ACTION_INCREMENT] = ACCESSKIT_ACTION_INCREMENT;
  1364. action_map[DisplayServer::AccessibilityAction::ACTION_HIDE_TOOLTIP] = ACCESSKIT_ACTION_HIDE_TOOLTIP;
  1365. action_map[DisplayServer::AccessibilityAction::ACTION_SHOW_TOOLTIP] = ACCESSKIT_ACTION_SHOW_TOOLTIP;
  1366. //action_map[DisplayServer::AccessibilityAction::ACTION_INVALIDATE_TREE] = ACCESSKIT_ACTION_INVALIDATE_TREE;
  1367. //action_map[DisplayServer::AccessibilityAction::ACTION_LOAD_INLINE_TEXT_BOXES] = ACCESSKIT_ACTION_LOAD_INLINE_TEXT_BOXES;
  1368. action_map[DisplayServer::AccessibilityAction::ACTION_SET_TEXT_SELECTION] = ACCESSKIT_ACTION_SET_TEXT_SELECTION;
  1369. action_map[DisplayServer::AccessibilityAction::ACTION_REPLACE_SELECTED_TEXT] = ACCESSKIT_ACTION_REPLACE_SELECTED_TEXT;
  1370. action_map[DisplayServer::AccessibilityAction::ACTION_SCROLL_BACKWARD] = ACCESSKIT_ACTION_SCROLL_UP;
  1371. action_map[DisplayServer::AccessibilityAction::ACTION_SCROLL_DOWN] = ACCESSKIT_ACTION_SCROLL_DOWN;
  1372. action_map[DisplayServer::AccessibilityAction::ACTION_SCROLL_FORWARD] = ACCESSKIT_ACTION_SCROLL_DOWN;
  1373. action_map[DisplayServer::AccessibilityAction::ACTION_SCROLL_LEFT] = ACCESSKIT_ACTION_SCROLL_LEFT;
  1374. action_map[DisplayServer::AccessibilityAction::ACTION_SCROLL_RIGHT] = ACCESSKIT_ACTION_SCROLL_RIGHT;
  1375. action_map[DisplayServer::AccessibilityAction::ACTION_SCROLL_UP] = ACCESSKIT_ACTION_SCROLL_UP;
  1376. action_map[DisplayServer::AccessibilityAction::ACTION_SCROLL_INTO_VIEW] = ACCESSKIT_ACTION_SCROLL_INTO_VIEW;
  1377. action_map[DisplayServer::AccessibilityAction::ACTION_SCROLL_TO_POINT] = ACCESSKIT_ACTION_SCROLL_TO_POINT;
  1378. action_map[DisplayServer::AccessibilityAction::ACTION_SET_SCROLL_OFFSET] = ACCESSKIT_ACTION_SET_SCROLL_OFFSET;
  1379. //action_map[DisplayServer::AccessibilityAction::ACTION_SET_SEQUENTIAL_FOCUS_NAVIGATION_STARTING_POINT] = ACCESSKIT_ACTION_SET_SEQUENTIAL_FOCUS_NAVIGATION_STARTING_POINT;
  1380. action_map[DisplayServer::AccessibilityAction::ACTION_SET_VALUE] = ACCESSKIT_ACTION_SET_VALUE;
  1381. action_map[DisplayServer::AccessibilityAction::ACTION_SHOW_CONTEXT_MENU] = ACCESSKIT_ACTION_SHOW_CONTEXT_MENU;
  1382. action_map[DisplayServer::AccessibilityAction::ACTION_CUSTOM] = ACCESSKIT_ACTION_CUSTOM_ACTION;
  1383. }
  1384. AccessibilityDriverAccessKit::~AccessibilityDriverAccessKit() {
  1385. singleton = nullptr;
  1386. }
  1387. #endif // ACCESSKIT_ENABLED