mirror of
https://github.com/godotengine/godot.git
synced 2025-10-19 16:03:29 +00:00
Use org.a11y.Status/ScreenReaderEnabled on Linux.
This commit is contained in:
parent
42224bb750
commit
98bef37f55
2 changed files with 49 additions and 3 deletions
|
@ -61,7 +61,8 @@ void FreeDesktopAtSPIMonitor::monitor_thread_func(void *p_userdata) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char *iface = "org.a11y.Status";
|
static const char *iface = "org.a11y.Status";
|
||||||
static const char *member = "IsEnabled";
|
static const char *member_ac = "IsEnabled";
|
||||||
|
static const char *member_sr = "ScreenReaderEnabled";
|
||||||
|
|
||||||
while (!mon->exit_thread.is_set()) {
|
while (!mon->exit_thread.is_set()) {
|
||||||
DBusMessage *message = dbus_message_new_method_call(BUS_OBJECT_NAME, BUS_OBJECT_PATH, BUS_INTERFACE_PROPERTIES, "Get");
|
DBusMessage *message = dbus_message_new_method_call(BUS_OBJECT_NAME, BUS_OBJECT_PATH, BUS_INTERFACE_PROPERTIES, "Get");
|
||||||
|
@ -69,12 +70,56 @@ void FreeDesktopAtSPIMonitor::monitor_thread_func(void *p_userdata) {
|
||||||
dbus_message_append_args(
|
dbus_message_append_args(
|
||||||
message,
|
message,
|
||||||
DBUS_TYPE_STRING, &iface,
|
DBUS_TYPE_STRING, &iface,
|
||||||
DBUS_TYPE_STRING, &member,
|
DBUS_TYPE_STRING, &member_ac,
|
||||||
DBUS_TYPE_INVALID);
|
DBUS_TYPE_INVALID);
|
||||||
|
|
||||||
DBusMessage *reply = dbus_connection_send_with_reply_and_block(bus, message, 50, &error);
|
DBusMessage *reply = dbus_connection_send_with_reply_and_block(bus, message, 50, &error);
|
||||||
dbus_message_unref(message);
|
dbus_message_unref(message);
|
||||||
|
|
||||||
|
if (!dbus_error_is_set(&error)) {
|
||||||
|
DBusMessageIter iter, iter_variant, iter_struct;
|
||||||
|
dbus_bool_t result;
|
||||||
|
dbus_message_iter_init(reply, &iter);
|
||||||
|
dbus_message_iter_recurse(&iter, &iter_variant);
|
||||||
|
switch (dbus_message_iter_get_arg_type(&iter_variant)) {
|
||||||
|
case DBUS_TYPE_STRUCT: {
|
||||||
|
dbus_message_iter_recurse(&iter_variant, &iter_struct);
|
||||||
|
if (dbus_message_iter_get_arg_type(&iter_struct) == DBUS_TYPE_BOOLEAN) {
|
||||||
|
dbus_message_iter_get_basic(&iter_struct, &result);
|
||||||
|
if (result) {
|
||||||
|
mon->ac_enabled.set();
|
||||||
|
} else {
|
||||||
|
mon->ac_enabled.clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} break;
|
||||||
|
case DBUS_TYPE_BOOLEAN: {
|
||||||
|
dbus_message_iter_get_basic(&iter_variant, &result);
|
||||||
|
if (result) {
|
||||||
|
mon->ac_enabled.set();
|
||||||
|
} else {
|
||||||
|
mon->ac_enabled.clear();
|
||||||
|
}
|
||||||
|
} break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
dbus_message_unref(reply);
|
||||||
|
} else {
|
||||||
|
dbus_error_free(&error);
|
||||||
|
}
|
||||||
|
|
||||||
|
message = dbus_message_new_method_call(BUS_OBJECT_NAME, BUS_OBJECT_PATH, BUS_INTERFACE_PROPERTIES, "Get");
|
||||||
|
|
||||||
|
dbus_message_append_args(
|
||||||
|
message,
|
||||||
|
DBUS_TYPE_STRING, &iface,
|
||||||
|
DBUS_TYPE_STRING, &member_sr,
|
||||||
|
DBUS_TYPE_INVALID);
|
||||||
|
|
||||||
|
reply = dbus_connection_send_with_reply_and_block(bus, message, 50, &error);
|
||||||
|
dbus_message_unref(message);
|
||||||
|
|
||||||
if (!dbus_error_is_set(&error)) {
|
if (!dbus_error_is_set(&error)) {
|
||||||
DBusMessageIter iter, iter_variant, iter_struct;
|
DBusMessageIter iter, iter_variant, iter_struct;
|
||||||
dbus_bool_t result;
|
dbus_bool_t result;
|
||||||
|
|
|
@ -40,6 +40,7 @@ private:
|
||||||
Thread thread;
|
Thread thread;
|
||||||
|
|
||||||
SafeFlag exit_thread;
|
SafeFlag exit_thread;
|
||||||
|
SafeFlag ac_enabled;
|
||||||
SafeFlag sr_enabled;
|
SafeFlag sr_enabled;
|
||||||
SafeFlag supported;
|
SafeFlag supported;
|
||||||
|
|
||||||
|
@ -50,7 +51,7 @@ public:
|
||||||
~FreeDesktopAtSPIMonitor();
|
~FreeDesktopAtSPIMonitor();
|
||||||
|
|
||||||
bool is_supported() { return supported.is_set(); }
|
bool is_supported() { return supported.is_set(); }
|
||||||
bool is_active() { return sr_enabled.is_set(); }
|
bool is_active() { return sr_enabled.is_set() && ac_enabled.is_set(); }
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // DBUS_ENABLED
|
#endif // DBUS_ENABLED
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue