diff options
author | Emmanuele Bassi <ebassi@gnome.org> | 2020-11-16 14:17:28 +0000 |
---|---|---|
committer | Emmanuele Bassi <ebassi@gnome.org> | 2020-11-16 16:44:56 +0000 |
commit | eec92b40ea22f48839f680cfa9729e30737b6f01 (patch) | |
tree | e66d04bfeadb838ac4ca889caa385056cf982170 /gtk/a11y | |
parent | d392f6f2a4c8c719471d06f11d0ecdaa74c4d8f7 (diff) | |
download | gtk+-eec92b40ea22f48839f680cfa9729e30737b6f01.tar.gz |
a11y: Compute the base path in the root object
The root path is shared by all AtSpiContext instances, so we should
compute it once, instead of every time we instantiate a new context.
This allows us to defer the path creation at realization time and ensure
that we have a registered application.
Diffstat (limited to 'gtk/a11y')
-rw-r--r-- | gtk/a11y/gtkatspicontext.c | 61 | ||||
-rw-r--r-- | gtk/a11y/gtkatspiroot.c | 32 | ||||
-rw-r--r-- | gtk/a11y/gtkatspirootprivate.h | 3 |
3 files changed, 57 insertions, 39 deletions
diff --git a/gtk/a11y/gtkatspicontext.c b/gtk/a11y/gtkatspicontext.c index 4dad9863dd..735b661945 100644 --- a/gtk/a11y/gtkatspicontext.c +++ b/gtk/a11y/gtkatspicontext.c @@ -1458,45 +1458,6 @@ gtk_at_spi_context_constructed (GObject *gobject) /* Make sure that we were properly constructed */ g_assert (self->bus_address); - /* We use the application's object path to build the path of each - * accessible object exposed on the accessibility bus; the path is - * also used to access the object cache - */ - GApplication *application = g_application_get_default (); - char *base_path = NULL; - - if (application != NULL) - { - const char *app_path = g_application_get_dbus_object_path (application); - base_path = g_strconcat (app_path, "/a11y", NULL); - } - else - { - char *uuid = g_uuid_string_random (); - base_path = g_strconcat ("/org/gtk/application/", uuid, "/a11y", NULL); - g_free (uuid); - } - - /* We use a unique id to ensure that we don't have conflicting - * objects on the bus - */ - char *uuid = g_uuid_string_random (); - - self->context_path = g_strconcat (base_path, "/", uuid, NULL); - - /* UUIDs use '-' as the separator, but that's not a valid character - * for a DBus object path - */ - size_t path_len = strlen (self->context_path); - for (size_t i = 0; i < path_len; i++) - { - if (self->context_path[i] == '-') - self->context_path[i] = '_'; - } - - g_free (base_path); - g_free (uuid); - G_OBJECT_CLASS (gtk_at_spi_context_parent_class)->constructed (gobject); } @@ -1526,6 +1487,22 @@ gtk_at_spi_context_realize (GtkATContext *context) g_object_ref (self->root); } + /* UUIDs use '-' as the separator, but that's not a valid character + * for a DBus object path + */ + char *uuid = g_uuid_string_random (); + size_t len = strlen (uuid); + for (size_t i = 0; i < len; i++) + { + if (uuid[i] == '-') + uuid[i] = '_'; + } + + self->context_path = + g_strconcat (gtk_at_spi_root_get_base_path (self->root), "/", uuid, NULL); + + g_free (uuid); + self->connection = gtk_at_spi_root_get_connection (self->root); if (self->connection == NULL) return; @@ -1812,7 +1789,13 @@ gtk_at_spi_context_get_context_path (GtkAtSpiContext *self) GVariant * gtk_at_spi_context_to_ref (GtkAtSpiContext *self) { + g_return_val_if_fail (GTK_IS_AT_SPI_CONTEXT (self), NULL); + + if (self->context_path == NULL) + return gtk_at_spi_null_ref (); + const char *name = g_dbus_connection_get_unique_name (self->connection); + return g_variant_new ("(so)", name, self->context_path); } /* }}} */ diff --git a/gtk/a11y/gtkatspiroot.c b/gtk/a11y/gtkatspiroot.c index e9a174990e..583371bcec 100644 --- a/gtk/a11y/gtkatspiroot.c +++ b/gtk/a11y/gtkatspiroot.c @@ -51,6 +51,8 @@ struct _GtkAtSpiRoot char *bus_address; GDBusConnection *connection; + char *base_path; + const char *root_path; const char *toolkit_name; @@ -87,6 +89,7 @@ gtk_at_spi_root_finalize (GObject *gobject) g_clear_handle_id (&self->register_id, g_source_remove); g_free (self->bus_address); + g_free (self->base_path); g_free (self->desktop_name); g_free (self->desktop_path); @@ -613,6 +616,27 @@ gtk_at_spi_root_constructed (GObject *gobject) goto out; } + /* We use the application's object path to build the path of each + * accessible object exposed on the accessibility bus; the path is + * also used to access the object cache + */ + GApplication *application = g_application_get_default (); + + if (application != NULL && g_application_get_is_registered (application)) + { + const char *app_path = g_application_get_dbus_object_path (application); + + self->base_path = g_strconcat (app_path, "/a11y", NULL); + } + else + { + self->base_path = g_strconcat ("/org/gtk/application/", + g_get_prgname (), + "/a11y", + NULL); + } + + out: G_OBJECT_CLASS (gtk_at_spi_root_parent_class)->constructed (gobject); } @@ -687,3 +711,11 @@ gtk_at_spi_root_to_ref (GtkAtSpiRoot *self) return g_variant_new ("(so)", self->desktop_name, self->desktop_path); } + +const char * +gtk_at_spi_root_get_base_path (GtkAtSpiRoot *self) +{ + g_return_val_if_fail (GTK_IS_AT_SPI_ROOT (self), NULL); + + return self->base_path; +} diff --git a/gtk/a11y/gtkatspirootprivate.h b/gtk/a11y/gtkatspirootprivate.h index 7a99e7c254..15a6b48548 100644 --- a/gtk/a11y/gtkatspirootprivate.h +++ b/gtk/a11y/gtkatspirootprivate.h @@ -42,6 +42,9 @@ gtk_at_spi_root_get_connection (GtkAtSpiRoot *self); GtkAtSpiCache * gtk_at_spi_root_get_cache (GtkAtSpiRoot *self); +const char * +gtk_at_spi_root_get_base_path (GtkAtSpiRoot *self); + GVariant * gtk_at_spi_root_to_ref (GtkAtSpiRoot *self); |