Skip to content

Commit 7d8207e

Browse files
committed
Merge pull request #109739 from bruvzg/ac_flags
Use `org.a11y.Status/ScreenReaderEnabled` on Linux.
2 parents 3d87dcb + 98bef37 commit 7d8207e

File tree

2 files changed

+49
-3
lines changed

2 files changed

+49
-3
lines changed

platform/linuxbsd/freedesktop_at_spi_monitor.cpp

Lines changed: 47 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,20 +61,65 @@ void FreeDesktopAtSPIMonitor::monitor_thread_func(void *p_userdata) {
6161
}
6262

6363
static const char *iface = "org.a11y.Status";
64-
static const char *member = "IsEnabled";
64+
static const char *member_ac = "IsEnabled";
65+
static const char *member_sr = "ScreenReaderEnabled";
6566

6667
while (!mon->exit_thread.is_set()) {
6768
DBusMessage *message = dbus_message_new_method_call(BUS_OBJECT_NAME, BUS_OBJECT_PATH, BUS_INTERFACE_PROPERTIES, "Get");
6869

6970
dbus_message_append_args(
7071
message,
7172
DBUS_TYPE_STRING, &iface,
72-
DBUS_TYPE_STRING, &member,
73+
DBUS_TYPE_STRING, &member_ac,
7374
DBUS_TYPE_INVALID);
7475

7576
DBusMessage *reply = dbus_connection_send_with_reply_and_block(bus, message, 50, &error);
7677
dbus_message_unref(message);
7778

79+
if (!dbus_error_is_set(&error)) {
80+
DBusMessageIter iter, iter_variant, iter_struct;
81+
dbus_bool_t result;
82+
dbus_message_iter_init(reply, &iter);
83+
dbus_message_iter_recurse(&iter, &iter_variant);
84+
switch (dbus_message_iter_get_arg_type(&iter_variant)) {
85+
case DBUS_TYPE_STRUCT: {
86+
dbus_message_iter_recurse(&iter_variant, &iter_struct);
87+
if (dbus_message_iter_get_arg_type(&iter_struct) == DBUS_TYPE_BOOLEAN) {
88+
dbus_message_iter_get_basic(&iter_struct, &result);
89+
if (result) {
90+
mon->ac_enabled.set();
91+
} else {
92+
mon->ac_enabled.clear();
93+
}
94+
}
95+
} break;
96+
case DBUS_TYPE_BOOLEAN: {
97+
dbus_message_iter_get_basic(&iter_variant, &result);
98+
if (result) {
99+
mon->ac_enabled.set();
100+
} else {
101+
mon->ac_enabled.clear();
102+
}
103+
} break;
104+
default:
105+
break;
106+
}
107+
dbus_message_unref(reply);
108+
} else {
109+
dbus_error_free(&error);
110+
}
111+
112+
message = dbus_message_new_method_call(BUS_OBJECT_NAME, BUS_OBJECT_PATH, BUS_INTERFACE_PROPERTIES, "Get");
113+
114+
dbus_message_append_args(
115+
message,
116+
DBUS_TYPE_STRING, &iface,
117+
DBUS_TYPE_STRING, &member_sr,
118+
DBUS_TYPE_INVALID);
119+
120+
reply = dbus_connection_send_with_reply_and_block(bus, message, 50, &error);
121+
dbus_message_unref(message);
122+
78123
if (!dbus_error_is_set(&error)) {
79124
DBusMessageIter iter, iter_variant, iter_struct;
80125
dbus_bool_t result;

platform/linuxbsd/freedesktop_at_spi_monitor.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ class FreeDesktopAtSPIMonitor {
4040
Thread thread;
4141

4242
SafeFlag exit_thread;
43+
SafeFlag ac_enabled;
4344
SafeFlag sr_enabled;
4445
SafeFlag supported;
4546

@@ -50,7 +51,7 @@ class FreeDesktopAtSPIMonitor {
5051
~FreeDesktopAtSPIMonitor();
5152

5253
bool is_supported() { return supported.is_set(); }
53-
bool is_active() { return sr_enabled.is_set(); }
54+
bool is_active() { return sr_enabled.is_set() && ac_enabled.is_set(); }
5455
};
5556

5657
#endif // DBUS_ENABLED

0 commit comments

Comments
 (0)