Move accessibility methods/enums from DisplayServer to the AccessibilityServer dedicated singleton.

This commit is contained in:
Pāvels Nadtočajevs 2025-12-10 13:12:53 +02:00
parent 4683f3806f
commit 1306221592
No known key found for this signature in database
GPG key ID: 8413210218EF35D2
88 changed files with 3156 additions and 1551 deletions

View file

@ -71,6 +71,7 @@
#include "servers/audio/audio_driver_dummy.h"
#include "servers/audio/audio_server.h"
#include "servers/camera/camera_server.h"
#include "servers/display/accessibility_server.h"
#include "servers/display/display_server.h"
#include "servers/movie_writer/movie_writer.h"
#include "servers/register_server_types.h"
@ -175,6 +176,7 @@ static SteamTracker *steam_tracker = nullptr;
// Initialized in setup2()
static AudioServer *audio_server = nullptr;
static CameraServer *camera_server = nullptr;
static AccessibilityServer *accessibility_server = nullptr;
static DisplayServer *display_server = nullptr;
static RenderingServer *rendering_server = nullptr;
static TextServerManager *tsman = nullptr;
@ -203,7 +205,8 @@ static int audio_driver_idx = -1;
// Engine config/tools
static DisplayServer::AccessibilityMode accessibility_mode = DisplayServer::AccessibilityMode::ACCESSIBILITY_AUTO;
static AccessibilityServerEnums::AccessibilityMode accessibility_mode = AccessibilityServerEnums::AccessibilityMode::ACCESSIBILITY_AUTO;
static String accessibility_driver_name;
static bool accessibility_mode_set = false;
static bool single_window = false;
static bool editor = false;
@ -408,6 +411,7 @@ void finalize_display() {
memdelete(rendering_server);
memdelete(display_server);
memdelete(accessibility_server);
}
void initialize_theme_db() {
@ -634,6 +638,7 @@ void Main::print_help(const char *p_binary) {
#endif
print_help_option("--wid <window_id>", "Request parented to window.\n");
print_help_option("--accessibility <mode>", "Select accessibility mode ['auto' (when screen reader is running, default), 'always', 'disabled'].\n");
print_help_option("--accessibility-driver <driver>", "Select accessibility driver ['accesskit', 'dummy'].\n");
print_help_title("Debug options");
print_help_option("-d, --debug", "Debug (local stdout debugger).\n");
@ -1364,13 +1369,13 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph
if (N) {
String string = N->get();
if (string == "auto") {
accessibility_mode = DisplayServer::AccessibilityMode::ACCESSIBILITY_AUTO;
accessibility_mode = AccessibilityServerEnums::AccessibilityMode::ACCESSIBILITY_AUTO;
accessibility_mode_set = true;
} else if (string == "always") {
accessibility_mode = DisplayServer::AccessibilityMode::ACCESSIBILITY_ALWAYS;
accessibility_mode = AccessibilityServerEnums::AccessibilityMode::ACCESSIBILITY_ALWAYS;
accessibility_mode_set = true;
} else if (string == "disabled") {
accessibility_mode = DisplayServer::AccessibilityMode::ACCESSIBILITY_DISABLED;
accessibility_mode = AccessibilityServerEnums::AccessibilityMode::ACCESSIBILITY_DISABLED;
accessibility_mode_set = true;
} else {
OS::get_singleton()->print("Accessibility mode argument not recognized, aborting.\n");
@ -1381,6 +1386,15 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph
OS::get_singleton()->print("Missing accessibility mode argument, aborting.\n");
goto error;
}
} else if (arg == "--accessibility-driver") {
if (N) {
String string = N->get();
accessibility_driver_name = string;
N = N->next();
} else {
OS::get_singleton()->print("Missing accessibility driver argument, aborting.\n");
goto error;
}
} else if (arg == "-t" || arg == "--always-on-top") { // force always-on-top window
init_always_on_top = true;
@ -3236,18 +3250,67 @@ Error Main::setup2(bool p_show_boot_logo) {
if (!accessibility_mode_set) {
#ifdef TOOLS_ENABLED
if (editor || project_manager || cmdline_tool) {
accessibility_mode = (DisplayServer::AccessibilityMode)accessibility_mode_editor;
accessibility_mode = (AccessibilityServerEnums::AccessibilityMode)accessibility_mode_editor;
} else {
#else
{
#endif
accessibility_mode = (DisplayServer::AccessibilityMode)GLOBAL_GET("accessibility/general/accessibility_support").operator int64_t();
accessibility_mode = (AccessibilityServerEnums::AccessibilityMode)GLOBAL_GET("accessibility/general/accessibility_support").operator int64_t();
}
}
DisplayServer::accessibility_set_mode(accessibility_mode);
if (accessibility_driver_name.is_empty()) {
if (!editor && !project_manager) {
accessibility_driver_name = GLOBAL_GET("accessibility/general/accessibility_driver");
} else {
accessibility_driver_name = "accesskit";
}
}
if (display_driver == NULL_DISPLAY_DRIVER || display_driver == EMBEDDED_DISPLAY_DRIVER || accessibility_mode == AccessibilityServerEnums::AccessibilityMode::ACCESSIBILITY_DISABLED) {
accessibility_driver_name = "dummy";
}
int accessibility_driver_idx = -1;
if (accessibility_driver_name.is_empty() || accessibility_driver_name == "default") {
accessibility_driver_idx = 0;
} else {
for (int i = 0; i < AccessibilityServer::get_create_function_count(); i++) {
String name = AccessibilityServer::get_create_function_name(i);
if (accessibility_driver_name == name) {
accessibility_driver_idx = i;
break;
}
}
if (accessibility_driver_idx < 0) {
// If the requested driver wasn't found, pick the first entry.
// If all else failed it would be the headless server.
accessibility_driver_idx = 0;
}
}
Error err;
accessibility_server = AccessibilityServer::create(accessibility_driver_idx, err);
if (err != OK || accessibility_server == nullptr) {
String last_name = AccessibilityServer::get_create_function_name(accessibility_driver_idx);
for (int i = 0; i < AccessibilityServer::get_create_function_count() - 1; i++) {
if (i == accessibility_driver_idx) {
continue; // Don't try the same twice.
}
String name = AccessibilityServer::get_create_function_name(i);
WARN_PRINT(vformat("Accessibility driver %s failed, falling back to %s.", last_name, name));
accessibility_server = AccessibilityServer::create(i, err);
if (err == OK && accessibility_server != nullptr) {
break;
}
}
}
if (accessibility_server) {
accessibility_server->set_mode(accessibility_mode);
}
String rendering_driver = OS::get_singleton()->get_current_rendering_driver_name();
Error err;
display_server = DisplayServer::create(display_driver_idx, rendering_driver, window_mode, window_vsync_mode, window_flags, window_position, window_size, init_screen, context, init_embed_parent_window_id, err);
if (err != OK || display_server == nullptr) {
String last_name = DisplayServer::get_create_function_name(display_driver_idx);