summaryrefslogtreecommitdiff
path: root/atspi/atspi-event-listener.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-event-listener.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-event-listener.c')
-rw-r--r--atspi/atspi-event-listener.c137
1 files changed, 58 insertions, 79 deletions
diff --git a/atspi/atspi-event-listener.c b/atspi/atspi-event-listener.c
index a89464d7..9b95c3dd 100644
--- a/atspi/atspi-event-listener.c
+++ b/atspi/atspi-event-listener.c
@@ -383,31 +383,23 @@ convert_event_type_to_dbus (const char *eventType, char **categoryp, char **name
{
gchar *matchrule;
(*matchrule_array) = g_ptr_array_new ();
- if (!strcmp (eventType, "object:text-reading-position"))
+ matchrule = g_strdup_printf ("type='signal',interface='org.a11y.atspi.Event.%s'", category);
+ if (name && name [0])
{
- matchrule = g_strdup ("type='signal',interface='org.a11y.atspi.ScreenReader',member='ReadingPosition',sender='org.a11y.Atspi.ScreenReader'");
- g_ptr_array_add (*matchrule_array, matchrule);
+ gchar *new_str = g_strconcat (matchrule, ",member='", name, "'", NULL);
+ g_free (matchrule);
+ matchrule = new_str;
}
- else
+ if (detail && detail [0])
{
- matchrule = g_strdup_printf ("type='signal',interface='org.a11y.atspi.Event.%s'", category);
- if (name && name [0])
- {
- gchar *new_str = g_strconcat (matchrule, ",member='", name, "'", NULL);
- g_free (matchrule);
- matchrule = new_str;
- }
- if (detail && detail [0])
- {
- gchar *new_str = g_strconcat (matchrule, ",arg0='", detail, "'", NULL);
- g_ptr_array_add (*matchrule_array, new_str);
- new_str = g_strconcat (matchrule, ",arg0path='", detail, "/'", NULL);
- g_ptr_array_add (*matchrule_array, new_str);
- g_free (matchrule);
- }
- else
- g_ptr_array_add (*matchrule_array, matchrule);
+ gchar *new_str = g_strconcat (matchrule, ",arg0='", detail, "'", NULL);
+ g_ptr_array_add (*matchrule_array, new_str);
+ new_str = g_strconcat (matchrule, ",arg0path='", detail, "/'", NULL);
+ g_ptr_array_add (*matchrule_array, new_str);
+ g_free (matchrule);
}
+ else
+ g_ptr_array_add (*matchrule_array, matchrule);
}
if (categoryp) *categoryp = category;
else g_free (category);
@@ -470,7 +462,6 @@ listener_entry_free (EventListenerEntry *e)
* object:text-selection-changed
* object:text-changed
* object:text-caret-moved
- * object:text-reading-position
* object:row-inserted
* object:row-reordered
* object:row-deleted
@@ -480,6 +471,9 @@ listener_entry_free (EventListenerEntry *e)
* object:model-changed
* object:active-descendant-changed
*
+ * (screen reader events)
+* screen-reader:region-changed
+ *
* (window events)
*
* window:minimize
@@ -977,19 +971,8 @@ _atspi_dbus_handle_event (DBusConnection *bus, DBusMessage *message, void *data)
dbus_int32_t detail1, detail2;
char *p;
GHashTable *cache = NULL;
- gboolean is_reading_position = 0;
- if (dbus_message_is_signal (message, ATSPI_DBUS_INTERFACE_SCREEN_READER,
- "ReadingPosition"))
- {
- if (strcmp (signature, "(so)ii") != 0)
- {
- g_warning ("Got invalid signature '%s' for ReadingPosition signal", signature);
- return DBUS_HANDLER_RESULT_HANDLED;
- }
- is_reading_position = TRUE;
- }
- else if (strcmp (signature, "siiv(so)") != 0 &&
+ if (strcmp (signature, "siiv(so)") != 0 &&
strcmp (signature, "siiva{sv}") != 0)
{
g_warning ("Got invalid signature %s for signal %s from interface %s\n", signature, member, category);
@@ -1007,16 +990,9 @@ _atspi_dbus_handle_event (DBusConnection *bus, DBusMessage *message, void *data)
return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
}
category++;
- if (!strcmp (category, "ScreenReader"))
- category = "Object"; /* hack -- assume this is ReadingPosition */
- }
- if (is_reading_position)
- e.source = _atspi_dbus_return_accessible_from_iter (&iter);
- else
- {
- dbus_message_iter_get_basic (&iter, &detail);
- dbus_message_iter_next (&iter);
}
+ dbus_message_iter_get_basic (&iter, &detail);
+ dbus_message_iter_next (&iter);
dbus_message_iter_get_basic (&iter, &detail1);
e.detail1 = detail1;
dbus_message_iter_next (&iter);
@@ -1025,10 +1001,7 @@ _atspi_dbus_handle_event (DBusConnection *bus, DBusMessage *message, void *data)
dbus_message_iter_next (&iter);
converted_type = convert_name_from_dbus (category, FALSE);
- if (is_reading_position)
- name = g_strdup ("text-reading-position");
- else
- name = convert_name_from_dbus (member, FALSE);
+ name = convert_name_from_dbus (member, FALSE);
detail = convert_name_from_dbus (detail, TRUE);
if (strcasecmp (category, name) != 0)
@@ -1051,58 +1024,64 @@ _atspi_dbus_handle_event (DBusConnection *bus, DBusMessage *message, void *data)
converted_type = p;
}
e.type = converted_type;
- if (!is_reading_position)
- e.source = _atspi_ref_accessible (dbus_message_get_sender(message), dbus_message_get_path(message));
- if (e.source == NULL)
+ if (strcmp (category, "ScreenReader") != 0)
{
- g_warning ("Got no valid source accessible for signal %s from interface %s\n", member, category);
- g_free (converted_type);
- g_free (name);
- g_free (detail);
- return DBUS_HANDLER_RESULT_HANDLED;
+ e.source = _atspi_ref_accessible (dbus_message_get_sender(message), dbus_message_get_path(message));
+ if (e.source == NULL)
+ {
+ g_warning ("Got no valid source accessible for signal %s from interface %s\n", member, category);
+ g_free (converted_type);
+ g_free (name);
+ g_free (detail);
+ return DBUS_HANDLER_RESULT_HANDLED;
+ }
}
- if (!is_reading_position)
+ dbus_message_iter_recurse (&iter, &iter_variant);
+ switch (dbus_message_iter_get_arg_type (&iter_variant))
{
- dbus_message_iter_recurse (&iter, &iter_variant);
- switch (dbus_message_iter_get_arg_type (&iter_variant))
+ case DBUS_TYPE_STRUCT:
{
- case DBUS_TYPE_STRUCT:
+ AtspiRect rect;
+ if (demarshal_rect (&iter_variant, &rect))
+ {
+ g_value_init (&e.any_data, ATSPI_TYPE_RECT);
+ g_value_set_boxed (&e.any_data, &rect);
+ }
+ else
{
- AtspiRect rect;
- if (demarshal_rect (&iter_variant, &rect))
+ AtspiAccessible *accessible;
+ accessible = _atspi_dbus_return_accessible_from_iter (&iter_variant);
+ if (!strcmp (category, "ScreenReader"))
{
- g_value_init (&e.any_data, ATSPI_TYPE_RECT);
- g_value_set_boxed (&e.any_data, &rect);
+ e.source = accessible;
}
else
{
- AtspiAccessible *accessible;
- accessible = _atspi_dbus_return_accessible_from_iter (&iter_variant);
g_value_init (&e.any_data, ATSPI_TYPE_ACCESSIBLE);
g_value_set_instance (&e.any_data, accessible);
if (accessible)
g_object_unref (accessible); /* value now owns it */
}
- break;
}
- case DBUS_TYPE_STRING:
- {
- dbus_message_iter_get_basic (&iter_variant, &p);
- g_value_init (&e.any_data, G_TYPE_STRING);
- g_value_set_string (&e.any_data, p);
- break;
- }
- default:
break;
}
-
- dbus_message_iter_next (&iter);
- if (dbus_message_iter_get_arg_type (&iter) == DBUS_TYPE_ARRAY)
+ case DBUS_TYPE_STRING:
{
- /* new form -- parse properties sent with event */
- cache = _atspi_dbus_update_cache_from_dict (e.source, &iter);
+ dbus_message_iter_get_basic (&iter_variant, &p);
+ g_value_init (&e.any_data, G_TYPE_STRING);
+ g_value_set_string (&e.any_data, p);
+ break;
}
+ default:
+ break;
+ }
+
+ dbus_message_iter_next (&iter);
+ if (dbus_message_iter_get_arg_type (&iter) == DBUS_TYPE_ARRAY)
+ {
+ /* new form -- parse properties sent with event */
+ cache = _atspi_dbus_update_cache_from_dict (e.source, &iter);
}
if (!strncmp (e.type, "object:children-changed", 23))