[gtk+] Rework AtkText implementation
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] Rework AtkText implementation
- Date: Mon, 25 Jul 2011 04:48:12 +0000 (UTC)
commit a4560cdfbb25053efd282353c03ac668d0e11e41
Author: Matthias Clasen <mclasen redhat com>
Date: Mon Jul 25 00:27:42 2011 -0400
Rework AtkText implementation
Use a PangoLayout, instead of storing a text buffer per item.
And use gtkpango api instead of implementing it all ourselves.
gtk/gtkiconview.c | 674 ++++++++++-------------------------------------------
1 files changed, 129 insertions(+), 545 deletions(-)
---
diff --git a/gtk/gtkiconview.c b/gtk/gtkiconview.c
index 6a02349..16f5668 100644
--- a/gtk/gtkiconview.c
+++ b/gtk/gtkiconview.c
@@ -40,12 +40,12 @@
#include "gtkwindow.h"
#include "gtkentry.h"
#include "gtkcombobox.h"
-#include "gtktextbuffer.h"
#include "gtkscrollable.h"
#include "gtksizerequest.h"
#include "gtktreednd.h"
#include "gtktypebuiltins.h"
#include "gtkprivate.h"
+#include "gtkpango.h"
#include "a11y/gtkcontaineraccessible.h"
/**
@@ -7087,7 +7087,6 @@ typedef struct
GtkWidget *widget;
AtkStateSet *state_set;
gchar *text;
- GtkTextBuffer *text_buffer;
gchar *action_description;
gchar *image_description;
guint action_idle_handler;
@@ -7102,7 +7101,7 @@ typedef struct _GtkIconViewItemAccessibleClass
static gboolean gtk_icon_view_item_accessible_is_showing (GtkIconViewItemAccessible *item);
static gboolean
-gtk_icon_view_item_accessible_idle_do_action (gpointer data)
+idle_do_action (gpointer data)
{
GtkIconViewItemAccessible *item;
GtkIconView *icon_view;
@@ -7123,8 +7122,8 @@ gtk_icon_view_item_accessible_idle_do_action (gpointer data)
}
static gboolean
-gtk_icon_view_item_accessible_action_do_action (AtkAction *action,
- gint i)
+gtk_icon_view_item_accessible_do_action (AtkAction *action,
+ gint i)
{
GtkIconViewItemAccessible *item;
@@ -7140,20 +7139,20 @@ gtk_icon_view_item_accessible_action_do_action (AtkAction *action,
return FALSE;
if (!item->action_idle_handler)
- item->action_idle_handler = gdk_threads_add_idle (gtk_icon_view_item_accessible_idle_do_action, item);
+ item->action_idle_handler = gdk_threads_add_idle (idle_do_action, item);
return TRUE;
}
static gint
-gtk_icon_view_item_accessible_action_get_n_actions (AtkAction *action)
+gtk_icon_view_item_accessible_get_n_actions (AtkAction *action)
{
return 1;
}
static const gchar *
-gtk_icon_view_item_accessible_action_get_description (AtkAction *action,
- gint i)
+gtk_icon_view_item_accessible_get_description (AtkAction *action,
+ gint i)
{
GtkIconViewItemAccessible *item;
@@ -7169,8 +7168,8 @@ gtk_icon_view_item_accessible_action_get_description (AtkAction *action,
}
static const gchar *
-gtk_icon_view_item_accessible_action_get_name (AtkAction *action,
- gint i)
+gtk_icon_view_item_accessible_get_name (AtkAction *action,
+ gint i)
{
if (i != 0)
return NULL;
@@ -7179,9 +7178,9 @@ gtk_icon_view_item_accessible_action_get_name (AtkAction *action,
}
static gboolean
-gtk_icon_view_item_accessible_action_set_description (AtkAction *action,
- gint i,
- const gchar *description)
+gtk_icon_view_item_accessible_set_description (AtkAction *action,
+ gint i,
+ const gchar *description)
{
GtkIconViewItemAccessible *item;
@@ -7199,15 +7198,15 @@ gtk_icon_view_item_accessible_action_set_description (AtkAction *action,
static void
atk_action_item_interface_init (AtkActionIface *iface)
{
- iface->do_action = gtk_icon_view_item_accessible_action_do_action;
- iface->get_n_actions = gtk_icon_view_item_accessible_action_get_n_actions;
- iface->get_description = gtk_icon_view_item_accessible_action_get_description;
- iface->get_name = gtk_icon_view_item_accessible_action_get_name;
- iface->set_description = gtk_icon_view_item_accessible_action_set_description;
+ iface->do_action = gtk_icon_view_item_accessible_do_action;
+ iface->set_description = gtk_icon_view_item_accessible_set_description;
+ iface->get_name = gtk_icon_view_item_accessible_get_name;
+ iface->get_n_actions = gtk_icon_view_item_accessible_get_n_actions;
+ iface->get_description = gtk_icon_view_item_accessible_get_description;
}
static const gchar *
-gtk_icon_view_item_accessible_image_get_image_description (AtkImage *image)
+gtk_icon_view_item_accessible_get_image_description (AtkImage *image)
{
GtkIconViewItemAccessible *item;
@@ -7217,8 +7216,8 @@ gtk_icon_view_item_accessible_image_get_image_description (AtkImage *image)
}
static gboolean
-gtk_icon_view_item_accessible_image_set_image_description (AtkImage *image,
- const gchar *description)
+gtk_icon_view_item_accessible_set_image_description (AtkImage *image,
+ const gchar *description)
{
GtkIconViewItemAccessible *item;
@@ -7235,7 +7234,7 @@ typedef struct {
gboolean pixbuf_found;
} GetPixbufBoxData;
-static gboolean
+static gboolean
get_pixbuf_foreach (GtkCellRenderer *renderer,
const GdkRectangle *cell_area,
const GdkRectangle *cell_background,
@@ -7268,14 +7267,13 @@ get_pixbuf_box (GtkIconView *icon_view,
return data.pixbuf_found;
}
-static gboolean
-get_text_foreach (GtkCellRenderer *renderer,
- gchar **text)
+static gboolean
+get_text_foreach (GtkCellRenderer *renderer,
+ gchar **text)
{
if (GTK_IS_CELL_RENDERER_TEXT (renderer))
{
g_object_get (renderer, "text", text, NULL);
-
return TRUE;
}
return FALSE;
@@ -7283,21 +7281,21 @@ get_text_foreach (GtkCellRenderer *renderer,
static gchar *
get_text (GtkIconView *icon_view,
- GtkIconViewItem *item)
+ GtkIconViewItem *item)
{
gchar *text = NULL;
gtk_icon_view_set_cell_data (icon_view, item);
gtk_cell_area_foreach (icon_view->priv->cell_area,
- (GtkCellCallback)get_text_foreach, &text);
+ (GtkCellCallback)get_text_foreach, &text);
return text;
}
static void
-gtk_icon_view_item_accessible_image_get_image_size (AtkImage *image,
- gint *width,
- gint *height)
+gtk_icon_view_item_accessible_get_image_size (AtkImage *image,
+ gint *width,
+ gint *height)
{
GtkIconViewItemAccessible *item;
GdkRectangle box;
@@ -7313,15 +7311,15 @@ gtk_icon_view_item_accessible_image_get_image_size (AtkImage *image,
if (get_pixbuf_box (GTK_ICON_VIEW (item->widget), item->item, &box))
{
*width = box.width;
- *height = box.height;
+ *height = box.height;
}
}
static void
-gtk_icon_view_item_accessible_image_get_image_position (AtkImage *image,
- gint *x,
- gint *y,
- AtkCoordType coord_type)
+gtk_icon_view_item_accessible_get_image_position (AtkImage *image,
+ gint *x,
+ gint *y,
+ AtkCoordType coord_type)
{
GtkIconViewItemAccessible *item;
GdkRectangle box;
@@ -7347,553 +7345,153 @@ gtk_icon_view_item_accessible_image_get_image_position (AtkImage *image,
static void
atk_image_item_interface_init (AtkImageIface *iface)
{
- iface->get_image_description = gtk_icon_view_item_accessible_image_get_image_description;
- iface->set_image_description = gtk_icon_view_item_accessible_image_set_image_description;
- iface->get_image_size = gtk_icon_view_item_accessible_image_get_image_size;
- iface->get_image_position = gtk_icon_view_item_accessible_image_get_image_position;
+ iface->get_image_description = gtk_icon_view_item_accessible_get_image_description;
+ iface->set_image_description = gtk_icon_view_item_accessible_set_image_description;
+ iface->get_image_size = gtk_icon_view_item_accessible_get_image_size;
+ iface->get_image_position = gtk_icon_view_item_accessible_get_image_position;
}
static gchar *
-gtk_icon_view_item_accessible_text_get_text (AtkText *text,
- gint start_pos,
- gint end_pos)
+gtk_icon_view_item_accessible_get_text (AtkText *text,
+ gint start_pos,
+ gint end_pos)
{
GtkIconViewItemAccessible *item;
- GtkTextIter start, end;
- GtkTextBuffer *buffer;
item = GTK_ICON_VIEW_ITEM_ACCESSIBLE (text);
-
- if (!GTK_IS_ICON_VIEW (item->widget))
- return NULL;
-
if (atk_state_set_contains_state (item->state_set, ATK_STATE_DEFUNCT))
return NULL;
- buffer = item->text_buffer;
- gtk_text_buffer_get_iter_at_offset (buffer, &start, start_pos);
- if (end_pos < 0)
- gtk_text_buffer_get_end_iter (buffer, &end);
+ if (item->text)
+ return g_utf8_substring (item->text, start_pos, end_pos > -1 ? end_pos : g_utf8_strlen (item->text, -1));
else
- gtk_text_buffer_get_iter_at_offset (buffer, &end, end_pos);
-
- return gtk_text_buffer_get_text (buffer, &start, &end, FALSE);
+ return g_strdup ("");
}
static gunichar
-gtk_icon_view_item_accessible_text_get_character_at_offset (AtkText *text,
- gint offset)
+gtk_icon_view_item_accessible_get_character_at_offset (AtkText *text,
+ gint offset)
{
GtkIconViewItemAccessible *item;
- GtkTextIter start, end;
- GtkTextBuffer *buffer;
gchar *string;
- gunichar unichar;
+ gchar *index;
item = GTK_ICON_VIEW_ITEM_ACCESSIBLE (text);
-
- if (!GTK_IS_ICON_VIEW (item->widget))
+ if (atk_state_set_contains_state (item->state_set, ATK_STATE_DEFUNCT))
return '\0';
- if (atk_state_set_contains_state (item->state_set, ATK_STATE_DEFUNCT))
+ string = item->text;
+
+ if (!string)
return '\0';
- buffer = item->text_buffer;
- if (offset >= gtk_text_buffer_get_char_count (buffer))
+ if (offset >= g_utf8_strlen (string, -1))
return '\0';
- gtk_text_buffer_get_iter_at_offset (buffer, &start, offset);
- end = start;
- gtk_text_iter_forward_char (&end);
- string = gtk_text_buffer_get_slice (buffer, &start, &end, FALSE);
- unichar = g_utf8_get_char (string);
- g_free(string);
+ index = g_utf8_offset_to_pointer (string, offset);
- return unichar;
+ return g_utf8_get_char (index);
}
-#if 0
-static void
-get_pango_text_offsets (PangoLayout *layout,
- GtkTextBuffer *buffer,
- gint function,
- AtkTextBoundary boundary_type,
- gint offset,
- gint *start_offset,
- gint *end_offset,
- GtkTextIter *start_iter,
- GtkTextIter *end_iter)
-{
- PangoLayoutIter *iter;
- PangoLayoutLine *line, *prev_line = NULL, *prev_prev_line = NULL;
- gint index, start_index, end_index;
- const gchar *text;
- gboolean found = FALSE;
-
- text = pango_layout_get_text (layout);
- index = g_utf8_offset_to_pointer (text, offset) - text;
- iter = pango_layout_get_iter (layout);
- do
- {
- line = pango_layout_iter_get_line_readonly (iter);
- start_index = line->start_index;
- end_index = start_index + line->length;
+static PangoLayout *
+create_pango_layout (GtkIconViewItemAccessible *item)
+{
+ PangoLayout *layout;
- if (index >= start_index && index <= end_index)
- {
- /*
- * Found line for offset
- */
- switch (function)
- {
- case 0:
- /*
- * We want the previous line
- */
- if (prev_line)
- {
- switch (boundary_type)
- {
- case ATK_TEXT_BOUNDARY_LINE_START:
- end_index = start_index;
- start_index = prev_line->start_index;
- break;
- case ATK_TEXT_BOUNDARY_LINE_END:
- if (prev_prev_line)
- start_index = prev_prev_line->start_index +
- prev_prev_line->length;
- end_index = prev_line->start_index + prev_line->length;
- break;
- default:
- g_assert_not_reached();
- }
- }
- else
- start_index = end_index = 0;
- break;
- case 1:
- switch (boundary_type)
- {
- case ATK_TEXT_BOUNDARY_LINE_START:
- if (pango_layout_iter_next_line (iter))
- end_index = pango_layout_iter_get_line_readonly (iter)->start_index;
- break;
- case ATK_TEXT_BOUNDARY_LINE_END:
- if (prev_line)
- start_index = prev_line->start_index +
- prev_line->length;
- break;
- default:
- g_assert_not_reached();
- }
- break;
- case 2:
- /*
- * We want the next line
- */
- if (pango_layout_iter_next_line (iter))
- {
- line = pango_layout_iter_get_line_readonly (iter);
- switch (boundary_type)
- {
- case ATK_TEXT_BOUNDARY_LINE_START:
- start_index = line->start_index;
- if (pango_layout_iter_next_line (iter))
- end_index = pango_layout_iter_get_line_readonly (iter)->start_index;
- else
- end_index = start_index + line->length;
- break;
- case ATK_TEXT_BOUNDARY_LINE_END:
- start_index = end_index;
- end_index = line->start_index + line->length;
- break;
- default:
- g_assert_not_reached();
- }
- }
- else
- start_index = end_index;
- break;
- }
- found = TRUE;
- break;
- }
- prev_prev_line = prev_line;
- prev_line = line;
- }
- while (pango_layout_iter_next_line (iter));
+ layout = gtk_widget_create_pango_layout (item->widget, item->text);
- if (!found)
- {
- start_index = prev_line->start_index + prev_line->length;
- end_index = start_index;
- }
- pango_layout_iter_free (iter);
- *start_offset = g_utf8_pointer_to_offset (text, text + start_index);
- *end_offset = g_utf8_pointer_to_offset (text, text + end_index);
-
- gtk_text_buffer_get_iter_at_offset (buffer, start_iter, *start_offset);
- gtk_text_buffer_get_iter_at_offset (buffer, end_iter, *end_offset);
+ return layout;
}
-#endif
-static gchar*
-gtk_icon_view_item_accessible_text_get_text_before_offset (AtkText *text,
- gint offset,
- AtkTextBoundary boundary_type,
- gint *start_offset,
- gint *end_offset)
+static gchar *
+gtk_icon_view_item_accessible_get_text_before_offset (AtkText *atk_text,
+ gint offset,
+ AtkTextBoundary boundary_type,
+ gint *start_offset,
+ gint *end_offset)
{
GtkIconViewItemAccessible *item;
- GtkTextIter start, end;
- GtkTextBuffer *buffer;
-#if 0
- GtkIconView *icon_view;
-#endif
-
- item = GTK_ICON_VIEW_ITEM_ACCESSIBLE (text);
-
- if (!GTK_IS_ICON_VIEW (item->widget))
- return NULL;
+ PangoLayout *layout;
+ gchar *text;
+ item = GTK_ICON_VIEW_ITEM_ACCESSIBLE (atk_text);
if (atk_state_set_contains_state (item->state_set, ATK_STATE_DEFUNCT))
return NULL;
- buffer = item->text_buffer;
-
- if (!gtk_text_buffer_get_char_count (buffer))
- {
- *start_offset = 0;
- *end_offset = 0;
- return g_strdup ("");
- }
- gtk_text_buffer_get_iter_at_offset (buffer, &start, offset);
-
- end = start;
-
- switch (boundary_type)
- {
- case ATK_TEXT_BOUNDARY_CHAR:
- gtk_text_iter_backward_char(&start);
- break;
- case ATK_TEXT_BOUNDARY_WORD_START:
- if (!gtk_text_iter_starts_word (&start))
- gtk_text_iter_backward_word_start (&start);
- end = start;
- gtk_text_iter_backward_word_start(&start);
- break;
- case ATK_TEXT_BOUNDARY_WORD_END:
- if (gtk_text_iter_inside_word (&start) &&
- !gtk_text_iter_starts_word (&start))
- gtk_text_iter_backward_word_start (&start);
- while (!gtk_text_iter_ends_word (&start))
- {
- if (!gtk_text_iter_backward_char (&start))
- break;
- }
- end = start;
- gtk_text_iter_backward_word_start(&start);
- while (!gtk_text_iter_ends_word (&start))
- {
- if (!gtk_text_iter_backward_char (&start))
- break;
- }
- break;
- case ATK_TEXT_BOUNDARY_SENTENCE_START:
- if (!gtk_text_iter_starts_sentence (&start))
- gtk_text_iter_backward_sentence_start (&start);
- end = start;
- gtk_text_iter_backward_sentence_start (&start);
- break;
- case ATK_TEXT_BOUNDARY_SENTENCE_END:
- if (gtk_text_iter_inside_sentence (&start) &&
- !gtk_text_iter_starts_sentence (&start))
- gtk_text_iter_backward_sentence_start (&start);
- while (!gtk_text_iter_ends_sentence (&start))
- {
- if (!gtk_text_iter_backward_char (&start))
- break;
- }
- end = start;
- gtk_text_iter_backward_sentence_start (&start);
- while (!gtk_text_iter_ends_sentence (&start))
- {
- if (!gtk_text_iter_backward_char (&start))
- break;
- }
- break;
- case ATK_TEXT_BOUNDARY_LINE_START:
- case ATK_TEXT_BOUNDARY_LINE_END:
-#if 0
- icon_view = GTK_ICON_VIEW (item->widget);
- /* FIXME we probably have to use GailTextCell to salvage this */
- gtk_icon_view_update_item_text (icon_view, item->item);
- get_pango_text_offsets (icon_view->priv->layout,
- buffer,
- 0,
- boundary_type,
- offset,
- start_offset,
- end_offset,
- &start,
- &end);
-#endif
- break;
- }
-
- *start_offset = gtk_text_iter_get_offset (&start);
- *end_offset = gtk_text_iter_get_offset (&end);
+ layout = create_pango_layout (item);
+ text = _gtk_pango_get_text_before (layout, boundary_type, offset, start_offset, end_offset);
+ g_object_unref (layout);
- return gtk_text_buffer_get_text (buffer, &start, &end, FALSE);
+ return text;
}
-static gchar*
-gtk_icon_view_item_accessible_text_get_text_at_offset (AtkText *text,
- gint offset,
- AtkTextBoundary boundary_type,
- gint *start_offset,
- gint *end_offset)
+static gchar *
+gtk_icon_view_item_accessible_get_text_at_offset (AtkText *atk_text,
+ gint offset,
+ AtkTextBoundary boundary_type,
+ gint *start_offset,
+ gint *end_offset)
{
GtkIconViewItemAccessible *item;
- GtkTextIter start, end;
- GtkTextBuffer *buffer;
-#if 0
- GtkIconView *icon_view;
-#endif
-
- item = GTK_ICON_VIEW_ITEM_ACCESSIBLE (text);
-
- if (!GTK_IS_ICON_VIEW (item->widget))
- return NULL;
+ PangoLayout *layout;
+ gchar *text;
+ item = GTK_ICON_VIEW_ITEM_ACCESSIBLE (atk_text);
if (atk_state_set_contains_state (item->state_set, ATK_STATE_DEFUNCT))
return NULL;
- buffer = item->text_buffer;
-
- if (!gtk_text_buffer_get_char_count (buffer))
- {
- *start_offset = 0;
- *end_offset = 0;
- return g_strdup ("");
- }
- gtk_text_buffer_get_iter_at_offset (buffer, &start, offset);
-
- end = start;
-
- switch (boundary_type)
- {
- case ATK_TEXT_BOUNDARY_CHAR:
- gtk_text_iter_forward_char (&end);
- break;
- case ATK_TEXT_BOUNDARY_WORD_START:
- if (!gtk_text_iter_starts_word (&start))
- gtk_text_iter_backward_word_start (&start);
- if (gtk_text_iter_inside_word (&end))
- gtk_text_iter_forward_word_end (&end);
- while (!gtk_text_iter_starts_word (&end))
- {
- if (!gtk_text_iter_forward_char (&end))
- break;
- }
- break;
- case ATK_TEXT_BOUNDARY_WORD_END:
- if (gtk_text_iter_inside_word (&start) &&
- !gtk_text_iter_starts_word (&start))
- gtk_text_iter_backward_word_start (&start);
- while (!gtk_text_iter_ends_word (&start))
- {
- if (!gtk_text_iter_backward_char (&start))
- break;
- }
- gtk_text_iter_forward_word_end (&end);
- break;
- case ATK_TEXT_BOUNDARY_SENTENCE_START:
- if (!gtk_text_iter_starts_sentence (&start))
- gtk_text_iter_backward_sentence_start (&start);
- if (gtk_text_iter_inside_sentence (&end))
- gtk_text_iter_forward_sentence_end (&end);
- while (!gtk_text_iter_starts_sentence (&end))
- {
- if (!gtk_text_iter_forward_char (&end))
- break;
- }
- break;
- case ATK_TEXT_BOUNDARY_SENTENCE_END:
- if (gtk_text_iter_inside_sentence (&start) &&
- !gtk_text_iter_starts_sentence (&start))
- gtk_text_iter_backward_sentence_start (&start);
- while (!gtk_text_iter_ends_sentence (&start))
- {
- if (!gtk_text_iter_backward_char (&start))
- break;
- }
- gtk_text_iter_forward_sentence_end (&end);
- break;
- case ATK_TEXT_BOUNDARY_LINE_START:
- case ATK_TEXT_BOUNDARY_LINE_END:
-#if 0
- icon_view = GTK_ICON_VIEW (item->widget);
- /* FIXME we probably have to use GailTextCell to salvage this */
- gtk_icon_view_update_item_text (icon_view, item->item);
- get_pango_text_offsets (icon_view->priv->layout,
- buffer,
- 1,
- boundary_type,
- offset,
- start_offset,
- end_offset,
- &start,
- &end);
-#endif
- break;
- }
-
+ layout = create_pango_layout (item);
+ text = _gtk_pango_get_text_at (layout, boundary_type, offset, start_offset, end_offset);
+ g_object_unref (layout);
- *start_offset = gtk_text_iter_get_offset (&start);
- *end_offset = gtk_text_iter_get_offset (&end);
-
- return gtk_text_buffer_get_text (buffer, &start, &end, FALSE);
+ return text;
}
-static gchar*
-gtk_icon_view_item_accessible_text_get_text_after_offset (AtkText *text,
- gint offset,
- AtkTextBoundary boundary_type,
- gint *start_offset,
- gint *end_offset)
+static gchar *
+gtk_icon_view_item_accessible_get_text_after_offset (AtkText *atk_text,
+ gint offset,
+ AtkTextBoundary boundary_type,
+ gint *start_offset,
+ gint *end_offset)
{
GtkIconViewItemAccessible *item;
- GtkTextIter start, end;
- GtkTextBuffer *buffer;
-#if 0
- GtkIconView *icon_view;
-#endif
-
- item = GTK_ICON_VIEW_ITEM_ACCESSIBLE (text);
-
- if (!GTK_IS_ICON_VIEW (item->widget))
- return NULL;
+ PangoLayout *layout;
+ gchar *text;
+ item = GTK_ICON_VIEW_ITEM_ACCESSIBLE (atk_text);
if (atk_state_set_contains_state (item->state_set, ATK_STATE_DEFUNCT))
return NULL;
- buffer = item->text_buffer;
-
- if (!gtk_text_buffer_get_char_count (buffer))
- {
- *start_offset = 0;
- *end_offset = 0;
- return g_strdup ("");
- }
- gtk_text_buffer_get_iter_at_offset (buffer, &start, offset);
-
- end = start;
-
- switch (boundary_type)
- {
- case ATK_TEXT_BOUNDARY_CHAR:
- gtk_text_iter_forward_char(&start);
- gtk_text_iter_forward_chars(&end, 2);
- break;
- case ATK_TEXT_BOUNDARY_WORD_START:
- if (gtk_text_iter_inside_word (&end))
- gtk_text_iter_forward_word_end (&end);
- while (!gtk_text_iter_starts_word (&end))
- {
- if (!gtk_text_iter_forward_char (&end))
- break;
- }
- start = end;
- if (!gtk_text_iter_is_end (&end))
- {
- gtk_text_iter_forward_word_end (&end);
- while (!gtk_text_iter_starts_word (&end))
- {
- if (!gtk_text_iter_forward_char (&end))
- break;
- }
- }
- break;
- case ATK_TEXT_BOUNDARY_WORD_END:
- gtk_text_iter_forward_word_end (&end);
- start = end;
- if (!gtk_text_iter_is_end (&end))
- gtk_text_iter_forward_word_end (&end);
- break;
- case ATK_TEXT_BOUNDARY_SENTENCE_START:
- if (gtk_text_iter_inside_sentence (&end))
- gtk_text_iter_forward_sentence_end (&end);
- while (!gtk_text_iter_starts_sentence (&end))
- {
- if (!gtk_text_iter_forward_char (&end))
- break;
- }
- start = end;
- if (!gtk_text_iter_is_end (&end))
- {
- gtk_text_iter_forward_sentence_end (&end);
- while (!gtk_text_iter_starts_sentence (&end))
- {
- if (!gtk_text_iter_forward_char (&end))
- break;
- }
- }
- break;
- case ATK_TEXT_BOUNDARY_SENTENCE_END:
- gtk_text_iter_forward_sentence_end (&end);
- start = end;
- if (!gtk_text_iter_is_end (&end))
- gtk_text_iter_forward_sentence_end (&end);
- break;
- case ATK_TEXT_BOUNDARY_LINE_START:
- case ATK_TEXT_BOUNDARY_LINE_END:
-#if 0
- icon_view = GTK_ICON_VIEW (item->widget);
- /* FIXME we probably have to use GailTextCell to salvage this */
- gtk_icon_view_update_item_text (icon_view, item->item);
- get_pango_text_offsets (icon_view->priv->layout,
- buffer,
- 2,
- boundary_type,
- offset,
- start_offset,
- end_offset,
- &start,
- &end);
-#endif
- break;
- }
- *start_offset = gtk_text_iter_get_offset (&start);
- *end_offset = gtk_text_iter_get_offset (&end);
+ layout = create_pango_layout (item);
+ text = _gtk_pango_get_text_after (layout, boundary_type, offset, start_offset, end_offset);
+ g_object_unref (layout);
- return gtk_text_buffer_get_text (buffer, &start, &end, FALSE);
+ return text;
}
static gint
-gtk_icon_view_item_accessible_text_get_character_count (AtkText *text)
+gtk_icon_view_item_accessible_get_character_count (AtkText *text)
{
GtkIconViewItemAccessible *item;
item = GTK_ICON_VIEW_ITEM_ACCESSIBLE (text);
-
- if (!GTK_IS_ICON_VIEW (item->widget))
- return 0;
-
if (atk_state_set_contains_state (item->state_set, ATK_STATE_DEFUNCT))
return 0;
- return gtk_text_buffer_get_char_count (item->text_buffer);
+ if (item->text)
+ return g_utf8_strlen (item->text, -1);
+ else
+ return 0;
}
static void
-gtk_icon_view_item_accessible_text_get_character_extents (AtkText *text,
- gint offset,
- gint *x,
- gint *y,
- gint *width,
- gint *height,
- AtkCoordType coord_type)
+gtk_icon_view_item_accessible_get_character_extents (AtkText *text,
+ gint offset,
+ gint *x,
+ gint *y,
+ gint *width,
+ gint *height,
+ AtkCoordType coord_type)
{
GtkIconViewItemAccessible *item;
#if 0
@@ -7930,10 +7528,10 @@ gtk_icon_view_item_accessible_text_get_character_extents (AtkText *text,
}
static gint
-gtk_icon_view_item_accessible_text_get_offset_at_point (AtkText *text,
- gint x,
- gint y,
- AtkCoordType coord_type)
+gtk_icon_view_item_accessible_get_offset_at_point (AtkText *text,
+ gint x,
+ gint y,
+ AtkCoordType coord_type)
{
GtkIconViewItemAccessible *item;
gint offset = 0;
@@ -7982,14 +7580,14 @@ gtk_icon_view_item_accessible_text_get_offset_at_point (AtkText *text,
static void
atk_text_item_interface_init (AtkTextIface *iface)
{
- iface->get_text = gtk_icon_view_item_accessible_text_get_text;
- iface->get_character_at_offset = gtk_icon_view_item_accessible_text_get_character_at_offset;
- iface->get_text_before_offset = gtk_icon_view_item_accessible_text_get_text_before_offset;
- iface->get_text_at_offset = gtk_icon_view_item_accessible_text_get_text_at_offset;
- iface->get_text_after_offset = gtk_icon_view_item_accessible_text_get_text_after_offset;
- iface->get_character_count = gtk_icon_view_item_accessible_text_get_character_count;
- iface->get_character_extents = gtk_icon_view_item_accessible_text_get_character_extents;
- iface->get_offset_at_point = gtk_icon_view_item_accessible_text_get_offset_at_point;
+ iface->get_text = gtk_icon_view_item_accessible_get_text;
+ iface->get_character_at_offset = gtk_icon_view_item_accessible_get_character_at_offset;
+ iface->get_text_before_offset = gtk_icon_view_item_accessible_get_text_before_offset;
+ iface->get_text_at_offset = gtk_icon_view_item_accessible_get_text_at_offset;
+ iface->get_text_after_offset = gtk_icon_view_item_accessible_get_text_after_offset;
+ iface->get_character_count = gtk_icon_view_item_accessible_get_character_count;
+ iface->get_character_extents = gtk_icon_view_item_accessible_get_character_extents;
+ iface->get_offset_at_point = gtk_icon_view_item_accessible_get_offset_at_point;
}
static void
@@ -8196,9 +7794,8 @@ gtk_icon_view_item_accessible_finalize (GObject *object)
if (item->state_set)
g_object_unref (item->state_set);
- if (item->text_buffer)
- g_object_unref (item->text_buffer);
+ g_free (item->text);
g_free (item->action_description);
g_free (item->image_description);
@@ -8456,22 +8053,15 @@ gtk_icon_view_accessible_ref_child (AtkObject *accessible,
obj = gtk_icon_view_accessible_find_child (accessible, index);
if (!obj)
{
- gchar *text;
-
obj = g_object_new (gtk_icon_view_item_accessible_get_type (), NULL);
gtk_icon_view_item_accessible_info_new (accessible, obj, index);
obj->role = ATK_ROLE_ICON;
a11y_item = GTK_ICON_VIEW_ITEM_ACCESSIBLE (obj);
a11y_item->item = item;
a11y_item->widget = widget;
- a11y_item->text_buffer = gtk_text_buffer_new (NULL);
- text = get_text (icon_view, item);
- if (text)
- {
- gtk_text_buffer_set_text (a11y_item->text_buffer, text, -1);
- g_free (text);
- }
+ g_free (a11y_item->text);
+ a11y_item->text = get_text (icon_view, item);
gtk_icon_view_item_accessible_set_visibility (a11y_item, FALSE);
g_object_add_weak_pointer (G_OBJECT (widget), (gpointer) &(a11y_item->widget));
@@ -8580,7 +8170,6 @@ gtk_icon_view_accessible_model_row_changed (GtkTreeModel *tree_model,
GtkIconViewItem *item;
GtkIconViewItemAccessible *a11y_item;
const gchar *name;
- gchar *text;
atk_obj = gtk_widget_get_accessible (GTK_WIDGET (user_data));
index = gtk_tree_path_get_indices(path)[0];
@@ -8594,15 +8183,10 @@ gtk_icon_view_accessible_model_row_changed (GtkTreeModel *tree_model,
item = a11y_item->item;
name = atk_object_get_name (ATK_OBJECT (a11y_item));
-
if (!name || strcmp (name, "") == 0)
{
- text = get_text (icon_view, item);
- if (text)
- {
- gtk_text_buffer_set_text (a11y_item->text_buffer, text, -1);
- g_free (text);
- }
+ g_free (a11y_item->text);
+ a11y_item->text = get_text (icon_view, item);
}
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]