[evolution-patches] *New* Patch for GTKHTML / A11Y fixes #312189
- From: Mengjie Yu <Meng-Jie Yu Sun COM>
- To: ksh <kakumar novell com>
- Cc: evolution-patch <evolution-patches lists ximian com>
- Subject: [evolution-patches] *New* Patch for GTKHTML / A11Y fixes #312189
- Date: Wed, 03 Aug 2005 16:56:38 +0800
Dear ksh,
Here is the patch for #312189, it is about gtkhtml/a11y.
the related URL is:
http://bugzilla.gnome.org/show_bug.cgi?id=312189
The patch for this bug is also available on the above URL.
Will you please help me to review it when you are not busy?
Thanks a lot.
Yours,
Mengjie
Index: ChangeLog
===================================================================
RCS file: /cvs/gnome/gtkhtml/a11y/ChangeLog,v
retrieving revision 1.25
diff -u -p -r1.25 ChangeLog
--- ChangeLog 6 Jul 2005 10:35:00 -0000 1.25
+++ ChangeLog 3 Aug 2005 08:47:50 -0000
@@ -1,3 +1,12 @@
+2005-08-03 Mengjie Yu <meng-jie yu sun com>
+
+ * text.c: (atk_text_interface_init),
+ (html_a11y_text_add_attribute),
+ (html_a11y_text_get_run_attributes):
+ Implement get_run_attributes function to inform atktools the attributes of the text.
+
+ Fixes #312189
+
2005-07-06 Mengjie Yu <meng-jie yu sun com>
* object.c: (gtk_html_a11y_insert_object_cb),
Index: text.c
===================================================================
RCS file: /cvs/gnome/gtkhtml/a11y/text.c,v
retrieving revision 1.16
diff -u -p -r1.16 text.c
--- text.c 6 Jul 2005 10:35:00 -0000 1.16
+++ text.c 3 Aug 2005 08:47:51 -0000
@@ -28,7 +28,7 @@
#include <atk/atkhyperlink.h>
#include <glib/gi18n-lib.h>
#include <glib/gmacros.h>
-
+#include <pango/pango.h>
#include "gtkhtml.h"
#include "htmlengine.h"
#include "htmlengine-edit.h"
@@ -106,6 +106,7 @@ static void html_a11y_text_paste_text (A
gint position);
static AtkStateSet* html_a11y_text_ref_state_set (AtkObject *accessible);
+static AtkAttributeSet * html_a11y_text_get_run_attributes (AtkText *text, gint offset, gint *start_offset, gint *end_offset);
static AtkObjectClass *parent_class = NULL;
@@ -238,6 +239,7 @@ atk_text_interface_init (AtkTextIface *i
iface->set_caret_offset = html_a11y_text_set_caret_offset;
iface->get_character_extents = html_a11y_text_get_character_extents;
iface->get_offset_at_point = html_a11y_text_get_offset_at_point;
+ iface->get_run_attributes = html_a11y_text_get_run_attributes;
}
static void
@@ -709,6 +711,159 @@ html_a11y_text_set_selection (AtkText *t
return html_a11y_text_add_selection (text, start_offset, end_offset);
}
+
+/* The following function is copied from libgail-util/gailmisc.c gail_misc_add_attribute */
+static AtkAttributeSet*
+html_a11y_text_add_attribute (AtkAttributeSet *attrib_set, AtkTextAttribute attr, gchar *value)
+{
+ AtkAttributeSet *return_set;
+ AtkAttribute *at = g_malloc (sizeof (AtkAttribute));
+ at->name = g_strdup (atk_text_attribute_get_name (attr));
+ at->value = value;
+ return_set = g_slist_prepend(attrib_set, at);
+ return return_set;
+}
+
+
+/* Most of the code of the following function is copied from libgail-util/gailmisc.c gail_misc_layout_get_run_attributes */
+static AtkAttributeSet *
+html_a11y_text_get_run_attributes (AtkText *text, gint offset, gint *start_offset, gint *end_offset)
+{
+ PangoAttrIterator *iter;
+ PangoAttrList *attr;
+ PangoAttrString *pango_string;
+ PangoAttrInt *pango_int;
+ PangoAttrColor *pango_color;
+ PangoAttrLanguage *pango_lang;
+ PangoAttrFloat *pango_float;
+ gint index, start_index, end_index;
+ gboolean is_next = TRUE;
+ gchar *value = NULL;
+ glong len;
+ gchar *textstring;
+ AtkAttributeSet *attrib_set = NULL;
+ HTMLText *t = HTML_TEXT (HTML_A11Y_HTML (text));
+
+ g_return_val_if_fail (t, NULL);
+
+ textstring = t->text;
+ attr = t->attr_list;
+
+ g_return_val_if_fail (attr && textstring, NULL);
+
+ len = g_utf8_strlen (textstring, -1);
+ iter = pango_attr_list_get_iterator (attr);
+
+ /* Get invariant range offsets */
+ /* If offset out of range, set offset in range */
+ if (offset > len)
+ offset = len;
+ else if (offset < 0)
+ offset = 0;
+
+ index = g_utf8_offset_to_pointer (textstring, offset) - textstring;
+ pango_attr_iterator_range (iter, &start_index, &end_index);
+
+ while (is_next) {
+ if (index >= start_index && index < end_index) {
+ *start_offset = g_utf8_pointer_to_offset (textstring, textstring + start_index);
+ if (end_index == G_MAXINT)
+ /* Last iterator */
+ end_index = len;
+
+ *end_offset = g_utf8_pointer_to_offset (textstring, textstring + end_index);
+ break;
+ }
+ is_next = pango_attr_iterator_next (iter);
+ pango_attr_iterator_range (iter, &start_index, &end_index);
+ }
+
+ /* Get attributes */
+ if ((pango_string = (PangoAttrString*) pango_attr_iterator_get (iter, PANGO_ATTR_FAMILY)) != NULL) {
+ value = g_strdup_printf("%s", pango_string->value);
+ attrib_set = html_a11y_text_add_attribute (attrib_set,
+ ATK_TEXT_ATTR_FAMILY_NAME,
+ value);
+ }
+ if ((pango_int = (PangoAttrInt*) pango_attr_iterator_get (iter, PANGO_ATTR_STYLE)) != NULL) {
+ attrib_set = html_a11y_text_add_attribute (attrib_set,
+ ATK_TEXT_ATTR_STYLE,
+ g_strdup (atk_text_attribute_get_value (ATK_TEXT_ATTR_STYLE, pango_int->value)));
+ }
+
+ if ((pango_int = (PangoAttrInt*) pango_attr_iterator_get (iter, PANGO_ATTR_WEIGHT)) != NULL) {
+ value = g_strdup_printf("%i", pango_int->value);
+ attrib_set = html_a11y_text_add_attribute (attrib_set,
+ ATK_TEXT_ATTR_WEIGHT,
+ value);
+ }
+ if ((pango_int = (PangoAttrInt*) pango_attr_iterator_get (iter, PANGO_ATTR_VARIANT)) != NULL) {
+ attrib_set = html_a11y_text_add_attribute (attrib_set,
+ ATK_TEXT_ATTR_VARIANT,
+ g_strdup (atk_text_attribute_get_value (ATK_TEXT_ATTR_VARIANT, pango_int->value)));
+ }
+ if ((pango_int = (PangoAttrInt*) pango_attr_iterator_get (iter, PANGO_ATTR_STRETCH)) != NULL) {
+ attrib_set = html_a11y_text_add_attribute (attrib_set,
+ ATK_TEXT_ATTR_STRETCH,
+ g_strdup (atk_text_attribute_get_value (ATK_TEXT_ATTR_STRETCH, pango_int->value)));
+ }
+ if ((pango_int = (PangoAttrInt*) pango_attr_iterator_get (iter, PANGO_ATTR_SIZE)) != NULL) {
+ value = g_strdup_printf("%i", pango_int->value / PANGO_SCALE);
+ attrib_set = html_a11y_text_add_attribute (attrib_set,
+ ATK_TEXT_ATTR_SIZE,
+ value);
+ }
+ if ((pango_int = (PangoAttrInt*) pango_attr_iterator_get (iter, PANGO_ATTR_UNDERLINE)) != NULL) {
+ attrib_set = html_a11y_text_add_attribute (attrib_set,
+ ATK_TEXT_ATTR_UNDERLINE,
+ g_strdup (atk_text_attribute_get_value (ATK_TEXT_ATTR_UNDERLINE, pango_int->value)));
+ }
+ if ((pango_int = (PangoAttrInt*) pango_attr_iterator_get (iter, PANGO_ATTR_STRIKETHROUGH)) != NULL) {
+ attrib_set = html_a11y_text_add_attribute (attrib_set,
+ ATK_TEXT_ATTR_STRIKETHROUGH,
+ g_strdup (atk_text_attribute_get_value (ATK_TEXT_ATTR_STRIKETHROUGH, pango_int->value)));
+ }
+ if ((pango_int = (PangoAttrInt*) pango_attr_iterator_get (iter, PANGO_ATTR_RISE)) != NULL) {
+ value = g_strdup_printf("%i", pango_int->value);
+ attrib_set = html_a11y_text_add_attribute (attrib_set,
+ ATK_TEXT_ATTR_RISE,
+ value);
+ }
+ if ((pango_lang = (PangoAttrLanguage*) pango_attr_iterator_get (iter, PANGO_ATTR_LANGUAGE)) != NULL) {
+ value = g_strdup( pango_language_to_string( pango_lang->value));
+ attrib_set = html_a11y_text_add_attribute (attrib_set,
+ ATK_TEXT_ATTR_LANGUAGE,
+ value);
+ }
+ if ((pango_float = (PangoAttrFloat*) pango_attr_iterator_get (iter, PANGO_ATTR_SCALE)) != NULL) {
+ value = g_strdup_printf("%g", pango_float->value);
+ attrib_set = html_a11y_text_add_attribute (attrib_set,
+ ATK_TEXT_ATTR_SCALE,
+ value);
+ }
+ if ((pango_color = (PangoAttrColor*) pango_attr_iterator_get (iter, PANGO_ATTR_FOREGROUND)) != NULL) {
+ value = g_strdup_printf ("%u,%u,%u",
+ pango_color->color.red,
+ pango_color->color.green,
+ pango_color->color.blue);
+ attrib_set = html_a11y_text_add_attribute (attrib_set,
+ ATK_TEXT_ATTR_FG_COLOR,
+ value);
+ }
+ if ((pango_color = (PangoAttrColor*) pango_attr_iterator_get (iter, PANGO_ATTR_BACKGROUND)) != NULL) {
+ value = g_strdup_printf ("%u,%u,%u",
+ pango_color->color.red,
+ pango_color->color.green,
+ pango_color->color.blue);
+ attrib_set = html_a11y_text_add_attribute (attrib_set,
+ ATK_TEXT_ATTR_BG_COLOR,
+ value);
+ }
+
+ pango_attr_iterator_destroy (iter);
+ return attrib_set;
+
+}
/*
AtkAttributeSet* (* get_run_attributes) (AtkText *text,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]