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); }