summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libview/ev-view-accessible.c124
1 files changed, 111 insertions, 13 deletions
diff --git a/libview/ev-view-accessible.c b/libview/ev-view-accessible.c
index 6fd633ae..ee35c9a7 100644
--- a/libview/ev-view-accessible.c
+++ b/libview/ev-view-accessible.c
@@ -349,29 +349,127 @@ ev_view_accessible_set_caret_offset (AtkText *text, gint offset)
return TRUE;
}
+static AtkAttributeSet *
+add_attribute (AtkAttributeSet *attr_set,
+ AtkTextAttribute attr_type,
+ gchar *attr_value)
+{
+ AtkAttribute *attr = g_new (AtkAttribute, 1);
+
+ attr->name = g_strdup (atk_text_attribute_get_name (attr_type));
+ attr->value = attr_value;
+
+ return g_slist_prepend (attr_set, attr);
+}
+
+static AtkAttributeSet *
+get_run_attributes (PangoAttrList *attrs,
+ const gchar *text,
+ gint offset,
+ gint *start_offset,
+ gint *end_offset)
+{
+ AtkAttributeSet *atk_attr_set = NULL;
+ PangoAttrString *pango_string;
+ PangoAttrInt *pango_int;
+ PangoAttrColor *pango_color;
+ PangoAttrIterator *iter;
+ gint i, start, end;
+ gboolean has_attrs = FALSE;
+ glong text_length;
+ gchar *attr_value;
+
+ text_length = g_utf8_strlen (text, -1);
+ if (offset < 0 || offset >= text_length)
+ return NULL;
+
+ /* Check if there are attributes for the offset,
+ * and set the attributes range if positive */
+ iter = pango_attr_list_get_iterator (attrs);
+ i = g_utf8_offset_to_pointer (text, offset) - text;
+
+ do {
+ pango_attr_iterator_range (iter, &start, &end);
+ if (i >= start && i < end) {
+ *start_offset = g_utf8_pointer_to_offset (text, text + start);
+ if (end == G_MAXINT) /* Last iterator */
+ end = text_length;
+ *end_offset = g_utf8_pointer_to_offset (text, text + end);
+ has_attrs = TRUE;
+ }
+ } while (!has_attrs && pango_attr_iterator_next (iter));
+
+ if (!has_attrs) {
+ pango_attr_iterator_destroy (iter);
+ return NULL;
+ }
+
+ /* Create the AtkAttributeSet from the Pango attributes */
+ pango_string = (PangoAttrString *) pango_attr_iterator_get (iter, PANGO_ATTR_FAMILY);
+ if (pango_string) {
+ attr_value = g_strdup (pango_string->value);
+ atk_attr_set = add_attribute (atk_attr_set, ATK_TEXT_ATTR_FAMILY_NAME, attr_value);
+ }
+
+ pango_int = (PangoAttrInt *) pango_attr_iterator_get (iter, PANGO_ATTR_SIZE);
+ if (pango_int) {
+ attr_value = g_strdup_printf ("%i", pango_int->value / PANGO_SCALE);
+ atk_attr_set = add_attribute (atk_attr_set, ATK_TEXT_ATTR_SIZE, attr_value);
+ }
+
+ pango_int = (PangoAttrInt *) pango_attr_iterator_get (iter, PANGO_ATTR_UNDERLINE);
+ if (pango_int) {
+ atk_attr_set = add_attribute (atk_attr_set,
+ ATK_TEXT_ATTR_UNDERLINE,
+ g_strdup (atk_text_attribute_get_value (ATK_TEXT_ATTR_UNDERLINE,
+ pango_int->value)));
+ }
+
+ pango_color = (PangoAttrColor *) pango_attr_iterator_get (iter, PANGO_ATTR_FOREGROUND);
+ if (pango_color) {
+ attr_value = g_strdup_printf ("%u,%u,%u",
+ pango_color->color.red,
+ pango_color->color.green,
+ pango_color->color.blue);
+ atk_attr_set = add_attribute (atk_attr_set, ATK_TEXT_ATTR_FG_COLOR, attr_value);
+ }
+
+ pango_attr_iterator_destroy (iter);
+
+ return atk_attr_set;
+}
+
static AtkAttributeSet*
ev_view_accessible_get_run_attributes (AtkText *text,
- gint offset,
- gint *start_offset,
- gint *end_offset)
+ gint offset,
+ gint *start_offset,
+ gint *end_offset)
{
- GtkWidget *widget;
- GtkTextBuffer *buffer;
- AtkAttributeSet *retval;
+ EvView *view;
+ GtkWidget *widget;
+ PangoAttrList *attrs;
+ const gchar *page_text;
+
+ if (offset < 0)
+ return NULL;
widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
- if (widget == NULL)
- /* State is defunct */
+ if (!widget)
return NULL;
- buffer = ev_view_accessible_get_text_buffer (EV_VIEW_ACCESSIBLE (text), EV_VIEW (widget));
- if (!buffer)
+ view = EV_VIEW (widget);
+ if (!view->page_cache)
return NULL;
- retval = gail_misc_buffer_get_run_attributes (buffer, offset,
- start_offset, end_offset);
+ page_text = ev_page_cache_get_text (view->page_cache, view->current_page);
+ if (!page_text)
+ return NULL;
- return retval;
+ attrs = ev_page_cache_get_text_attrs (view->page_cache, view->current_page);
+ if (!attrs)
+ return NULL;
+
+ return get_run_attributes (attrs, page_text, offset, start_offset, end_offset);
}
static AtkAttributeSet*