diff --git a/panels/common/common.gresource.xml b/panels/common/common.gresource.xml
index 084dd840b78839a3d2819bdf2289f628c1e5397b..46e37753c61701b84dae3d24364a0449428b938d 100644
--- a/panels/common/common.gresource.xml
+++ b/panels/common/common.gresource.xml
@@ -21,5 +21,6 @@
check-outlined-symbolic.svg
check-plain-symbolic.svg
cog-wheel-symbolic.svg
+ external-link-symbolic.svg
diff --git a/panels/common/external-link-symbolic.svg b/panels/common/external-link-symbolic.svg
new file mode 100644
index 0000000000000000000000000000000000000000..b3e376b31575a814bf7a502dbc361e391fd7335b
--- /dev/null
+++ b/panels/common/external-link-symbolic.svg
@@ -0,0 +1,2 @@
+
+
diff --git a/panels/universal-access/cc-ua-seeing-page.blp b/panels/universal-access/cc-ua-seeing-page.blp
index 50d70668a3fbd3884d2ad67f87d298b8a395efbd..7530e23e5200f74a29aa3ae216df60395dbe8545 100644
--- a/panels/universal-access/cc-ua-seeing-page.blp
+++ b/panels/universal-access/cc-ua-seeing-page.blp
@@ -11,10 +11,30 @@ template $CcUaSeeingPage: Adw.NavigationPage {
content: Adw.PreferencesPage {
Adw.PreferencesGroup {
- Adw.SwitchRow screen_reader_row {
- title: _("Screen _Reader");
- subtitle: _("The screen reader reads displayed text as you move the focus");
- use-underline: true;
+ ListBox {
+ selection-mode: none;
+
+ accessibility {
+ label: _("Screen Reader");
+ }
+
+ styles [
+ "boxed-list-separate",
+ ]
+
+ Adw.SwitchRow screen_reader_row {
+ title: _("Screen _Reader");
+ subtitle: _("The screen reader reads displayed text as you move the focus");
+ use-underline: true;
+ }
+
+ Adw.ButtonRow configure_screen_reader_row {
+ title: _("Co_nfigure");
+ use-underline: true;
+ sensitive: bind screen_reader_row.active;
+ activated => $configure_screen_reader_activated_cb(template);
+ end-icon-name: "external-link-symbolic";
+ }
}
}
diff --git a/panels/universal-access/cc-ua-seeing-page.c b/panels/universal-access/cc-ua-seeing-page.c
index 94696acd920613b85a5e80e439a0772009be1384..3159dfcd9a2b7d21d9acb80e353aa6382f59b9da 100644
--- a/panels/universal-access/cc-ua-seeing-page.c
+++ b/panels/universal-access/cc-ua-seeing-page.c
@@ -56,6 +56,9 @@ struct _CcUaSeeingPage
AdwSwitchRow *show_scrollbars_row;
AdwSwitchRow *screen_reader_row;
+ AdwButtonRow *configure_screen_reader_row;
+
+ GDBusProxy *proxy;
GSettings *kb_settings;
GSettings *interface_settings;
@@ -65,6 +68,68 @@ struct _CcUaSeeingPage
G_DEFINE_TYPE (CcUaSeeingPage, cc_ua_seeing_page, ADW_TYPE_NAVIGATION_PAGE)
+static void
+orca_get_version_cb (GObject *source_object,
+ GAsyncResult *res,
+ gpointer data)
+{
+ g_autoptr(GVariant) val = NULL;
+ g_autoptr(GError) error = NULL;
+ CcUaSeeingPage *self = data;
+
+ g_assert (CC_IS_UA_SEEING_PAGE (self));
+
+ val = g_dbus_proxy_call_finish (G_DBUS_PROXY (source_object),
+ res, &error);
+ if (!val)
+ {
+ /* Orca implemented a DBus interface at the same time as ShowPreferences,
+ * so apparently this Orca version is too old. So, hide the row.
+ * No need to check the version otherwise for now.
+ */
+ g_debug ("Failed to get Orca version: %s", error->message);
+ gtk_widget_set_visible (GTK_WIDGET (self->configure_screen_reader_row), FALSE);
+ return;
+ }
+}
+
+static void
+check_orca_show_preferences_support (CcUaSeeingPage *self)
+{
+ g_assert (CC_IS_UA_SEEING_PAGE (self));
+
+ g_dbus_proxy_call (self->proxy,
+ "GetVersion",
+ NULL,
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ orca_get_version_cb,
+ self);
+}
+
+static void
+on_orca_proxy_ready (GObject *source_object,
+ GAsyncResult *res,
+ gpointer data)
+{
+ g_autoptr(GError) error = NULL;
+ CcUaSeeingPage *self = data;
+
+ g_assert (CC_IS_UA_SEEING_PAGE (self));
+
+ self->proxy = g_dbus_proxy_new_for_bus_finish (res, &error);
+
+ if (self->proxy == NULL)
+ {
+ g_warning ("Error creating proxy: %s", error->message);
+ gtk_widget_set_visible (GTK_WIDGET (self->configure_screen_reader_row), FALSE);
+ return;
+ }
+
+ check_orca_show_preferences_support (self);
+}
+
static gboolean
get_large_text_mapping (GValue *value,
GVariant *variant,
@@ -148,6 +213,38 @@ ua_cursor_row_activated_cb (CcUaSeeingPage *self)
adw_navigation_view_push (ADW_NAVIGATION_VIEW (parent), page);
}
+static void
+orca_show_preferences_cb (GObject *source_object,
+ GAsyncResult *res,
+ gpointer data)
+{
+ g_autoptr(GVariant) val = NULL;
+ g_autoptr(GError) error = NULL;
+
+ val = g_dbus_proxy_call_finish (G_DBUS_PROXY (source_object),
+ res, &error);
+ if (!val)
+ {
+ g_warning ("Failed to launch Orca preferences: %s", error->message);
+ return;
+ }
+}
+
+static void
+configure_screen_reader_activated_cb (CcUaSeeingPage *self)
+{
+ g_assert (CC_IS_UA_SEEING_PAGE (self));
+
+ g_dbus_proxy_call (self->proxy,
+ "ShowPreferences",
+ NULL,
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ orca_show_preferences_cb,
+ NULL);
+}
+
static void
cc_ua_seeing_page_dispose (GObject *object)
{
@@ -182,8 +279,10 @@ cc_ua_seeing_page_class_init (CcUaSeeingPageClass *klass)
gtk_widget_class_bind_template_child (widget_class, CcUaSeeingPage, show_scrollbars_row);
gtk_widget_class_bind_template_child (widget_class, CcUaSeeingPage, screen_reader_row);
+ gtk_widget_class_bind_template_child (widget_class, CcUaSeeingPage, configure_screen_reader_row);
gtk_widget_class_bind_template_callback (widget_class, ua_cursor_row_activated_cb);
+ gtk_widget_class_bind_template_callback (widget_class, configure_screen_reader_activated_cb);
}
static void
@@ -239,6 +338,16 @@ cc_ua_seeing_page_init (CcUaSeeingPage *self)
G_CALLBACK (ua_seeing_interface_cursor_size_changed_cb),
self, G_CONNECT_SWAPPED | G_CONNECT_AFTER);
+ g_dbus_proxy_new_for_bus (G_BUS_TYPE_SESSION,
+ G_DBUS_PROXY_FLAGS_NONE,
+ NULL,
+ "org.gnome.Orca.Service",
+ "/org/gnome/Orca/Service",
+ "org.gnome.Orca.Service",
+ NULL,
+ on_orca_proxy_ready,
+ self);
+
ua_seeing_interface_cursor_size_changed_cb (self);
}