accessibility_driver_accesskit.cpp 69 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693
  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, bool p_is_last_line) {
  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. if (!p_is_last_line || text_elements.is_empty()) {
  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. if (!p_is_last_line) {
  373. accesskit_node_set_value(ae->node, "\n");
  374. Vector<uint8_t> char_lengths;
  375. Vector<float> char_positions;
  376. Vector<float> char_widths;
  377. char_lengths.push_back(1);
  378. char_positions.push_back(0.0);
  379. char_widths.push_back(1.0);
  380. accesskit_node_set_character_lengths(ae->node, char_lengths.size(), char_lengths.ptr());
  381. accesskit_node_set_character_positions(ae->node, char_positions.size(), char_positions.ptr());
  382. accesskit_node_set_character_widths(ae->node, char_widths.size(), char_widths.ptr());
  383. } else {
  384. accesskit_node_set_value(ae->node, "");
  385. }
  386. accesskit_node_set_text_direction(ae->node, ACCESSKIT_TEXT_DIRECTION_LEFT_TO_RIGHT);
  387. accesskit_rect rect;
  388. rect.x0 = run_off_x;
  389. rect.y0 = 0;
  390. rect.x1 = run_off_x + 1;
  391. rect.y1 = text_height;
  392. accesskit_node_set_bounds(ae->node, rect);
  393. }
  394. // Sort runs in logical order.
  395. struct RunCompare {
  396. _FORCE_INLINE_ bool operator()(const AccessibilityElement *l, const AccessibilityElement *r) const {
  397. return l->run.x < r->run.x;
  398. }
  399. };
  400. text_elements.sort_custom<RunCompare>();
  401. for (int i = 0; i < text_elements.size(); i++) {
  402. RID rid = rid_owner.make_rid(text_elements[i]);
  403. root_ae->children.push_back(rid);
  404. wd->update.insert(rid);
  405. // Link adjacent TextRuns on the same line.
  406. if (i > 0) {
  407. RID prev_rid = root_ae->children[i - 1];
  408. AccessibilityElement *prev_ae = rid_owner.get_or_null(prev_rid);
  409. accesskit_node_set_previous_on_line(text_elements[i]->node, (accesskit_node_id)prev_rid.get_id());
  410. accesskit_node_set_next_on_line(prev_ae->node, (accesskit_node_id)rid.get_id());
  411. }
  412. }
  413. return root_rid;
  414. }
  415. bool AccessibilityDriverAccessKit::accessibility_has_element(const RID &p_id) const {
  416. return rid_owner.owns(p_id);
  417. }
  418. void AccessibilityDriverAccessKit::_free_recursive(WindowData *p_wd, const RID &p_id) {
  419. if (p_wd && p_wd->update.has(p_id)) {
  420. p_wd->update.erase(p_id);
  421. }
  422. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  423. for (const RID &rid : ae->children) {
  424. _free_recursive(p_wd, rid);
  425. }
  426. if (ae->node) {
  427. accesskit_node_free(ae->node);
  428. }
  429. memdelete(ae);
  430. rid_owner.free(p_id);
  431. }
  432. void AccessibilityDriverAccessKit::accessibility_free_element(const RID &p_id) {
  433. ERR_FAIL_COND_MSG(in_accessibility_update, "Element can't be removed inside NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  434. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  435. if (ae) {
  436. WindowData *wd = windows.getptr(ae->window_id);
  437. AccessibilityElement *parent_ae = rid_owner.get_or_null(ae->parent);
  438. if (parent_ae) {
  439. parent_ae->children.erase(p_id);
  440. }
  441. _free_recursive(wd, p_id);
  442. }
  443. }
  444. void AccessibilityDriverAccessKit::accessibility_element_set_meta(const RID &p_id, const Variant &p_meta) {
  445. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  446. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  447. ERR_FAIL_NULL(ae);
  448. ae->meta = p_meta;
  449. }
  450. Variant AccessibilityDriverAccessKit::accessibility_element_get_meta(const RID &p_id) const {
  451. const AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  452. ERR_FAIL_NULL_V(ae, Variant());
  453. return ae->meta;
  454. }
  455. void AccessibilityDriverAccessKit::accessibility_update_set_focus(const RID &p_id) {
  456. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  457. if (p_id.is_valid() && rid_owner.owns(p_id)) {
  458. focus = p_id;
  459. } else {
  460. focus = RID();
  461. }
  462. }
  463. RID AccessibilityDriverAccessKit::accessibility_get_window_root(DisplayServer::WindowID p_window_id) const {
  464. const WindowData *wd = windows.getptr(p_window_id);
  465. ERR_FAIL_NULL_V(wd, RID());
  466. return wd->root_id;
  467. }
  468. accesskit_tree_update *AccessibilityDriverAccessKit::_accessibility_build_tree_update(void *p_user_data) {
  469. DisplayServer::WindowID window_id = (DisplayServer::WindowID)(size_t)p_user_data;
  470. ERR_FAIL_COND_V(!singleton->windows.has(window_id), nullptr);
  471. WindowData &wd = singleton->windows[window_id];
  472. singleton->in_accessibility_update = true;
  473. if (singleton->update_cb.is_valid()) {
  474. singleton->update_cb.call(window_id);
  475. }
  476. singleton->in_accessibility_update = false;
  477. AccessibilityElement *focus_ae = singleton->rid_owner.get_or_null(singleton->focus);
  478. uint32_t update_size = wd.update.size();
  479. accesskit_node_id ac_focus = (accesskit_node_id)wd.root_id.get_id();
  480. if (focus_ae && focus_ae->window_id == window_id) {
  481. ac_focus = (accesskit_node_id)singleton->focus.get_id();
  482. }
  483. 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);
  484. for (const RID &rid : wd.update) {
  485. AccessibilityElement *ae = singleton->rid_owner.get_or_null(rid);
  486. if (ae && ae->node) {
  487. for (const RID &child_rid : ae->children) {
  488. accesskit_node_push_child(ae->node, (accesskit_node_id)child_rid.get_id());
  489. }
  490. accesskit_tree_update_push_node(tree_update, (accesskit_node_id)rid.get_id(), ae->node);
  491. ae->node = nullptr;
  492. }
  493. }
  494. wd.update.clear();
  495. return tree_update;
  496. }
  497. void AccessibilityDriverAccessKit::accessibility_update_if_active(const Callable &p_callable) {
  498. ERR_FAIL_COND(!p_callable.is_valid());
  499. update_cb = p_callable;
  500. for (KeyValue<DisplayServer::WindowID, WindowData> &window : windows) {
  501. #ifdef WINDOWS_ENABLED
  502. accesskit_windows_queued_events *events = accesskit_windows_subclassing_adapter_update_if_active(window.value.adapter, _accessibility_build_tree_update, (void *)(size_t)window.key);
  503. if (events) {
  504. accesskit_windows_queued_events_raise(events);
  505. }
  506. #endif
  507. #ifdef MACOS_ENABLED
  508. accesskit_macos_queued_events *events = accesskit_macos_subclassing_adapter_update_if_active(window.value.adapter, _accessibility_build_tree_update, (void *)(size_t)window.key);
  509. if (events) {
  510. accesskit_macos_queued_events_raise(events);
  511. }
  512. #endif
  513. #ifdef LINUXBSD_ENABLED
  514. accesskit_unix_adapter_update_if_active(window.value.adapter, _accessibility_build_tree_update, (void *)(size_t)window.key);
  515. #endif
  516. }
  517. update_cb = Callable();
  518. }
  519. _FORCE_INLINE_ void AccessibilityDriverAccessKit::_ensure_node(const RID &p_id, AccessibilityElement *p_ae) {
  520. if (unlikely(!p_ae->node)) {
  521. WindowData *wd = windows.getptr(p_ae->window_id);
  522. ERR_FAIL_NULL(wd);
  523. wd->update.insert(p_id);
  524. p_ae->node = accesskit_node_new(p_ae->role);
  525. // Re-apply stored name if any, so nodes recreated by _ensure_node
  526. // retain their label even if the caller doesn't re-set all properties.
  527. if (!p_ae->name.is_empty() || !p_ae->name_extra_info.is_empty()) {
  528. String full_name = p_ae->name + " " + p_ae->name_extra_info;
  529. accesskit_node_set_label(p_ae->node, full_name.utf8().ptr());
  530. }
  531. }
  532. }
  533. void AccessibilityDriverAccessKit::accessibility_set_window_rect(DisplayServer::WindowID p_window_id, const Rect2 &p_rect_out, const Rect2 &p_rect_in) {
  534. #ifdef LINUXBSD_ENABLED
  535. const WindowData *wd = windows.getptr(p_window_id);
  536. ERR_FAIL_NULL(wd);
  537. 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 };
  538. 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 };
  539. accesskit_unix_adapter_set_root_window_bounds(wd->adapter, outer_bounds, inner_bounds);
  540. #endif
  541. }
  542. void AccessibilityDriverAccessKit::accessibility_set_window_focused(DisplayServer::WindowID p_window_id, bool p_focused) {
  543. const WindowData *wd = windows.getptr(p_window_id);
  544. ERR_FAIL_NULL(wd);
  545. #ifdef LINUXBSD_ENABLED
  546. accesskit_unix_adapter_update_window_focus_state(wd->adapter, p_focused);
  547. #endif
  548. #ifdef MACOS_ENABLED
  549. accesskit_macos_queued_events *events = accesskit_macos_subclassing_adapter_update_view_focus_state(wd->adapter, p_focused);
  550. if (events != nullptr) {
  551. accesskit_macos_queued_events_raise(events);
  552. }
  553. #endif
  554. // Note: On Windows, the subclassing adapter takes care of this.
  555. }
  556. void AccessibilityDriverAccessKit::accessibility_update_set_role(const RID &p_id, DisplayServer::AccessibilityRole p_role) {
  557. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  558. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  559. ERR_FAIL_NULL(ae);
  560. if (ae->role == _accessibility_role(p_role)) {
  561. return;
  562. }
  563. ae->role = _accessibility_role(p_role);
  564. _ensure_node(p_id, ae);
  565. accesskit_node_set_role(ae->node, ae->role);
  566. }
  567. void AccessibilityDriverAccessKit::accessibility_update_set_name(const RID &p_id, const String &p_name) {
  568. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  569. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  570. ERR_FAIL_NULL(ae);
  571. _ensure_node(p_id, ae);
  572. ae->name = p_name;
  573. String full_name = ae->name + " " + ae->name_extra_info;
  574. if (!full_name.is_empty()) {
  575. accesskit_node_set_label(ae->node, full_name.utf8().ptr());
  576. } else {
  577. accesskit_node_clear_label(ae->node);
  578. }
  579. }
  580. void AccessibilityDriverAccessKit::accessibility_update_set_extra_info(const RID &p_id, const String &p_name_extra_info) {
  581. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  582. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  583. ERR_FAIL_NULL(ae);
  584. _ensure_node(p_id, ae);
  585. ae->name_extra_info = p_name_extra_info;
  586. String full_name = ae->name + " " + ae->name_extra_info;
  587. if (!full_name.is_empty()) {
  588. accesskit_node_set_label(ae->node, full_name.utf8().ptr());
  589. } else {
  590. accesskit_node_clear_label(ae->node);
  591. }
  592. }
  593. void AccessibilityDriverAccessKit::accessibility_update_set_description(const RID &p_id, const String &p_description) {
  594. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  595. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  596. ERR_FAIL_NULL(ae);
  597. _ensure_node(p_id, ae);
  598. if (!p_description.is_empty()) {
  599. accesskit_node_set_description(ae->node, p_description.utf8().ptr());
  600. } else {
  601. accesskit_node_clear_description(ae->node);
  602. }
  603. }
  604. void AccessibilityDriverAccessKit::accessibility_update_set_value(const RID &p_id, const String &p_value) {
  605. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  606. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  607. ERR_FAIL_NULL(ae);
  608. _ensure_node(p_id, ae);
  609. if (!p_value.is_empty()) {
  610. Vector<uint8_t> ch_length;
  611. accesskit_node_set_value(ae->node, p_value.utf8(&ch_length).ptr());
  612. accesskit_node_set_character_lengths(ae->node, ch_length.size(), ch_length.ptr());
  613. } else {
  614. accesskit_node_clear_value(ae->node);
  615. accesskit_node_clear_character_lengths(ae->node);
  616. }
  617. }
  618. void AccessibilityDriverAccessKit::accessibility_update_set_tooltip(const RID &p_id, const String &p_tooltip) {
  619. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  620. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  621. ERR_FAIL_NULL(ae);
  622. _ensure_node(p_id, ae);
  623. if (!p_tooltip.is_empty()) {
  624. accesskit_node_set_tooltip(ae->node, p_tooltip.utf8().ptr());
  625. } else {
  626. accesskit_node_clear_tooltip(ae->node);
  627. }
  628. }
  629. void AccessibilityDriverAccessKit::accessibility_update_set_bounds(const RID &p_id, const Rect2 &p_rect) {
  630. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  631. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  632. ERR_FAIL_NULL(ae);
  633. _ensure_node(p_id, ae);
  634. accesskit_rect rect;
  635. rect.x0 = p_rect.position.x;
  636. rect.y0 = p_rect.position.y;
  637. rect.x1 = p_rect.position.x + p_rect.size.x;
  638. rect.y1 = p_rect.position.y + p_rect.size.y;
  639. accesskit_node_set_bounds(ae->node, rect);
  640. }
  641. void AccessibilityDriverAccessKit::accessibility_update_set_transform(const RID &p_id, const Transform2D &p_transform) {
  642. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  643. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  644. ERR_FAIL_NULL(ae);
  645. _ensure_node(p_id, ae);
  646. 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] };
  647. accesskit_node_set_transform(ae->node, transform);
  648. }
  649. void AccessibilityDriverAccessKit::accessibility_update_add_child(const RID &p_id, const RID &p_child_id) {
  650. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  651. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  652. ERR_FAIL_NULL(ae);
  653. AccessibilityElement *other_ae = rid_owner.get_or_null(p_child_id);
  654. ERR_FAIL_NULL(other_ae);
  655. ERR_FAIL_COND(other_ae->window_id != ae->window_id);
  656. _ensure_node(p_id, ae);
  657. accesskit_node_push_child(ae->node, (accesskit_node_id)p_child_id.get_id());
  658. }
  659. void AccessibilityDriverAccessKit::accessibility_update_add_related_controls(const RID &p_id, const RID &p_related_id) {
  660. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  661. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  662. ERR_FAIL_NULL(ae);
  663. AccessibilityElement *other_ae = rid_owner.get_or_null(p_related_id);
  664. ERR_FAIL_NULL(other_ae);
  665. ERR_FAIL_COND(other_ae->window_id != ae->window_id);
  666. _ensure_node(p_id, ae);
  667. accesskit_node_push_controlled(ae->node, (accesskit_node_id)p_related_id.get_id());
  668. }
  669. void AccessibilityDriverAccessKit::accessibility_update_add_related_details(const RID &p_id, const RID &p_related_id) {
  670. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  671. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  672. ERR_FAIL_NULL(ae);
  673. AccessibilityElement *other_ae = rid_owner.get_or_null(p_related_id);
  674. ERR_FAIL_NULL(other_ae);
  675. ERR_FAIL_COND(other_ae->window_id != ae->window_id);
  676. _ensure_node(p_id, ae);
  677. accesskit_node_push_detail(ae->node, (accesskit_node_id)p_related_id.get_id());
  678. }
  679. void AccessibilityDriverAccessKit::accessibility_update_add_related_described_by(const RID &p_id, const RID &p_related_id) {
  680. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  681. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  682. ERR_FAIL_NULL(ae);
  683. AccessibilityElement *other_ae = rid_owner.get_or_null(p_related_id);
  684. ERR_FAIL_NULL(other_ae);
  685. ERR_FAIL_COND(other_ae->window_id != ae->window_id);
  686. _ensure_node(p_id, ae);
  687. accesskit_node_push_described_by(ae->node, (accesskit_node_id)p_related_id.get_id());
  688. }
  689. void AccessibilityDriverAccessKit::accessibility_update_add_related_flow_to(const RID &p_id, const RID &p_related_id) {
  690. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  691. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  692. ERR_FAIL_NULL(ae);
  693. AccessibilityElement *other_ae = rid_owner.get_or_null(p_related_id);
  694. ERR_FAIL_NULL(other_ae);
  695. ERR_FAIL_COND(other_ae->window_id != ae->window_id);
  696. _ensure_node(p_id, ae);
  697. accesskit_node_push_flow_to(ae->node, (accesskit_node_id)p_related_id.get_id());
  698. }
  699. void AccessibilityDriverAccessKit::accessibility_update_add_related_labeled_by(const RID &p_id, const RID &p_related_id) {
  700. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  701. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  702. ERR_FAIL_NULL(ae);
  703. AccessibilityElement *other_ae = rid_owner.get_or_null(p_related_id);
  704. ERR_FAIL_NULL(other_ae);
  705. ERR_FAIL_COND(other_ae->window_id != ae->window_id);
  706. _ensure_node(p_id, ae);
  707. accesskit_node_push_labelled_by(ae->node, (accesskit_node_id)p_related_id.get_id());
  708. }
  709. void AccessibilityDriverAccessKit::accessibility_update_add_related_radio_group(const RID &p_id, const RID &p_related_id) {
  710. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  711. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  712. ERR_FAIL_NULL(ae);
  713. AccessibilityElement *other_ae = rid_owner.get_or_null(p_related_id);
  714. ERR_FAIL_NULL(other_ae);
  715. ERR_FAIL_COND(other_ae->window_id != ae->window_id);
  716. _ensure_node(p_id, ae);
  717. accesskit_node_push_to_radio_group(ae->node, (accesskit_node_id)p_related_id.get_id());
  718. }
  719. void AccessibilityDriverAccessKit::accessibility_update_set_active_descendant(const RID &p_id, const RID &p_other_id) {
  720. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  721. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  722. ERR_FAIL_NULL(ae);
  723. AccessibilityElement *other_ae = rid_owner.get_or_null(p_other_id);
  724. ERR_FAIL_NULL(other_ae);
  725. ERR_FAIL_COND(other_ae->window_id != ae->window_id);
  726. _ensure_node(p_id, ae);
  727. accesskit_node_set_active_descendant(ae->node, (accesskit_node_id)p_other_id.get_id());
  728. }
  729. void AccessibilityDriverAccessKit::accessibility_update_set_next_on_line(const RID &p_id, const RID &p_other_id) {
  730. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  731. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  732. ERR_FAIL_NULL(ae);
  733. AccessibilityElement *other_ae = rid_owner.get_or_null(p_other_id);
  734. ERR_FAIL_NULL(other_ae);
  735. ERR_FAIL_COND(other_ae->window_id != ae->window_id);
  736. _ensure_node(p_id, ae);
  737. accesskit_node_set_next_on_line(ae->node, (accesskit_node_id)p_other_id.get_id());
  738. }
  739. void AccessibilityDriverAccessKit::accessibility_update_set_previous_on_line(const RID &p_id, const RID &p_other_id) {
  740. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  741. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  742. ERR_FAIL_NULL(ae);
  743. AccessibilityElement *other_ae = rid_owner.get_or_null(p_other_id);
  744. ERR_FAIL_NULL(other_ae);
  745. ERR_FAIL_COND(other_ae->window_id != ae->window_id);
  746. _ensure_node(p_id, ae);
  747. accesskit_node_set_previous_on_line(ae->node, (accesskit_node_id)p_other_id.get_id());
  748. }
  749. void AccessibilityDriverAccessKit::accessibility_update_set_member_of(const RID &p_id, const RID &p_group_id) {
  750. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  751. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  752. ERR_FAIL_NULL(ae);
  753. AccessibilityElement *other_ae = rid_owner.get_or_null(p_group_id);
  754. ERR_FAIL_NULL(other_ae);
  755. ERR_FAIL_COND(other_ae->window_id != ae->window_id);
  756. _ensure_node(p_id, ae);
  757. accesskit_node_set_member_of(ae->node, (accesskit_node_id)p_group_id.get_id());
  758. }
  759. void AccessibilityDriverAccessKit::accessibility_update_set_in_page_link_target(const RID &p_id, const RID &p_other_id) {
  760. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  761. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  762. ERR_FAIL_NULL(ae);
  763. AccessibilityElement *other_ae = rid_owner.get_or_null(p_other_id);
  764. ERR_FAIL_NULL(other_ae);
  765. ERR_FAIL_COND(other_ae->window_id != ae->window_id);
  766. _ensure_node(p_id, ae);
  767. accesskit_node_set_in_page_link_target(ae->node, (accesskit_node_id)p_other_id.get_id());
  768. }
  769. void AccessibilityDriverAccessKit::accessibility_update_set_error_message(const RID &p_id, const RID &p_other_id) {
  770. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  771. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  772. ERR_FAIL_NULL(ae);
  773. AccessibilityElement *other_ae = rid_owner.get_or_null(p_other_id);
  774. ERR_FAIL_NULL(other_ae);
  775. ERR_FAIL_COND(other_ae->window_id != ae->window_id);
  776. _ensure_node(p_id, ae);
  777. accesskit_node_set_error_message(ae->node, (accesskit_node_id)p_other_id.get_id());
  778. }
  779. void AccessibilityDriverAccessKit::accessibility_update_set_live(const RID &p_id, DisplayServer::AccessibilityLiveMode p_live) {
  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. switch (p_live) {
  785. case DisplayServer::AccessibilityLiveMode::LIVE_OFF: {
  786. accesskit_node_set_live(ae->node, ACCESSKIT_LIVE_OFF);
  787. } break;
  788. case DisplayServer::AccessibilityLiveMode::LIVE_POLITE: {
  789. accesskit_node_set_live(ae->node, ACCESSKIT_LIVE_POLITE);
  790. } break;
  791. case DisplayServer::AccessibilityLiveMode::LIVE_ASSERTIVE: {
  792. accesskit_node_set_live(ae->node, ACCESSKIT_LIVE_ASSERTIVE);
  793. } break;
  794. }
  795. }
  796. void AccessibilityDriverAccessKit::accessibility_update_add_action(const RID &p_id, DisplayServer::AccessibilityAction p_action, const Callable &p_callable) {
  797. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  798. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  799. ERR_FAIL_NULL(ae);
  800. _ensure_node(p_id, ae);
  801. ae->actions[_accessibility_action(p_action)] = p_callable;
  802. accesskit_node_add_action(ae->node, _accessibility_action(p_action));
  803. }
  804. void AccessibilityDriverAccessKit::accessibility_update_add_custom_action(const RID &p_id, int p_action_id, const String &p_action_description) {
  805. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  806. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  807. ERR_FAIL_NULL(ae);
  808. _ensure_node(p_id, ae);
  809. if (!p_action_description.is_empty()) {
  810. accesskit_custom_action *ca = accesskit_custom_action_new(p_action_id);
  811. accesskit_custom_action_set_description(ca, p_action_description.utf8().ptr());
  812. accesskit_node_push_custom_action(ae->node, ca);
  813. } else {
  814. String cs_name = vformat("Custom Action %d", p_action_id);
  815. accesskit_custom_action *ca = accesskit_custom_action_new(p_action_id);
  816. accesskit_custom_action_set_description(ca, cs_name.utf8().ptr());
  817. accesskit_node_push_custom_action(ae->node, ca);
  818. }
  819. }
  820. void AccessibilityDriverAccessKit::accessibility_update_set_table_row_count(const RID &p_id, int p_count) {
  821. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  822. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  823. ERR_FAIL_NULL(ae);
  824. _ensure_node(p_id, ae);
  825. accesskit_node_set_row_count(ae->node, p_count);
  826. }
  827. void AccessibilityDriverAccessKit::accessibility_update_set_table_column_count(const RID &p_id, int p_count) {
  828. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  829. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  830. ERR_FAIL_NULL(ae);
  831. _ensure_node(p_id, ae);
  832. accesskit_node_set_column_count(ae->node, p_count);
  833. }
  834. void AccessibilityDriverAccessKit::accessibility_update_set_table_row_index(const RID &p_id, int p_index) {
  835. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  836. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  837. ERR_FAIL_NULL(ae);
  838. _ensure_node(p_id, ae);
  839. accesskit_node_set_row_index(ae->node, p_index);
  840. }
  841. void AccessibilityDriverAccessKit::accessibility_update_set_table_column_index(const RID &p_id, int p_index) {
  842. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  843. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  844. ERR_FAIL_NULL(ae);
  845. _ensure_node(p_id, ae);
  846. accesskit_node_set_column_index(ae->node, p_index);
  847. }
  848. void AccessibilityDriverAccessKit::accessibility_update_set_table_cell_position(const RID &p_id, int p_row_index, int p_column_index) {
  849. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  850. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  851. ERR_FAIL_NULL(ae);
  852. _ensure_node(p_id, ae);
  853. accesskit_node_set_row_index(ae->node, p_row_index);
  854. accesskit_node_set_column_index(ae->node, p_column_index);
  855. }
  856. void AccessibilityDriverAccessKit::accessibility_update_set_table_cell_span(const RID &p_id, int p_row_span, int p_column_span) {
  857. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  858. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  859. ERR_FAIL_NULL(ae);
  860. _ensure_node(p_id, ae);
  861. accesskit_node_set_row_span(ae->node, p_row_span);
  862. accesskit_node_set_column_span(ae->node, p_column_span);
  863. }
  864. void AccessibilityDriverAccessKit::accessibility_update_set_list_item_count(const RID &p_id, int p_size) {
  865. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  866. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  867. ERR_FAIL_NULL(ae);
  868. _ensure_node(p_id, ae);
  869. accesskit_node_set_size_of_set(ae->node, p_size);
  870. }
  871. void AccessibilityDriverAccessKit::accessibility_update_set_list_item_index(const RID &p_id, int p_index) {
  872. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  873. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  874. ERR_FAIL_NULL(ae);
  875. _ensure_node(p_id, ae);
  876. accesskit_node_set_position_in_set(ae->node, p_index);
  877. }
  878. void AccessibilityDriverAccessKit::accessibility_update_set_list_item_level(const RID &p_id, int p_level) {
  879. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  880. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  881. ERR_FAIL_NULL(ae);
  882. _ensure_node(p_id, ae);
  883. accesskit_node_set_level(ae->node, p_level);
  884. }
  885. void AccessibilityDriverAccessKit::accessibility_update_set_list_item_selected(const RID &p_id, bool p_selected) {
  886. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  887. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  888. ERR_FAIL_NULL(ae);
  889. _ensure_node(p_id, ae);
  890. accesskit_node_set_selected(ae->node, p_selected);
  891. }
  892. void AccessibilityDriverAccessKit::accessibility_update_set_list_item_expanded(const RID &p_id, bool p_expanded) {
  893. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  894. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  895. ERR_FAIL_NULL(ae);
  896. _ensure_node(p_id, ae);
  897. accesskit_node_set_expanded(ae->node, p_expanded);
  898. }
  899. void AccessibilityDriverAccessKit::accessibility_update_set_popup_type(const RID &p_id, DisplayServer::AccessibilityPopupType p_popup) {
  900. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  901. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  902. ERR_FAIL_NULL(ae);
  903. _ensure_node(p_id, ae);
  904. switch (p_popup) {
  905. case DisplayServer::AccessibilityPopupType::POPUP_MENU: {
  906. accesskit_node_set_has_popup(ae->node, ACCESSKIT_HAS_POPUP_MENU);
  907. } break;
  908. case DisplayServer::AccessibilityPopupType::POPUP_LIST: {
  909. accesskit_node_set_has_popup(ae->node, ACCESSKIT_HAS_POPUP_LISTBOX);
  910. } break;
  911. case DisplayServer::AccessibilityPopupType::POPUP_TREE: {
  912. accesskit_node_set_has_popup(ae->node, ACCESSKIT_HAS_POPUP_TREE);
  913. } break;
  914. case DisplayServer::AccessibilityPopupType::POPUP_DIALOG: {
  915. accesskit_node_set_has_popup(ae->node, ACCESSKIT_HAS_POPUP_DIALOG);
  916. } break;
  917. }
  918. }
  919. void AccessibilityDriverAccessKit::accessibility_update_set_checked(const RID &p_id, bool p_checekd) {
  920. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  921. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  922. ERR_FAIL_NULL(ae);
  923. _ensure_node(p_id, ae);
  924. if (p_checekd) {
  925. accesskit_node_set_toggled(ae->node, ACCESSKIT_TOGGLED_TRUE);
  926. } else {
  927. accesskit_node_set_toggled(ae->node, ACCESSKIT_TOGGLED_FALSE);
  928. }
  929. }
  930. void AccessibilityDriverAccessKit::accessibility_update_set_num_value(const RID &p_id, double p_position) {
  931. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  932. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  933. ERR_FAIL_NULL(ae);
  934. _ensure_node(p_id, ae);
  935. accesskit_node_set_numeric_value(ae->node, p_position);
  936. }
  937. void AccessibilityDriverAccessKit::accessibility_update_set_num_range(const RID &p_id, double p_min, double p_max) {
  938. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  939. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  940. ERR_FAIL_NULL(ae);
  941. _ensure_node(p_id, ae);
  942. accesskit_node_set_min_numeric_value(ae->node, p_min);
  943. accesskit_node_set_max_numeric_value(ae->node, p_max);
  944. }
  945. void AccessibilityDriverAccessKit::accessibility_update_set_num_step(const RID &p_id, double p_step) {
  946. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  947. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  948. ERR_FAIL_NULL(ae);
  949. _ensure_node(p_id, ae);
  950. accesskit_node_set_numeric_value_step(ae->node, p_step);
  951. }
  952. void AccessibilityDriverAccessKit::accessibility_update_set_num_jump(const RID &p_id, double p_jump) {
  953. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  954. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  955. ERR_FAIL_NULL(ae);
  956. _ensure_node(p_id, ae);
  957. accesskit_node_set_numeric_value_jump(ae->node, p_jump);
  958. }
  959. void AccessibilityDriverAccessKit::accessibility_update_set_scroll_x(const RID &p_id, double p_position) {
  960. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  961. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  962. ERR_FAIL_NULL(ae);
  963. _ensure_node(p_id, ae);
  964. accesskit_node_set_scroll_x(ae->node, p_position);
  965. }
  966. void AccessibilityDriverAccessKit::accessibility_update_set_scroll_x_range(const RID &p_id, double p_min, double p_max) {
  967. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  968. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  969. ERR_FAIL_NULL(ae);
  970. _ensure_node(p_id, ae);
  971. accesskit_node_set_scroll_x_min(ae->node, p_min);
  972. accesskit_node_set_scroll_x_max(ae->node, p_max);
  973. }
  974. void AccessibilityDriverAccessKit::accessibility_update_set_scroll_y(const RID &p_id, double p_position) {
  975. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  976. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  977. ERR_FAIL_NULL(ae);
  978. _ensure_node(p_id, ae);
  979. accesskit_node_set_scroll_y(ae->node, p_position);
  980. }
  981. void AccessibilityDriverAccessKit::accessibility_update_set_scroll_y_range(const RID &p_id, double p_min, double p_max) {
  982. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  983. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  984. ERR_FAIL_NULL(ae);
  985. _ensure_node(p_id, ae);
  986. accesskit_node_set_scroll_y_min(ae->node, p_min);
  987. accesskit_node_set_scroll_y_max(ae->node, p_max);
  988. }
  989. void AccessibilityDriverAccessKit::accessibility_update_set_text_decorations(const RID &p_id, bool p_underline, bool p_strikethrough, bool p_overline) {
  990. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  991. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  992. ERR_FAIL_NULL(ae);
  993. _ensure_node(p_id, ae);
  994. if (p_underline) {
  995. accesskit_node_set_underline(ae->node, ACCESSKIT_TEXT_DECORATION_SOLID);
  996. } else {
  997. accesskit_node_clear_underline(ae->node);
  998. }
  999. if (p_overline) {
  1000. accesskit_node_set_overline(ae->node, ACCESSKIT_TEXT_DECORATION_SOLID);
  1001. } else {
  1002. accesskit_node_clear_overline(ae->node);
  1003. }
  1004. if (p_strikethrough) {
  1005. accesskit_node_set_strikethrough(ae->node, ACCESSKIT_TEXT_DECORATION_SOLID);
  1006. } else {
  1007. accesskit_node_clear_strikethrough(ae->node);
  1008. }
  1009. }
  1010. void AccessibilityDriverAccessKit::accessibility_update_set_text_align(const RID &p_id, HorizontalAlignment p_align) {
  1011. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  1012. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  1013. ERR_FAIL_NULL(ae);
  1014. _ensure_node(p_id, ae);
  1015. switch (p_align) {
  1016. case HORIZONTAL_ALIGNMENT_LEFT: {
  1017. accesskit_node_set_text_align(ae->node, ACCESSKIT_TEXT_ALIGN_LEFT);
  1018. } break;
  1019. case HORIZONTAL_ALIGNMENT_CENTER: {
  1020. accesskit_node_set_text_align(ae->node, ACCESSKIT_TEXT_ALIGN_RIGHT);
  1021. } break;
  1022. case HORIZONTAL_ALIGNMENT_RIGHT: {
  1023. accesskit_node_set_text_align(ae->node, ACCESSKIT_TEXT_ALIGN_CENTER);
  1024. } break;
  1025. case HORIZONTAL_ALIGNMENT_FILL: {
  1026. accesskit_node_set_text_align(ae->node, ACCESSKIT_TEXT_ALIGN_JUSTIFY);
  1027. } break;
  1028. }
  1029. }
  1030. 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) {
  1031. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  1032. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  1033. ERR_FAIL_NULL(ae);
  1034. AccessibilityElement *start_ae = rid_owner.get_or_null(p_text_start_id);
  1035. ERR_FAIL_NULL(start_ae);
  1036. ERR_FAIL_COND(start_ae->window_id != ae->window_id);
  1037. AccessibilityElement *end_ae = rid_owner.get_or_null(p_text_end_id);
  1038. ERR_FAIL_NULL(end_ae);
  1039. ERR_FAIL_COND(end_ae->window_id != ae->window_id);
  1040. int start_pos = p_start_char;
  1041. int end_pos = p_end_char;
  1042. RID start_rid;
  1043. RID end_rid;
  1044. for (const RID &rid : start_ae->children) {
  1045. const AccessibilityElement *child_ae = rid_owner.get_or_null(rid);
  1046. if (child_ae && child_ae->role == ACCESSKIT_ROLE_TEXT_RUN) {
  1047. if (p_start_char >= child_ae->run.x && p_start_char <= child_ae->run.y) {
  1048. start_rid = rid;
  1049. start_pos = p_start_char - child_ae->run.x;
  1050. break;
  1051. }
  1052. }
  1053. }
  1054. for (const RID &rid : end_ae->children) {
  1055. const AccessibilityElement *child_ae = rid_owner.get_or_null(rid);
  1056. if (child_ae && child_ae->role == ACCESSKIT_ROLE_TEXT_RUN) {
  1057. if (p_end_char >= child_ae->run.x && p_end_char <= child_ae->run.y) {
  1058. end_rid = rid;
  1059. end_pos = p_end_char - child_ae->run.x;
  1060. break;
  1061. }
  1062. }
  1063. }
  1064. ERR_FAIL_COND(start_rid.is_null() && end_rid.is_null());
  1065. _ensure_node(p_id, ae);
  1066. accesskit_text_selection sel;
  1067. sel.anchor.node = (accesskit_node_id)start_rid.get_id();
  1068. sel.anchor.character_index = start_pos;
  1069. sel.focus.node = (accesskit_node_id)end_rid.get_id();
  1070. sel.focus.character_index = end_pos;
  1071. accesskit_node_set_text_selection(ae->node, sel);
  1072. }
  1073. void AccessibilityDriverAccessKit::accessibility_update_set_flag(const RID &p_id, DisplayServer::AccessibilityFlags p_flag, bool p_value) {
  1074. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  1075. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  1076. ERR_FAIL_NULL(ae);
  1077. _ensure_node(p_id, ae);
  1078. switch (p_flag) {
  1079. case DisplayServer::AccessibilityFlags::FLAG_HIDDEN: {
  1080. if (p_value) {
  1081. accesskit_node_set_hidden(ae->node);
  1082. } else {
  1083. accesskit_node_clear_hidden(ae->node);
  1084. }
  1085. } break;
  1086. case DisplayServer::AccessibilityFlags::FLAG_MULTISELECTABLE: {
  1087. if (p_value) {
  1088. accesskit_node_set_multiselectable(ae->node);
  1089. } else {
  1090. accesskit_node_clear_multiselectable(ae->node);
  1091. }
  1092. } break;
  1093. case DisplayServer::AccessibilityFlags::FLAG_REQUIRED: {
  1094. if (p_value) {
  1095. accesskit_node_set_required(ae->node);
  1096. } else {
  1097. accesskit_node_clear_required(ae->node);
  1098. }
  1099. } break;
  1100. case DisplayServer::AccessibilityFlags::FLAG_VISITED: {
  1101. if (p_value) {
  1102. accesskit_node_set_visited(ae->node);
  1103. } else {
  1104. accesskit_node_clear_visited(ae->node);
  1105. }
  1106. } break;
  1107. case DisplayServer::AccessibilityFlags::FLAG_BUSY: {
  1108. if (p_value) {
  1109. accesskit_node_set_busy(ae->node);
  1110. } else {
  1111. accesskit_node_clear_busy(ae->node);
  1112. }
  1113. } break;
  1114. case DisplayServer::AccessibilityFlags::FLAG_MODAL: {
  1115. if (p_value) {
  1116. accesskit_node_set_modal(ae->node);
  1117. } else {
  1118. accesskit_node_clear_modal(ae->node);
  1119. }
  1120. } break;
  1121. case DisplayServer::AccessibilityFlags::FLAG_TOUCH_PASSTHROUGH: {
  1122. if (p_value) {
  1123. accesskit_node_set_touch_transparent(ae->node);
  1124. } else {
  1125. accesskit_node_clear_touch_transparent(ae->node);
  1126. }
  1127. } break;
  1128. case DisplayServer::AccessibilityFlags::FLAG_READONLY: {
  1129. if (p_value) {
  1130. accesskit_node_set_read_only(ae->node);
  1131. } else {
  1132. accesskit_node_clear_read_only(ae->node);
  1133. }
  1134. } break;
  1135. case DisplayServer::AccessibilityFlags::FLAG_DISABLED: {
  1136. if (p_value) {
  1137. accesskit_node_set_disabled(ae->node);
  1138. } else {
  1139. accesskit_node_clear_disabled(ae->node);
  1140. }
  1141. } break;
  1142. case DisplayServer::AccessibilityFlags::FLAG_CLIPS_CHILDREN: {
  1143. if (p_value) {
  1144. accesskit_node_set_clips_children(ae->node);
  1145. } else {
  1146. accesskit_node_clear_clips_children(ae->node);
  1147. }
  1148. } break;
  1149. }
  1150. }
  1151. void AccessibilityDriverAccessKit::accessibility_update_set_classname(const RID &p_id, const String &p_classname) {
  1152. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  1153. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  1154. ERR_FAIL_NULL(ae);
  1155. _ensure_node(p_id, ae);
  1156. if (!p_classname.is_empty()) {
  1157. accesskit_node_set_class_name(ae->node, p_classname.utf8().ptr());
  1158. } else {
  1159. accesskit_node_clear_class_name(ae->node);
  1160. }
  1161. }
  1162. void AccessibilityDriverAccessKit::accessibility_update_set_placeholder(const RID &p_id, const String &p_placeholder) {
  1163. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  1164. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  1165. ERR_FAIL_NULL(ae);
  1166. _ensure_node(p_id, ae);
  1167. if (!p_placeholder.is_empty()) {
  1168. accesskit_node_set_placeholder(ae->node, p_placeholder.utf8().ptr());
  1169. } else {
  1170. accesskit_node_clear_placeholder(ae->node);
  1171. }
  1172. }
  1173. void AccessibilityDriverAccessKit::accessibility_update_set_language(const RID &p_id, const String &p_language) {
  1174. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  1175. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  1176. ERR_FAIL_NULL(ae);
  1177. _ensure_node(p_id, ae);
  1178. accesskit_node_set_language(ae->node, p_language.utf8().ptr());
  1179. }
  1180. void AccessibilityDriverAccessKit::accessibility_update_set_text_orientation(const RID &p_id, bool p_vertical) {
  1181. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  1182. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  1183. ERR_FAIL_NULL(ae);
  1184. _ensure_node(p_id, ae);
  1185. if (p_vertical) {
  1186. accesskit_node_set_text_direction(ae->node, ACCESSKIT_TEXT_DIRECTION_TOP_TO_BOTTOM);
  1187. } else {
  1188. accesskit_node_set_text_direction(ae->node, ACCESSKIT_TEXT_DIRECTION_LEFT_TO_RIGHT);
  1189. }
  1190. }
  1191. void AccessibilityDriverAccessKit::accessibility_update_set_list_orientation(const RID &p_id, bool p_vertical) {
  1192. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  1193. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  1194. ERR_FAIL_NULL(ae);
  1195. _ensure_node(p_id, ae);
  1196. if (p_vertical) {
  1197. accesskit_node_set_orientation(ae->node, ACCESSKIT_ORIENTATION_VERTICAL);
  1198. } else {
  1199. accesskit_node_set_orientation(ae->node, ACCESSKIT_ORIENTATION_HORIZONTAL);
  1200. }
  1201. }
  1202. void AccessibilityDriverAccessKit::accessibility_update_set_shortcut(const RID &p_id, const String &p_shortcut) {
  1203. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  1204. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  1205. ERR_FAIL_NULL(ae);
  1206. _ensure_node(p_id, ae);
  1207. if (!p_shortcut.is_empty()) {
  1208. accesskit_node_set_keyboard_shortcut(ae->node, p_shortcut.utf8().ptr());
  1209. } else {
  1210. accesskit_node_clear_keyboard_shortcut(ae->node);
  1211. }
  1212. }
  1213. void AccessibilityDriverAccessKit::accessibility_update_set_url(const RID &p_id, const String &p_url) {
  1214. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  1215. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  1216. ERR_FAIL_NULL(ae);
  1217. _ensure_node(p_id, ae);
  1218. if (!p_url.is_empty()) {
  1219. accesskit_node_set_url(ae->node, p_url.utf8().ptr());
  1220. } else {
  1221. accesskit_node_clear_url(ae->node);
  1222. }
  1223. }
  1224. void AccessibilityDriverAccessKit::accessibility_update_set_role_description(const RID &p_id, const String &p_description) {
  1225. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  1226. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  1227. ERR_FAIL_NULL(ae);
  1228. _ensure_node(p_id, ae);
  1229. if (!p_description.is_empty()) {
  1230. accesskit_node_set_role_description(ae->node, p_description.utf8().ptr());
  1231. } else {
  1232. accesskit_node_clear_role_description(ae->node);
  1233. }
  1234. }
  1235. void AccessibilityDriverAccessKit::accessibility_update_set_state_description(const RID &p_id, const String &p_description) {
  1236. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  1237. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  1238. ERR_FAIL_NULL(ae);
  1239. _ensure_node(p_id, ae);
  1240. if (!p_description.is_empty()) {
  1241. accesskit_node_set_state_description(ae->node, p_description.utf8().ptr());
  1242. } else {
  1243. accesskit_node_clear_state_description(ae->node);
  1244. }
  1245. }
  1246. void AccessibilityDriverAccessKit::accessibility_update_set_color_value(const RID &p_id, const Color &p_color) {
  1247. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  1248. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  1249. ERR_FAIL_NULL(ae);
  1250. _ensure_node(p_id, ae);
  1251. accesskit_node_set_color_value(ae->node, p_color.to_rgba32());
  1252. }
  1253. void AccessibilityDriverAccessKit::accessibility_update_set_background_color(const RID &p_id, const Color &p_color) {
  1254. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  1255. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  1256. ERR_FAIL_NULL(ae);
  1257. _ensure_node(p_id, ae);
  1258. accesskit_node_set_background_color(ae->node, p_color.to_rgba32());
  1259. }
  1260. void AccessibilityDriverAccessKit::accessibility_update_set_foreground_color(const RID &p_id, const Color &p_color) {
  1261. ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
  1262. AccessibilityElement *ae = rid_owner.get_or_null(p_id);
  1263. ERR_FAIL_NULL(ae);
  1264. _ensure_node(p_id, ae);
  1265. accesskit_node_set_foreground_color(ae->node, p_color.to_rgba32());
  1266. }
  1267. Error AccessibilityDriverAccessKit::init() {
  1268. #ifdef ACCESSKIT_DYNAMIC
  1269. #ifdef DEBUG_ENABLED
  1270. int dylibloader_verbose = 1;
  1271. #else
  1272. int dylibloader_verbose = 0;
  1273. #endif
  1274. void *library_handle = nullptr;
  1275. String path;
  1276. String arch = Engine::get_singleton()->get_architecture_name();
  1277. #ifdef LINUXBSD_ENABLED
  1278. path = OS::get_singleton()->get_executable_path().get_base_dir().path_join("libaccesskit." + arch + ".so");
  1279. if (!FileAccess::exists(path)) {
  1280. path = OS::get_singleton()->get_executable_path().get_base_dir().path_join("../lib").path_join("libaccesskit." + arch + ".so");
  1281. }
  1282. if (!FileAccess::exists(path)) {
  1283. path = OS::get_singleton()->get_executable_path().get_base_dir().path_join("libaccesskit.so");
  1284. }
  1285. if (!FileAccess::exists(path)) {
  1286. path = OS::get_singleton()->get_executable_path().get_base_dir().path_join("../lib").path_join("libaccesskit.so");
  1287. }
  1288. if (!FileAccess::exists(path)) {
  1289. return ERR_CANT_CREATE;
  1290. }
  1291. #endif
  1292. #ifdef MACOS_ENABLED
  1293. path = OS::get_singleton()->get_executable_path().get_base_dir().path_join("libaccesskit." + arch + ".dylib");
  1294. if (!FileAccess::exists(path)) {
  1295. path = OS::get_singleton()->get_executable_path().get_base_dir().path_join("../Frameworks").path_join("libaccesskit." + arch + ".dylib");
  1296. }
  1297. if (!FileAccess::exists(path)) {
  1298. path = OS::get_singleton()->get_executable_path().get_base_dir().path_join("libaccesskit.dylib");
  1299. }
  1300. if (!FileAccess::exists(path)) {
  1301. path = OS::get_singleton()->get_executable_path().get_base_dir().path_join("../Frameworks").path_join("libaccesskit.dylib");
  1302. }
  1303. if (!FileAccess::exists(path)) {
  1304. return ERR_CANT_CREATE;
  1305. }
  1306. #endif
  1307. #ifdef WINDOWS_ENABLED
  1308. path = OS::get_singleton()->get_executable_path().get_base_dir().path_join("accesskit." + arch + ".dll");
  1309. if (!FileAccess::exists(path)) {
  1310. path = OS::get_singleton()->get_executable_path().get_base_dir().path_join("accesskit.dll");
  1311. }
  1312. if (!FileAccess::exists(path)) {
  1313. return ERR_CANT_CREATE;
  1314. }
  1315. #endif
  1316. Error err = OS::get_singleton()->open_dynamic_library(path, library_handle);
  1317. if (err == OK && initialize_libaccesskit(dylibloader_verbose, library_handle) == 0) {
  1318. print_verbose("AccessKit loaded.");
  1319. } else {
  1320. return ERR_CANT_CREATE;
  1321. }
  1322. #endif
  1323. #ifdef MACOS_ENABLED
  1324. //accesskit_macos_add_focus_forwarder_to_window_class("GodotWindow");
  1325. #endif
  1326. return OK;
  1327. }
  1328. AccessibilityDriverAccessKit::AccessibilityDriverAccessKit() {
  1329. singleton = this;
  1330. role_map[DisplayServer::AccessibilityRole::ROLE_UNKNOWN] = ACCESSKIT_ROLE_UNKNOWN;
  1331. role_map[DisplayServer::AccessibilityRole::ROLE_DEFAULT_BUTTON] = ACCESSKIT_ROLE_DEFAULT_BUTTON;
  1332. role_map[DisplayServer::AccessibilityRole::ROLE_AUDIO] = ACCESSKIT_ROLE_AUDIO;
  1333. role_map[DisplayServer::AccessibilityRole::ROLE_VIDEO] = ACCESSKIT_ROLE_VIDEO;
  1334. role_map[DisplayServer::AccessibilityRole::ROLE_STATIC_TEXT] = ACCESSKIT_ROLE_LABEL;
  1335. role_map[DisplayServer::AccessibilityRole::ROLE_CONTAINER] = ACCESSKIT_ROLE_GENERIC_CONTAINER;
  1336. role_map[DisplayServer::AccessibilityRole::ROLE_PANEL] = ACCESSKIT_ROLE_PANE;
  1337. role_map[DisplayServer::AccessibilityRole::ROLE_BUTTON] = ACCESSKIT_ROLE_BUTTON;
  1338. role_map[DisplayServer::AccessibilityRole::ROLE_LINK] = ACCESSKIT_ROLE_LINK;
  1339. role_map[DisplayServer::AccessibilityRole::ROLE_CHECK_BOX] = ACCESSKIT_ROLE_CHECK_BOX;
  1340. role_map[DisplayServer::AccessibilityRole::ROLE_RADIO_BUTTON] = ACCESSKIT_ROLE_RADIO_BUTTON;
  1341. role_map[DisplayServer::AccessibilityRole::ROLE_CHECK_BUTTON] = ACCESSKIT_ROLE_SWITCH;
  1342. role_map[DisplayServer::AccessibilityRole::ROLE_SCROLL_BAR] = ACCESSKIT_ROLE_SCROLL_BAR;
  1343. role_map[DisplayServer::AccessibilityRole::ROLE_SCROLL_VIEW] = ACCESSKIT_ROLE_SCROLL_VIEW;
  1344. role_map[DisplayServer::AccessibilityRole::ROLE_SPLITTER] = ACCESSKIT_ROLE_SPLITTER;
  1345. role_map[DisplayServer::AccessibilityRole::ROLE_SLIDER] = ACCESSKIT_ROLE_SLIDER;
  1346. role_map[DisplayServer::AccessibilityRole::ROLE_SPIN_BUTTON] = ACCESSKIT_ROLE_SPIN_BUTTON;
  1347. role_map[DisplayServer::AccessibilityRole::ROLE_PROGRESS_INDICATOR] = ACCESSKIT_ROLE_PROGRESS_INDICATOR;
  1348. role_map[DisplayServer::AccessibilityRole::ROLE_TEXT_FIELD] = ACCESSKIT_ROLE_TEXT_INPUT;
  1349. role_map[DisplayServer::AccessibilityRole::ROLE_MULTILINE_TEXT_FIELD] = ACCESSKIT_ROLE_MULTILINE_TEXT_INPUT;
  1350. role_map[DisplayServer::AccessibilityRole::ROLE_COLOR_PICKER] = ACCESSKIT_ROLE_COLOR_WELL;
  1351. role_map[DisplayServer::AccessibilityRole::ROLE_TABLE] = ACCESSKIT_ROLE_TABLE;
  1352. role_map[DisplayServer::AccessibilityRole::ROLE_CELL] = ACCESSKIT_ROLE_CELL;
  1353. role_map[DisplayServer::AccessibilityRole::ROLE_ROW] = ACCESSKIT_ROLE_ROW;
  1354. role_map[DisplayServer::AccessibilityRole::ROLE_ROW_GROUP] = ACCESSKIT_ROLE_ROW_GROUP;
  1355. role_map[DisplayServer::AccessibilityRole::ROLE_ROW_HEADER] = ACCESSKIT_ROLE_ROW_HEADER;
  1356. role_map[DisplayServer::AccessibilityRole::ROLE_COLUMN_HEADER] = ACCESSKIT_ROLE_COLUMN_HEADER;
  1357. role_map[DisplayServer::AccessibilityRole::ROLE_TREE] = ACCESSKIT_ROLE_TREE;
  1358. role_map[DisplayServer::AccessibilityRole::ROLE_TREE_ITEM] = ACCESSKIT_ROLE_TREE_ITEM;
  1359. role_map[DisplayServer::AccessibilityRole::ROLE_LIST] = ACCESSKIT_ROLE_LIST;
  1360. role_map[DisplayServer::AccessibilityRole::ROLE_LIST_ITEM] = ACCESSKIT_ROLE_LIST_ITEM;
  1361. role_map[DisplayServer::AccessibilityRole::ROLE_LIST_BOX] = ACCESSKIT_ROLE_LIST_BOX;
  1362. role_map[DisplayServer::AccessibilityRole::ROLE_LIST_BOX_OPTION] = ACCESSKIT_ROLE_LIST_BOX_OPTION;
  1363. role_map[DisplayServer::AccessibilityRole::ROLE_TAB_BAR] = ACCESSKIT_ROLE_TAB_LIST;
  1364. role_map[DisplayServer::AccessibilityRole::ROLE_TAB] = ACCESSKIT_ROLE_TAB;
  1365. role_map[DisplayServer::AccessibilityRole::ROLE_TAB_PANEL] = ACCESSKIT_ROLE_TAB_PANEL;
  1366. role_map[DisplayServer::AccessibilityRole::ROLE_MENU_BAR] = ACCESSKIT_ROLE_MENU_BAR;
  1367. role_map[DisplayServer::AccessibilityRole::ROLE_MENU] = ACCESSKIT_ROLE_MENU;
  1368. role_map[DisplayServer::AccessibilityRole::ROLE_MENU_ITEM] = ACCESSKIT_ROLE_MENU_ITEM;
  1369. role_map[DisplayServer::AccessibilityRole::ROLE_MENU_ITEM_CHECK_BOX] = ACCESSKIT_ROLE_MENU_ITEM_CHECK_BOX;
  1370. role_map[DisplayServer::AccessibilityRole::ROLE_MENU_ITEM_RADIO] = ACCESSKIT_ROLE_MENU_ITEM_RADIO;
  1371. role_map[DisplayServer::AccessibilityRole::ROLE_IMAGE] = ACCESSKIT_ROLE_IMAGE;
  1372. role_map[DisplayServer::AccessibilityRole::ROLE_WINDOW] = ACCESSKIT_ROLE_WINDOW;
  1373. role_map[DisplayServer::AccessibilityRole::ROLE_TITLE_BAR] = ACCESSKIT_ROLE_TITLE_BAR;
  1374. role_map[DisplayServer::AccessibilityRole::ROLE_DIALOG] = ACCESSKIT_ROLE_DIALOG;
  1375. role_map[DisplayServer::AccessibilityRole::ROLE_TOOLTIP] = ACCESSKIT_ROLE_TOOLTIP;
  1376. action_map[DisplayServer::AccessibilityAction::ACTION_CLICK] = ACCESSKIT_ACTION_CLICK;
  1377. action_map[DisplayServer::AccessibilityAction::ACTION_FOCUS] = ACCESSKIT_ACTION_FOCUS;
  1378. action_map[DisplayServer::AccessibilityAction::ACTION_BLUR] = ACCESSKIT_ACTION_BLUR;
  1379. action_map[DisplayServer::AccessibilityAction::ACTION_COLLAPSE] = ACCESSKIT_ACTION_COLLAPSE;
  1380. action_map[DisplayServer::AccessibilityAction::ACTION_EXPAND] = ACCESSKIT_ACTION_EXPAND;
  1381. action_map[DisplayServer::AccessibilityAction::ACTION_DECREMENT] = ACCESSKIT_ACTION_DECREMENT;
  1382. action_map[DisplayServer::AccessibilityAction::ACTION_INCREMENT] = ACCESSKIT_ACTION_INCREMENT;
  1383. action_map[DisplayServer::AccessibilityAction::ACTION_HIDE_TOOLTIP] = ACCESSKIT_ACTION_HIDE_TOOLTIP;
  1384. action_map[DisplayServer::AccessibilityAction::ACTION_SHOW_TOOLTIP] = ACCESSKIT_ACTION_SHOW_TOOLTIP;
  1385. //action_map[DisplayServer::AccessibilityAction::ACTION_INVALIDATE_TREE] = ACCESSKIT_ACTION_INVALIDATE_TREE;
  1386. //action_map[DisplayServer::AccessibilityAction::ACTION_LOAD_INLINE_TEXT_BOXES] = ACCESSKIT_ACTION_LOAD_INLINE_TEXT_BOXES;
  1387. action_map[DisplayServer::AccessibilityAction::ACTION_SET_TEXT_SELECTION] = ACCESSKIT_ACTION_SET_TEXT_SELECTION;
  1388. action_map[DisplayServer::AccessibilityAction::ACTION_REPLACE_SELECTED_TEXT] = ACCESSKIT_ACTION_REPLACE_SELECTED_TEXT;
  1389. action_map[DisplayServer::AccessibilityAction::ACTION_SCROLL_BACKWARD] = ACCESSKIT_ACTION_SCROLL_UP;
  1390. action_map[DisplayServer::AccessibilityAction::ACTION_SCROLL_DOWN] = ACCESSKIT_ACTION_SCROLL_DOWN;
  1391. action_map[DisplayServer::AccessibilityAction::ACTION_SCROLL_FORWARD] = ACCESSKIT_ACTION_SCROLL_DOWN;
  1392. action_map[DisplayServer::AccessibilityAction::ACTION_SCROLL_LEFT] = ACCESSKIT_ACTION_SCROLL_LEFT;
  1393. action_map[DisplayServer::AccessibilityAction::ACTION_SCROLL_RIGHT] = ACCESSKIT_ACTION_SCROLL_RIGHT;
  1394. action_map[DisplayServer::AccessibilityAction::ACTION_SCROLL_UP] = ACCESSKIT_ACTION_SCROLL_UP;
  1395. action_map[DisplayServer::AccessibilityAction::ACTION_SCROLL_INTO_VIEW] = ACCESSKIT_ACTION_SCROLL_INTO_VIEW;
  1396. action_map[DisplayServer::AccessibilityAction::ACTION_SCROLL_TO_POINT] = ACCESSKIT_ACTION_SCROLL_TO_POINT;
  1397. action_map[DisplayServer::AccessibilityAction::ACTION_SET_SCROLL_OFFSET] = ACCESSKIT_ACTION_SET_SCROLL_OFFSET;
  1398. //action_map[DisplayServer::AccessibilityAction::ACTION_SET_SEQUENTIAL_FOCUS_NAVIGATION_STARTING_POINT] = ACCESSKIT_ACTION_SET_SEQUENTIAL_FOCUS_NAVIGATION_STARTING_POINT;
  1399. action_map[DisplayServer::AccessibilityAction::ACTION_SET_VALUE] = ACCESSKIT_ACTION_SET_VALUE;
  1400. action_map[DisplayServer::AccessibilityAction::ACTION_SHOW_CONTEXT_MENU] = ACCESSKIT_ACTION_SHOW_CONTEXT_MENU;
  1401. action_map[DisplayServer::AccessibilityAction::ACTION_CUSTOM] = ACCESSKIT_ACTION_CUSTOM_ACTION;
  1402. }
  1403. AccessibilityDriverAccessKit::~AccessibilityDriverAccessKit() {
  1404. singleton = nullptr;
  1405. }
  1406. #endif // ACCESSKIT_ENABLED