a11y: factor some PangoAttributes->AtkTextAttributes mappings

That code can then be used by get_run_attributes and
get_default_attributes implementations.
This commit is contained in:
Philippe Normand 2011-02-02 15:34:40 +01:00 committed by Alejandro Piñeiro
parent 7e9ee85c7d
commit 49d4317420

View File

@ -174,8 +174,7 @@ static AtkAttributeSet* _cally_misc_add_attribute (AtkAttributeSet *attrib_s
gchar *value); gchar *value);
static AtkAttributeSet* _cally_misc_layout_get_run_attributes (AtkAttributeSet *attrib_set, static AtkAttributeSet* _cally_misc_layout_get_run_attributes (AtkAttributeSet *attrib_set,
PangoLayout *layout, ClutterText *clutter_text,
gchar *text,
gint offset, gint offset,
gint *start_offset, gint *start_offset,
gint *end_offset); gint *end_offset);
@ -733,7 +732,7 @@ cally_text_set_selection (AtkText *text,
static AtkAttributeSet* static AtkAttributeSet*
cally_text_get_run_attributes (AtkText *text, cally_text_get_run_attributes (AtkText *text,
gint offset, gint offset,
gint *start_offset, gint *start_offset,
gint *end_offset) gint *end_offset)
{ {
@ -750,8 +749,7 @@ cally_text_get_run_attributes (AtkText *text,
clutter_text = CLUTTER_TEXT (actor); clutter_text = CLUTTER_TEXT (actor);
at_set = _cally_misc_layout_get_run_attributes (at_set, at_set = _cally_misc_layout_get_run_attributes (at_set,
clutter_text_get_layout (clutter_text), clutter_text,
(gchar*)clutter_text_get_text (clutter_text),
offset, offset,
start_offset, start_offset,
end_offset); end_offset);
@ -1101,70 +1099,47 @@ _cally_misc_add_attribute (AtkAttributeSet *attrib_set,
return return_set; return return_set;
} }
static gint
_cally_atk_attribute_lookup_func (gconstpointer data,
gconstpointer user_data)
{
AtkTextAttribute attr = (AtkTextAttribute) user_data;
AtkAttribute *at = (AtkAttribute *) data;
if (!g_strcmp0 (at->name, atk_text_attribute_get_name (attr)))
return 0;
return -1;
}
static gboolean
_cally_misc_find_atk_attribute (AtkAttributeSet *attrib_set,
AtkTextAttribute attr)
{
GSList* result = g_slist_find_custom ((GSList*) attrib_set,
(gconstpointer) attr,
_cally_atk_attribute_lookup_func);
return (result != NULL);
}
/** /**
* _cally_misc_layout_get_run_attributes: * _cally_misc_layout_atk_attributes_from_pango:
* *
* Reimplementation of gail_misc_layout_get_run_attributes (check this * Store the pango attributes as their ATK equivalent in an existing
* function for more documentation). * #AtkAttributeSet.
* *
* Returns: A pointer to the #AtkAttributeSet. * Returns: A pointer to the updated #AtkAttributeSet.
**/ **/
static AtkAttributeSet* static AtkAttributeSet*
_cally_misc_layout_get_run_attributes (AtkAttributeSet *attrib_set, _cally_misc_layout_atk_attributes_from_pango (AtkAttributeSet *attrib_set,
PangoLayout *layout, PangoAttrIterator *iter)
gchar *text,
gint offset,
gint *start_offset,
gint *end_offset)
{ {
PangoAttrIterator *iter;
PangoAttrList *attr;
PangoAttrString *pango_string; PangoAttrString *pango_string;
PangoAttrInt *pango_int; PangoAttrInt *pango_int;
PangoAttrColor *pango_color; PangoAttrColor *pango_color;
PangoAttrLanguage *pango_lang; PangoAttrLanguage *pango_lang;
PangoAttrFloat *pango_float; PangoAttrFloat *pango_float;
gint index, start_index, end_index;
gboolean is_next = TRUE;
gchar *value = NULL; gchar *value = NULL;
glong len;
len = g_utf8_strlen (text, -1);
/* Grab the attributes of the PangoLayout, if any */
if ((attr = pango_layout_get_attributes (layout)) == NULL)
{
*start_offset = 0;
*end_offset = len;
return attrib_set;
}
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 (text, offset) - text;
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 (text,
text + start_index);
if (end_index == G_MAXINT)
/* Last iterator */
end_index = len;
*end_offset = g_utf8_pointer_to_offset (text,
text + 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, if ((pango_string = (PangoAttrString*) pango_attr_iterator_get (iter,
PANGO_ATTR_FAMILY)) != NULL) PANGO_ATTR_FAMILY)) != NULL)
{ {
@ -1270,6 +1245,73 @@ _cally_misc_layout_get_run_attributes (AtkAttributeSet *attrib_set,
ATK_TEXT_ATTR_BG_COLOR, ATK_TEXT_ATTR_BG_COLOR,
value); value);
} }
pango_attr_iterator_destroy (iter);
return attrib_set; return attrib_set;
} }
/**
* _cally_misc_layout_get_run_attributes:
*
* Reimplementation of gail_misc_layout_get_run_attributes (check this
* function for more documentation).
*
* Returns: A pointer to the #AtkAttributeSet.
**/
static AtkAttributeSet*
_cally_misc_layout_get_run_attributes (AtkAttributeSet *attrib_set,
ClutterText *clutter_text,
gint offset,
gint *start_offset,
gint *end_offset)
{
PangoAttrIterator *iter;
PangoAttrList *attr;
gint index, start_index, end_index;
gboolean is_next = TRUE;
glong len;
PangoLayout *layout = clutter_text_get_layout (clutter_text);
gchar *text = (gchar*) clutter_text_get_text (clutter_text);
len = g_utf8_strlen (text, -1);
/* Grab the attributes of the PangoLayout, if any */
if ((attr = pango_layout_get_attributes (layout)) == NULL)
{
*start_offset = 0;
*end_offset = len;
}
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 (text, offset) - text;
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 (text,
text + start_index);
if (end_index == G_MAXINT)
/* Last iterator */
end_index = len;
*end_offset = g_utf8_pointer_to_offset (text,
text + end_index);
break;
}
is_next = pango_attr_iterator_next (iter);
pango_attr_iterator_range (iter, &start_index, &end_index);
}
/* Get attributes */
attrib_set = _cally_misc_layout_atk_attributes_from_pango (attrib_set, iter);
pango_attr_iterator_destroy (iter);
return attrib_set;
}