Path: blob/master/drivers/accesskit/accessibility_driver_accesskit.cpp
9973 views
/**************************************************************************/1/* accessibility_driver_accesskit.cpp */2/**************************************************************************/3/* This file is part of: */4/* GODOT ENGINE */5/* https://godotengine.org */6/**************************************************************************/7/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */8/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */9/* */10/* Permission is hereby granted, free of charge, to any person obtaining */11/* a copy of this software and associated documentation files (the */12/* "Software"), to deal in the Software without restriction, including */13/* without limitation the rights to use, copy, modify, merge, publish, */14/* distribute, sublicense, and/or sell copies of the Software, and to */15/* permit persons to whom the Software is furnished to do so, subject to */16/* the following conditions: */17/* */18/* The above copyright notice and this permission notice shall be */19/* included in all copies or substantial portions of the Software. */20/* */21/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */22/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */23/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */24/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */25/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */26/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */27/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */28/**************************************************************************/2930#ifdef ACCESSKIT_ENABLED3132#include "accessibility_driver_accesskit.h"3334#include "core/config/project_settings.h"35#include "core/version.h"3637#include "servers/text_server.h"3839AccessibilityDriverAccessKit *AccessibilityDriverAccessKit::singleton = nullptr;4041_FORCE_INLINE_ accesskit_role AccessibilityDriverAccessKit::_accessibility_role(DisplayServer::AccessibilityRole p_role) const {42if (role_map.has(p_role)) {43return role_map[p_role];44}45return ACCESSKIT_ROLE_UNKNOWN;46}4748_FORCE_INLINE_ accesskit_action AccessibilityDriverAccessKit::_accessibility_action(DisplayServer::AccessibilityAction p_action) const {49if (action_map.has(p_action)) {50return action_map[p_action];51}52return ACCESSKIT_ACTION_CLICK;53}5455bool AccessibilityDriverAccessKit::window_create(DisplayServer::WindowID p_window_id, void *p_handle) {56ERR_FAIL_COND_V(windows.has(p_window_id), false);5758WindowData &wd = windows[p_window_id];5960AccessibilityElement *ae = memnew(AccessibilityElement);61ae->role = ACCESSKIT_ROLE_WINDOW;62ae->window_id = p_window_id;63wd.root_id = rid_owner.make_rid(ae);6465#ifdef WINDOWS_ENABLED66wd.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);67#endif68#ifdef MACOS_ENABLED69wd.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);70#endif71#ifdef LINUXBSD_ENABLED72wd.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);73#endif7475if (wd.adapter == nullptr) {76memdelete(ae);77rid_owner.free(wd.root_id);78windows.erase(p_window_id);7980return false;81} else {82return true;83}84}8586void AccessibilityDriverAccessKit::window_destroy(DisplayServer::WindowID p_window_id) {87WindowData *wd = windows.getptr(p_window_id);88ERR_FAIL_NULL(wd);8990#ifdef WINDOWS_ENABLED91accesskit_windows_subclassing_adapter_free(wd->adapter);92#endif93#ifdef MACOS_ENABLED94accesskit_macos_subclassing_adapter_free(wd->adapter);95#endif96#ifdef LINUXBSD_ENABLED97accesskit_unix_adapter_free(wd->adapter);98#endif99accessibility_free_element(wd->root_id);100101windows.erase(p_window_id);102}103104void AccessibilityDriverAccessKit::_accessibility_deactivation_callback(void *p_user_data) {105// NOP106}107108void AccessibilityDriverAccessKit::_accessibility_action_callback(struct accesskit_action_request *p_request, void *p_user_data) {109DisplayServer::WindowID window_id = (DisplayServer::WindowID)(size_t)p_user_data;110ERR_FAIL_COND(!singleton->windows.has(window_id));111112RID rid = RID::from_uint64(p_request->target);113AccessibilityElement *ae = singleton->rid_owner.get_or_null(rid);114ERR_FAIL_NULL(ae);115116Variant rq_data;117if (!ae->actions.has(p_request->action) && ae->role == ACCESSKIT_ROLE_TEXT_RUN && p_request->action == ACCESSKIT_ACTION_SCROLL_INTO_VIEW) {118AccessibilityElement *root_ae = singleton->rid_owner.get_or_null(ae->parent);119ERR_FAIL_NULL(root_ae);120ae = root_ae;121rq_data = ae->run;122}123124if (ae->actions.has(p_request->action)) {125Callable &cb = ae->actions[p_request->action];126if (cb.is_valid()) {127if (p_request->data.has_value) {128switch (p_request->data.value.tag) {129case ACCESSKIT_ACTION_DATA_CUSTOM_ACTION: {130rq_data = p_request->data.value.custom_action;131} break;132case ACCESSKIT_ACTION_DATA_VALUE: {133rq_data = String::utf8(p_request->data.value.value);134} break;135case ACCESSKIT_ACTION_DATA_NUMERIC_VALUE: {136rq_data = p_request->data.value.numeric_value;137} break;138case ACCESSKIT_ACTION_DATA_SCROLL_HINT: {139switch (p_request->data.value.scroll_hint) {140case ACCESSKIT_SCROLL_HINT_TOP_LEFT: {141rq_data = DisplayServer::SCROLL_HINT_TOP_LEFT;142} break;143case ACCESSKIT_SCROLL_HINT_BOTTOM_RIGHT: {144rq_data = DisplayServer::SCROLL_HINT_BOTTOM_RIGHT;145} break;146case ACCESSKIT_SCROLL_HINT_TOP_EDGE: {147rq_data = DisplayServer::SCROLL_HINT_TOP_EDGE;148} break;149case ACCESSKIT_SCROLL_HINT_BOTTOM_EDGE: {150rq_data = DisplayServer::SCROLL_HINT_BOTTOM_EDGE;151} break;152case ACCESSKIT_SCROLL_HINT_LEFT_EDGE: {153rq_data = DisplayServer::SCROLL_HINT_LEFT_EDGE;154} break;155case ACCESSKIT_SCROLL_HINT_RIGHT_EDGE: {156rq_data = DisplayServer::SCROLL_HINT_RIGHT_EDGE;157} break;158default:159break;160}161} break;162case ACCESSKIT_ACTION_DATA_SCROLL_UNIT: {163if (p_request->data.value.scroll_unit == ACCESSKIT_SCROLL_UNIT_ITEM) {164rq_data = DisplayServer::SCROLL_UNIT_ITEM;165} else if (p_request->data.value.scroll_unit == ACCESSKIT_SCROLL_UNIT_PAGE) {166rq_data = DisplayServer::SCROLL_UNIT_PAGE;167}168} break;169case ACCESSKIT_ACTION_DATA_SCROLL_TO_POINT: {170rq_data = Point2(p_request->data.value.scroll_to_point.x, p_request->data.value.scroll_to_point.y);171} break;172case ACCESSKIT_ACTION_DATA_SET_SCROLL_OFFSET: {173rq_data = Point2(p_request->data.value.set_scroll_offset.x, p_request->data.value.set_scroll_offset.y);174} break;175case ACCESSKIT_ACTION_DATA_SET_TEXT_SELECTION: {176Dictionary sel;177178RID start_rid = RID::from_uint64(p_request->data.value.set_text_selection.anchor.node);179AccessibilityElement *start_ae = singleton->rid_owner.get_or_null(start_rid);180ERR_FAIL_NULL(start_ae);181182RID end_rid = RID::from_uint64(p_request->data.value.set_text_selection.focus.node);183AccessibilityElement *end_ae = singleton->rid_owner.get_or_null(end_rid);184ERR_FAIL_NULL(end_ae);185186sel["start_element"] = start_ae->parent;187sel["start_char"] = (int64_t)p_request->data.value.set_text_selection.anchor.character_index + start_ae->run.x;188sel["end_element"] = end_ae->parent;189sel["end_char"] = (int64_t)p_request->data.value.set_text_selection.focus.character_index + end_ae->run.x;190rq_data = sel;191} break;192}193}194195cb.call_deferred(rq_data);196}197}198}199200accesskit_tree_update *AccessibilityDriverAccessKit::_accessibility_initial_tree_update_callback(void *p_user_data) {201DisplayServer::WindowID window_id = (DisplayServer::WindowID)(size_t)p_user_data;202WindowData *wd = singleton->windows.getptr(window_id);203ERR_FAIL_NULL_V(wd, nullptr);204205accesskit_node *win_node = accesskit_node_new(ACCESSKIT_ROLE_WINDOW);206accesskit_node_set_label(win_node, "Godot Engine");207accesskit_node_set_busy(win_node);208209accesskit_node_id win_id = (accesskit_node_id)wd->root_id.get_id();210211accesskit_tree_update *tree_update = accesskit_tree_update_with_capacity_and_focus(1, win_id);212213accesskit_tree_update_set_tree(tree_update, accesskit_tree_new(win_id));214accesskit_tree_update_push_node(tree_update, win_id, win_node);215216return tree_update;217}218219RID AccessibilityDriverAccessKit::accessibility_create_element(DisplayServer::WindowID p_window_id, DisplayServer::AccessibilityRole p_role) {220AccessibilityElement *ae = memnew(AccessibilityElement);221ae->role = _accessibility_role(p_role);222ae->window_id = p_window_id;223RID rid = rid_owner.make_rid(ae);224225return rid;226}227228RID AccessibilityDriverAccessKit::accessibility_create_sub_element(const RID &p_parent_rid, DisplayServer::AccessibilityRole p_role, int p_insert_pos) {229AccessibilityElement *parent_ae = rid_owner.get_or_null(p_parent_rid);230ERR_FAIL_NULL_V(parent_ae, RID());231232WindowData *wd = windows.getptr(parent_ae->window_id);233ERR_FAIL_NULL_V(wd, RID());234235AccessibilityElement *ae = memnew(AccessibilityElement);236ae->role = _accessibility_role(p_role);237ae->window_id = parent_ae->window_id;238ae->parent = p_parent_rid;239ae->node = accesskit_node_new(ae->role);240RID rid = rid_owner.make_rid(ae);241if (p_insert_pos == -1) {242parent_ae->children.push_back(rid);243} else {244parent_ae->children.insert(p_insert_pos, rid);245}246wd->update.insert(rid);247248return rid;249}250251RID 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) {252AccessibilityElement *parent_ae = rid_owner.get_or_null(p_parent_rid);253ERR_FAIL_NULL_V(parent_ae, RID());254255WindowData *wd = windows.getptr(parent_ae->window_id);256ERR_FAIL_NULL_V(wd, RID());257258AccessibilityElement *root_ae = memnew(AccessibilityElement);259root_ae->role = ACCESSKIT_ROLE_GENERIC_CONTAINER;260root_ae->window_id = parent_ae->window_id;261root_ae->parent = p_parent_rid;262root_ae->node = accesskit_node_new(root_ae->role);263RID root_rid = rid_owner.make_rid(root_ae);264if (p_insert_pos == -1) {265parent_ae->children.push_back(root_rid);266} else {267parent_ae->children.insert(p_insert_pos, root_rid);268}269wd->update.insert(root_rid);270271float text_width = 0;272float text_height = p_min_height;273Vector<int32_t> words;274int64_t run_count = 0; // Note: runs in visual order.275const Glyph *gl = nullptr;276int64_t gl_count = 0;277int64_t gl_index = 0;278float run_off_x = 0.0;279Vector2i full_range;280281if (p_shaped_text.is_valid()) {282text_width = TS->shaped_text_get_size(p_shaped_text).x;283text_height = MAX(text_height, TS->shaped_text_get_size(p_shaped_text).y);284words = TS->shaped_text_get_word_breaks(p_shaped_text);285run_count = TS->shaped_get_run_count(p_shaped_text);286gl = TS->shaped_text_get_glyphs(p_shaped_text);287gl_count = TS->shaped_text_get_glyph_count(p_shaped_text);288full_range = TS->shaped_text_get_range(p_shaped_text);289}290291accesskit_rect root_rect;292root_rect.x0 = 0;293root_rect.y0 = 0;294root_rect.x1 = text_width;295root_rect.y1 = MAX(p_min_height, text_height);296accesskit_node_set_bounds(root_ae->node, root_rect);297298// Create text element for each run.299Vector<AccessibilityElement *> text_elements;300for (int64_t i = 0; i < run_count; i++) {301const Vector2i range = TS->shaped_get_run_range(p_shaped_text, i);302String t = TS->shaped_get_run_text(p_shaped_text, i);303304if (t.is_empty()) {305continue;306}307308AccessibilityElement *ae = memnew(AccessibilityElement);309ae->role = ACCESSKIT_ROLE_TEXT_RUN;310ae->window_id = parent_ae->window_id;311ae->parent = root_rid;312ae->run = Vector3i(range.x, range.y, i);313ae->node = accesskit_node_new(ae->role);314315text_elements.push_back(ae);316317// UTF-8 text and char lengths.318Vector<uint8_t> char_lengths;319CharString text = t.utf8(&char_lengths);320321accesskit_node_set_value(ae->node, text.ptr());322accesskit_node_set_character_lengths(ae->node, char_lengths.size(), char_lengths.ptr());323324// Word sizes.325Vector<uint8_t> word_lengths;326327int32_t prev = ae->run.x;328int32_t total = 0;329for (int j = 0; j < words.size(); j += 2) {330if (words[j] < ae->run.x) {331continue;332}333if (words[j] >= ae->run.y) {334break;335}336int32_t wlen = words[j] - prev;337while (wlen > 255) {338word_lengths.push_back(255);339wlen -= 255;340total += 255;341}342if (wlen > 0) {343word_lengths.push_back(wlen);344total += wlen;345}346prev = words[j];347}348if (total < t.length()) {349word_lengths.push_back(t.length() - total);350}351accesskit_node_set_word_lengths(ae->node, word_lengths.size(), word_lengths.ptr());352353// Char widths and positions.354Vector<float> char_positions;355Vector<float> char_widths;356357char_positions.resize_initialized(t.length());358float *positions_ptr = char_positions.ptrw();359360char_widths.resize_initialized(t.length());361float *widths_ptr = char_widths.ptrw();362363float size_x = 0.0;364for (int j = gl_index; j < gl_count; j += gl[j].count) {365if (gl[j].start >= ae->run.y) {366gl_index = j;367break;368}369370float advance = 0.0; // Graphame advance.371for (int k = 0; k < gl[j].count; k++) {372advance += gl[j + k].advance;373}374int chars = gl[j].end - gl[j].start;375float adv_per_char = advance / (float)chars;376377for (int k = 0; k < chars; k++) {378int index = gl[j].start + k - ae->run.x;379ERR_CONTINUE(index < 0 || index >= t.length());380positions_ptr[index] = size_x + adv_per_char * k;381widths_ptr[index] = adv_per_char;382}383size_x += advance * gl[j].repeat;384}385positions_ptr[t.length() - 1] = size_x;386widths_ptr[t.length() - 1] = 1.0;387388accesskit_node_set_character_positions(ae->node, char_positions.size(), char_positions.ptr());389accesskit_node_set_character_widths(ae->node, char_widths.size(), char_widths.ptr());390391RID font_rid = TS->shaped_get_run_font_rid(p_shaped_text, i);392if (font_rid != RID()) {393CharString font_name = TS->font_get_name(font_rid).utf8();394if (font_name.length() > 0) {395accesskit_node_set_font_family(ae->node, font_name.ptr());396}397if (TS->font_get_style(font_rid).has_flag(TextServer::FONT_BOLD)) {398accesskit_node_set_bold(ae->node);399}400if (TS->font_get_style(font_rid).has_flag(TextServer::FONT_ITALIC)) {401accesskit_node_set_italic(ae->node);402}403accesskit_node_set_font_weight(ae->node, TS->font_get_weight(font_rid));404}405accesskit_node_set_font_size(ae->node, TS->shaped_get_run_font_size(p_shaped_text, i));406CharString language = TS->shaped_get_run_language(p_shaped_text, i).utf8();407if (language.length() > 0) {408accesskit_node_set_language(ae->node, language.ptr());409}410accesskit_node_set_text_direction(ae->node, ACCESSKIT_TEXT_DIRECTION_LEFT_TO_RIGHT);411412accesskit_rect rect;413rect.x0 = run_off_x;414rect.y0 = 0;415rect.x1 = run_off_x + size_x;416rect.y1 = text_height;417accesskit_node_set_bounds(ae->node, rect);418accesskit_node_add_action(ae->node, ACCESSKIT_ACTION_SCROLL_INTO_VIEW);419420run_off_x += size_x;421}422{423// Add "\n" at the end.424AccessibilityElement *ae = memnew(AccessibilityElement);425ae->role = ACCESSKIT_ROLE_TEXT_RUN;426ae->window_id = parent_ae->window_id;427ae->parent = root_rid;428ae->run = Vector3i(full_range.y, full_range.y, run_count);429ae->node = accesskit_node_new(ae->role);430431text_elements.push_back(ae);432433Vector<uint8_t> char_lengths;434char_lengths.push_back(1);435accesskit_node_set_value(ae->node, "\n");436accesskit_node_set_character_lengths(ae->node, char_lengths.size(), char_lengths.ptr());437438Vector<float> char_positions;439Vector<float> char_widths;440char_positions.push_back(0.0);441char_widths.push_back(1.0);442443accesskit_node_set_character_positions(ae->node, char_positions.size(), char_positions.ptr());444accesskit_node_set_character_widths(ae->node, char_widths.size(), char_widths.ptr());445accesskit_node_set_text_direction(ae->node, ACCESSKIT_TEXT_DIRECTION_LEFT_TO_RIGHT);446447accesskit_rect rect;448rect.x0 = run_off_x;449rect.y0 = 0;450rect.x1 = run_off_x + 1;451rect.y1 = text_height;452accesskit_node_set_bounds(ae->node, rect);453}454455// Sort runs in logical order.456struct RunCompare {457_FORCE_INLINE_ bool operator()(const AccessibilityElement *l, const AccessibilityElement *r) const {458return l->run.x < r->run.x;459}460};461text_elements.sort_custom<RunCompare>();462for (AccessibilityElement *text_element : text_elements) {463RID rid = rid_owner.make_rid(text_element);464root_ae->children.push_back(rid);465wd->update.insert(rid);466}467468return root_rid;469}470471bool AccessibilityDriverAccessKit::accessibility_has_element(const RID &p_id) const {472return rid_owner.owns(p_id);473}474475void AccessibilityDriverAccessKit::_free_recursive(WindowData *p_wd, const RID &p_id) {476if (p_wd && p_wd->update.has(p_id)) {477p_wd->update.erase(p_id);478}479AccessibilityElement *ae = rid_owner.get_or_null(p_id);480for (const RID &rid : ae->children) {481_free_recursive(p_wd, rid);482}483if (ae->node) {484accesskit_node_free(ae->node);485}486memdelete(ae);487rid_owner.free(p_id);488}489490void AccessibilityDriverAccessKit::accessibility_free_element(const RID &p_id) {491ERR_FAIL_COND_MSG(in_accessibility_update, "Element can't be removed inside NOTIFICATION_ACCESSIBILITY_UPDATE notification.");492493AccessibilityElement *ae = rid_owner.get_or_null(p_id);494if (ae) {495WindowData *wd = windows.getptr(ae->window_id);496AccessibilityElement *parent_ae = rid_owner.get_or_null(ae->parent);497if (parent_ae) {498parent_ae->children.erase(p_id);499}500_free_recursive(wd, p_id);501}502}503504void AccessibilityDriverAccessKit::accessibility_element_set_meta(const RID &p_id, const Variant &p_meta) {505ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");506507AccessibilityElement *ae = rid_owner.get_or_null(p_id);508ERR_FAIL_NULL(ae);509ae->meta = p_meta;510}511512Variant AccessibilityDriverAccessKit::accessibility_element_get_meta(const RID &p_id) const {513const AccessibilityElement *ae = rid_owner.get_or_null(p_id);514ERR_FAIL_NULL_V(ae, Variant());515return ae->meta;516}517518void AccessibilityDriverAccessKit::accessibility_update_set_focus(const RID &p_id) {519ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");520521if (p_id.is_valid() && rid_owner.owns(p_id)) {522focus = p_id;523} else {524focus = RID();525}526}527528RID AccessibilityDriverAccessKit::accessibility_get_window_root(DisplayServer::WindowID p_window_id) const {529const WindowData *wd = windows.getptr(p_window_id);530ERR_FAIL_NULL_V(wd, RID());531532return wd->root_id;533}534535accesskit_tree_update *AccessibilityDriverAccessKit::_accessibility_build_tree_update(void *p_user_data) {536DisplayServer::WindowID window_id = (DisplayServer::WindowID)(size_t)p_user_data;537538ERR_FAIL_COND_V(!singleton->windows.has(window_id), nullptr);539WindowData &wd = singleton->windows[window_id];540541singleton->in_accessibility_update = true;542if (singleton->update_cb.is_valid()) {543singleton->update_cb.call(window_id);544}545singleton->in_accessibility_update = false;546547AccessibilityElement *focus_ae = singleton->rid_owner.get_or_null(singleton->focus);548uint32_t update_size = wd.update.size();549550accesskit_node_id ac_focus = (accesskit_node_id)wd.root_id.get_id();551if (focus_ae && focus_ae->window_id == window_id) {552ac_focus = (accesskit_node_id)singleton->focus.get_id();553}554555accesskit_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);556for (const RID &rid : wd.update) {557AccessibilityElement *ae = singleton->rid_owner.get_or_null(rid);558if (ae && ae->node) {559for (const RID &child_rid : ae->children) {560accesskit_node_push_child(ae->node, (accesskit_node_id)child_rid.get_id());561}562accesskit_tree_update_push_node(tree_update, (accesskit_node_id)rid.get_id(), ae->node);563ae->node = nullptr;564}565}566wd.update.clear();567568return tree_update;569}570571void AccessibilityDriverAccessKit::accessibility_update_if_active(const Callable &p_callable) {572ERR_FAIL_COND(!p_callable.is_valid());573update_cb = p_callable;574for (KeyValue<DisplayServer::WindowID, WindowData> &window : windows) {575#ifdef WINDOWS_ENABLED576accesskit_windows_queued_events *events = accesskit_windows_subclassing_adapter_update_if_active(window.value.adapter, _accessibility_build_tree_update, (void *)(size_t)window.key);577if (events) {578accesskit_windows_queued_events_raise(events);579}580#endif581#ifdef MACOS_ENABLED582accesskit_macos_queued_events *events = accesskit_macos_subclassing_adapter_update_if_active(window.value.adapter, _accessibility_build_tree_update, (void *)(size_t)window.key);583if (events) {584accesskit_macos_queued_events_raise(events);585}586#endif587#ifdef LINUXBSD_ENABLED588accesskit_unix_adapter_update_if_active(window.value.adapter, _accessibility_build_tree_update, (void *)(size_t)window.key);589#endif590}591update_cb = Callable();592}593594_FORCE_INLINE_ void AccessibilityDriverAccessKit::_ensure_node(const RID &p_id, AccessibilityElement *p_ae) {595if (unlikely(!p_ae->node)) {596WindowData *wd = windows.getptr(p_ae->window_id);597ERR_FAIL_NULL(wd);598599wd->update.insert(p_id);600p_ae->node = accesskit_node_new(p_ae->role);601}602}603604void AccessibilityDriverAccessKit::accessibility_set_window_rect(DisplayServer::WindowID p_window_id, const Rect2 &p_rect_out, const Rect2 &p_rect_in) {605#ifdef LINUXBSD_ENABLED606const WindowData *wd = windows.getptr(p_window_id);607ERR_FAIL_NULL(wd);608609accesskit_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 };610accesskit_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 };611accesskit_unix_adapter_set_root_window_bounds(wd->adapter, outer_bounds, inner_bounds);612#endif613}614615void AccessibilityDriverAccessKit::accessibility_set_window_focused(DisplayServer::WindowID p_window_id, bool p_focused) {616const WindowData *wd = windows.getptr(p_window_id);617ERR_FAIL_NULL(wd);618619#ifdef LINUXBSD_ENABLED620accesskit_unix_adapter_update_window_focus_state(wd->adapter, p_focused);621#endif622#ifdef MACOS_ENABLED623accesskit_macos_queued_events *events = accesskit_macos_subclassing_adapter_update_view_focus_state(wd->adapter, p_focused);624if (events != nullptr) {625accesskit_macos_queued_events_raise(events);626}627#endif628// Note: On Windows, the subclassing adapter takes care of this.629}630631void AccessibilityDriverAccessKit::accessibility_update_set_role(const RID &p_id, DisplayServer::AccessibilityRole p_role) {632ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");633634AccessibilityElement *ae = rid_owner.get_or_null(p_id);635ERR_FAIL_NULL(ae);636if (ae->role == _accessibility_role(p_role)) {637return;638}639ae->role = _accessibility_role(p_role);640_ensure_node(p_id, ae);641642accesskit_node_set_role(ae->node, ae->role);643}644645void AccessibilityDriverAccessKit::accessibility_update_set_name(const RID &p_id, const String &p_name) {646ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");647648AccessibilityElement *ae = rid_owner.get_or_null(p_id);649ERR_FAIL_NULL(ae);650_ensure_node(p_id, ae);651652ae->name = p_name;653String full_name = ae->name + " " + ae->name_extra_info;654if (!full_name.is_empty()) {655accesskit_node_set_label(ae->node, full_name.utf8().ptr());656} else {657accesskit_node_clear_label(ae->node);658}659}660661void AccessibilityDriverAccessKit::accessibility_update_set_extra_info(const RID &p_id, const String &p_name_extra_info) {662ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");663664AccessibilityElement *ae = rid_owner.get_or_null(p_id);665ERR_FAIL_NULL(ae);666_ensure_node(p_id, ae);667668ae->name_extra_info = p_name_extra_info;669String full_name = ae->name + " " + ae->name_extra_info;670if (!full_name.is_empty()) {671accesskit_node_set_label(ae->node, full_name.utf8().ptr());672} else {673accesskit_node_clear_label(ae->node);674}675}676677void AccessibilityDriverAccessKit::accessibility_update_set_description(const RID &p_id, const String &p_description) {678ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");679680AccessibilityElement *ae = rid_owner.get_or_null(p_id);681ERR_FAIL_NULL(ae);682_ensure_node(p_id, ae);683684if (!p_description.is_empty()) {685accesskit_node_set_description(ae->node, p_description.utf8().ptr());686} else {687accesskit_node_clear_description(ae->node);688}689}690691void AccessibilityDriverAccessKit::accessibility_update_set_value(const RID &p_id, const String &p_value) {692ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");693694AccessibilityElement *ae = rid_owner.get_or_null(p_id);695ERR_FAIL_NULL(ae);696_ensure_node(p_id, ae);697698if (!p_value.is_empty()) {699Vector<uint8_t> ch_length;700accesskit_node_set_value(ae->node, p_value.utf8(&ch_length).ptr());701accesskit_node_set_character_lengths(ae->node, ch_length.size(), ch_length.ptr());702} else {703accesskit_node_clear_value(ae->node);704accesskit_node_clear_character_lengths(ae->node);705}706}707708void AccessibilityDriverAccessKit::accessibility_update_set_tooltip(const RID &p_id, const String &p_tooltip) {709ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");710711AccessibilityElement *ae = rid_owner.get_or_null(p_id);712ERR_FAIL_NULL(ae);713_ensure_node(p_id, ae);714715if (!p_tooltip.is_empty()) {716accesskit_node_set_tooltip(ae->node, p_tooltip.utf8().ptr());717} else {718accesskit_node_clear_tooltip(ae->node);719}720}721722void AccessibilityDriverAccessKit::accessibility_update_set_bounds(const RID &p_id, const Rect2 &p_rect) {723ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");724725AccessibilityElement *ae = rid_owner.get_or_null(p_id);726ERR_FAIL_NULL(ae);727_ensure_node(p_id, ae);728729accesskit_rect rect;730rect.x0 = p_rect.position.x;731rect.y0 = p_rect.position.y;732rect.x1 = p_rect.position.x + p_rect.size.x;733rect.y1 = p_rect.position.y + p_rect.size.y;734accesskit_node_set_bounds(ae->node, rect);735}736737void AccessibilityDriverAccessKit::accessibility_update_set_transform(const RID &p_id, const Transform2D &p_transform) {738ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");739740AccessibilityElement *ae = rid_owner.get_or_null(p_id);741ERR_FAIL_NULL(ae);742_ensure_node(p_id, ae);743744accesskit_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] };745accesskit_node_set_transform(ae->node, transform);746}747748void AccessibilityDriverAccessKit::accessibility_update_add_child(const RID &p_id, const RID &p_child_id) {749ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");750751AccessibilityElement *ae = rid_owner.get_or_null(p_id);752ERR_FAIL_NULL(ae);753AccessibilityElement *other_ae = rid_owner.get_or_null(p_child_id);754ERR_FAIL_NULL(other_ae);755ERR_FAIL_COND(other_ae->window_id != ae->window_id);756_ensure_node(p_id, ae);757758accesskit_node_push_child(ae->node, (accesskit_node_id)p_child_id.get_id());759}760761void AccessibilityDriverAccessKit::accessibility_update_add_related_controls(const RID &p_id, const RID &p_related_id) {762ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");763764AccessibilityElement *ae = rid_owner.get_or_null(p_id);765ERR_FAIL_NULL(ae);766AccessibilityElement *other_ae = rid_owner.get_or_null(p_related_id);767ERR_FAIL_NULL(other_ae);768ERR_FAIL_COND(other_ae->window_id != ae->window_id);769_ensure_node(p_id, ae);770771accesskit_node_push_controlled(ae->node, (accesskit_node_id)p_related_id.get_id());772}773774void AccessibilityDriverAccessKit::accessibility_update_add_related_details(const RID &p_id, const RID &p_related_id) {775ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");776777AccessibilityElement *ae = rid_owner.get_or_null(p_id);778ERR_FAIL_NULL(ae);779AccessibilityElement *other_ae = rid_owner.get_or_null(p_related_id);780ERR_FAIL_NULL(other_ae);781ERR_FAIL_COND(other_ae->window_id != ae->window_id);782_ensure_node(p_id, ae);783784accesskit_node_push_detail(ae->node, (accesskit_node_id)p_related_id.get_id());785}786787void AccessibilityDriverAccessKit::accessibility_update_add_related_described_by(const RID &p_id, const RID &p_related_id) {788ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");789790AccessibilityElement *ae = rid_owner.get_or_null(p_id);791ERR_FAIL_NULL(ae);792AccessibilityElement *other_ae = rid_owner.get_or_null(p_related_id);793ERR_FAIL_NULL(other_ae);794ERR_FAIL_COND(other_ae->window_id != ae->window_id);795_ensure_node(p_id, ae);796797accesskit_node_push_described_by(ae->node, (accesskit_node_id)p_related_id.get_id());798}799800void AccessibilityDriverAccessKit::accessibility_update_add_related_flow_to(const RID &p_id, const RID &p_related_id) {801ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");802803AccessibilityElement *ae = rid_owner.get_or_null(p_id);804ERR_FAIL_NULL(ae);805AccessibilityElement *other_ae = rid_owner.get_or_null(p_related_id);806ERR_FAIL_NULL(other_ae);807ERR_FAIL_COND(other_ae->window_id != ae->window_id);808_ensure_node(p_id, ae);809810accesskit_node_push_flow_to(ae->node, (accesskit_node_id)p_related_id.get_id());811}812813void AccessibilityDriverAccessKit::accessibility_update_add_related_labeled_by(const RID &p_id, const RID &p_related_id) {814ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");815816AccessibilityElement *ae = rid_owner.get_or_null(p_id);817ERR_FAIL_NULL(ae);818AccessibilityElement *other_ae = rid_owner.get_or_null(p_related_id);819ERR_FAIL_NULL(other_ae);820ERR_FAIL_COND(other_ae->window_id != ae->window_id);821_ensure_node(p_id, ae);822823accesskit_node_push_labelled_by(ae->node, (accesskit_node_id)p_related_id.get_id());824}825826void AccessibilityDriverAccessKit::accessibility_update_add_related_radio_group(const RID &p_id, const RID &p_related_id) {827ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");828829AccessibilityElement *ae = rid_owner.get_or_null(p_id);830ERR_FAIL_NULL(ae);831AccessibilityElement *other_ae = rid_owner.get_or_null(p_related_id);832ERR_FAIL_NULL(other_ae);833ERR_FAIL_COND(other_ae->window_id != ae->window_id);834_ensure_node(p_id, ae);835836accesskit_node_push_to_radio_group(ae->node, (accesskit_node_id)p_related_id.get_id());837}838839void AccessibilityDriverAccessKit::accessibility_update_set_active_descendant(const RID &p_id, const RID &p_other_id) {840ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");841842AccessibilityElement *ae = rid_owner.get_or_null(p_id);843ERR_FAIL_NULL(ae);844AccessibilityElement *other_ae = rid_owner.get_or_null(p_other_id);845ERR_FAIL_NULL(other_ae);846ERR_FAIL_COND(other_ae->window_id != ae->window_id);847_ensure_node(p_id, ae);848849accesskit_node_set_active_descendant(ae->node, (accesskit_node_id)p_other_id.get_id());850}851852void AccessibilityDriverAccessKit::accessibility_update_set_next_on_line(const RID &p_id, const RID &p_other_id) {853ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");854855AccessibilityElement *ae = rid_owner.get_or_null(p_id);856ERR_FAIL_NULL(ae);857AccessibilityElement *other_ae = rid_owner.get_or_null(p_other_id);858ERR_FAIL_NULL(other_ae);859ERR_FAIL_COND(other_ae->window_id != ae->window_id);860_ensure_node(p_id, ae);861862accesskit_node_set_next_on_line(ae->node, (accesskit_node_id)p_other_id.get_id());863}864865void AccessibilityDriverAccessKit::accessibility_update_set_previous_on_line(const RID &p_id, const RID &p_other_id) {866ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");867868AccessibilityElement *ae = rid_owner.get_or_null(p_id);869ERR_FAIL_NULL(ae);870AccessibilityElement *other_ae = rid_owner.get_or_null(p_other_id);871ERR_FAIL_NULL(other_ae);872ERR_FAIL_COND(other_ae->window_id != ae->window_id);873_ensure_node(p_id, ae);874875accesskit_node_set_previous_on_line(ae->node, (accesskit_node_id)p_other_id.get_id());876}877878void AccessibilityDriverAccessKit::accessibility_update_set_member_of(const RID &p_id, const RID &p_group_id) {879ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");880881AccessibilityElement *ae = rid_owner.get_or_null(p_id);882ERR_FAIL_NULL(ae);883AccessibilityElement *other_ae = rid_owner.get_or_null(p_group_id);884ERR_FAIL_NULL(other_ae);885ERR_FAIL_COND(other_ae->window_id != ae->window_id);886_ensure_node(p_id, ae);887888accesskit_node_set_member_of(ae->node, (accesskit_node_id)p_group_id.get_id());889}890891void AccessibilityDriverAccessKit::accessibility_update_set_in_page_link_target(const RID &p_id, const RID &p_other_id) {892ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");893894AccessibilityElement *ae = rid_owner.get_or_null(p_id);895ERR_FAIL_NULL(ae);896AccessibilityElement *other_ae = rid_owner.get_or_null(p_other_id);897ERR_FAIL_NULL(other_ae);898ERR_FAIL_COND(other_ae->window_id != ae->window_id);899_ensure_node(p_id, ae);900901accesskit_node_set_in_page_link_target(ae->node, (accesskit_node_id)p_other_id.get_id());902}903904void AccessibilityDriverAccessKit::accessibility_update_set_error_message(const RID &p_id, const RID &p_other_id) {905ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");906907AccessibilityElement *ae = rid_owner.get_or_null(p_id);908ERR_FAIL_NULL(ae);909AccessibilityElement *other_ae = rid_owner.get_or_null(p_other_id);910ERR_FAIL_NULL(other_ae);911ERR_FAIL_COND(other_ae->window_id != ae->window_id);912_ensure_node(p_id, ae);913914accesskit_node_set_error_message(ae->node, (accesskit_node_id)p_other_id.get_id());915}916917void AccessibilityDriverAccessKit::accessibility_update_set_live(const RID &p_id, DisplayServer::AccessibilityLiveMode p_live) {918ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");919920AccessibilityElement *ae = rid_owner.get_or_null(p_id);921ERR_FAIL_NULL(ae);922_ensure_node(p_id, ae);923924switch (p_live) {925case DisplayServer::AccessibilityLiveMode::LIVE_OFF: {926accesskit_node_set_live(ae->node, ACCESSKIT_LIVE_OFF);927} break;928case DisplayServer::AccessibilityLiveMode::LIVE_POLITE: {929accesskit_node_set_live(ae->node, ACCESSKIT_LIVE_POLITE);930} break;931case DisplayServer::AccessibilityLiveMode::LIVE_ASSERTIVE: {932accesskit_node_set_live(ae->node, ACCESSKIT_LIVE_ASSERTIVE);933} break;934}935}936937void AccessibilityDriverAccessKit::accessibility_update_add_action(const RID &p_id, DisplayServer::AccessibilityAction p_action, const Callable &p_callable) {938ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");939940AccessibilityElement *ae = rid_owner.get_or_null(p_id);941ERR_FAIL_NULL(ae);942_ensure_node(p_id, ae);943944ae->actions[_accessibility_action(p_action)] = p_callable;945946accesskit_node_add_action(ae->node, _accessibility_action(p_action));947}948949void AccessibilityDriverAccessKit::accessibility_update_add_custom_action(const RID &p_id, int p_action_id, const String &p_action_description) {950ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");951952AccessibilityElement *ae = rid_owner.get_or_null(p_id);953ERR_FAIL_NULL(ae);954_ensure_node(p_id, ae);955956if (!p_action_description.is_empty()) {957accesskit_custom_action ca = accesskit_custom_action_new(p_action_id, p_action_description.utf8().ptr());958accesskit_node_push_custom_action(ae->node, ca);959} else {960String cs_name = vformat("Custom Action %d", p_action_id);961accesskit_custom_action ca = accesskit_custom_action_new(p_action_id, cs_name.utf8().ptr());962accesskit_node_push_custom_action(ae->node, ca);963}964}965966void AccessibilityDriverAccessKit::accessibility_update_set_table_row_count(const RID &p_id, int p_count) {967ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");968969AccessibilityElement *ae = rid_owner.get_or_null(p_id);970ERR_FAIL_NULL(ae);971_ensure_node(p_id, ae);972973accesskit_node_set_row_count(ae->node, p_count);974}975976void AccessibilityDriverAccessKit::accessibility_update_set_table_column_count(const RID &p_id, int p_count) {977ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");978979AccessibilityElement *ae = rid_owner.get_or_null(p_id);980ERR_FAIL_NULL(ae);981_ensure_node(p_id, ae);982983accesskit_node_set_column_count(ae->node, p_count);984}985986void AccessibilityDriverAccessKit::accessibility_update_set_table_row_index(const RID &p_id, int p_index) {987ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");988989AccessibilityElement *ae = rid_owner.get_or_null(p_id);990ERR_FAIL_NULL(ae);991_ensure_node(p_id, ae);992993accesskit_node_set_row_index(ae->node, p_index);994}995996void AccessibilityDriverAccessKit::accessibility_update_set_table_column_index(const RID &p_id, int p_index) {997ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");998999AccessibilityElement *ae = rid_owner.get_or_null(p_id);1000ERR_FAIL_NULL(ae);1001_ensure_node(p_id, ae);10021003accesskit_node_set_column_index(ae->node, p_index);1004}10051006void AccessibilityDriverAccessKit::accessibility_update_set_table_cell_position(const RID &p_id, int p_row_index, int p_column_index) {1007ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");10081009AccessibilityElement *ae = rid_owner.get_or_null(p_id);1010ERR_FAIL_NULL(ae);1011_ensure_node(p_id, ae);10121013accesskit_node_set_row_index(ae->node, p_row_index);1014accesskit_node_set_column_index(ae->node, p_column_index);1015}10161017void AccessibilityDriverAccessKit::accessibility_update_set_table_cell_span(const RID &p_id, int p_row_span, int p_column_span) {1018ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");10191020AccessibilityElement *ae = rid_owner.get_or_null(p_id);1021ERR_FAIL_NULL(ae);1022_ensure_node(p_id, ae);10231024accesskit_node_set_row_span(ae->node, p_row_span);1025accesskit_node_set_column_span(ae->node, p_column_span);1026}10271028void AccessibilityDriverAccessKit::accessibility_update_set_list_item_count(const RID &p_id, int p_size) {1029ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");10301031AccessibilityElement *ae = rid_owner.get_or_null(p_id);1032ERR_FAIL_NULL(ae);1033_ensure_node(p_id, ae);10341035accesskit_node_set_size_of_set(ae->node, p_size);1036}10371038void AccessibilityDriverAccessKit::accessibility_update_set_list_item_index(const RID &p_id, int p_index) {1039ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");10401041AccessibilityElement *ae = rid_owner.get_or_null(p_id);1042ERR_FAIL_NULL(ae);1043_ensure_node(p_id, ae);10441045accesskit_node_set_position_in_set(ae->node, p_index);1046}10471048void AccessibilityDriverAccessKit::accessibility_update_set_list_item_level(const RID &p_id, int p_level) {1049ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");10501051AccessibilityElement *ae = rid_owner.get_or_null(p_id);1052ERR_FAIL_NULL(ae);1053_ensure_node(p_id, ae);10541055accesskit_node_set_level(ae->node, p_level);1056}10571058void AccessibilityDriverAccessKit::accessibility_update_set_list_item_selected(const RID &p_id, bool p_selected) {1059ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");10601061AccessibilityElement *ae = rid_owner.get_or_null(p_id);1062ERR_FAIL_NULL(ae);1063_ensure_node(p_id, ae);10641065accesskit_node_set_selected(ae->node, p_selected);1066}10671068void AccessibilityDriverAccessKit::accessibility_update_set_list_item_expanded(const RID &p_id, bool p_expanded) {1069ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");10701071AccessibilityElement *ae = rid_owner.get_or_null(p_id);1072ERR_FAIL_NULL(ae);1073_ensure_node(p_id, ae);10741075accesskit_node_set_expanded(ae->node, p_expanded);1076}10771078void AccessibilityDriverAccessKit::accessibility_update_set_popup_type(const RID &p_id, DisplayServer::AccessibilityPopupType p_popup) {1079ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");10801081AccessibilityElement *ae = rid_owner.get_or_null(p_id);1082ERR_FAIL_NULL(ae);1083_ensure_node(p_id, ae);10841085switch (p_popup) {1086case DisplayServer::AccessibilityPopupType::POPUP_MENU: {1087accesskit_node_set_has_popup(ae->node, ACCESSKIT_HAS_POPUP_MENU);1088} break;1089case DisplayServer::AccessibilityPopupType::POPUP_LIST: {1090accesskit_node_set_has_popup(ae->node, ACCESSKIT_HAS_POPUP_LISTBOX);1091} break;1092case DisplayServer::AccessibilityPopupType::POPUP_TREE: {1093accesskit_node_set_has_popup(ae->node, ACCESSKIT_HAS_POPUP_TREE);1094} break;1095case DisplayServer::AccessibilityPopupType::POPUP_DIALOG: {1096accesskit_node_set_has_popup(ae->node, ACCESSKIT_HAS_POPUP_DIALOG);1097} break;1098}1099}11001101void AccessibilityDriverAccessKit::accessibility_update_set_checked(const RID &p_id, bool p_checekd) {1102ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");11031104AccessibilityElement *ae = rid_owner.get_or_null(p_id);1105ERR_FAIL_NULL(ae);1106_ensure_node(p_id, ae);11071108if (p_checekd) {1109accesskit_node_set_toggled(ae->node, ACCESSKIT_TOGGLED_TRUE);1110} else {1111accesskit_node_set_toggled(ae->node, ACCESSKIT_TOGGLED_FALSE);1112}1113}11141115void AccessibilityDriverAccessKit::accessibility_update_set_num_value(const RID &p_id, double p_position) {1116ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");11171118AccessibilityElement *ae = rid_owner.get_or_null(p_id);1119ERR_FAIL_NULL(ae);1120_ensure_node(p_id, ae);11211122accesskit_node_set_numeric_value(ae->node, p_position);1123}11241125void AccessibilityDriverAccessKit::accessibility_update_set_num_range(const RID &p_id, double p_min, double p_max) {1126ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");11271128AccessibilityElement *ae = rid_owner.get_or_null(p_id);1129ERR_FAIL_NULL(ae);1130_ensure_node(p_id, ae);11311132accesskit_node_set_min_numeric_value(ae->node, p_min);1133accesskit_node_set_max_numeric_value(ae->node, p_max);1134}11351136void AccessibilityDriverAccessKit::accessibility_update_set_num_step(const RID &p_id, double p_step) {1137ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");11381139AccessibilityElement *ae = rid_owner.get_or_null(p_id);1140ERR_FAIL_NULL(ae);1141_ensure_node(p_id, ae);11421143accesskit_node_set_numeric_value_step(ae->node, p_step);1144}11451146void AccessibilityDriverAccessKit::accessibility_update_set_num_jump(const RID &p_id, double p_jump) {1147ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");11481149AccessibilityElement *ae = rid_owner.get_or_null(p_id);1150ERR_FAIL_NULL(ae);1151_ensure_node(p_id, ae);11521153accesskit_node_set_numeric_value_jump(ae->node, p_jump);1154}11551156void AccessibilityDriverAccessKit::accessibility_update_set_scroll_x(const RID &p_id, double p_position) {1157ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");11581159AccessibilityElement *ae = rid_owner.get_or_null(p_id);1160ERR_FAIL_NULL(ae);1161_ensure_node(p_id, ae);11621163accesskit_node_set_scroll_x(ae->node, p_position);1164}11651166void AccessibilityDriverAccessKit::accessibility_update_set_scroll_x_range(const RID &p_id, double p_min, double p_max) {1167ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");11681169AccessibilityElement *ae = rid_owner.get_or_null(p_id);1170ERR_FAIL_NULL(ae);1171_ensure_node(p_id, ae);11721173accesskit_node_set_scroll_x_min(ae->node, p_min);1174accesskit_node_set_scroll_x_max(ae->node, p_max);1175}11761177void AccessibilityDriverAccessKit::accessibility_update_set_scroll_y(const RID &p_id, double p_position) {1178ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");11791180AccessibilityElement *ae = rid_owner.get_or_null(p_id);1181ERR_FAIL_NULL(ae);1182_ensure_node(p_id, ae);11831184accesskit_node_set_scroll_y(ae->node, p_position);1185}11861187void AccessibilityDriverAccessKit::accessibility_update_set_scroll_y_range(const RID &p_id, double p_min, double p_max) {1188ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");11891190AccessibilityElement *ae = rid_owner.get_or_null(p_id);1191ERR_FAIL_NULL(ae);1192_ensure_node(p_id, ae);11931194accesskit_node_set_scroll_y_min(ae->node, p_min);1195accesskit_node_set_scroll_y_max(ae->node, p_max);1196}11971198void AccessibilityDriverAccessKit::accessibility_update_set_text_decorations(const RID &p_id, bool p_underline, bool p_strikethrough, bool p_overline) {1199ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");12001201AccessibilityElement *ae = rid_owner.get_or_null(p_id);1202ERR_FAIL_NULL(ae);1203_ensure_node(p_id, ae);12041205if (p_underline) {1206accesskit_node_set_underline(ae->node, ACCESSKIT_TEXT_DECORATION_SOLID);1207} else {1208accesskit_node_clear_underline(ae->node);1209}1210if (p_overline) {1211accesskit_node_set_overline(ae->node, ACCESSKIT_TEXT_DECORATION_SOLID);1212} else {1213accesskit_node_clear_overline(ae->node);1214}1215if (p_strikethrough) {1216accesskit_node_set_strikethrough(ae->node, ACCESSKIT_TEXT_DECORATION_SOLID);1217} else {1218accesskit_node_clear_strikethrough(ae->node);1219}1220}12211222void AccessibilityDriverAccessKit::accessibility_update_set_text_align(const RID &p_id, HorizontalAlignment p_align) {1223ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");12241225AccessibilityElement *ae = rid_owner.get_or_null(p_id);1226ERR_FAIL_NULL(ae);1227_ensure_node(p_id, ae);12281229switch (p_align) {1230case HORIZONTAL_ALIGNMENT_LEFT: {1231accesskit_node_set_text_align(ae->node, ACCESSKIT_TEXT_ALIGN_LEFT);1232} break;1233case HORIZONTAL_ALIGNMENT_CENTER: {1234accesskit_node_set_text_align(ae->node, ACCESSKIT_TEXT_ALIGN_RIGHT);1235} break;1236case HORIZONTAL_ALIGNMENT_RIGHT: {1237accesskit_node_set_text_align(ae->node, ACCESSKIT_TEXT_ALIGN_CENTER);1238} break;1239case HORIZONTAL_ALIGNMENT_FILL: {1240accesskit_node_set_text_align(ae->node, ACCESSKIT_TEXT_ALIGN_JUSTIFY);1241} break;1242}1243}12441245void 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) {1246ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");12471248AccessibilityElement *ae = rid_owner.get_or_null(p_id);1249ERR_FAIL_NULL(ae);1250AccessibilityElement *start_ae = rid_owner.get_or_null(p_text_start_id);1251ERR_FAIL_NULL(start_ae);1252ERR_FAIL_COND(start_ae->window_id != ae->window_id);1253AccessibilityElement *end_ae = rid_owner.get_or_null(p_text_end_id);1254ERR_FAIL_NULL(end_ae);1255ERR_FAIL_COND(end_ae->window_id != ae->window_id);12561257int start_pos = p_start_char;1258int end_pos = p_end_char;1259RID start_rid;1260RID end_rid;1261for (const RID &rid : start_ae->children) {1262const AccessibilityElement *child_ae = rid_owner.get_or_null(rid);1263if (child_ae && child_ae->role == ACCESSKIT_ROLE_TEXT_RUN) {1264if (p_start_char >= child_ae->run.x && p_start_char <= child_ae->run.y) {1265start_rid = rid;1266start_pos = p_start_char - child_ae->run.x;1267break;1268}1269}1270}1271for (const RID &rid : end_ae->children) {1272const AccessibilityElement *child_ae = rid_owner.get_or_null(rid);1273if (child_ae && child_ae->role == ACCESSKIT_ROLE_TEXT_RUN) {1274if (p_end_char >= child_ae->run.x && p_end_char <= child_ae->run.y) {1275end_rid = rid;1276end_pos = p_end_char - child_ae->run.x;1277break;1278}1279}1280}1281ERR_FAIL_COND(start_rid.is_null() && end_rid.is_null());1282_ensure_node(p_id, ae);12831284accesskit_text_selection sel;1285sel.anchor.node = (accesskit_node_id)start_rid.get_id();1286sel.anchor.character_index = start_pos;1287sel.focus.node = (accesskit_node_id)end_rid.get_id();1288sel.focus.character_index = end_pos;1289accesskit_node_set_text_selection(ae->node, sel);1290}12911292void AccessibilityDriverAccessKit::accessibility_update_set_flag(const RID &p_id, DisplayServer::AccessibilityFlags p_flag, bool p_value) {1293ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");12941295AccessibilityElement *ae = rid_owner.get_or_null(p_id);1296ERR_FAIL_NULL(ae);1297_ensure_node(p_id, ae);12981299switch (p_flag) {1300case DisplayServer::AccessibilityFlags::FLAG_HIDDEN: {1301if (p_value) {1302accesskit_node_set_hidden(ae->node);1303} else {1304accesskit_node_clear_hidden(ae->node);1305}1306} break;1307case DisplayServer::AccessibilityFlags::FLAG_MULTISELECTABLE: {1308if (p_value) {1309accesskit_node_set_multiselectable(ae->node);1310} else {1311accesskit_node_clear_multiselectable(ae->node);1312}1313} break;1314case DisplayServer::AccessibilityFlags::FLAG_REQUIRED: {1315if (p_value) {1316accesskit_node_set_required(ae->node);1317} else {1318accesskit_node_clear_required(ae->node);1319}1320} break;1321case DisplayServer::AccessibilityFlags::FLAG_VISITED: {1322if (p_value) {1323accesskit_node_set_visited(ae->node);1324} else {1325accesskit_node_clear_visited(ae->node);1326}1327} break;1328case DisplayServer::AccessibilityFlags::FLAG_BUSY: {1329if (p_value) {1330accesskit_node_set_busy(ae->node);1331} else {1332accesskit_node_clear_busy(ae->node);1333}1334} break;1335case DisplayServer::AccessibilityFlags::FLAG_MODAL: {1336if (p_value) {1337accesskit_node_set_modal(ae->node);1338} else {1339accesskit_node_clear_modal(ae->node);1340}1341} break;1342case DisplayServer::AccessibilityFlags::FLAG_TOUCH_PASSTHROUGH: {1343if (p_value) {1344accesskit_node_set_touch_transparent(ae->node);1345} else {1346accesskit_node_clear_touch_transparent(ae->node);1347}1348} break;1349case DisplayServer::AccessibilityFlags::FLAG_READONLY: {1350if (p_value) {1351accesskit_node_set_read_only(ae->node);1352} else {1353accesskit_node_clear_read_only(ae->node);1354}1355} break;1356case DisplayServer::AccessibilityFlags::FLAG_DISABLED: {1357if (p_value) {1358accesskit_node_set_disabled(ae->node);1359} else {1360accesskit_node_clear_disabled(ae->node);1361}1362} break;1363case DisplayServer::AccessibilityFlags::FLAG_CLIPS_CHILDREN: {1364if (p_value) {1365accesskit_node_set_clips_children(ae->node);1366} else {1367accesskit_node_clear_clips_children(ae->node);1368}1369} break;1370}1371}13721373void AccessibilityDriverAccessKit::accessibility_update_set_classname(const RID &p_id, const String &p_classname) {1374ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");13751376AccessibilityElement *ae = rid_owner.get_or_null(p_id);1377ERR_FAIL_NULL(ae);1378_ensure_node(p_id, ae);13791380if (!p_classname.is_empty()) {1381accesskit_node_set_class_name(ae->node, p_classname.utf8().ptr());1382} else {1383accesskit_node_clear_class_name(ae->node);1384}1385}13861387void AccessibilityDriverAccessKit::accessibility_update_set_placeholder(const RID &p_id, const String &p_placeholder) {1388ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");13891390AccessibilityElement *ae = rid_owner.get_or_null(p_id);1391ERR_FAIL_NULL(ae);1392_ensure_node(p_id, ae);13931394if (!p_placeholder.is_empty()) {1395accesskit_node_set_placeholder(ae->node, p_placeholder.utf8().ptr());1396} else {1397accesskit_node_clear_placeholder(ae->node);1398}1399}14001401void AccessibilityDriverAccessKit::accessibility_update_set_language(const RID &p_id, const String &p_language) {1402ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");14031404AccessibilityElement *ae = rid_owner.get_or_null(p_id);1405ERR_FAIL_NULL(ae);1406_ensure_node(p_id, ae);14071408accesskit_node_set_language(ae->node, p_language.utf8().ptr());1409}14101411void AccessibilityDriverAccessKit::accessibility_update_set_text_orientation(const RID &p_id, bool p_vertical) {1412ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");14131414AccessibilityElement *ae = rid_owner.get_or_null(p_id);1415ERR_FAIL_NULL(ae);1416_ensure_node(p_id, ae);14171418if (p_vertical) {1419accesskit_node_set_text_direction(ae->node, ACCESSKIT_TEXT_DIRECTION_TOP_TO_BOTTOM);1420} else {1421accesskit_node_set_text_direction(ae->node, ACCESSKIT_TEXT_DIRECTION_LEFT_TO_RIGHT);1422}1423}14241425void AccessibilityDriverAccessKit::accessibility_update_set_list_orientation(const RID &p_id, bool p_vertical) {1426ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");14271428AccessibilityElement *ae = rid_owner.get_or_null(p_id);1429ERR_FAIL_NULL(ae);1430_ensure_node(p_id, ae);14311432if (p_vertical) {1433accesskit_node_set_orientation(ae->node, ACCESSKIT_ORIENTATION_VERTICAL);1434} else {1435accesskit_node_set_orientation(ae->node, ACCESSKIT_ORIENTATION_HORIZONTAL);1436}1437}14381439void AccessibilityDriverAccessKit::accessibility_update_set_shortcut(const RID &p_id, const String &p_shortcut) {1440ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");14411442AccessibilityElement *ae = rid_owner.get_or_null(p_id);1443ERR_FAIL_NULL(ae);1444_ensure_node(p_id, ae);14451446if (!p_shortcut.is_empty()) {1447accesskit_node_set_keyboard_shortcut(ae->node, p_shortcut.utf8().ptr());1448} else {1449accesskit_node_clear_keyboard_shortcut(ae->node);1450}1451}14521453void AccessibilityDriverAccessKit::accessibility_update_set_url(const RID &p_id, const String &p_url) {1454ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");14551456AccessibilityElement *ae = rid_owner.get_or_null(p_id);1457ERR_FAIL_NULL(ae);1458_ensure_node(p_id, ae);14591460if (!p_url.is_empty()) {1461accesskit_node_set_url(ae->node, p_url.utf8().ptr());1462} else {1463accesskit_node_clear_url(ae->node);1464}1465}14661467void AccessibilityDriverAccessKit::accessibility_update_set_role_description(const RID &p_id, const String &p_description) {1468ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");14691470AccessibilityElement *ae = rid_owner.get_or_null(p_id);1471ERR_FAIL_NULL(ae);1472_ensure_node(p_id, ae);14731474if (!p_description.is_empty()) {1475accesskit_node_set_role_description(ae->node, p_description.utf8().ptr());1476} else {1477accesskit_node_clear_role_description(ae->node);1478}1479}14801481void AccessibilityDriverAccessKit::accessibility_update_set_state_description(const RID &p_id, const String &p_description) {1482ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");14831484AccessibilityElement *ae = rid_owner.get_or_null(p_id);1485ERR_FAIL_NULL(ae);1486_ensure_node(p_id, ae);14871488if (!p_description.is_empty()) {1489accesskit_node_set_state_description(ae->node, p_description.utf8().ptr());1490} else {1491accesskit_node_clear_state_description(ae->node);1492}1493}14941495void AccessibilityDriverAccessKit::accessibility_update_set_color_value(const RID &p_id, const Color &p_color) {1496ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");14971498AccessibilityElement *ae = rid_owner.get_or_null(p_id);1499ERR_FAIL_NULL(ae);1500_ensure_node(p_id, ae);15011502accesskit_node_set_color_value(ae->node, p_color.to_rgba32());1503}15041505void AccessibilityDriverAccessKit::accessibility_update_set_background_color(const RID &p_id, const Color &p_color) {1506ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");15071508AccessibilityElement *ae = rid_owner.get_or_null(p_id);1509ERR_FAIL_NULL(ae);1510_ensure_node(p_id, ae);15111512accesskit_node_set_background_color(ae->node, p_color.to_rgba32());1513}15141515void AccessibilityDriverAccessKit::accessibility_update_set_foreground_color(const RID &p_id, const Color &p_color) {1516ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");15171518AccessibilityElement *ae = rid_owner.get_or_null(p_id);1519ERR_FAIL_NULL(ae);1520_ensure_node(p_id, ae);15211522accesskit_node_set_foreground_color(ae->node, p_color.to_rgba32());1523}15241525Error AccessibilityDriverAccessKit::init() {1526#ifdef ACCESSKIT_DYNAMIC1527#ifdef DEBUG_ENABLED1528int dylibloader_verbose = 1;1529#else1530int dylibloader_verbose = 0;1531#endif1532void *library_handle = nullptr;1533String path;1534String arch = Engine::get_singleton()->get_architecture_name();1535#ifdef LINUXBSD_ENABLED1536path = OS::get_singleton()->get_executable_path().get_base_dir().path_join("libaccesskit." + arch + ".so");1537if (!FileAccess::exists(path)) {1538path = OS::get_singleton()->get_executable_path().get_base_dir().path_join("../lib").path_join("libaccesskit." + arch + ".so");1539}1540if (!FileAccess::exists(path)) {1541path = OS::get_singleton()->get_executable_path().get_base_dir().path_join("libaccesskit.so");1542}1543if (!FileAccess::exists(path)) {1544path = OS::get_singleton()->get_executable_path().get_base_dir().path_join("../lib").path_join("libaccesskit.so");1545}1546if (!FileAccess::exists(path)) {1547return ERR_CANT_CREATE;1548}1549#endif1550#ifdef MACOS_ENABLED1551path = OS::get_singleton()->get_executable_path().get_base_dir().path_join("libaccesskit." + arch + ".dylib");1552if (!FileAccess::exists(path)) {1553path = OS::get_singleton()->get_executable_path().get_base_dir().path_join("../Frameworks").path_join("libaccesskit." + arch + ".dylib");1554}1555if (!FileAccess::exists(path)) {1556path = OS::get_singleton()->get_executable_path().get_base_dir().path_join("libaccesskit.dylib");1557}1558if (!FileAccess::exists(path)) {1559path = OS::get_singleton()->get_executable_path().get_base_dir().path_join("../Frameworks").path_join("libaccesskit.dylib");1560}1561if (!FileAccess::exists(path)) {1562return ERR_CANT_CREATE;1563}1564#endif1565#ifdef WINDOWS_ENABLED1566path = OS::get_singleton()->get_executable_path().get_base_dir().path_join("accesskit." + arch + ".dll");1567if (!FileAccess::exists(path)) {1568path = OS::get_singleton()->get_executable_path().get_base_dir().path_join("accesskit.dll");1569}1570if (!FileAccess::exists(path)) {1571return ERR_CANT_CREATE;1572}1573#endif15741575Error err = OS::get_singleton()->open_dynamic_library(path, library_handle);1576if (err == OK && initialize_libaccesskit(dylibloader_verbose, library_handle) == 0) {1577print_verbose("AccessKit loaded.");1578} else {1579return ERR_CANT_CREATE;1580}1581#endif1582#ifdef MACOS_ENABLED1583//accesskit_macos_add_focus_forwarder_to_window_class("GodotWindow");1584#endif1585return OK;1586}15871588AccessibilityDriverAccessKit::AccessibilityDriverAccessKit() {1589singleton = this;15901591role_map[DisplayServer::AccessibilityRole::ROLE_UNKNOWN] = ACCESSKIT_ROLE_UNKNOWN;1592role_map[DisplayServer::AccessibilityRole::ROLE_DEFAULT_BUTTON] = ACCESSKIT_ROLE_DEFAULT_BUTTON;1593role_map[DisplayServer::AccessibilityRole::ROLE_AUDIO] = ACCESSKIT_ROLE_AUDIO;1594role_map[DisplayServer::AccessibilityRole::ROLE_VIDEO] = ACCESSKIT_ROLE_VIDEO;1595role_map[DisplayServer::AccessibilityRole::ROLE_STATIC_TEXT] = ACCESSKIT_ROLE_LABEL;1596role_map[DisplayServer::AccessibilityRole::ROLE_CONTAINER] = ACCESSKIT_ROLE_GENERIC_CONTAINER;1597role_map[DisplayServer::AccessibilityRole::ROLE_PANEL] = ACCESSKIT_ROLE_PANE;1598role_map[DisplayServer::AccessibilityRole::ROLE_BUTTON] = ACCESSKIT_ROLE_BUTTON;1599role_map[DisplayServer::AccessibilityRole::ROLE_LINK] = ACCESSKIT_ROLE_LINK;1600role_map[DisplayServer::AccessibilityRole::ROLE_CHECK_BOX] = ACCESSKIT_ROLE_CHECK_BOX;1601role_map[DisplayServer::AccessibilityRole::ROLE_RADIO_BUTTON] = ACCESSKIT_ROLE_RADIO_BUTTON;1602role_map[DisplayServer::AccessibilityRole::ROLE_CHECK_BUTTON] = ACCESSKIT_ROLE_SWITCH;1603role_map[DisplayServer::AccessibilityRole::ROLE_SCROLL_BAR] = ACCESSKIT_ROLE_SCROLL_BAR;1604role_map[DisplayServer::AccessibilityRole::ROLE_SCROLL_VIEW] = ACCESSKIT_ROLE_SCROLL_VIEW;1605role_map[DisplayServer::AccessibilityRole::ROLE_SPLITTER] = ACCESSKIT_ROLE_SPLITTER;1606role_map[DisplayServer::AccessibilityRole::ROLE_SLIDER] = ACCESSKIT_ROLE_SLIDER;1607role_map[DisplayServer::AccessibilityRole::ROLE_SPIN_BUTTON] = ACCESSKIT_ROLE_SPIN_BUTTON;1608role_map[DisplayServer::AccessibilityRole::ROLE_PROGRESS_INDICATOR] = ACCESSKIT_ROLE_PROGRESS_INDICATOR;1609role_map[DisplayServer::AccessibilityRole::ROLE_TEXT_FIELD] = ACCESSKIT_ROLE_TEXT_INPUT;1610role_map[DisplayServer::AccessibilityRole::ROLE_MULTILINE_TEXT_FIELD] = ACCESSKIT_ROLE_MULTILINE_TEXT_INPUT;1611role_map[DisplayServer::AccessibilityRole::ROLE_COLOR_PICKER] = ACCESSKIT_ROLE_COLOR_WELL;1612role_map[DisplayServer::AccessibilityRole::ROLE_TABLE] = ACCESSKIT_ROLE_TABLE;1613role_map[DisplayServer::AccessibilityRole::ROLE_CELL] = ACCESSKIT_ROLE_CELL;1614role_map[DisplayServer::AccessibilityRole::ROLE_ROW] = ACCESSKIT_ROLE_ROW;1615role_map[DisplayServer::AccessibilityRole::ROLE_ROW_GROUP] = ACCESSKIT_ROLE_ROW_GROUP;1616role_map[DisplayServer::AccessibilityRole::ROLE_ROW_HEADER] = ACCESSKIT_ROLE_ROW_HEADER;1617role_map[DisplayServer::AccessibilityRole::ROLE_COLUMN_HEADER] = ACCESSKIT_ROLE_COLUMN_HEADER;1618role_map[DisplayServer::AccessibilityRole::ROLE_TREE] = ACCESSKIT_ROLE_TREE;1619role_map[DisplayServer::AccessibilityRole::ROLE_TREE_ITEM] = ACCESSKIT_ROLE_TREE_ITEM;1620role_map[DisplayServer::AccessibilityRole::ROLE_LIST] = ACCESSKIT_ROLE_LIST;1621role_map[DisplayServer::AccessibilityRole::ROLE_LIST_ITEM] = ACCESSKIT_ROLE_LIST_ITEM;1622role_map[DisplayServer::AccessibilityRole::ROLE_LIST_BOX] = ACCESSKIT_ROLE_LIST_BOX;1623role_map[DisplayServer::AccessibilityRole::ROLE_LIST_BOX_OPTION] = ACCESSKIT_ROLE_LIST_BOX_OPTION;1624role_map[DisplayServer::AccessibilityRole::ROLE_TAB_BAR] = ACCESSKIT_ROLE_TAB_LIST;1625role_map[DisplayServer::AccessibilityRole::ROLE_TAB] = ACCESSKIT_ROLE_TAB;1626role_map[DisplayServer::AccessibilityRole::ROLE_TAB_PANEL] = ACCESSKIT_ROLE_TAB_PANEL;1627role_map[DisplayServer::AccessibilityRole::ROLE_MENU_BAR] = ACCESSKIT_ROLE_MENU_BAR;1628role_map[DisplayServer::AccessibilityRole::ROLE_MENU] = ACCESSKIT_ROLE_MENU;1629role_map[DisplayServer::AccessibilityRole::ROLE_MENU_ITEM] = ACCESSKIT_ROLE_MENU_ITEM;1630role_map[DisplayServer::AccessibilityRole::ROLE_MENU_ITEM_CHECK_BOX] = ACCESSKIT_ROLE_MENU_ITEM_CHECK_BOX;1631role_map[DisplayServer::AccessibilityRole::ROLE_MENU_ITEM_RADIO] = ACCESSKIT_ROLE_MENU_ITEM_RADIO;1632role_map[DisplayServer::AccessibilityRole::ROLE_IMAGE] = ACCESSKIT_ROLE_IMAGE;1633role_map[DisplayServer::AccessibilityRole::ROLE_WINDOW] = ACCESSKIT_ROLE_WINDOW;1634role_map[DisplayServer::AccessibilityRole::ROLE_TITLE_BAR] = ACCESSKIT_ROLE_TITLE_BAR;1635role_map[DisplayServer::AccessibilityRole::ROLE_DIALOG] = ACCESSKIT_ROLE_DIALOG;1636role_map[DisplayServer::AccessibilityRole::ROLE_TOOLTIP] = ACCESSKIT_ROLE_TOOLTIP;16371638action_map[DisplayServer::AccessibilityAction::ACTION_CLICK] = ACCESSKIT_ACTION_CLICK;1639action_map[DisplayServer::AccessibilityAction::ACTION_FOCUS] = ACCESSKIT_ACTION_FOCUS;1640action_map[DisplayServer::AccessibilityAction::ACTION_BLUR] = ACCESSKIT_ACTION_BLUR;1641action_map[DisplayServer::AccessibilityAction::ACTION_COLLAPSE] = ACCESSKIT_ACTION_COLLAPSE;1642action_map[DisplayServer::AccessibilityAction::ACTION_EXPAND] = ACCESSKIT_ACTION_EXPAND;1643action_map[DisplayServer::AccessibilityAction::ACTION_DECREMENT] = ACCESSKIT_ACTION_DECREMENT;1644action_map[DisplayServer::AccessibilityAction::ACTION_INCREMENT] = ACCESSKIT_ACTION_INCREMENT;1645action_map[DisplayServer::AccessibilityAction::ACTION_HIDE_TOOLTIP] = ACCESSKIT_ACTION_HIDE_TOOLTIP;1646action_map[DisplayServer::AccessibilityAction::ACTION_SHOW_TOOLTIP] = ACCESSKIT_ACTION_SHOW_TOOLTIP;1647//action_map[DisplayServer::AccessibilityAction::ACTION_INVALIDATE_TREE] = ACCESSKIT_ACTION_INVALIDATE_TREE;1648//action_map[DisplayServer::AccessibilityAction::ACTION_LOAD_INLINE_TEXT_BOXES] = ACCESSKIT_ACTION_LOAD_INLINE_TEXT_BOXES;1649action_map[DisplayServer::AccessibilityAction::ACTION_SET_TEXT_SELECTION] = ACCESSKIT_ACTION_SET_TEXT_SELECTION;1650action_map[DisplayServer::AccessibilityAction::ACTION_REPLACE_SELECTED_TEXT] = ACCESSKIT_ACTION_REPLACE_SELECTED_TEXT;1651action_map[DisplayServer::AccessibilityAction::ACTION_SCROLL_BACKWARD] = ACCESSKIT_ACTION_SCROLL_UP;1652action_map[DisplayServer::AccessibilityAction::ACTION_SCROLL_DOWN] = ACCESSKIT_ACTION_SCROLL_DOWN;1653action_map[DisplayServer::AccessibilityAction::ACTION_SCROLL_FORWARD] = ACCESSKIT_ACTION_SCROLL_DOWN;1654action_map[DisplayServer::AccessibilityAction::ACTION_SCROLL_LEFT] = ACCESSKIT_ACTION_SCROLL_LEFT;1655action_map[DisplayServer::AccessibilityAction::ACTION_SCROLL_RIGHT] = ACCESSKIT_ACTION_SCROLL_RIGHT;1656action_map[DisplayServer::AccessibilityAction::ACTION_SCROLL_UP] = ACCESSKIT_ACTION_SCROLL_UP;1657action_map[DisplayServer::AccessibilityAction::ACTION_SCROLL_INTO_VIEW] = ACCESSKIT_ACTION_SCROLL_INTO_VIEW;1658action_map[DisplayServer::AccessibilityAction::ACTION_SCROLL_TO_POINT] = ACCESSKIT_ACTION_SCROLL_TO_POINT;1659action_map[DisplayServer::AccessibilityAction::ACTION_SET_SCROLL_OFFSET] = ACCESSKIT_ACTION_SET_SCROLL_OFFSET;1660//action_map[DisplayServer::AccessibilityAction::ACTION_SET_SEQUENTIAL_FOCUS_NAVIGATION_STARTING_POINT] = ACCESSKIT_ACTION_SET_SEQUENTIAL_FOCUS_NAVIGATION_STARTING_POINT;1661action_map[DisplayServer::AccessibilityAction::ACTION_SET_VALUE] = ACCESSKIT_ACTION_SET_VALUE;1662action_map[DisplayServer::AccessibilityAction::ACTION_SHOW_CONTEXT_MENU] = ACCESSKIT_ACTION_SHOW_CONTEXT_MENU;1663action_map[DisplayServer::AccessibilityAction::ACTION_CUSTOM] = ACCESSKIT_ACTION_CUSTOM_ACTION;1664}16651666AccessibilityDriverAccessKit::~AccessibilityDriverAccessKit() {1667singleton = nullptr;1668}16691670#endif // ACCESSKIT_ENABLED167116721673