summaryrefslogtreecommitdiff
path: root/atspi/atspi-accessible.c
diff options
context:
space:
mode:
authorMike Gorse <mgorse@alum.wpi.edu>2019-07-18 18:21:09 -0500
committerMike Gorse <mgorse@alum.wpi.edu>2019-07-18 18:21:09 -0500
commit36a621aa17ed27be55cd9f16a1f7b29904cb510c (patch)
treeaab19c716716c0d831a3f180e88bddd6b9b60e90 /atspi/atspi-accessible.c
parent5604b79d72179708b218ddaaf226fc38614ca4a9 (diff)
downloadat-spi2-core-36a621aa17ed27be55cd9f16a1f7b29904cb510c.tar.gz
Refactor the API for the screen reader to notify listeners of its status
Remove atspi_text_notify_reading_position, and instead add a region_changed signal. Also make the dbus API more like the API used for other events. Per discussion at https://gitlab.gnome.org/GNOME/orca/issues/36
Diffstat (limited to 'atspi/atspi-accessible.c')
-rw-r--r--atspi/atspi-accessible.c83
1 files changed, 83 insertions, 0 deletions
diff --git a/atspi/atspi-accessible.c b/atspi/atspi-accessible.c
index 2a0eda10..b2f26915 100644
--- a/atspi/atspi-accessible.c
+++ b/atspi/atspi-accessible.c
@@ -26,9 +26,63 @@
#include "atspi-accessible-private.h"
#include <string.h>
+enum {
+ REGION_CHANGED,
+ LAST_SIGNAL
+};
+
static gboolean enable_caching = FALSE;
static guint quark_locale;
+static guint atspi_accessible_signals[LAST_SIGNAL] = { 0, };
+
+static gboolean
+screen_reader_signal_watcher (GSignalInvocationHint *signal_hint,
+ guint n_param_values,
+ const GValue *param_values,
+ gpointer data)
+{
+ GObject *object;
+ AtspiAccessible *accessible;
+ GSignalQuery signal_query;
+ const char *name;
+ DBusMessage *signal;
+ DBusMessageIter iter, iter_struct, iter_variant, iter_array;
+ dbus_int32_t detail1, detail2;
+ const char *detail = "";
+
+ object = g_value_get_object (param_values + 0);
+ g_return_val_if_fail (ATSPI_IS_ACCESSIBLE(object), FALSE);
+
+ g_signal_query (signal_hint->signal_id, &signal_query);
+ name = signal_query.signal_name;
+ detail1 = g_value_get_int (param_values + 1);
+ detail2 = g_value_get_int (param_values + 2);
+ accessible = ATSPI_ACCESSIBLE (object);
+
+ signal = dbus_message_new_signal (ATSPI_DBUS_PATH_SCREEN_READER,
+ ATSPI_DBUS_INTERFACE_EVENT_SCREEN_READER,
+ "RegionChanged");
+ dbus_message_iter_init_append (signal, &iter);
+ dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &detail);
+ dbus_message_iter_append_basic (&iter, DBUS_TYPE_INT32, &detail1);
+ dbus_message_iter_append_basic (&iter, DBUS_TYPE_INT32, &detail2);
+ dbus_message_iter_open_container (&iter, DBUS_TYPE_VARIANT, "(so)",
+ &iter_variant);
+ dbus_message_iter_open_container (&iter_variant, DBUS_TYPE_STRUCT, NULL,
+ &iter_struct);
+ dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_STRING, &accessible->parent.app->bus_name);
+ dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_OBJECT_PATH, &accessible->parent.path);
+ dbus_message_iter_close_container (&iter_variant, &iter_struct);
+ dbus_message_iter_close_container (&iter, &iter_variant);
+ dbus_message_iter_open_container (&iter, DBUS_TYPE_ARRAY, "{sv}",
+ &iter_array);
+ dbus_message_iter_close_container (&iter, &iter_array);
+ dbus_connection_send (_atspi_bus (), signal, NULL);
+ dbus_message_unref (signal);
+ return TRUE;
+}
+
static void
atspi_action_interface_init (AtspiAction *action)
{
@@ -189,6 +243,8 @@ atspi_accessible_finalize (GObject *object)
#endif
G_OBJECT_CLASS (atspi_accessible_parent_class)->finalize (object);
+
+ /* TODO: remove emission hook */
}
static void
@@ -200,6 +256,33 @@ atspi_accessible_class_init (AtspiAccessibleClass *klass)
object_class->finalize = atspi_accessible_finalize;
quark_locale = g_quark_from_string ("accessible-locale");
+
+ /**
+ * AtspiAccessible::region-changed:
+ * @atspiaccessible: the object which received the signal
+ * @arg1: an integer specifying the current offset of the text being read,
+ * if the object is textual.
+ * @arg2: an integer specifying the ending offset of the text being read,
+ * if the object is textual.
+ *
+ * The signal "region-changed" is emitted by a screen reader to inndicate
+ * that it is now reading or tracking a new object, or, a new piece of
+ * text within an object. This allows a magnifier to gain the information
+ * needded to highlight the object that the screen reader is reading.
+ */
+ atspi_accessible_signals[REGION_CHANGED] =
+ g_signal_new ("region_changed",
+ G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (AtspiAccessibleClass, region_changed),
+ NULL, NULL,
+ atspi_marshal_VOID__INT_INT,
+ G_TYPE_NONE,
+ 2, G_TYPE_INT, G_TYPE_INT);
+
+ g_signal_add_emission_hook (atspi_accessible_signals[REGION_CHANGED], 0,
+ screen_reader_signal_watcher, NULL,
+ (GDestroyNotify) NULL);
}
/**