accessibility_driver_accesskit.cpp 67 KB

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