From bdab6ada37b7e23bcad96b9e0cf45bc65b43ed89 Mon Sep 17 00:00:00 2001 From: Hari Rana Date: Sun, 3 Aug 2025 09:12:55 -0400 Subject: [PATCH 1/3] ua-seeing-page: Add label to Screen Reader list box Since the AdwPreferencesGroup widget does not allow us to set a title and keep it visually hidden, this approach uses another list box to set an accessible label. This will be useful for adding a "Configure" button and maintaining semantics. Part-of: --- panels/universal-access/cc-ua-seeing-page.blp | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/panels/universal-access/cc-ua-seeing-page.blp b/panels/universal-access/cc-ua-seeing-page.blp index 50d70668a3..2210b49385 100644 --- a/panels/universal-access/cc-ua-seeing-page.blp +++ b/panels/universal-access/cc-ua-seeing-page.blp @@ -11,10 +11,22 @@ 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; + } } } -- GitLab From 4266fc3acd1603095a7caa5177de4f6ff16deb60 Mon Sep 17 00:00:00 2001 From: Hari Rana Date: Sun, 27 Jul 2025 15:08:18 -0400 Subject: [PATCH 2/3] ua-seeing-page: Add button for launching Orca preferences Closes https://gitlab.gnome.org/GNOME/gnome-control-center/-/issues/2247 Part-of: --- panels/common/common.gresource.xml | 1 + panels/common/external-link-symbolic.svg | 2 + panels/universal-access/cc-ua-seeing-page.blp | 8 +++ panels/universal-access/cc-ua-seeing-page.c | 64 +++++++++++++++++++ 4 files changed, 75 insertions(+) create mode 100644 panels/common/external-link-symbolic.svg diff --git a/panels/common/common.gresource.xml b/panels/common/common.gresource.xml index 084dd840b7..46e37753c6 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 0000000000..b3e376b315 --- /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 2210b49385..6219c4777e 100644 --- a/panels/universal-access/cc-ua-seeing-page.blp +++ b/panels/universal-access/cc-ua-seeing-page.blp @@ -27,6 +27,14 @@ template $CcUaSeeingPage: Adw.NavigationPage { subtitle: _("The screen reader reads displayed text as you move the focus"); use-underline: true; } + + Adw.ButtonRow { + 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 94696acd92..6ec817218f 100644 --- a/panels/universal-access/cc-ua-seeing-page.c +++ b/panels/universal-access/cc-ua-seeing-page.c @@ -57,6 +57,8 @@ struct _CcUaSeeingPage AdwSwitchRow *screen_reader_row; + GDBusProxy *proxy; + GSettings *kb_settings; GSettings *interface_settings; GSettings *application_settings; @@ -65,6 +67,25 @@ struct _CcUaSeeingPage G_DEFINE_TYPE (CcUaSeeingPage, cc_ua_seeing_page, ADW_TYPE_NAVIGATION_PAGE) +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); + return; + } +} + static gboolean get_large_text_mapping (GValue *value, GVariant *variant, @@ -148,6 +169,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) { @@ -184,6 +237,7 @@ cc_ua_seeing_page_class_init (CcUaSeeingPageClass *klass) gtk_widget_class_bind_template_child (widget_class, CcUaSeeingPage, 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 +293,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); } -- GitLab From 67eb6f46d843d29095c5424f927d8e0a3b0aefbd Mon Sep 17 00:00:00 2001 From: Matthijs Velsink Date: Sun, 24 Aug 2025 18:03:43 +0200 Subject: [PATCH 3/3] ua-seeing-page: Hide screen reader configure row if unsupported Orca started supporting a DBus interface at the same time as creating the ShowPreferences method. So the simple way to check if the method is support is to just call another implemented method (GetVersion) and see if that call fails or not. Also hide the Configure row if the proxy can't be created for some reason. Part-of: --- panels/universal-access/cc-ua-seeing-page.blp | 2 +- panels/universal-access/cc-ua-seeing-page.c | 45 +++++++++++++++++++ 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/panels/universal-access/cc-ua-seeing-page.blp b/panels/universal-access/cc-ua-seeing-page.blp index 6219c4777e..7530e23e52 100644 --- a/panels/universal-access/cc-ua-seeing-page.blp +++ b/panels/universal-access/cc-ua-seeing-page.blp @@ -28,7 +28,7 @@ template $CcUaSeeingPage: Adw.NavigationPage { use-underline: true; } - Adw.ButtonRow { + Adw.ButtonRow configure_screen_reader_row { title: _("Co_nfigure"); use-underline: true; sensitive: bind screen_reader_row.active; diff --git a/panels/universal-access/cc-ua-seeing-page.c b/panels/universal-access/cc-ua-seeing-page.c index 6ec817218f..3159dfcd9a 100644 --- a/panels/universal-access/cc-ua-seeing-page.c +++ b/panels/universal-access/cc-ua-seeing-page.c @@ -56,6 +56,7 @@ struct _CcUaSeeingPage AdwSwitchRow *show_scrollbars_row; AdwSwitchRow *screen_reader_row; + AdwButtonRow *configure_screen_reader_row; GDBusProxy *proxy; @@ -67,6 +68,46 @@ 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, @@ -82,8 +123,11 @@ on_orca_proxy_ready (GObject *source_object, 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 @@ -235,6 +279,7 @@ 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); -- GitLab