Use org.a11y.Status/ScreenReaderEnabled on Linux.

This commit is contained in:
Pāvels Nadtočajevs 2025-08-18 17:36:49 +03:00
parent 42224bb750
commit 98bef37f55
No known key found for this signature in database
GPG key ID: 8413210218EF35D2
2 changed files with 49 additions and 3 deletions

View file

@ -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;

View file

@ -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