[gtk/a11y-work: 1/4] a11y: Set an accessible role for GtkTextView
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/a11y-work: 1/4] a11y: Set an accessible role for GtkTextView
- Date: Thu, 30 Jul 2020 02:46:09 +0000 (UTC)
commit c68fe1053aa7009161a5a2f1a137ff81693e9c47
Author: Matthias Clasen <mclasen redhat com>
Date: Wed Jul 29 18:18:04 2020 -0400
a11y: Set an accessible role for GtkTextView
Use the text-box accessible role for GtkTextView
and set properties as appropriate.
Update the documentation and add a test.
docs/reference/gtk/section-accessibility.md | 2 +-
gtk/gtktextview.c | 28 +++++++++++++++------
testsuite/a11y/meson.build | 1 +
testsuite/a11y/textview.c | 39 +++++++++++++++++++++++++++++
4 files changed, 61 insertions(+), 9 deletions(-)
---
diff --git a/docs/reference/gtk/section-accessibility.md b/docs/reference/gtk/section-accessibility.md
index 1885b928f8..4dd51c6a7e 100644
--- a/docs/reference/gtk/section-accessibility.md
+++ b/docs/reference/gtk/section-accessibility.md
@@ -60,7 +60,7 @@ Each role name is part of the #GtkAccessibleRole enumeration.
| `SEPARATOR` | A divider that separates sections of content or groups of items | #GtkSeparator |
| `SPIN_BUTTON` | A range control that allows seelcting among discrete choices | #GtkSpinButton |
| `SWITCH` | A control that represents on/off values | #GtkSwitch |
-| `TEXT_BOX` | A type of input that allows free-form text as its value. | #GtkEntry, #GtkPasswordEntry |
+| `TEXT_BOX` | A type of input that allows free-form text as its value. | #GtkEntry, #GtkPasswordEntry,
#GtkTextView |
| `WINDOW` | An application window | #GtkWindow |
| `...` | … |
diff --git a/gtk/gtktextview.c b/gtk/gtktextview.c
index 8be1e73a86..f59b259277 100644
--- a/gtk/gtktextview.c
+++ b/gtk/gtktextview.c
@@ -89,9 +89,12 @@
*
* If a context menu is opened, the window node will appear as a subnode
* of the main node.
+ *
+ * # Accessibility
+ *
+ * GtkTextView uses the #GTK_ACCESSIBLE_ROLE_TEXT_BOX role.
*/
-
/* How scrolling, validation, exposes, etc. work.
*
* The expose_event handler has the invariant that the onscreen lines
@@ -1801,6 +1804,7 @@ gtk_text_view_class_init (GtkTextViewClass *klass)
"(i)", GTK_DIR_TAB_BACKWARD);
gtk_widget_class_set_css_name (widget_class, I_("textview"));
+ gtk_widget_class_set_accessible_role (widget_class, GTK_ACCESSIBLE_ROLE_TEXT_BOX);
quark_text_selection_data = g_quark_from_static_string ("gtk-text-view-text-selection-data");
quark_gtk_signal = g_quark_from_static_string ("gtk-signal");
@@ -1942,6 +1946,10 @@ gtk_text_view_init (GtkTextView *text_view)
gtk_widget_action_set_enabled (GTK_WIDGET (text_view), "text.can-redo", FALSE);
gtk_widget_action_set_enabled (GTK_WIDGET (text_view), "text.can-undo", FALSE);
+
+ gtk_accessible_update_property (GTK_ACCESSIBLE (widget),
+ GTK_ACCESSIBLE_PROPERTY_MULTI_LINE, TRUE,
+ -1);
}
GtkCssNode *
@@ -3074,11 +3082,11 @@ gtk_text_view_set_editable (GtkTextView *text_view,
if (priv->editable != setting)
{
if (!setting)
- {
- gtk_text_view_reset_im_context(text_view);
- if (gtk_widget_has_focus (GTK_WIDGET (text_view)))
- gtk_im_context_focus_out (priv->im_context);
- }
+ {
+ gtk_text_view_reset_im_context (text_view);
+ if (gtk_widget_has_focus (GTK_WIDGET (text_view)))
+ gtk_im_context_focus_out (priv->im_context);
+ }
priv->editable = setting;
@@ -3090,12 +3098,16 @@ gtk_text_view_set_editable (GtkTextView *text_view,
if (priv->layout && priv->layout->default_style)
{
- gtk_text_layout_set_overwrite_mode (priv->layout,
- priv->overwrite_mode && priv->editable);
+ gtk_text_layout_set_overwrite_mode (priv->layout,
+ priv->overwrite_mode && priv->editable);
priv->layout->default_style->editable = priv->editable;
gtk_text_layout_default_style_changed (priv->layout);
}
+ gtk_accessible_update_property (GTK_ACCESSIBLE (text_view),
+ GTK_ACCESSIBLE_PROPERTY_READ_ONLY, !setting,
+ -1);
+
g_object_notify (G_OBJECT (text_view), "editable");
}
}
diff --git a/testsuite/a11y/meson.build b/testsuite/a11y/meson.build
index 2d828e36bd..2c25837dbb 100644
--- a/testsuite/a11y/meson.build
+++ b/testsuite/a11y/meson.build
@@ -24,6 +24,7 @@ tests = [
{ 'name': 'separator' },
{ 'name': 'spinbutton' },
{ 'name': 'switch' },
+ { 'name': 'textview' },
{ 'name': 'window' },
]
diff --git a/testsuite/a11y/textview.c b/testsuite/a11y/textview.c
new file mode 100644
index 0000000000..cdbccda8e4
--- /dev/null
+++ b/testsuite/a11y/textview.c
@@ -0,0 +1,39 @@
+#include <gtk/gtk.h>
+
+static void
+textview_role (void)
+{
+ GtkWidget *widget = gtk_text_view_new ();
+ g_object_ref_sink (widget);
+
+ gtk_test_accessible_assert_role (widget, GTK_ACCESSIBLE_ROLE_TEXT_BOX);
+
+ g_object_unref (widget);
+}
+
+static void
+textview_properties (void)
+{
+ GtkWidget *widget = gtk_text_view_new ();
+ g_object_ref_sink (widget);
+
+ gtk_test_accessible_assert_property (widget, GTK_ACCESSIBLE_PROPERTY_MULTI_LINE, TRUE);
+ gtk_test_accessible_assert_property (widget, GTK_ACCESSIBLE_PROPERTY_READ_ONLY, FALSE);
+
+ gtk_text_view_set_editable (GTK_TEXT_VIEW (widget), FALSE);
+
+ gtk_test_accessible_assert_property (widget, GTK_ACCESSIBLE_PROPERTY_READ_ONLY, TRUE);
+
+ g_object_unref (widget);
+}
+
+int
+main (int argc, char *argv[])
+{
+ gtk_test_init (&argc, &argv, NULL);
+
+ g_test_add_func ("/a11y/textview/role", textview_role);
+ g_test_add_func ("/a11y/textview/properties", textview_properties);
+
+ return g_test_run ();
+}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]