Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
godotengine
GitHub Repository: godotengine/godot
Path: blob/master/drivers/accesskit/accessibility_server_accesskit.cpp
45997 views
1
/**************************************************************************/
2
/* accessibility_server_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
31
#ifdef ACCESSKIT_ENABLED
32
33
#include "accessibility_server_accesskit.h"
34
35
#include "servers/text/text_server.h"
36
37
_FORCE_INLINE_ accesskit_role AccessibilityServerAccessKit::_accessibility_role(AccessibilityServerEnums::AccessibilityRole p_role) const {
38
if (role_map.has(p_role)) {
39
return role_map[p_role];
40
}
41
return ACCESSKIT_ROLE_UNKNOWN;
42
}
43
44
_FORCE_INLINE_ accesskit_action AccessibilityServerAccessKit::_accessibility_action(AccessibilityServerEnums::AccessibilityAction p_action) const {
45
if (action_map.has(p_action)) {
46
return action_map[p_action];
47
}
48
return ACCESSKIT_ACTION_CLICK;
49
}
50
51
bool AccessibilityServerAccessKit::window_create(DisplayServerEnums::WindowID p_window_id, void *p_handle) {
52
ERR_FAIL_COND_V(windows.has(p_window_id), false);
53
54
WindowData &wd = windows[p_window_id];
55
56
AccessibilityElement *ae = memnew(AccessibilityElement);
57
ae->role = ACCESSKIT_ROLE_WINDOW;
58
ae->window_id = p_window_id;
59
wd.root_id = rid_owner.make_rid(ae);
60
61
#ifdef WINDOWS_ENABLED
62
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);
63
#endif
64
#ifdef MACOS_ENABLED
65
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);
66
#endif
67
#ifdef LINUXBSD_ENABLED
68
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);
69
#endif
70
print_verbose(vformat("Accessibility: window %d adapter created.", p_window_id));
71
72
if (wd.adapter == nullptr) {
73
memdelete(ae);
74
rid_owner.free(wd.root_id);
75
windows.erase(p_window_id);
76
77
return false;
78
} else {
79
return true;
80
}
81
}
82
83
void AccessibilityServerAccessKit::window_destroy(DisplayServerEnums::WindowID p_window_id) {
84
WindowData *wd = windows.getptr(p_window_id);
85
ERR_FAIL_NULL(wd);
86
87
print_verbose(vformat("Accessibility: window %d adapter destroyed.", p_window_id));
88
89
#ifdef WINDOWS_ENABLED
90
accesskit_windows_subclassing_adapter_free(wd->adapter);
91
#endif
92
#ifdef MACOS_ENABLED
93
accesskit_macos_subclassing_adapter_free(wd->adapter);
94
#endif
95
#ifdef LINUXBSD_ENABLED
96
accesskit_unix_adapter_free(wd->adapter);
97
#endif
98
free_element(wd->root_id);
99
100
windows.erase(p_window_id);
101
}
102
103
void AccessibilityServerAccessKit::_accessibility_deactivation_callback(void *p_user_data) {
104
DisplayServerEnums::WindowID window_id = (DisplayServerEnums::WindowID)(size_t)p_user_data;
105
WindowData *wd = static_cast<AccessibilityServerAccessKit *>(get_singleton())->windows.getptr(window_id);
106
ERR_FAIL_NULL(wd);
107
108
print_verbose(vformat("Accessibility: window %d adapter deactivated.", window_id));
109
110
if (static_cast<AccessibilityServerAccessKit *>(get_singleton())->focus.is_valid()) {
111
AccessibilityElement *ae = static_cast<AccessibilityServerAccessKit *>(get_singleton())->rid_owner.get_or_null(static_cast<AccessibilityServerAccessKit *>(get_singleton())->focus);
112
if (ae && ae->window_id == window_id) {
113
static_cast<AccessibilityServerAccessKit *>(get_singleton())->focus = RID();
114
}
115
}
116
if (wd->deactivate.is_valid()) {
117
wd->deactivate.call_deferred(); // Should be called on main thread only.
118
}
119
120
wd->activated = false;
121
wd->update.clear();
122
}
123
124
void AccessibilityServerAccessKit::_accessibility_action_callback(struct accesskit_action_request *p_request, void *p_user_data) {
125
DisplayServerEnums::WindowID window_id = (DisplayServerEnums::WindowID)(size_t)p_user_data;
126
ERR_FAIL_COND(!static_cast<AccessibilityServerAccessKit *>(get_singleton())->windows.has(window_id));
127
128
RID rid = RID::from_uint64(p_request->target_node);
129
AccessibilityElement *ae = static_cast<AccessibilityServerAccessKit *>(get_singleton())->rid_owner.get_or_null(rid);
130
ERR_FAIL_NULL(ae);
131
132
Variant rq_data;
133
if (!ae->actions.has(p_request->action) && ae->role == ACCESSKIT_ROLE_TEXT_RUN && p_request->action == ACCESSKIT_ACTION_SCROLL_INTO_VIEW) {
134
AccessibilityElement *root_ae = static_cast<AccessibilityServerAccessKit *>(get_singleton())->rid_owner.get_or_null(ae->parent);
135
ERR_FAIL_NULL(root_ae);
136
ae = root_ae;
137
rq_data = ae->run;
138
}
139
140
if (ae->actions.has(p_request->action)) {
141
Callable &cb = ae->actions[p_request->action];
142
if (cb.is_valid()) {
143
if (p_request->data.has_value) {
144
switch (p_request->data.value.tag) {
145
case ACCESSKIT_ACTION_DATA_CUSTOM_ACTION: {
146
rq_data = p_request->data.value.custom_action;
147
} break;
148
case ACCESSKIT_ACTION_DATA_VALUE: {
149
rq_data = String::utf8(p_request->data.value.value);
150
} break;
151
case ACCESSKIT_ACTION_DATA_NUMERIC_VALUE: {
152
rq_data = p_request->data.value.numeric_value;
153
} break;
154
case ACCESSKIT_ACTION_DATA_SCROLL_HINT: {
155
switch (p_request->data.value.scroll_hint) {
156
case ACCESSKIT_SCROLL_HINT_TOP_LEFT: {
157
rq_data = AccessibilityServerEnums::SCROLL_HINT_TOP_LEFT;
158
} break;
159
case ACCESSKIT_SCROLL_HINT_BOTTOM_RIGHT: {
160
rq_data = AccessibilityServerEnums::SCROLL_HINT_BOTTOM_RIGHT;
161
} break;
162
case ACCESSKIT_SCROLL_HINT_TOP_EDGE: {
163
rq_data = AccessibilityServerEnums::SCROLL_HINT_TOP_EDGE;
164
} break;
165
case ACCESSKIT_SCROLL_HINT_BOTTOM_EDGE: {
166
rq_data = AccessibilityServerEnums::SCROLL_HINT_BOTTOM_EDGE;
167
} break;
168
case ACCESSKIT_SCROLL_HINT_LEFT_EDGE: {
169
rq_data = AccessibilityServerEnums::SCROLL_HINT_LEFT_EDGE;
170
} break;
171
case ACCESSKIT_SCROLL_HINT_RIGHT_EDGE: {
172
rq_data = AccessibilityServerEnums::SCROLL_HINT_RIGHT_EDGE;
173
} break;
174
default:
175
break;
176
}
177
} break;
178
case ACCESSKIT_ACTION_DATA_SCROLL_UNIT: {
179
if (p_request->data.value.scroll_unit == ACCESSKIT_SCROLL_UNIT_ITEM) {
180
rq_data = AccessibilityServerEnums::SCROLL_UNIT_ITEM;
181
} else if (p_request->data.value.scroll_unit == ACCESSKIT_SCROLL_UNIT_PAGE) {
182
rq_data = AccessibilityServerEnums::SCROLL_UNIT_PAGE;
183
}
184
} break;
185
case ACCESSKIT_ACTION_DATA_SCROLL_TO_POINT: {
186
rq_data = Point2(p_request->data.value.scroll_to_point.x, p_request->data.value.scroll_to_point.y);
187
} break;
188
case ACCESSKIT_ACTION_DATA_SET_SCROLL_OFFSET: {
189
rq_data = Point2(p_request->data.value.set_scroll_offset.x, p_request->data.value.set_scroll_offset.y);
190
} break;
191
case ACCESSKIT_ACTION_DATA_SET_TEXT_SELECTION: {
192
Dictionary sel;
193
194
RID start_rid = RID::from_uint64(p_request->data.value.set_text_selection.anchor.node);
195
AccessibilityElement *start_ae = static_cast<AccessibilityServerAccessKit *>(get_singleton())->rid_owner.get_or_null(start_rid);
196
ERR_FAIL_NULL(start_ae);
197
198
RID end_rid = RID::from_uint64(p_request->data.value.set_text_selection.focus.node);
199
AccessibilityElement *end_ae = static_cast<AccessibilityServerAccessKit *>(get_singleton())->rid_owner.get_or_null(end_rid);
200
ERR_FAIL_NULL(end_ae);
201
202
sel["start_element"] = start_ae->parent;
203
sel["start_char"] = (int64_t)p_request->data.value.set_text_selection.anchor.character_index + start_ae->run.x;
204
sel["end_element"] = end_ae->parent;
205
sel["end_char"] = (int64_t)p_request->data.value.set_text_selection.focus.character_index + end_ae->run.x;
206
rq_data = sel;
207
} break;
208
}
209
}
210
211
cb.call_deferred(rq_data);
212
}
213
}
214
}
215
216
accesskit_tree_update *AccessibilityServerAccessKit::_accessibility_initial_tree_update_callback(void *p_user_data) {
217
DisplayServerEnums::WindowID window_id = (DisplayServerEnums::WindowID)(size_t)p_user_data;
218
WindowData *wd = static_cast<AccessibilityServerAccessKit *>(get_singleton())->windows.getptr(window_id);
219
ERR_FAIL_NULL_V(wd, nullptr);
220
221
accesskit_node *win_node = accesskit_node_new(ACCESSKIT_ROLE_WINDOW);
222
accesskit_node_set_label(win_node, "Godot Engine");
223
accesskit_node_set_busy(win_node);
224
225
accesskit_node_id win_id = (accesskit_node_id)wd->root_id.get_id();
226
227
accesskit_tree_update *tree_update = accesskit_tree_update_with_capacity_and_focus(1, win_id);
228
229
accesskit_tree_update_set_tree(tree_update, accesskit_tree_new(win_id));
230
accesskit_tree_update_push_node(tree_update, win_id, win_node);
231
232
print_verbose(vformat("Accessibility: window %d adapter activated.", window_id));
233
234
if (wd->activate.is_valid()) {
235
wd->activate.call_deferred(); // Should be called on main thread only.
236
}
237
wd->activated = true;
238
239
return tree_update;
240
}
241
242
void AccessibilityServerAccessKit::set_window_callbacks(DisplayServerEnums::WindowID p_window_id, const Callable &p_activate_callable, const Callable &p_deativate_callable) {
243
WindowData *wd = static_cast<AccessibilityServerAccessKit *>(get_singleton())->windows.getptr(p_window_id);
244
ERR_FAIL_NULL(wd);
245
246
wd->activate = p_activate_callable;
247
wd->deactivate = p_deativate_callable;
248
}
249
250
void AccessibilityServerAccessKit::window_activation_completed(DisplayServerEnums::WindowID p_window_id) {
251
WindowData *wd = static_cast<AccessibilityServerAccessKit *>(get_singleton())->windows.getptr(p_window_id);
252
if (!wd) {
253
return;
254
}
255
256
print_verbose(vformat("Accessibility: window %d adapter initial update completed.", p_window_id));
257
258
wd->initial_update_completed = true;
259
}
260
261
void AccessibilityServerAccessKit::window_deactivation_completed(DisplayServerEnums::WindowID p_window_id) {
262
WindowData *wd = static_cast<AccessibilityServerAccessKit *>(get_singleton())->windows.getptr(p_window_id);
263
if (!wd) {
264
return;
265
}
266
267
print_verbose(vformat("Accessibility: window %d adapter deactivation completed.", p_window_id));
268
269
#ifdef DEV_ENABLED
270
LocalVector<RID> to_delete;
271
for (const RID &rid : rid_owner.get_owned_list()) {
272
AccessibilityElement *ae = rid_owner.get_or_null(rid);
273
if (rid != wd->root_id && ae && ae->window_id == p_window_id) {
274
ERR_PRINT(vformat("Accessibility/BUG: Accessibility element %d was not deleted on window %d adapter deactivation.", rid.get_id(), p_window_id));
275
to_delete.push_back(rid);
276
}
277
}
278
for (const RID &rid : to_delete) {
279
_free_recursive(wd, rid);
280
}
281
#endif
282
wd->initial_update_completed = false;
283
}
284
285
RID AccessibilityServerAccessKit::create_element(DisplayServerEnums::WindowID p_window_id, AccessibilityServerEnums::AccessibilityRole p_role) {
286
AccessibilityElement *ae = memnew(AccessibilityElement);
287
ae->role = _accessibility_role(p_role);
288
ae->window_id = p_window_id;
289
RID rid = rid_owner.make_rid(ae);
290
291
return rid;
292
}
293
294
RID AccessibilityServerAccessKit::create_sub_element(const RID &p_parent_rid, AccessibilityServerEnums::AccessibilityRole p_role, int p_insert_pos) {
295
AccessibilityElement *parent_ae = rid_owner.get_or_null(p_parent_rid);
296
ERR_FAIL_NULL_V(parent_ae, RID());
297
298
WindowData *wd = windows.getptr(parent_ae->window_id);
299
ERR_FAIL_NULL_V(wd, RID());
300
301
AccessibilityElement *ae = memnew(AccessibilityElement);
302
ae->role = _accessibility_role(p_role);
303
ae->window_id = parent_ae->window_id;
304
ae->parent = p_parent_rid;
305
ae->node = accesskit_node_new(ae->role);
306
RID rid = rid_owner.make_rid(ae);
307
if (p_insert_pos == -1) {
308
parent_ae->children.push_back(rid);
309
} else {
310
parent_ae->children.insert(p_insert_pos, rid);
311
}
312
wd->update.insert(rid);
313
314
return rid;
315
}
316
317
RID AccessibilityServerAccessKit::create_sub_text_edit_elements(const RID &p_parent_rid, const RID &p_shaped_text, float p_min_height, int p_insert_pos, bool p_is_last_line) {
318
AccessibilityElement *parent_ae = rid_owner.get_or_null(p_parent_rid);
319
ERR_FAIL_NULL_V(parent_ae, RID());
320
321
WindowData *wd = windows.getptr(parent_ae->window_id);
322
ERR_FAIL_NULL_V(wd, RID());
323
324
AccessibilityElement *root_ae = memnew(AccessibilityElement);
325
root_ae->role = ACCESSKIT_ROLE_GENERIC_CONTAINER;
326
root_ae->window_id = parent_ae->window_id;
327
root_ae->parent = p_parent_rid;
328
root_ae->node = accesskit_node_new(root_ae->role);
329
RID root_rid = rid_owner.make_rid(root_ae);
330
if (p_insert_pos == -1) {
331
parent_ae->children.push_back(root_rid);
332
} else {
333
parent_ae->children.insert(p_insert_pos, root_rid);
334
}
335
wd->update.insert(root_rid);
336
337
float text_width = 0;
338
float text_height = p_min_height;
339
Vector<int32_t> words;
340
int64_t run_count = 0; // Note: runs in visual order.
341
const Glyph *gl = nullptr;
342
float run_off_x = 0.0;
343
Vector2i full_range;
344
345
if (p_shaped_text.is_valid()) {
346
text_width = TS->shaped_text_get_size(p_shaped_text).x;
347
text_height = MAX(text_height, TS->shaped_text_get_size(p_shaped_text).y);
348
words = TS->shaped_text_get_word_breaks(p_shaped_text);
349
run_count = TS->shaped_get_run_count(p_shaped_text);
350
gl = TS->shaped_text_get_glyphs(p_shaped_text);
351
full_range = TS->shaped_text_get_range(p_shaped_text);
352
}
353
354
accesskit_rect root_rect;
355
root_rect.x0 = 0;
356
root_rect.y0 = 0;
357
root_rect.x1 = text_width;
358
root_rect.y1 = MAX(p_min_height, text_height);
359
accesskit_node_set_bounds(root_ae->node, root_rect);
360
361
// Create text element for each run.
362
Vector<AccessibilityElement *> text_elements;
363
for (int64_t i = 0; i < run_count; i++) {
364
const Vector2i range = TS->shaped_get_run_range(p_shaped_text, i);
365
const Vector2i gl_range = TS->shaped_get_run_glyph_range(p_shaped_text, i);
366
String run_t = TS->shaped_get_run_text(p_shaped_text, i);
367
TextServer::Direction dir = TS->shaped_get_run_direction(p_shaped_text, i);
368
369
if (run_t.is_empty()) {
370
continue;
371
}
372
373
// Split long runs in to < 254 char subruns due to AccessKit limitation.
374
Vector<Vector2i> subrun_ranges;
375
Vector<Vector<uint8_t>> subrun_word_starts;
376
{
377
Vector2i cur_range = range;
378
bool slice = false;
379
do {
380
// Word starts.
381
Vector<uint8_t> word_starts;
382
word_starts.push_back(0);
383
384
slice = false;
385
for (int j = 0; j < words.size(); j += 2) {
386
if (words[j] <= cur_range.x) {
387
continue;
388
}
389
if (words[j] >= cur_range.y) {
390
break;
391
}
392
int32_t wstart = words[j] - cur_range.x;
393
int32_t wend = words[j + 1] - cur_range.x;
394
if (wend >= 254) {
395
cur_range.y = words[j];
396
slice = true;
397
break;
398
}
399
word_starts.push_back(wstart);
400
}
401
subrun_ranges.push_back(cur_range);
402
subrun_word_starts.push_back(word_starts);
403
404
if (slice) {
405
cur_range.x = cur_range.y;
406
cur_range.y = range.y;
407
}
408
} while (slice);
409
}
410
411
// Process subruns.
412
int start, end, delta;
413
if (dir == TextServer::DIRECTION_LTR) {
414
start = 0;
415
end = subrun_ranges.size();
416
delta = +1;
417
} else {
418
start = subrun_ranges.size() - 1;
419
end = -1;
420
delta = -1;
421
}
422
for (int rr = start; rr != end; rr += delta) {
423
// Word starts.
424
const Vector<uint8_t> &word_starts = subrun_word_starts[rr];
425
const Vector2i &cur_range = subrun_ranges[rr];
426
427
AccessibilityElement *ae = memnew(AccessibilityElement);
428
ae->role = ACCESSKIT_ROLE_TEXT_RUN;
429
ae->window_id = parent_ae->window_id;
430
ae->parent = root_rid;
431
ae->run = Vector3i(cur_range.x, cur_range.y, i);
432
ae->node = accesskit_node_new(ae->role);
433
434
text_elements.push_back(ae);
435
436
String sub_t = run_t.substr(cur_range.x - range.x, cur_range.y - cur_range.x);
437
if (sub_t.is_empty()) {
438
continue;
439
}
440
441
// UTF-8 text and char lengths.
442
Vector<uint8_t> char_lengths;
443
CharString text = sub_t.utf8(&char_lengths);
444
445
ae->value = sub_t;
446
accesskit_node_set_value(ae->node, text.ptr());
447
accesskit_node_set_character_lengths(ae->node, char_lengths.size(), char_lengths.ptr());
448
449
accesskit_node_set_word_starts(ae->node, word_starts.size(), word_starts.ptr());
450
451
// Char widths and positions.
452
Vector<float> char_positions;
453
Vector<float> char_widths;
454
455
char_positions.resize_initialized(sub_t.length());
456
float *positions_ptr = char_positions.ptrw();
457
458
char_widths.resize_initialized(sub_t.length());
459
float *widths_ptr = char_widths.ptrw();
460
461
float size_x = 0.0;
462
for (int j = gl_range.x; j <= gl_range.y; j += gl[j].count) {
463
if (gl[j].start >= ae->run.y || gl[j].start < ae->run.x) {
464
continue;
465
}
466
467
float advance = 0.0; // Graphame advance.
468
for (int k = 0; k < gl[j].count; k++) {
469
advance += gl[j + k].advance;
470
}
471
int chars = gl[j].end - gl[j].start;
472
float adv_per_char = advance / (float)chars;
473
474
for (int k = 0; k < chars; k++) {
475
int index = gl[j].start + k - ae->run.x;
476
ERR_CONTINUE(index < 0 || index >= sub_t.length());
477
positions_ptr[index] = size_x + adv_per_char * k;
478
widths_ptr[index] = adv_per_char;
479
}
480
size_x += advance * gl[j].repeat;
481
}
482
positions_ptr[sub_t.length() - 1] = size_x;
483
widths_ptr[sub_t.length() - 1] = 1.0;
484
485
accesskit_node_set_character_positions(ae->node, char_positions.size(), char_positions.ptr());
486
accesskit_node_set_character_widths(ae->node, char_widths.size(), char_widths.ptr());
487
488
RID font_rid = TS->shaped_get_run_font_rid(p_shaped_text, i);
489
if (font_rid != RID()) {
490
CharString font_name = TS->font_get_name(font_rid).utf8();
491
if (font_name.length() > 0) {
492
accesskit_node_set_font_family(ae->node, font_name.ptr());
493
}
494
if (TS->font_get_style(font_rid).has_flag(TextServer::FONT_ITALIC)) {
495
accesskit_node_set_italic(ae->node);
496
}
497
accesskit_node_set_font_weight(ae->node, TS->font_get_weight(font_rid));
498
}
499
accesskit_node_set_font_size(ae->node, TS->shaped_get_run_font_size(p_shaped_text, i));
500
CharString language = TS->shaped_get_run_language(p_shaped_text, i).utf8();
501
if (language.length() > 0) {
502
accesskit_node_set_language(ae->node, language.ptr());
503
}
504
accesskit_node_set_text_direction(ae->node, ACCESSKIT_TEXT_DIRECTION_LEFT_TO_RIGHT);
505
506
accesskit_rect rect;
507
rect.x0 = run_off_x;
508
rect.y0 = 0;
509
rect.x1 = run_off_x + size_x;
510
rect.y1 = text_height;
511
accesskit_node_set_bounds(ae->node, rect);
512
accesskit_node_add_action(ae->node, ACCESSKIT_ACTION_SCROLL_INTO_VIEW);
513
514
run_off_x += size_x;
515
}
516
}
517
if (!p_is_last_line || text_elements.is_empty()) {
518
// Add "\n" at the end.
519
AccessibilityElement *ae = memnew(AccessibilityElement);
520
ae->role = ACCESSKIT_ROLE_TEXT_RUN;
521
ae->window_id = parent_ae->window_id;
522
ae->parent = root_rid;
523
ae->run = Vector3i(full_range.y, full_range.y, run_count);
524
ae->node = accesskit_node_new(ae->role);
525
526
text_elements.push_back(ae);
527
528
ae->value = String();
529
if (!p_is_last_line) {
530
accesskit_node_set_value(ae->node, "\n");
531
532
Vector<uint8_t> char_lengths;
533
Vector<float> char_positions;
534
Vector<float> char_widths;
535
char_lengths.push_back(1);
536
char_positions.push_back(0.0);
537
char_widths.push_back(1.0);
538
539
accesskit_node_set_character_lengths(ae->node, char_lengths.size(), char_lengths.ptr());
540
accesskit_node_set_character_positions(ae->node, char_positions.size(), char_positions.ptr());
541
accesskit_node_set_character_widths(ae->node, char_widths.size(), char_widths.ptr());
542
} else {
543
accesskit_node_set_value(ae->node, "");
544
}
545
accesskit_node_set_text_direction(ae->node, ACCESSKIT_TEXT_DIRECTION_LEFT_TO_RIGHT);
546
547
accesskit_rect rect;
548
rect.x0 = run_off_x;
549
rect.y0 = 0;
550
rect.x1 = run_off_x + 1;
551
rect.y1 = text_height;
552
accesskit_node_set_bounds(ae->node, rect);
553
}
554
555
// Sort runs in logical order.
556
struct RunCompare {
557
_FORCE_INLINE_ bool operator()(const AccessibilityElement *l, const AccessibilityElement *r) const {
558
return l->run.x < r->run.x;
559
}
560
};
561
text_elements.sort_custom<RunCompare>();
562
for (int i = 0; i < text_elements.size(); i++) {
563
RID rid = rid_owner.make_rid(text_elements[i]);
564
root_ae->children.push_back(rid);
565
wd->update.insert(rid);
566
567
// Link adjacent TextRuns on the same line.
568
if (i > 0) {
569
RID prev_rid = root_ae->children[i - 1];
570
AccessibilityElement *prev_ae = rid_owner.get_or_null(prev_rid);
571
accesskit_node_set_previous_on_line(text_elements[i]->node, (accesskit_node_id)prev_rid.get_id());
572
accesskit_node_set_next_on_line(prev_ae->node, (accesskit_node_id)rid.get_id());
573
}
574
}
575
576
return root_rid;
577
}
578
579
bool AccessibilityServerAccessKit::has_element(const RID &p_id) const {
580
return rid_owner.owns(p_id);
581
}
582
583
void AccessibilityServerAccessKit::_free_recursive(WindowData *p_wd, const RID &p_id) {
584
if (p_wd && p_wd->update.has(p_id)) {
585
p_wd->update.erase(p_id);
586
}
587
AccessibilityElement *ae = rid_owner.get_or_null(p_id);
588
for (const RID &rid : ae->children) {
589
_free_recursive(p_wd, rid);
590
}
591
if (ae->node) {
592
accesskit_node_free(ae->node);
593
}
594
memdelete(ae);
595
rid_owner.free(p_id);
596
}
597
598
void AccessibilityServerAccessKit::free_element(const RID &p_id) {
599
ERR_FAIL_COND_MSG(in_accessibility_update, "Element can't be removed inside NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
600
601
AccessibilityElement *ae = rid_owner.get_or_null(p_id);
602
if (ae) {
603
WindowData *wd = windows.getptr(ae->window_id);
604
AccessibilityElement *parent_ae = rid_owner.get_or_null(ae->parent);
605
if (parent_ae) {
606
parent_ae->children.erase(p_id);
607
}
608
_free_recursive(wd, p_id);
609
}
610
}
611
612
void AccessibilityServerAccessKit::element_set_meta(const RID &p_id, const Variant &p_meta) {
613
ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
614
615
AccessibilityElement *ae = rid_owner.get_or_null(p_id);
616
ERR_FAIL_NULL(ae);
617
ae->meta = p_meta;
618
}
619
620
Variant AccessibilityServerAccessKit::element_get_meta(const RID &p_id) const {
621
const AccessibilityElement *ae = rid_owner.get_or_null(p_id);
622
ERR_FAIL_NULL_V(ae, Variant());
623
return ae->meta;
624
}
625
626
void AccessibilityServerAccessKit::update_set_focus(const RID &p_id) {
627
ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
628
629
if (p_id.is_valid() && rid_owner.owns(p_id)) {
630
focus = p_id;
631
} else {
632
focus = RID();
633
}
634
}
635
636
RID AccessibilityServerAccessKit::get_window_root(DisplayServerEnums::WindowID p_window_id) const {
637
const WindowData *wd = windows.getptr(p_window_id);
638
ERR_FAIL_NULL_V(wd, RID());
639
640
return wd->root_id;
641
}
642
643
accesskit_tree_update *AccessibilityServerAccessKit::_accessibility_build_tree_update(void *p_user_data) {
644
DisplayServerEnums::WindowID window_id = (DisplayServerEnums::WindowID)(size_t)p_user_data;
645
646
ERR_FAIL_COND_V(!static_cast<AccessibilityServerAccessKit *>(get_singleton())->windows.has(window_id), nullptr);
647
WindowData &wd = static_cast<AccessibilityServerAccessKit *>(get_singleton())->windows[window_id];
648
649
static_cast<AccessibilityServerAccessKit *>(get_singleton())->in_accessibility_update = true;
650
if (static_cast<AccessibilityServerAccessKit *>(get_singleton())->update_cb.is_valid()) {
651
static_cast<AccessibilityServerAccessKit *>(get_singleton())->update_cb.call(window_id);
652
}
653
static_cast<AccessibilityServerAccessKit *>(get_singleton())->in_accessibility_update = false;
654
655
AccessibilityElement *focus_ae = static_cast<AccessibilityServerAccessKit *>(get_singleton())->rid_owner.get_or_null(static_cast<AccessibilityServerAccessKit *>(get_singleton())->focus);
656
uint32_t update_size = wd.update.size();
657
658
accesskit_node_id ac_focus = (accesskit_node_id)wd.root_id.get_id();
659
if (focus_ae && focus_ae->window_id == window_id) {
660
ac_focus = (accesskit_node_id) static_cast<AccessibilityServerAccessKit *>(get_singleton())->focus.get_id();
661
}
662
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);
663
for (const RID &rid : wd.update) {
664
AccessibilityElement *ae = static_cast<AccessibilityServerAccessKit *>(get_singleton())->rid_owner.get_or_null(rid);
665
if (ae && ae->node) {
666
for (const RID &child_rid : ae->children) {
667
accesskit_node_push_child(ae->node, (accesskit_node_id)child_rid.get_id());
668
}
669
accesskit_tree_update_push_node(tree_update, (accesskit_node_id)rid.get_id(), ae->node);
670
ae->node = nullptr;
671
}
672
}
673
wd.update.clear();
674
675
return tree_update;
676
}
677
678
void AccessibilityServerAccessKit::update_if_active(const Callable &p_callable) {
679
ERR_FAIL_COND(!p_callable.is_valid());
680
update_cb = p_callable;
681
for (KeyValue<DisplayServerEnums::WindowID, WindowData> &window : windows) {
682
#ifdef WINDOWS_ENABLED
683
accesskit_windows_queued_events *events = accesskit_windows_subclassing_adapter_update_if_active(window.value.adapter, _accessibility_build_tree_update, (void *)(size_t)window.key);
684
if (events) {
685
accesskit_windows_queued_events_raise(events);
686
}
687
#endif
688
#ifdef MACOS_ENABLED
689
accesskit_macos_queued_events *events = accesskit_macos_subclassing_adapter_update_if_active(window.value.adapter, _accessibility_build_tree_update, (void *)(size_t)window.key);
690
if (events) {
691
accesskit_macos_queued_events_raise(events);
692
}
693
#endif
694
#ifdef LINUXBSD_ENABLED
695
accesskit_unix_adapter_update_if_active(window.value.adapter, _accessibility_build_tree_update, (void *)(size_t)window.key);
696
#endif
697
}
698
update_cb = Callable();
699
}
700
701
_FORCE_INLINE_ void AccessibilityServerAccessKit::_ensure_node(const RID &p_id, AccessibilityElement *p_ae) {
702
if (unlikely(!p_ae->node)) {
703
WindowData *wd = windows.getptr(p_ae->window_id);
704
ERR_FAIL_NULL(wd);
705
706
wd->update.insert(p_id);
707
p_ae->node = accesskit_node_new(p_ae->role);
708
709
// Re-apply stored name if any, so nodes recreated by _ensure_node
710
// retain their label even if the caller doesn't re-set all properties.
711
String full_name = (p_ae->name + " " + p_ae->name_extra_info).strip_edges();
712
if (!full_name.is_empty()) {
713
accesskit_node_set_label(p_ae->node, full_name.utf8().ptr());
714
}
715
}
716
}
717
718
void AccessibilityServerAccessKit::set_window_rect(DisplayServerEnums::WindowID p_window_id, const Rect2 &p_rect_out, const Rect2 &p_rect_in) {
719
#ifdef LINUXBSD_ENABLED
720
const WindowData *wd = windows.getptr(p_window_id);
721
ERR_FAIL_NULL(wd);
722
723
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 };
724
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 };
725
accesskit_unix_adapter_set_root_window_bounds(wd->adapter, outer_bounds, inner_bounds);
726
#endif
727
}
728
729
void AccessibilityServerAccessKit::set_window_focused(DisplayServerEnums::WindowID p_window_id, bool p_focused) {
730
const WindowData *wd = windows.getptr(p_window_id);
731
ERR_FAIL_NULL(wd);
732
733
#ifdef LINUXBSD_ENABLED
734
accesskit_unix_adapter_update_window_focus_state(wd->adapter, p_focused);
735
#endif
736
#ifdef MACOS_ENABLED
737
accesskit_macos_queued_events *events = accesskit_macos_subclassing_adapter_update_view_focus_state(wd->adapter, p_focused);
738
if (events != nullptr) {
739
accesskit_macos_queued_events_raise(events);
740
}
741
#endif
742
// Note: On Windows, the subclassing adapter takes care of this.
743
}
744
745
void AccessibilityServerAccessKit::update_set_role(const RID &p_id, AccessibilityServerEnums::AccessibilityRole p_role) {
746
ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
747
748
AccessibilityElement *ae = rid_owner.get_or_null(p_id);
749
ERR_FAIL_NULL(ae);
750
if (ae->role == _accessibility_role(p_role)) {
751
return;
752
}
753
ae->role = _accessibility_role(p_role);
754
_ensure_node(p_id, ae);
755
756
accesskit_node_set_role(ae->node, ae->role);
757
}
758
759
void AccessibilityServerAccessKit::update_set_name(const RID &p_id, const String &p_name) {
760
ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
761
762
AccessibilityElement *ae = rid_owner.get_or_null(p_id);
763
ERR_FAIL_NULL(ae);
764
_ensure_node(p_id, ae);
765
766
ae->name = p_name;
767
String full_name = (ae->name + " " + ae->name_extra_info).strip_edges();
768
if (!full_name.is_empty()) {
769
accesskit_node_set_label(ae->node, full_name.utf8().ptr());
770
} else {
771
accesskit_node_clear_label(ae->node);
772
}
773
}
774
775
void AccessibilityServerAccessKit::update_set_braille_label(const RID &p_id, const String &p_name) {
776
ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
777
778
AccessibilityElement *ae = rid_owner.get_or_null(p_id);
779
ERR_FAIL_NULL(ae);
780
_ensure_node(p_id, ae);
781
782
if (!p_name.is_empty()) {
783
accesskit_node_set_braille_label(ae->node, p_name.utf8().ptr());
784
} else {
785
accesskit_node_clear_braille_label(ae->node);
786
}
787
}
788
789
void AccessibilityServerAccessKit::update_set_braille_role_description(const RID &p_id, const String &p_description) {
790
ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
791
792
AccessibilityElement *ae = rid_owner.get_or_null(p_id);
793
ERR_FAIL_NULL(ae);
794
_ensure_node(p_id, ae);
795
796
if (!p_description.is_empty()) {
797
accesskit_node_set_braille_role_description(ae->node, p_description.utf8().ptr());
798
} else {
799
accesskit_node_clear_braille_role_description(ae->node);
800
}
801
}
802
803
void AccessibilityServerAccessKit::update_set_extra_info(const RID &p_id, const String &p_name_extra_info) {
804
ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
805
806
AccessibilityElement *ae = rid_owner.get_or_null(p_id);
807
ERR_FAIL_NULL(ae);
808
_ensure_node(p_id, ae);
809
810
ae->name_extra_info = p_name_extra_info;
811
String full_name = (ae->name + " " + ae->name_extra_info).strip_edges();
812
if (!full_name.is_empty()) {
813
accesskit_node_set_label(ae->node, full_name.utf8().ptr());
814
} else {
815
accesskit_node_clear_label(ae->node);
816
}
817
}
818
819
void AccessibilityServerAccessKit::update_set_description(const RID &p_id, const String &p_description) {
820
ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
821
822
AccessibilityElement *ae = rid_owner.get_or_null(p_id);
823
ERR_FAIL_NULL(ae);
824
_ensure_node(p_id, ae);
825
826
if (!p_description.is_empty()) {
827
accesskit_node_set_description(ae->node, p_description.utf8().ptr());
828
} else {
829
accesskit_node_clear_description(ae->node);
830
}
831
}
832
833
void AccessibilityServerAccessKit::update_set_value(const RID &p_id, const String &p_value) {
834
ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
835
836
AccessibilityElement *ae = rid_owner.get_or_null(p_id);
837
ERR_FAIL_NULL(ae);
838
_ensure_node(p_id, ae);
839
840
if (!p_value.is_empty()) {
841
Vector<uint8_t> ch_length;
842
ae->value = p_value;
843
accesskit_node_set_value(ae->node, p_value.utf8(&ch_length).ptr());
844
accesskit_node_set_character_lengths(ae->node, ch_length.size(), ch_length.ptr());
845
} else {
846
ae->value = String();
847
accesskit_node_clear_value(ae->node);
848
accesskit_node_clear_character_lengths(ae->node);
849
}
850
}
851
852
void AccessibilityServerAccessKit::update_set_tooltip(const RID &p_id, const String &p_tooltip) {
853
ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
854
855
AccessibilityElement *ae = rid_owner.get_or_null(p_id);
856
ERR_FAIL_NULL(ae);
857
_ensure_node(p_id, ae);
858
859
if (!p_tooltip.is_empty()) {
860
accesskit_node_set_tooltip(ae->node, p_tooltip.utf8().ptr());
861
} else {
862
accesskit_node_clear_tooltip(ae->node);
863
}
864
}
865
866
void AccessibilityServerAccessKit::update_set_bounds(const RID &p_id, const Rect2 &p_rect) {
867
ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
868
869
AccessibilityElement *ae = rid_owner.get_or_null(p_id);
870
ERR_FAIL_NULL(ae);
871
_ensure_node(p_id, ae);
872
873
accesskit_rect rect;
874
rect.x0 = p_rect.position.x;
875
rect.y0 = p_rect.position.y;
876
rect.x1 = p_rect.position.x + p_rect.size.x;
877
rect.y1 = p_rect.position.y + p_rect.size.y;
878
accesskit_node_set_bounds(ae->node, rect);
879
}
880
881
void AccessibilityServerAccessKit::update_set_transform(const RID &p_id, const Transform2D &p_transform) {
882
ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
883
884
AccessibilityElement *ae = rid_owner.get_or_null(p_id);
885
ERR_FAIL_NULL(ae);
886
_ensure_node(p_id, ae);
887
888
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] };
889
accesskit_node_set_transform(ae->node, transform);
890
}
891
892
void AccessibilityServerAccessKit::update_add_child(const RID &p_id, const RID &p_child_id) {
893
ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
894
895
AccessibilityElement *ae = rid_owner.get_or_null(p_id);
896
ERR_FAIL_NULL(ae);
897
AccessibilityElement *other_ae = rid_owner.get_or_null(p_child_id);
898
ERR_FAIL_NULL(other_ae);
899
ERR_FAIL_COND(other_ae->window_id != ae->window_id);
900
_ensure_node(p_id, ae);
901
902
accesskit_node_push_child(ae->node, (accesskit_node_id)p_child_id.get_id());
903
}
904
905
void AccessibilityServerAccessKit::update_add_related_controls(const RID &p_id, const RID &p_related_id) {
906
ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
907
908
AccessibilityElement *ae = rid_owner.get_or_null(p_id);
909
ERR_FAIL_NULL(ae);
910
AccessibilityElement *other_ae = rid_owner.get_or_null(p_related_id);
911
ERR_FAIL_NULL(other_ae);
912
ERR_FAIL_COND(other_ae->window_id != ae->window_id);
913
_ensure_node(p_id, ae);
914
915
accesskit_node_push_controlled(ae->node, (accesskit_node_id)p_related_id.get_id());
916
}
917
918
void AccessibilityServerAccessKit::update_add_related_details(const RID &p_id, const RID &p_related_id) {
919
ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
920
921
AccessibilityElement *ae = rid_owner.get_or_null(p_id);
922
ERR_FAIL_NULL(ae);
923
AccessibilityElement *other_ae = rid_owner.get_or_null(p_related_id);
924
ERR_FAIL_NULL(other_ae);
925
ERR_FAIL_COND(other_ae->window_id != ae->window_id);
926
_ensure_node(p_id, ae);
927
928
accesskit_node_push_detail(ae->node, (accesskit_node_id)p_related_id.get_id());
929
}
930
931
void AccessibilityServerAccessKit::update_add_related_described_by(const RID &p_id, const RID &p_related_id) {
932
ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
933
934
AccessibilityElement *ae = rid_owner.get_or_null(p_id);
935
ERR_FAIL_NULL(ae);
936
AccessibilityElement *other_ae = rid_owner.get_or_null(p_related_id);
937
ERR_FAIL_NULL(other_ae);
938
ERR_FAIL_COND(other_ae->window_id != ae->window_id);
939
_ensure_node(p_id, ae);
940
941
accesskit_node_push_described_by(ae->node, (accesskit_node_id)p_related_id.get_id());
942
}
943
944
void AccessibilityServerAccessKit::update_add_related_flow_to(const RID &p_id, const RID &p_related_id) {
945
ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
946
947
AccessibilityElement *ae = rid_owner.get_or_null(p_id);
948
ERR_FAIL_NULL(ae);
949
AccessibilityElement *other_ae = rid_owner.get_or_null(p_related_id);
950
ERR_FAIL_NULL(other_ae);
951
ERR_FAIL_COND(other_ae->window_id != ae->window_id);
952
_ensure_node(p_id, ae);
953
954
accesskit_node_push_flow_to(ae->node, (accesskit_node_id)p_related_id.get_id());
955
}
956
957
void AccessibilityServerAccessKit::update_add_related_labeled_by(const RID &p_id, const RID &p_related_id) {
958
ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
959
960
AccessibilityElement *ae = rid_owner.get_or_null(p_id);
961
ERR_FAIL_NULL(ae);
962
AccessibilityElement *other_ae = rid_owner.get_or_null(p_related_id);
963
ERR_FAIL_NULL(other_ae);
964
ERR_FAIL_COND(other_ae->window_id != ae->window_id);
965
_ensure_node(p_id, ae);
966
967
accesskit_node_push_labelled_by(ae->node, (accesskit_node_id)p_related_id.get_id());
968
}
969
970
void AccessibilityServerAccessKit::update_add_related_radio_group(const RID &p_id, const RID &p_related_id) {
971
ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
972
973
AccessibilityElement *ae = rid_owner.get_or_null(p_id);
974
ERR_FAIL_NULL(ae);
975
AccessibilityElement *other_ae = rid_owner.get_or_null(p_related_id);
976
ERR_FAIL_NULL(other_ae);
977
ERR_FAIL_COND(other_ae->window_id != ae->window_id);
978
_ensure_node(p_id, ae);
979
980
accesskit_node_push_to_radio_group(ae->node, (accesskit_node_id)p_related_id.get_id());
981
}
982
983
void AccessibilityServerAccessKit::update_set_active_descendant(const RID &p_id, const RID &p_other_id) {
984
ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
985
986
AccessibilityElement *ae = rid_owner.get_or_null(p_id);
987
ERR_FAIL_NULL(ae);
988
AccessibilityElement *other_ae = rid_owner.get_or_null(p_other_id);
989
ERR_FAIL_NULL(other_ae);
990
ERR_FAIL_COND(other_ae->window_id != ae->window_id);
991
_ensure_node(p_id, ae);
992
993
accesskit_node_set_active_descendant(ae->node, (accesskit_node_id)p_other_id.get_id());
994
}
995
996
void AccessibilityServerAccessKit::update_set_next_on_line(const RID &p_id, const RID &p_other_id) {
997
ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
998
999
AccessibilityElement *ae = rid_owner.get_or_null(p_id);
1000
ERR_FAIL_NULL(ae);
1001
AccessibilityElement *other_ae = rid_owner.get_or_null(p_other_id);
1002
ERR_FAIL_NULL(other_ae);
1003
ERR_FAIL_COND(other_ae->window_id != ae->window_id);
1004
_ensure_node(p_id, ae);
1005
1006
accesskit_node_set_next_on_line(ae->node, (accesskit_node_id)p_other_id.get_id());
1007
}
1008
1009
void AccessibilityServerAccessKit::update_set_previous_on_line(const RID &p_id, const RID &p_other_id) {
1010
ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
1011
1012
AccessibilityElement *ae = rid_owner.get_or_null(p_id);
1013
ERR_FAIL_NULL(ae);
1014
AccessibilityElement *other_ae = rid_owner.get_or_null(p_other_id);
1015
ERR_FAIL_NULL(other_ae);
1016
ERR_FAIL_COND(other_ae->window_id != ae->window_id);
1017
_ensure_node(p_id, ae);
1018
1019
accesskit_node_set_previous_on_line(ae->node, (accesskit_node_id)p_other_id.get_id());
1020
}
1021
1022
void AccessibilityServerAccessKit::update_set_member_of(const RID &p_id, const RID &p_group_id) {
1023
ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
1024
1025
AccessibilityElement *ae = rid_owner.get_or_null(p_id);
1026
ERR_FAIL_NULL(ae);
1027
AccessibilityElement *other_ae = rid_owner.get_or_null(p_group_id);
1028
ERR_FAIL_NULL(other_ae);
1029
ERR_FAIL_COND(other_ae->window_id != ae->window_id);
1030
_ensure_node(p_id, ae);
1031
1032
accesskit_node_set_member_of(ae->node, (accesskit_node_id)p_group_id.get_id());
1033
}
1034
1035
void AccessibilityServerAccessKit::update_set_in_page_link_target(const RID &p_id, const RID &p_other_id) {
1036
ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
1037
1038
AccessibilityElement *ae = rid_owner.get_or_null(p_id);
1039
ERR_FAIL_NULL(ae);
1040
AccessibilityElement *other_ae = rid_owner.get_or_null(p_other_id);
1041
ERR_FAIL_NULL(other_ae);
1042
ERR_FAIL_COND(other_ae->window_id != ae->window_id);
1043
_ensure_node(p_id, ae);
1044
1045
accesskit_node_set_in_page_link_target(ae->node, (accesskit_node_id)p_other_id.get_id());
1046
}
1047
1048
void AccessibilityServerAccessKit::update_set_error_message(const RID &p_id, const RID &p_other_id) {
1049
ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
1050
1051
AccessibilityElement *ae = rid_owner.get_or_null(p_id);
1052
ERR_FAIL_NULL(ae);
1053
AccessibilityElement *other_ae = rid_owner.get_or_null(p_other_id);
1054
ERR_FAIL_NULL(other_ae);
1055
ERR_FAIL_COND(other_ae->window_id != ae->window_id);
1056
_ensure_node(p_id, ae);
1057
1058
accesskit_node_set_error_message(ae->node, (accesskit_node_id)p_other_id.get_id());
1059
}
1060
1061
void AccessibilityServerAccessKit::update_set_live(const RID &p_id, AccessibilityServerEnums::AccessibilityLiveMode p_live) {
1062
ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
1063
1064
AccessibilityElement *ae = rid_owner.get_or_null(p_id);
1065
ERR_FAIL_NULL(ae);
1066
_ensure_node(p_id, ae);
1067
1068
switch (p_live) {
1069
case AccessibilityServerEnums::AccessibilityLiveMode::LIVE_OFF: {
1070
accesskit_node_set_live(ae->node, ACCESSKIT_LIVE_OFF);
1071
} break;
1072
case AccessibilityServerEnums::AccessibilityLiveMode::LIVE_POLITE: {
1073
accesskit_node_set_live(ae->node, ACCESSKIT_LIVE_POLITE);
1074
} break;
1075
case AccessibilityServerEnums::AccessibilityLiveMode::LIVE_ASSERTIVE: {
1076
accesskit_node_set_live(ae->node, ACCESSKIT_LIVE_ASSERTIVE);
1077
} break;
1078
}
1079
}
1080
1081
void AccessibilityServerAccessKit::update_add_action(const RID &p_id, AccessibilityServerEnums::AccessibilityAction p_action, const Callable &p_callable) {
1082
ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
1083
1084
AccessibilityElement *ae = rid_owner.get_or_null(p_id);
1085
ERR_FAIL_NULL(ae);
1086
_ensure_node(p_id, ae);
1087
1088
ae->actions[_accessibility_action(p_action)] = p_callable;
1089
1090
accesskit_node_add_action(ae->node, _accessibility_action(p_action));
1091
}
1092
1093
void AccessibilityServerAccessKit::update_add_custom_action(const RID &p_id, int p_action_id, const String &p_action_description) {
1094
ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
1095
1096
AccessibilityElement *ae = rid_owner.get_or_null(p_id);
1097
ERR_FAIL_NULL(ae);
1098
_ensure_node(p_id, ae);
1099
1100
if (!p_action_description.is_empty()) {
1101
accesskit_custom_action *ca = accesskit_custom_action_new(p_action_id);
1102
accesskit_custom_action_set_description(ca, p_action_description.utf8().ptr());
1103
accesskit_node_push_custom_action(ae->node, ca);
1104
} else {
1105
String cs_name = vformat("Custom Action %d", p_action_id);
1106
accesskit_custom_action *ca = accesskit_custom_action_new(p_action_id);
1107
accesskit_custom_action_set_description(ca, cs_name.utf8().ptr());
1108
accesskit_node_push_custom_action(ae->node, ca);
1109
}
1110
}
1111
1112
void AccessibilityServerAccessKit::update_set_table_row_count(const RID &p_id, int p_count) {
1113
ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
1114
1115
AccessibilityElement *ae = rid_owner.get_or_null(p_id);
1116
ERR_FAIL_NULL(ae);
1117
_ensure_node(p_id, ae);
1118
1119
accesskit_node_set_row_count(ae->node, p_count);
1120
}
1121
1122
void AccessibilityServerAccessKit::update_set_table_column_count(const RID &p_id, int p_count) {
1123
ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
1124
1125
AccessibilityElement *ae = rid_owner.get_or_null(p_id);
1126
ERR_FAIL_NULL(ae);
1127
_ensure_node(p_id, ae);
1128
1129
accesskit_node_set_column_count(ae->node, p_count);
1130
}
1131
1132
void AccessibilityServerAccessKit::update_set_table_row_index(const RID &p_id, int p_index) {
1133
ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
1134
1135
AccessibilityElement *ae = rid_owner.get_or_null(p_id);
1136
ERR_FAIL_NULL(ae);
1137
_ensure_node(p_id, ae);
1138
1139
accesskit_node_set_row_index(ae->node, p_index);
1140
}
1141
1142
void AccessibilityServerAccessKit::update_set_table_column_index(const RID &p_id, int p_index) {
1143
ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
1144
1145
AccessibilityElement *ae = rid_owner.get_or_null(p_id);
1146
ERR_FAIL_NULL(ae);
1147
_ensure_node(p_id, ae);
1148
1149
accesskit_node_set_column_index(ae->node, p_index);
1150
}
1151
1152
void AccessibilityServerAccessKit::update_set_table_cell_position(const RID &p_id, int p_row_index, int p_column_index) {
1153
ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
1154
1155
AccessibilityElement *ae = rid_owner.get_or_null(p_id);
1156
ERR_FAIL_NULL(ae);
1157
_ensure_node(p_id, ae);
1158
1159
accesskit_node_set_row_index(ae->node, p_row_index);
1160
accesskit_node_set_column_index(ae->node, p_column_index);
1161
}
1162
1163
void AccessibilityServerAccessKit::update_set_table_cell_span(const RID &p_id, int p_row_span, int p_column_span) {
1164
ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
1165
1166
AccessibilityElement *ae = rid_owner.get_or_null(p_id);
1167
ERR_FAIL_NULL(ae);
1168
_ensure_node(p_id, ae);
1169
1170
accesskit_node_set_row_span(ae->node, p_row_span);
1171
accesskit_node_set_column_span(ae->node, p_column_span);
1172
}
1173
1174
void AccessibilityServerAccessKit::update_set_list_item_count(const RID &p_id, int p_size) {
1175
ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
1176
1177
AccessibilityElement *ae = rid_owner.get_or_null(p_id);
1178
ERR_FAIL_NULL(ae);
1179
_ensure_node(p_id, ae);
1180
1181
accesskit_node_set_size_of_set(ae->node, p_size);
1182
}
1183
1184
void AccessibilityServerAccessKit::update_set_list_item_index(const RID &p_id, int p_index) {
1185
ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
1186
1187
AccessibilityElement *ae = rid_owner.get_or_null(p_id);
1188
ERR_FAIL_NULL(ae);
1189
_ensure_node(p_id, ae);
1190
1191
accesskit_node_set_position_in_set(ae->node, p_index);
1192
}
1193
1194
void AccessibilityServerAccessKit::update_set_list_item_level(const RID &p_id, int p_level) {
1195
ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
1196
1197
AccessibilityElement *ae = rid_owner.get_or_null(p_id);
1198
ERR_FAIL_NULL(ae);
1199
_ensure_node(p_id, ae);
1200
1201
accesskit_node_set_level(ae->node, p_level);
1202
}
1203
1204
void AccessibilityServerAccessKit::update_set_list_item_selected(const RID &p_id, bool p_selected) {
1205
ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
1206
1207
AccessibilityElement *ae = rid_owner.get_or_null(p_id);
1208
ERR_FAIL_NULL(ae);
1209
_ensure_node(p_id, ae);
1210
1211
accesskit_node_set_selected(ae->node, p_selected);
1212
}
1213
1214
void AccessibilityServerAccessKit::update_set_list_item_expanded(const RID &p_id, bool p_expanded) {
1215
ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
1216
1217
AccessibilityElement *ae = rid_owner.get_or_null(p_id);
1218
ERR_FAIL_NULL(ae);
1219
_ensure_node(p_id, ae);
1220
1221
accesskit_node_set_expanded(ae->node, p_expanded);
1222
}
1223
1224
void AccessibilityServerAccessKit::update_set_popup_type(const RID &p_id, AccessibilityServerEnums::AccessibilityPopupType p_popup) {
1225
ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
1226
1227
AccessibilityElement *ae = rid_owner.get_or_null(p_id);
1228
ERR_FAIL_NULL(ae);
1229
_ensure_node(p_id, ae);
1230
1231
switch (p_popup) {
1232
case AccessibilityServerEnums::AccessibilityPopupType::POPUP_MENU: {
1233
accesskit_node_set_has_popup(ae->node, ACCESSKIT_HAS_POPUP_MENU);
1234
} break;
1235
case AccessibilityServerEnums::AccessibilityPopupType::POPUP_LIST: {
1236
accesskit_node_set_has_popup(ae->node, ACCESSKIT_HAS_POPUP_LISTBOX);
1237
} break;
1238
case AccessibilityServerEnums::AccessibilityPopupType::POPUP_TREE: {
1239
accesskit_node_set_has_popup(ae->node, ACCESSKIT_HAS_POPUP_TREE);
1240
} break;
1241
case AccessibilityServerEnums::AccessibilityPopupType::POPUP_DIALOG: {
1242
accesskit_node_set_has_popup(ae->node, ACCESSKIT_HAS_POPUP_DIALOG);
1243
} break;
1244
}
1245
}
1246
1247
void AccessibilityServerAccessKit::update_set_checked(const RID &p_id, bool p_checekd) {
1248
ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
1249
1250
AccessibilityElement *ae = rid_owner.get_or_null(p_id);
1251
ERR_FAIL_NULL(ae);
1252
_ensure_node(p_id, ae);
1253
1254
if (p_checekd) {
1255
accesskit_node_set_toggled(ae->node, ACCESSKIT_TOGGLED_TRUE);
1256
} else {
1257
accesskit_node_set_toggled(ae->node, ACCESSKIT_TOGGLED_FALSE);
1258
}
1259
}
1260
1261
void AccessibilityServerAccessKit::update_set_num_value(const RID &p_id, double p_position) {
1262
ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
1263
1264
AccessibilityElement *ae = rid_owner.get_or_null(p_id);
1265
ERR_FAIL_NULL(ae);
1266
_ensure_node(p_id, ae);
1267
1268
accesskit_node_set_numeric_value(ae->node, p_position);
1269
ae->value = p_position;
1270
}
1271
1272
void AccessibilityServerAccessKit::update_set_num_range(const RID &p_id, double p_min, double p_max) {
1273
ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
1274
1275
AccessibilityElement *ae = rid_owner.get_or_null(p_id);
1276
ERR_FAIL_NULL(ae);
1277
_ensure_node(p_id, ae);
1278
1279
accesskit_node_set_min_numeric_value(ae->node, p_min);
1280
accesskit_node_set_max_numeric_value(ae->node, p_max);
1281
}
1282
1283
void AccessibilityServerAccessKit::update_set_num_step(const RID &p_id, double p_step) {
1284
ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
1285
1286
AccessibilityElement *ae = rid_owner.get_or_null(p_id);
1287
ERR_FAIL_NULL(ae);
1288
_ensure_node(p_id, ae);
1289
1290
accesskit_node_set_numeric_value_step(ae->node, p_step);
1291
}
1292
1293
void AccessibilityServerAccessKit::update_set_num_jump(const RID &p_id, double p_jump) {
1294
ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
1295
1296
AccessibilityElement *ae = rid_owner.get_or_null(p_id);
1297
ERR_FAIL_NULL(ae);
1298
_ensure_node(p_id, ae);
1299
1300
accesskit_node_set_numeric_value_jump(ae->node, p_jump);
1301
}
1302
1303
void AccessibilityServerAccessKit::update_set_scroll_x(const RID &p_id, double p_position) {
1304
ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
1305
1306
AccessibilityElement *ae = rid_owner.get_or_null(p_id);
1307
ERR_FAIL_NULL(ae);
1308
_ensure_node(p_id, ae);
1309
1310
accesskit_node_set_scroll_x(ae->node, p_position);
1311
}
1312
1313
void AccessibilityServerAccessKit::update_set_scroll_x_range(const RID &p_id, double p_min, double p_max) {
1314
ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
1315
1316
AccessibilityElement *ae = rid_owner.get_or_null(p_id);
1317
ERR_FAIL_NULL(ae);
1318
_ensure_node(p_id, ae);
1319
1320
accesskit_node_set_scroll_x_min(ae->node, p_min);
1321
accesskit_node_set_scroll_x_max(ae->node, p_max);
1322
}
1323
1324
void AccessibilityServerAccessKit::update_set_scroll_y(const RID &p_id, double p_position) {
1325
ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
1326
1327
AccessibilityElement *ae = rid_owner.get_or_null(p_id);
1328
ERR_FAIL_NULL(ae);
1329
_ensure_node(p_id, ae);
1330
1331
accesskit_node_set_scroll_y(ae->node, p_position);
1332
}
1333
1334
void AccessibilityServerAccessKit::update_set_scroll_y_range(const RID &p_id, double p_min, double p_max) {
1335
ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
1336
1337
AccessibilityElement *ae = rid_owner.get_or_null(p_id);
1338
ERR_FAIL_NULL(ae);
1339
_ensure_node(p_id, ae);
1340
1341
accesskit_node_set_scroll_y_min(ae->node, p_min);
1342
accesskit_node_set_scroll_y_max(ae->node, p_max);
1343
}
1344
1345
void AccessibilityServerAccessKit::update_set_text_decorations(const RID &p_id, bool p_underline, bool p_strikethrough, bool p_overline, const Color &p_color) {
1346
ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
1347
1348
AccessibilityElement *ae = rid_owner.get_or_null(p_id);
1349
ERR_FAIL_NULL(ae);
1350
_ensure_node(p_id, ae);
1351
1352
accesskit_color color;
1353
color.red = p_color.get_r8();
1354
color.blue = p_color.get_b8();
1355
color.green = p_color.get_g8();
1356
color.alpha = p_color.get_a8();
1357
1358
if (p_underline) {
1359
accesskit_node_set_underline(ae->node, { ACCESSKIT_TEXT_DECORATION_STYLE_SOLID, color });
1360
} else {
1361
accesskit_node_clear_underline(ae->node);
1362
}
1363
if (p_overline) {
1364
accesskit_node_set_overline(ae->node, { ACCESSKIT_TEXT_DECORATION_STYLE_SOLID, color });
1365
} else {
1366
accesskit_node_clear_overline(ae->node);
1367
}
1368
if (p_strikethrough) {
1369
accesskit_node_set_strikethrough(ae->node, { ACCESSKIT_TEXT_DECORATION_STYLE_SOLID, color });
1370
} else {
1371
accesskit_node_clear_strikethrough(ae->node);
1372
}
1373
}
1374
1375
void AccessibilityServerAccessKit::update_set_text_align(const RID &p_id, HorizontalAlignment p_align) {
1376
ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
1377
1378
AccessibilityElement *ae = rid_owner.get_or_null(p_id);
1379
ERR_FAIL_NULL(ae);
1380
_ensure_node(p_id, ae);
1381
1382
switch (p_align) {
1383
case HORIZONTAL_ALIGNMENT_LEFT: {
1384
accesskit_node_set_text_align(ae->node, ACCESSKIT_TEXT_ALIGN_LEFT);
1385
} break;
1386
case HORIZONTAL_ALIGNMENT_CENTER: {
1387
accesskit_node_set_text_align(ae->node, ACCESSKIT_TEXT_ALIGN_RIGHT);
1388
} break;
1389
case HORIZONTAL_ALIGNMENT_RIGHT: {
1390
accesskit_node_set_text_align(ae->node, ACCESSKIT_TEXT_ALIGN_CENTER);
1391
} break;
1392
case HORIZONTAL_ALIGNMENT_FILL: {
1393
accesskit_node_set_text_align(ae->node, ACCESSKIT_TEXT_ALIGN_JUSTIFY);
1394
} break;
1395
}
1396
}
1397
1398
void AccessibilityServerAccessKit::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) {
1399
ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
1400
1401
AccessibilityElement *ae = rid_owner.get_or_null(p_id);
1402
ERR_FAIL_NULL(ae);
1403
AccessibilityElement *start_ae = rid_owner.get_or_null(p_text_start_id);
1404
ERR_FAIL_NULL(start_ae);
1405
ERR_FAIL_COND(start_ae->window_id != ae->window_id);
1406
AccessibilityElement *end_ae = rid_owner.get_or_null(p_text_end_id);
1407
ERR_FAIL_NULL(end_ae);
1408
ERR_FAIL_COND(end_ae->window_id != ae->window_id);
1409
1410
int start_pos = p_start_char;
1411
int end_pos = p_end_char;
1412
RID start_rid;
1413
RID end_rid;
1414
for (const RID &rid : start_ae->children) {
1415
const AccessibilityElement *child_ae = rid_owner.get_or_null(rid);
1416
if (child_ae && child_ae->role == ACCESSKIT_ROLE_TEXT_RUN) {
1417
if (p_start_char >= child_ae->run.x && p_start_char <= child_ae->run.y) {
1418
start_rid = rid;
1419
start_pos = p_start_char - child_ae->run.x;
1420
break;
1421
}
1422
}
1423
}
1424
for (const RID &rid : end_ae->children) {
1425
const AccessibilityElement *child_ae = rid_owner.get_or_null(rid);
1426
if (child_ae && child_ae->role == ACCESSKIT_ROLE_TEXT_RUN) {
1427
if (p_end_char >= child_ae->run.x && p_end_char <= child_ae->run.y) {
1428
end_rid = rid;
1429
end_pos = p_end_char - child_ae->run.x;
1430
break;
1431
}
1432
}
1433
}
1434
ERR_FAIL_COND(start_rid.is_null() && end_rid.is_null());
1435
_ensure_node(p_id, ae);
1436
1437
accesskit_text_selection sel;
1438
sel.anchor.node = (accesskit_node_id)start_rid.get_id();
1439
sel.anchor.character_index = start_pos;
1440
sel.focus.node = (accesskit_node_id)end_rid.get_id();
1441
sel.focus.character_index = end_pos;
1442
accesskit_node_set_text_selection(ae->node, sel);
1443
}
1444
1445
void AccessibilityServerAccessKit::update_set_flag(const RID &p_id, AccessibilityServerEnums::AccessibilityFlags p_flag, bool p_value) {
1446
ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
1447
1448
AccessibilityElement *ae = rid_owner.get_or_null(p_id);
1449
ERR_FAIL_NULL(ae);
1450
_ensure_node(p_id, ae);
1451
1452
if (p_value) {
1453
ae->flags |= (1ULL << (uint64_t)p_flag);
1454
} else {
1455
ae->flags &= ~(1ULL << (uint64_t)p_flag);
1456
}
1457
switch (p_flag) {
1458
case AccessibilityServerEnums::AccessibilityFlags::FLAG_HIDDEN: {
1459
if (p_value) {
1460
accesskit_node_set_hidden(ae->node);
1461
} else {
1462
accesskit_node_clear_hidden(ae->node);
1463
}
1464
} break;
1465
case AccessibilityServerEnums::AccessibilityFlags::FLAG_MULTISELECTABLE: {
1466
if (p_value) {
1467
accesskit_node_set_multiselectable(ae->node);
1468
} else {
1469
accesskit_node_clear_multiselectable(ae->node);
1470
}
1471
} break;
1472
case AccessibilityServerEnums::AccessibilityFlags::FLAG_REQUIRED: {
1473
if (p_value) {
1474
accesskit_node_set_required(ae->node);
1475
} else {
1476
accesskit_node_clear_required(ae->node);
1477
}
1478
} break;
1479
case AccessibilityServerEnums::AccessibilityFlags::FLAG_VISITED: {
1480
if (p_value) {
1481
accesskit_node_set_visited(ae->node);
1482
} else {
1483
accesskit_node_clear_visited(ae->node);
1484
}
1485
} break;
1486
case AccessibilityServerEnums::AccessibilityFlags::FLAG_BUSY: {
1487
if (p_value) {
1488
accesskit_node_set_busy(ae->node);
1489
} else {
1490
accesskit_node_clear_busy(ae->node);
1491
}
1492
} break;
1493
case AccessibilityServerEnums::AccessibilityFlags::FLAG_MODAL: {
1494
if (p_value) {
1495
accesskit_node_set_modal(ae->node);
1496
} else {
1497
accesskit_node_clear_modal(ae->node);
1498
}
1499
} break;
1500
case AccessibilityServerEnums::AccessibilityFlags::FLAG_TOUCH_PASSTHROUGH: {
1501
if (p_value) {
1502
accesskit_node_set_touch_transparent(ae->node);
1503
} else {
1504
accesskit_node_clear_touch_transparent(ae->node);
1505
}
1506
} break;
1507
case AccessibilityServerEnums::AccessibilityFlags::FLAG_READONLY: {
1508
if (p_value) {
1509
accesskit_node_set_read_only(ae->node);
1510
} else {
1511
accesskit_node_clear_read_only(ae->node);
1512
}
1513
} break;
1514
case AccessibilityServerEnums::AccessibilityFlags::FLAG_DISABLED: {
1515
if (p_value) {
1516
accesskit_node_set_disabled(ae->node);
1517
} else {
1518
accesskit_node_clear_disabled(ae->node);
1519
}
1520
} break;
1521
case AccessibilityServerEnums::AccessibilityFlags::FLAG_CLIPS_CHILDREN: {
1522
if (p_value) {
1523
accesskit_node_set_clips_children(ae->node);
1524
} else {
1525
accesskit_node_clear_clips_children(ae->node);
1526
}
1527
} break;
1528
}
1529
}
1530
1531
void AccessibilityServerAccessKit::update_set_classname(const RID &p_id, const String &p_classname) {
1532
ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
1533
1534
AccessibilityElement *ae = rid_owner.get_or_null(p_id);
1535
ERR_FAIL_NULL(ae);
1536
_ensure_node(p_id, ae);
1537
1538
if (!p_classname.is_empty()) {
1539
accesskit_node_set_class_name(ae->node, p_classname.utf8().ptr());
1540
} else {
1541
accesskit_node_clear_class_name(ae->node);
1542
}
1543
}
1544
1545
void AccessibilityServerAccessKit::update_set_placeholder(const RID &p_id, const String &p_placeholder) {
1546
ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
1547
1548
AccessibilityElement *ae = rid_owner.get_or_null(p_id);
1549
ERR_FAIL_NULL(ae);
1550
_ensure_node(p_id, ae);
1551
1552
if (!p_placeholder.is_empty()) {
1553
accesskit_node_set_placeholder(ae->node, p_placeholder.utf8().ptr());
1554
} else {
1555
accesskit_node_clear_placeholder(ae->node);
1556
}
1557
}
1558
1559
void AccessibilityServerAccessKit::update_set_language(const RID &p_id, const String &p_language) {
1560
ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
1561
1562
AccessibilityElement *ae = rid_owner.get_or_null(p_id);
1563
ERR_FAIL_NULL(ae);
1564
_ensure_node(p_id, ae);
1565
1566
accesskit_node_set_language(ae->node, p_language.utf8().ptr());
1567
}
1568
1569
void AccessibilityServerAccessKit::update_set_text_orientation(const RID &p_id, bool p_vertical) {
1570
ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
1571
1572
AccessibilityElement *ae = rid_owner.get_or_null(p_id);
1573
ERR_FAIL_NULL(ae);
1574
_ensure_node(p_id, ae);
1575
1576
if (p_vertical) {
1577
accesskit_node_set_text_direction(ae->node, ACCESSKIT_TEXT_DIRECTION_TOP_TO_BOTTOM);
1578
} else {
1579
accesskit_node_set_text_direction(ae->node, ACCESSKIT_TEXT_DIRECTION_LEFT_TO_RIGHT);
1580
}
1581
}
1582
1583
void AccessibilityServerAccessKit::update_set_list_orientation(const RID &p_id, bool p_vertical) {
1584
ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
1585
1586
AccessibilityElement *ae = rid_owner.get_or_null(p_id);
1587
ERR_FAIL_NULL(ae);
1588
_ensure_node(p_id, ae);
1589
1590
if (p_vertical) {
1591
accesskit_node_set_orientation(ae->node, ACCESSKIT_ORIENTATION_VERTICAL);
1592
} else {
1593
accesskit_node_set_orientation(ae->node, ACCESSKIT_ORIENTATION_HORIZONTAL);
1594
}
1595
}
1596
1597
void AccessibilityServerAccessKit::update_set_shortcut(const RID &p_id, const String &p_shortcut) {
1598
ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
1599
1600
AccessibilityElement *ae = rid_owner.get_or_null(p_id);
1601
ERR_FAIL_NULL(ae);
1602
_ensure_node(p_id, ae);
1603
1604
if (!p_shortcut.is_empty()) {
1605
accesskit_node_set_keyboard_shortcut(ae->node, p_shortcut.utf8().ptr());
1606
} else {
1607
accesskit_node_clear_keyboard_shortcut(ae->node);
1608
}
1609
}
1610
1611
void AccessibilityServerAccessKit::update_set_url(const RID &p_id, const String &p_url) {
1612
ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
1613
1614
AccessibilityElement *ae = rid_owner.get_or_null(p_id);
1615
ERR_FAIL_NULL(ae);
1616
_ensure_node(p_id, ae);
1617
1618
if (!p_url.is_empty()) {
1619
accesskit_node_set_url(ae->node, p_url.utf8().ptr());
1620
} else {
1621
accesskit_node_clear_url(ae->node);
1622
}
1623
}
1624
1625
void AccessibilityServerAccessKit::update_set_role_description(const RID &p_id, const String &p_description) {
1626
ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
1627
1628
AccessibilityElement *ae = rid_owner.get_or_null(p_id);
1629
ERR_FAIL_NULL(ae);
1630
_ensure_node(p_id, ae);
1631
1632
if (!p_description.is_empty()) {
1633
accesskit_node_set_role_description(ae->node, p_description.utf8().ptr());
1634
} else {
1635
accesskit_node_clear_role_description(ae->node);
1636
}
1637
}
1638
1639
void AccessibilityServerAccessKit::update_set_state_description(const RID &p_id, const String &p_description) {
1640
ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
1641
1642
AccessibilityElement *ae = rid_owner.get_or_null(p_id);
1643
ERR_FAIL_NULL(ae);
1644
_ensure_node(p_id, ae);
1645
1646
if (!p_description.is_empty()) {
1647
accesskit_node_set_state_description(ae->node, p_description.utf8().ptr());
1648
} else {
1649
accesskit_node_clear_state_description(ae->node);
1650
}
1651
}
1652
1653
void AccessibilityServerAccessKit::update_set_color_value(const RID &p_id, const Color &p_color) {
1654
ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
1655
1656
AccessibilityElement *ae = rid_owner.get_or_null(p_id);
1657
ERR_FAIL_NULL(ae);
1658
_ensure_node(p_id, ae);
1659
1660
ae->value = p_color;
1661
1662
accesskit_color color;
1663
color.red = p_color.get_r8();
1664
color.blue = p_color.get_b8();
1665
color.green = p_color.get_g8();
1666
color.alpha = p_color.get_a8();
1667
1668
accesskit_node_set_color_value(ae->node, color);
1669
}
1670
1671
void AccessibilityServerAccessKit::update_set_background_color(const RID &p_id, const Color &p_color) {
1672
ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
1673
1674
AccessibilityElement *ae = rid_owner.get_or_null(p_id);
1675
ERR_FAIL_NULL(ae);
1676
_ensure_node(p_id, ae);
1677
1678
accesskit_color color;
1679
color.red = p_color.get_r8();
1680
color.blue = p_color.get_b8();
1681
color.green = p_color.get_g8();
1682
color.alpha = p_color.get_a8();
1683
1684
accesskit_node_set_background_color(ae->node, color);
1685
}
1686
1687
void AccessibilityServerAccessKit::update_set_foreground_color(const RID &p_id, const Color &p_color) {
1688
ERR_FAIL_COND_MSG(!in_accessibility_update, "Accessibility updates are only allowed inside the NOTIFICATION_ACCESSIBILITY_UPDATE notification.");
1689
1690
AccessibilityElement *ae = rid_owner.get_or_null(p_id);
1691
ERR_FAIL_NULL(ae);
1692
_ensure_node(p_id, ae);
1693
1694
accesskit_color color;
1695
color.red = p_color.get_r8();
1696
color.blue = p_color.get_b8();
1697
color.green = p_color.get_g8();
1698
color.alpha = p_color.get_a8();
1699
1700
accesskit_node_set_foreground_color(ae->node, color);
1701
}
1702
1703
AccessibilityServer *AccessibilityServerAccessKit::create_func(Error &r_error) {
1704
print_verbose("Accessibility: AccessKit driver loaded.");
1705
r_error = OK;
1706
return memnew(AccessibilityServerAccessKit);
1707
}
1708
1709
AccessibilityServerAccessKit::AccessibilityServerAccessKit() {
1710
role_map[AccessibilityServerEnums::AccessibilityRole::ROLE_UNKNOWN] = ACCESSKIT_ROLE_UNKNOWN;
1711
role_map[AccessibilityServerEnums::AccessibilityRole::ROLE_DEFAULT_BUTTON] = ACCESSKIT_ROLE_DEFAULT_BUTTON;
1712
role_map[AccessibilityServerEnums::AccessibilityRole::ROLE_AUDIO] = ACCESSKIT_ROLE_AUDIO;
1713
role_map[AccessibilityServerEnums::AccessibilityRole::ROLE_VIDEO] = ACCESSKIT_ROLE_VIDEO;
1714
role_map[AccessibilityServerEnums::AccessibilityRole::ROLE_STATIC_TEXT] = ACCESSKIT_ROLE_LABEL;
1715
role_map[AccessibilityServerEnums::AccessibilityRole::ROLE_CONTAINER] = ACCESSKIT_ROLE_GENERIC_CONTAINER;
1716
role_map[AccessibilityServerEnums::AccessibilityRole::ROLE_PANEL] = ACCESSKIT_ROLE_PANE;
1717
role_map[AccessibilityServerEnums::AccessibilityRole::ROLE_BUTTON] = ACCESSKIT_ROLE_BUTTON;
1718
role_map[AccessibilityServerEnums::AccessibilityRole::ROLE_LINK] = ACCESSKIT_ROLE_LINK;
1719
role_map[AccessibilityServerEnums::AccessibilityRole::ROLE_CHECK_BOX] = ACCESSKIT_ROLE_CHECK_BOX;
1720
role_map[AccessibilityServerEnums::AccessibilityRole::ROLE_RADIO_BUTTON] = ACCESSKIT_ROLE_RADIO_BUTTON;
1721
role_map[AccessibilityServerEnums::AccessibilityRole::ROLE_CHECK_BUTTON] = ACCESSKIT_ROLE_SWITCH;
1722
role_map[AccessibilityServerEnums::AccessibilityRole::ROLE_SCROLL_BAR] = ACCESSKIT_ROLE_SCROLL_BAR;
1723
role_map[AccessibilityServerEnums::AccessibilityRole::ROLE_SCROLL_VIEW] = ACCESSKIT_ROLE_SCROLL_VIEW;
1724
role_map[AccessibilityServerEnums::AccessibilityRole::ROLE_SPLITTER] = ACCESSKIT_ROLE_SPLITTER;
1725
role_map[AccessibilityServerEnums::AccessibilityRole::ROLE_SLIDER] = ACCESSKIT_ROLE_SLIDER;
1726
role_map[AccessibilityServerEnums::AccessibilityRole::ROLE_SPIN_BUTTON] = ACCESSKIT_ROLE_SPIN_BUTTON;
1727
role_map[AccessibilityServerEnums::AccessibilityRole::ROLE_PROGRESS_INDICATOR] = ACCESSKIT_ROLE_PROGRESS_INDICATOR;
1728
role_map[AccessibilityServerEnums::AccessibilityRole::ROLE_TEXT_FIELD] = ACCESSKIT_ROLE_TEXT_INPUT;
1729
role_map[AccessibilityServerEnums::AccessibilityRole::ROLE_MULTILINE_TEXT_FIELD] = ACCESSKIT_ROLE_MULTILINE_TEXT_INPUT;
1730
role_map[AccessibilityServerEnums::AccessibilityRole::ROLE_COLOR_PICKER] = ACCESSKIT_ROLE_COLOR_WELL;
1731
role_map[AccessibilityServerEnums::AccessibilityRole::ROLE_TABLE] = ACCESSKIT_ROLE_TABLE;
1732
role_map[AccessibilityServerEnums::AccessibilityRole::ROLE_CELL] = ACCESSKIT_ROLE_CELL;
1733
role_map[AccessibilityServerEnums::AccessibilityRole::ROLE_ROW] = ACCESSKIT_ROLE_ROW;
1734
role_map[AccessibilityServerEnums::AccessibilityRole::ROLE_ROW_GROUP] = ACCESSKIT_ROLE_ROW_GROUP;
1735
role_map[AccessibilityServerEnums::AccessibilityRole::ROLE_ROW_HEADER] = ACCESSKIT_ROLE_ROW_HEADER;
1736
role_map[AccessibilityServerEnums::AccessibilityRole::ROLE_COLUMN_HEADER] = ACCESSKIT_ROLE_COLUMN_HEADER;
1737
role_map[AccessibilityServerEnums::AccessibilityRole::ROLE_TREE] = ACCESSKIT_ROLE_TREE;
1738
role_map[AccessibilityServerEnums::AccessibilityRole::ROLE_TREE_ITEM] = ACCESSKIT_ROLE_TREE_ITEM;
1739
role_map[AccessibilityServerEnums::AccessibilityRole::ROLE_LIST] = ACCESSKIT_ROLE_LIST;
1740
role_map[AccessibilityServerEnums::AccessibilityRole::ROLE_LIST_ITEM] = ACCESSKIT_ROLE_LIST_ITEM;
1741
role_map[AccessibilityServerEnums::AccessibilityRole::ROLE_LIST_BOX] = ACCESSKIT_ROLE_LIST_BOX;
1742
role_map[AccessibilityServerEnums::AccessibilityRole::ROLE_LIST_BOX_OPTION] = ACCESSKIT_ROLE_LIST_BOX_OPTION;
1743
role_map[AccessibilityServerEnums::AccessibilityRole::ROLE_TAB_BAR] = ACCESSKIT_ROLE_TAB_LIST;
1744
role_map[AccessibilityServerEnums::AccessibilityRole::ROLE_TAB] = ACCESSKIT_ROLE_TAB;
1745
role_map[AccessibilityServerEnums::AccessibilityRole::ROLE_TAB_PANEL] = ACCESSKIT_ROLE_TAB_PANEL;
1746
role_map[AccessibilityServerEnums::AccessibilityRole::ROLE_MENU_BAR] = ACCESSKIT_ROLE_MENU_BAR;
1747
role_map[AccessibilityServerEnums::AccessibilityRole::ROLE_MENU] = ACCESSKIT_ROLE_MENU;
1748
role_map[AccessibilityServerEnums::AccessibilityRole::ROLE_MENU_ITEM] = ACCESSKIT_ROLE_MENU_ITEM;
1749
role_map[AccessibilityServerEnums::AccessibilityRole::ROLE_MENU_ITEM_CHECK_BOX] = ACCESSKIT_ROLE_MENU_ITEM_CHECK_BOX;
1750
role_map[AccessibilityServerEnums::AccessibilityRole::ROLE_MENU_ITEM_RADIO] = ACCESSKIT_ROLE_MENU_ITEM_RADIO;
1751
role_map[AccessibilityServerEnums::AccessibilityRole::ROLE_IMAGE] = ACCESSKIT_ROLE_IMAGE;
1752
role_map[AccessibilityServerEnums::AccessibilityRole::ROLE_WINDOW] = ACCESSKIT_ROLE_WINDOW;
1753
role_map[AccessibilityServerEnums::AccessibilityRole::ROLE_TITLE_BAR] = ACCESSKIT_ROLE_TITLE_BAR;
1754
role_map[AccessibilityServerEnums::AccessibilityRole::ROLE_DIALOG] = ACCESSKIT_ROLE_DIALOG;
1755
role_map[AccessibilityServerEnums::AccessibilityRole::ROLE_TOOLTIP] = ACCESSKIT_ROLE_TOOLTIP;
1756
role_map[AccessibilityServerEnums::AccessibilityRole::ROLE_REGION] = ACCESSKIT_ROLE_REGION;
1757
role_map[AccessibilityServerEnums::AccessibilityRole::ROLE_TEXT_RUN] = ACCESSKIT_ROLE_TEXT_RUN;
1758
1759
action_map[AccessibilityServerEnums::AccessibilityAction::ACTION_CLICK] = ACCESSKIT_ACTION_CLICK;
1760
action_map[AccessibilityServerEnums::AccessibilityAction::ACTION_FOCUS] = ACCESSKIT_ACTION_FOCUS;
1761
action_map[AccessibilityServerEnums::AccessibilityAction::ACTION_BLUR] = ACCESSKIT_ACTION_BLUR;
1762
action_map[AccessibilityServerEnums::AccessibilityAction::ACTION_COLLAPSE] = ACCESSKIT_ACTION_COLLAPSE;
1763
action_map[AccessibilityServerEnums::AccessibilityAction::ACTION_EXPAND] = ACCESSKIT_ACTION_EXPAND;
1764
action_map[AccessibilityServerEnums::AccessibilityAction::ACTION_DECREMENT] = ACCESSKIT_ACTION_DECREMENT;
1765
action_map[AccessibilityServerEnums::AccessibilityAction::ACTION_INCREMENT] = ACCESSKIT_ACTION_INCREMENT;
1766
action_map[AccessibilityServerEnums::AccessibilityAction::ACTION_HIDE_TOOLTIP] = ACCESSKIT_ACTION_HIDE_TOOLTIP;
1767
action_map[AccessibilityServerEnums::AccessibilityAction::ACTION_SHOW_TOOLTIP] = ACCESSKIT_ACTION_SHOW_TOOLTIP;
1768
//action_map[AccessibilityServerEnums::AccessibilityAction::ACTION_INVALIDATE_TREE] = ACCESSKIT_ACTION_INVALIDATE_TREE;
1769
//action_map[AccessibilityServerEnums::AccessibilityAction::ACTION_LOAD_INLINE_TEXT_BOXES] = ACCESSKIT_ACTION_LOAD_INLINE_TEXT_BOXES;
1770
action_map[AccessibilityServerEnums::AccessibilityAction::ACTION_SET_TEXT_SELECTION] = ACCESSKIT_ACTION_SET_TEXT_SELECTION;
1771
action_map[AccessibilityServerEnums::AccessibilityAction::ACTION_REPLACE_SELECTED_TEXT] = ACCESSKIT_ACTION_REPLACE_SELECTED_TEXT;
1772
action_map[AccessibilityServerEnums::AccessibilityAction::ACTION_SCROLL_BACKWARD] = ACCESSKIT_ACTION_SCROLL_UP;
1773
action_map[AccessibilityServerEnums::AccessibilityAction::ACTION_SCROLL_DOWN] = ACCESSKIT_ACTION_SCROLL_DOWN;
1774
action_map[AccessibilityServerEnums::AccessibilityAction::ACTION_SCROLL_FORWARD] = ACCESSKIT_ACTION_SCROLL_DOWN;
1775
action_map[AccessibilityServerEnums::AccessibilityAction::ACTION_SCROLL_LEFT] = ACCESSKIT_ACTION_SCROLL_LEFT;
1776
action_map[AccessibilityServerEnums::AccessibilityAction::ACTION_SCROLL_RIGHT] = ACCESSKIT_ACTION_SCROLL_RIGHT;
1777
action_map[AccessibilityServerEnums::AccessibilityAction::ACTION_SCROLL_UP] = ACCESSKIT_ACTION_SCROLL_UP;
1778
action_map[AccessibilityServerEnums::AccessibilityAction::ACTION_SCROLL_INTO_VIEW] = ACCESSKIT_ACTION_SCROLL_INTO_VIEW;
1779
action_map[AccessibilityServerEnums::AccessibilityAction::ACTION_SCROLL_TO_POINT] = ACCESSKIT_ACTION_SCROLL_TO_POINT;
1780
action_map[AccessibilityServerEnums::AccessibilityAction::ACTION_SET_SCROLL_OFFSET] = ACCESSKIT_ACTION_SET_SCROLL_OFFSET;
1781
//action_map[AccessibilityServerEnums::AccessibilityAction::ACTION_SET_SEQUENTIAL_FOCUS_NAVIGATION_STARTING_POINT] = ACCESSKIT_ACTION_SET_SEQUENTIAL_FOCUS_NAVIGATION_STARTING_POINT;
1782
action_map[AccessibilityServerEnums::AccessibilityAction::ACTION_SET_VALUE] = ACCESSKIT_ACTION_SET_VALUE;
1783
action_map[AccessibilityServerEnums::AccessibilityAction::ACTION_SHOW_CONTEXT_MENU] = ACCESSKIT_ACTION_SHOW_CONTEXT_MENU;
1784
action_map[AccessibilityServerEnums::AccessibilityAction::ACTION_CUSTOM] = ACCESSKIT_ACTION_CUSTOM_ACTION;
1785
}
1786
1787
AccessibilityServerAccessKit::~AccessibilityServerAccessKit() {}
1788
1789
void AccessibilityServerAccessKit::register_create_func() {
1790
register_create_function("accesskit", create_func);
1791
}
1792
1793
#endif // ACCESSKIT_ENABLED
1794
1795