Sfoglia il codice sorgente

Merge pull request #109739 from bruvzg/ac_flags

Use `org.a11y.Status/ScreenReaderEnabled` on Linux.
Thaddeus Crews 2 settimane fa
parent
commit
7d8207e885

+ 47 - 2
platform/linuxbsd/freedesktop_at_spi_monitor.cpp

@@ -61,7 +61,8 @@ void FreeDesktopAtSPIMonitor::monitor_thread_func(void *p_userdata) {
 	}
 
 	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()) {
 		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(
 				message,
 				DBUS_TYPE_STRING, &iface,
-				DBUS_TYPE_STRING, &member,
+				DBUS_TYPE_STRING, &member_ac,
 				DBUS_TYPE_INVALID);
 
 		DBusMessage *reply = dbus_connection_send_with_reply_and_block(bus, message, 50, &error);
 		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)) {
 			DBusMessageIter iter, iter_variant, iter_struct;
 			dbus_bool_t result;

+ 2 - 1
platform/linuxbsd/freedesktop_at_spi_monitor.h

@@ -40,6 +40,7 @@ private:
 	Thread thread;
 
 	SafeFlag exit_thread;
+	SafeFlag ac_enabled;
 	SafeFlag sr_enabled;
 	SafeFlag supported;
 
@@ -50,7 +51,7 @@ public:
 	~FreeDesktopAtSPIMonitor();
 
 	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