summaryrefslogtreecommitdiff
path: root/gtk/a11y/gtktextviewaccessible.c
diff options
context:
space:
mode:
Diffstat (limited to 'gtk/a11y/gtktextviewaccessible.c')
-rw-r--r--gtk/a11y/gtktextviewaccessible.c1819
1 files changed, 0 insertions, 1819 deletions
diff --git a/gtk/a11y/gtktextviewaccessible.c b/gtk/a11y/gtktextviewaccessible.c
deleted file mode 100644
index 3de00eec92..0000000000
--- a/gtk/a11y/gtktextviewaccessible.c
+++ /dev/null
@@ -1,1819 +0,0 @@
-/* GTK+ - accessibility implementations
- * Copyright 2001, 2002, 2003 Sun Microsystems Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include "config.h"
-
-#include <sys/types.h>
-
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-
-#include <string.h>
-#include <stdlib.h>
-#include <glib-object.h>
-#include <glib/gstdio.h>
-#include <gtk/gtk.h>
-#include "gtktextviewaccessibleprivate.h"
-#include "gtktextbufferprivate.h"
-#include "gtktextviewprivate.h"
-#include "gtk/gtkwidgetprivate.h"
-
-struct _GtkTextViewAccessiblePrivate
-{
- int insert_offset;
- int selection_bound;
-};
-
-static void insert_text_cb (GtkTextBuffer *buffer,
- GtkTextIter *arg1,
- char *arg2,
- int arg3,
- gpointer user_data);
-static void delete_range_cb (GtkTextBuffer *buffer,
- GtkTextIter *arg1,
- GtkTextIter *arg2,
- gpointer user_data);
-static void delete_range_after_cb (GtkTextBuffer *buffer,
- GtkTextIter *arg1,
- GtkTextIter *arg2,
- gpointer user_data);
-static void mark_set_cb (GtkTextBuffer *buffer,
- GtkTextIter *arg1,
- GtkTextMark *arg2,
- gpointer user_data);
-
-
-static void atk_editable_text_interface_init (AtkEditableTextIface *iface);
-static void atk_text_interface_init (AtkTextIface *iface);
-
-G_DEFINE_TYPE_WITH_CODE (GtkTextViewAccessible, gtk_text_view_accessible, GTK_TYPE_WIDGET_ACCESSIBLE,
- G_ADD_PRIVATE (GtkTextViewAccessible)
- G_IMPLEMENT_INTERFACE (ATK_TYPE_EDITABLE_TEXT, atk_editable_text_interface_init)
- G_IMPLEMENT_INTERFACE (ATK_TYPE_TEXT, atk_text_interface_init))
-
-
-static void
-on_editable_changed (GObject *gobject,
- GParamSpec *pspec,
- AtkObject *accessible)
-{
- GtkTextView *text_view = GTK_TEXT_VIEW (gobject);
-
- atk_object_notify_state_change (accessible,
- ATK_STATE_EDITABLE,
- gtk_text_view_get_editable (text_view));
-}
-
-static void
-gtk_text_view_accessible_initialize (AtkObject *obj,
- gpointer data)
-{
- ATK_OBJECT_CLASS (gtk_text_view_accessible_parent_class)->initialize (obj, data);
-
- obj->role = ATK_ROLE_TEXT;
-
- g_signal_connect (data, "notify::editable",
- G_CALLBACK (on_editable_changed),
- obj);
-}
-
-static AtkStateSet*
-gtk_text_view_accessible_ref_state_set (AtkObject *accessible)
-{
- AtkStateSet *state_set;
- GtkWidget *widget;
-
- state_set = ATK_OBJECT_CLASS (gtk_text_view_accessible_parent_class)->ref_state_set (accessible);
-
- widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (accessible));
- if (widget == NULL)
- {
- atk_state_set_add_state (state_set, ATK_STATE_DEFUNCT);
- return state_set;
- }
-
- if (gtk_text_view_get_editable (GTK_TEXT_VIEW (widget)))
- atk_state_set_add_state (state_set, ATK_STATE_EDITABLE);
- atk_state_set_add_state (state_set, ATK_STATE_MULTI_LINE);
-
- return state_set;
-}
-
-static void
-gtk_text_view_accessible_change_buffer (GtkTextViewAccessible *accessible,
- GtkTextBuffer *old_buffer,
- GtkTextBuffer *new_buffer)
-{
- if (old_buffer)
- {
- g_signal_handlers_disconnect_matched (old_buffer, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, accessible);
-
- g_signal_emit_by_name (accessible,
- "text-changed::delete",
- 0,
- gtk_text_buffer_get_char_count (old_buffer));
- }
-
- if (new_buffer)
- {
- g_signal_connect_after (new_buffer, "insert-text", G_CALLBACK (insert_text_cb), accessible);
- g_signal_connect (new_buffer, "delete-range", G_CALLBACK (delete_range_cb), accessible);
- g_signal_connect_after (new_buffer, "delete-range", G_CALLBACK (delete_range_after_cb), accessible);
- g_signal_connect_after (new_buffer, "mark-set", G_CALLBACK (mark_set_cb), accessible);
-
- g_signal_emit_by_name (accessible,
- "text-changed::insert",
- 0,
- gtk_text_buffer_get_char_count (new_buffer));
- }
-}
-
-static void
-gtk_text_view_accessible_widget_set (GtkAccessible *accessible)
-{
- gtk_text_view_accessible_change_buffer (GTK_TEXT_VIEW_ACCESSIBLE (accessible),
- NULL,
- gtk_text_view_get_buffer (GTK_TEXT_VIEW (gtk_accessible_get_widget (accessible))));
-}
-
-static void
-gtk_text_view_accessible_widget_unset (GtkAccessible *accessible)
-{
- gtk_text_view_accessible_change_buffer (GTK_TEXT_VIEW_ACCESSIBLE (accessible),
- gtk_text_view_get_buffer (GTK_TEXT_VIEW (gtk_accessible_get_widget (accessible))),
- NULL);
-}
-
-static void
-gtk_text_view_accessible_class_init (GtkTextViewAccessibleClass *klass)
-{
- AtkObjectClass *class = ATK_OBJECT_CLASS (klass);
- GtkAccessibleClass *accessible_class = GTK_ACCESSIBLE_CLASS (klass);
-
- accessible_class->widget_set = gtk_text_view_accessible_widget_set;
- accessible_class->widget_unset = gtk_text_view_accessible_widget_unset;
-
- class->ref_state_set = gtk_text_view_accessible_ref_state_set;
- class->initialize = gtk_text_view_accessible_initialize;
-}
-
-static void
-gtk_text_view_accessible_init (GtkTextViewAccessible *accessible)
-{
- accessible->priv = gtk_text_view_accessible_get_instance_private (accessible);
-}
-
-static char *
-gtk_text_view_accessible_get_text (AtkText *text,
- int start_offset,
- int end_offset)
-{
- GtkTextView *view;
- GtkTextBuffer *buffer;
- GtkTextIter start, end;
- GtkWidget *widget;
-
- widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
- if (widget == NULL)
- return NULL;
-
- view = GTK_TEXT_VIEW (widget);
- buffer = gtk_text_view_get_buffer (view);
- gtk_text_buffer_get_iter_at_offset (buffer, &start, start_offset);
- gtk_text_buffer_get_iter_at_offset (buffer, &end, end_offset);
-
- return gtk_text_buffer_get_text (buffer, &start, &end, FALSE);
-}
-
-static char *
-gtk_text_view_accessible_get_text_after_offset (AtkText *text,
- int offset,
- AtkTextBoundary boundary_type,
- int *start_offset,
- int *end_offset)
-{
- GtkWidget *widget;
- GtkTextView *view;
- GtkTextBuffer *buffer;
- GtkTextIter pos;
- GtkTextIter start, end;
-
- widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
- if (widget == NULL)
- return NULL;
-
- view = GTK_TEXT_VIEW (widget);
- buffer = gtk_text_view_get_buffer (view);
- gtk_text_buffer_get_iter_at_offset (buffer, &pos, offset);
- start = end = pos;
- if (boundary_type == ATK_TEXT_BOUNDARY_LINE_START)
- {
- gtk_text_view_forward_display_line (view, &end);
- start = end;
- gtk_text_view_forward_display_line (view, &end);
- }
- else if (boundary_type == ATK_TEXT_BOUNDARY_LINE_END)
- {
- gtk_text_view_forward_display_line_end (view, &end);
- start = end;
- gtk_text_view_forward_display_line (view, &end);
- gtk_text_view_forward_display_line_end (view, &end);
- }
- else
- _gtk_text_buffer_get_text_after (buffer, boundary_type, &pos, &start, &end);
-
- *start_offset = gtk_text_iter_get_offset (&start);
- *end_offset = gtk_text_iter_get_offset (&end);
-
- return gtk_text_buffer_get_slice (buffer, &start, &end, FALSE);
-}
-
-static char *
-gtk_text_view_accessible_get_text_at_offset (AtkText *text,
- int offset,
- AtkTextBoundary boundary_type,
- int *start_offset,
- int *end_offset)
-{
- GtkWidget *widget;
- GtkTextView *view;
- GtkTextBuffer *buffer;
- GtkTextIter pos;
- GtkTextIter start, end;
-
- widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
- if (widget == NULL)
- return NULL;
-
- view = GTK_TEXT_VIEW (widget);
- buffer = gtk_text_view_get_buffer (view);
- gtk_text_buffer_get_iter_at_offset (buffer, &pos, offset);
- start = end = pos;
- if (boundary_type == ATK_TEXT_BOUNDARY_LINE_START)
- {
- gtk_text_view_backward_display_line_start (view, &start);
- gtk_text_view_forward_display_line (view, &end);
- }
- else if (boundary_type == ATK_TEXT_BOUNDARY_LINE_END)
- {
- gtk_text_view_backward_display_line_start (view, &start);
- if (!gtk_text_iter_is_start (&start))
- {
- gtk_text_view_backward_display_line (view, &start);
- gtk_text_view_forward_display_line_end (view, &start);
- }
- gtk_text_view_forward_display_line_end (view, &end);
- }
- else
- _gtk_text_buffer_get_text_at (buffer, boundary_type, &pos, &start, &end);
-
- *start_offset = gtk_text_iter_get_offset (&start);
- *end_offset = gtk_text_iter_get_offset (&end);
-
- return gtk_text_buffer_get_slice (buffer, &start, &end, FALSE);
-}
-
-static char *
-gtk_text_view_accessible_get_text_before_offset (AtkText *text,
- int offset,
- AtkTextBoundary boundary_type,
- int *start_offset,
- int *end_offset)
-{
- GtkWidget *widget;
- GtkTextView *view;
- GtkTextBuffer *buffer;
- GtkTextIter pos;
- GtkTextIter start, end;
-
- widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
- if (widget == NULL)
- return NULL;
-
- view = GTK_TEXT_VIEW (widget);
- buffer = gtk_text_view_get_buffer (view);
- gtk_text_buffer_get_iter_at_offset (buffer, &pos, offset);
- start = end = pos;
-
- if (boundary_type == ATK_TEXT_BOUNDARY_LINE_START)
- {
- gtk_text_view_backward_display_line_start (view, &start);
- end = start;
- gtk_text_view_backward_display_line (view, &start);
- gtk_text_view_backward_display_line_start (view, &start);
- }
- else if (boundary_type == ATK_TEXT_BOUNDARY_LINE_END)
- {
- gtk_text_view_backward_display_line_start (view, &start);
- if (!gtk_text_iter_is_start (&start))
- {
- gtk_text_view_backward_display_line (view, &start);
- end = start;
- gtk_text_view_forward_display_line_end (view, &end);
- if (!gtk_text_iter_is_start (&start))
- {
- if (gtk_text_view_backward_display_line (view, &start))
- gtk_text_view_forward_display_line_end (view, &start);
- else
- gtk_text_iter_set_offset (&start, 0);
- }
- }
- else
- end = start;
- }
- else
- _gtk_text_buffer_get_text_before (buffer, boundary_type, &pos, &start, &end);
-
- *start_offset = gtk_text_iter_get_offset (&start);
- *end_offset = gtk_text_iter_get_offset (&end);
-
- return gtk_text_buffer_get_slice (buffer, &start, &end, FALSE);
-}
-
-static gunichar
-gtk_text_view_accessible_get_character_at_offset (AtkText *text,
- int offset)
-{
- GtkWidget *widget;
- GtkTextIter start, end;
- GtkTextBuffer *buffer;
- char *string;
- gunichar unichar;
-
- widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
- if (widget == NULL)
- return '\0';
-
- buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (widget));
- if (offset >= gtk_text_buffer_get_char_count (buffer))
- 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);
-
- return unichar;
-}
-
-static int
-gtk_text_view_accessible_get_character_count (AtkText *text)
-{
- GtkWidget *widget;
- GtkTextBuffer *buffer;
-
- widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
- if (widget == NULL)
- return 0;
-
- buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (widget));
- return gtk_text_buffer_get_char_count (buffer);
-}
-
-static int
-get_insert_offset (GtkTextBuffer *buffer)
-{
- GtkTextMark *insert;
- GtkTextIter iter;
-
- insert = gtk_text_buffer_get_insert (buffer);
- gtk_text_buffer_get_iter_at_mark (buffer, &iter, insert);
- return gtk_text_iter_get_offset (&iter);
-}
-
-static int
-gtk_text_view_accessible_get_caret_offset (AtkText *text)
-{
- GtkWidget *widget;
- GtkTextBuffer *buffer;
-
- widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
- if (widget == NULL)
- return -1;
-
- buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (widget));
- return get_insert_offset (buffer);
-}
-
-static gboolean
-gtk_text_view_accessible_set_caret_offset (AtkText *text,
- int offset)
-{
- GtkTextView *view;
- GtkWidget *widget;
- GtkTextBuffer *buffer;
- GtkTextIter iter;
-
- widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
- if (widget == NULL)
- return FALSE;
-
- view = GTK_TEXT_VIEW (widget);
- buffer = gtk_text_view_get_buffer (view);
-
- gtk_text_buffer_get_iter_at_offset (buffer, &iter, offset);
- gtk_text_buffer_place_cursor (buffer, &iter);
- gtk_text_view_scroll_to_iter (view, &iter, 0, FALSE, 0, 0);
-
- return TRUE;
-}
-
-static int
-gtk_text_view_accessible_get_offset_at_point (AtkText *text,
- int x,
- int y,
- AtkCoordType coords)
-{
- GtkTextView *view;
- GtkTextIter iter;
- int buff_x, buff_y;
- GtkWidget *widget;
- GdkRectangle rect;
-
- widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
- if (widget == NULL)
- return -1;
-
- if (coords != ATK_XY_WINDOW)
- return -1;
-
- view = GTK_TEXT_VIEW (widget);
-
- gtk_text_view_window_to_buffer_coords (view, GTK_TEXT_WINDOW_WIDGET,
- x, y, &buff_x, &buff_y);
- gtk_text_view_get_visible_rect (view, &rect);
-
- /* Clamp point to visible rectangle */
- buff_x = CLAMP (buff_x, rect.x, rect.x + rect.width - 1);
- buff_y = CLAMP (buff_y, rect.y, rect.y + rect.height - 1);
-
- gtk_text_view_get_iter_at_location (view, &iter, buff_x, buff_y);
-
- /* The iter at a location sometimes points to the next character.
- * See bug 111031. We work around that
- */
- gtk_text_view_get_iter_location (view, &iter, &rect);
- if (buff_x < rect.x)
- gtk_text_iter_backward_char (&iter);
- return gtk_text_iter_get_offset (&iter);
-}
-
-static void
-gtk_text_view_accessible_get_character_extents (AtkText *text,
- int offset,
- int *x,
- int *y,
- int *width,
- int *height,
- AtkCoordType coords)
-{
- GtkTextView *view;
- GtkTextBuffer *buffer;
- GtkTextIter iter;
- GtkWidget *widget;
- GdkRectangle rectangle;
-
- *x = 0;
- *y = 0;
- *width = 0;
- *height = 0;
-
- widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
- if (widget == NULL)
- return;
-
- view = GTK_TEXT_VIEW (widget);
- buffer = gtk_text_view_get_buffer (view);
- gtk_text_buffer_get_iter_at_offset (buffer, &iter, offset);
- gtk_text_view_get_iter_location (view, &iter, &rectangle);
-
- *height = rectangle.height;
- *width = rectangle.width;
-
- gtk_text_view_buffer_to_window_coords (view, GTK_TEXT_WINDOW_WIDGET,
- rectangle.x, rectangle.y, x, y);
- if (coords != ATK_XY_WINDOW)
- {
- *x = 0;
- *y = 0;
- *height = 0;
- *width = 0;
- }
-}
-
-static AtkAttributeSet *
-add_text_attribute (AtkAttributeSet *attributes,
- AtkTextAttribute attr,
- char *value)
-{
- AtkAttribute *at;
-
- at = g_new (AtkAttribute, 1);
- at->name = g_strdup (atk_text_attribute_get_name (attr));
- at->value = value;
-
- return g_slist_prepend (attributes, at);
-}
-
-static AtkAttributeSet *
-add_text_int_attribute (AtkAttributeSet *attributes,
- AtkTextAttribute attr,
- int i)
-
-{
- char *value;
-
- value = g_strdup (atk_text_attribute_get_value (attr, i));
-
- return add_text_attribute (attributes, attr, value);
-}
-
-static AtkAttributeSet *
-gtk_text_view_accessible_get_run_attributes (AtkText *text,
- int offset,
- int *start_offset,
- int *end_offset)
-{
- GtkTextView *view;
- GtkTextBuffer *buffer;
- GtkWidget *widget;
- GtkTextIter iter;
- AtkAttributeSet *attrib_set = NULL;
- GSList *tags, *temp_tags;
- double scale = 1;
- gboolean val_set = FALSE;
-
- widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
- if (widget == NULL)
- return NULL;
-
- view = GTK_TEXT_VIEW (widget);
- buffer = gtk_text_view_get_buffer (view);
-
- gtk_text_buffer_get_iter_at_offset (buffer, &iter, offset);
-
- gtk_text_iter_forward_to_tag_toggle (&iter, NULL);
- *end_offset = gtk_text_iter_get_offset (&iter);
-
- gtk_text_iter_backward_to_tag_toggle (&iter, NULL);
- *start_offset = gtk_text_iter_get_offset (&iter);
-
- gtk_text_buffer_get_iter_at_offset (buffer, &iter, offset);
-
- tags = gtk_text_iter_get_tags (&iter);
- tags = g_slist_reverse (tags);
-
- temp_tags = tags;
- while (temp_tags && !val_set)
- {
- GtkTextTag *tag = GTK_TEXT_TAG (temp_tags->data);
-
- g_object_get (tag, "style-set", &val_set, NULL);
- if (val_set)
- {
- PangoStyle style;
- g_object_get (tag, "style", &style, NULL);
- attrib_set = add_text_int_attribute (attrib_set, ATK_TEXT_ATTR_STYLE, style);
- }
- temp_tags = temp_tags->next;
- }
- val_set = FALSE;
-
- temp_tags = tags;
- while (temp_tags && !val_set)
- {
- GtkTextTag *tag = GTK_TEXT_TAG (temp_tags->data);
-
- g_object_get (tag, "variant-set", &val_set, NULL);
- if (val_set)
- {
- PangoVariant variant;
- g_object_get (tag, "variant", &variant, NULL);
- attrib_set = add_text_int_attribute (attrib_set, ATK_TEXT_ATTR_VARIANT, variant);
- }
- temp_tags = temp_tags->next;
- }
- val_set = FALSE;
-
- temp_tags = tags;
- while (temp_tags && !val_set)
- {
- GtkTextTag *tag = GTK_TEXT_TAG (temp_tags->data);
-
- g_object_get (tag, "stretch-set", &val_set, NULL);
- if (val_set)
- {
- PangoStretch stretch;
- g_object_get (tag, "stretch", &stretch, NULL);
- attrib_set = add_text_int_attribute (attrib_set, ATK_TEXT_ATTR_STRETCH, stretch);
- }
- temp_tags = temp_tags->next;
- }
- val_set = FALSE;
-
- temp_tags = tags;
- while (temp_tags && !val_set)
- {
- GtkTextTag *tag = GTK_TEXT_TAG (temp_tags->data);
-
- g_object_get (tag, "justification-set", &val_set, NULL);
- if (val_set)
- {
- GtkJustification justification;
- g_object_get (tag, "justification", &justification, NULL);
- attrib_set = add_text_int_attribute (attrib_set, ATK_TEXT_ATTR_JUSTIFICATION, justification);
- }
- temp_tags = temp_tags->next;
- }
- val_set = FALSE;
-
- temp_tags = tags;
- while (temp_tags && !val_set)
- {
- GtkTextTag *tag = GTK_TEXT_TAG (temp_tags->data);
- GtkTextDirection direction;
-
- g_object_get (tag, "direction", &direction, NULL);
-
- if (direction != GTK_TEXT_DIR_NONE)
- {
- val_set = TRUE;
- attrib_set = add_text_int_attribute (attrib_set, ATK_TEXT_ATTR_DIRECTION, direction);
- }
- temp_tags = temp_tags->next;
- }
- val_set = FALSE;
-
- temp_tags = tags;
- while (temp_tags && !val_set)
- {
- GtkTextTag *tag = GTK_TEXT_TAG (temp_tags->data);
-
- g_object_get (tag, "wrap-mode-set", &val_set, NULL);
- if (val_set)
- {
- GtkWrapMode wrap_mode;
- g_object_get (tag, "wrap-mode", &wrap_mode, NULL);
- attrib_set = add_text_int_attribute (attrib_set, ATK_TEXT_ATTR_WRAP_MODE, wrap_mode);
- }
- temp_tags = temp_tags->next;
- }
- val_set = FALSE;
-
- temp_tags = tags;
- while (temp_tags && !val_set)
- {
- GtkTextTag *tag = GTK_TEXT_TAG (temp_tags->data);
-
- g_object_get (tag, "foreground-set", &val_set, NULL);
- if (val_set)
- {
- GdkRGBA *rgba;
- char *value;
-
- g_object_get (tag, "foreground-rgba", &rgba, NULL);
- value = g_strdup_printf ("%u,%u,%u",
- (guint) rgba->red * 65535,
- (guint) rgba->green * 65535,
- (guint) rgba->blue * 65535);
- gdk_rgba_free (rgba);
- attrib_set = add_text_attribute (attrib_set, ATK_TEXT_ATTR_FG_COLOR, value);
- }
- temp_tags = temp_tags->next;
- }
- val_set = FALSE;
-
- temp_tags = tags;
- while (temp_tags && !val_set)
- {
- GtkTextTag *tag = GTK_TEXT_TAG (temp_tags->data);
-
- g_object_get (tag, "background-set", &val_set, NULL);
- if (val_set)
- {
- GdkRGBA *rgba;
- char *value;
-
- g_object_get (tag, "background-rgba", &rgba, NULL);
- value = g_strdup_printf ("%u,%u,%u",
- (guint) rgba->red * 65535,
- (guint) rgba->green * 65535,
- (guint) rgba->blue * 65535);
- gdk_rgba_free (rgba);
- attrib_set = add_text_attribute (attrib_set, ATK_TEXT_ATTR_BG_COLOR, value);
- }
- temp_tags = temp_tags->next;
- }
- val_set = FALSE;
-
- temp_tags = tags;
- while (temp_tags && !val_set)
- {
- GtkTextTag *tag = GTK_TEXT_TAG (temp_tags->data);
-
- g_object_get (tag, "family-set", &val_set, NULL);
-
- if (val_set)
- {
- char *value;
- g_object_get (tag, "family", &value, NULL);
- attrib_set = add_text_attribute (attrib_set, ATK_TEXT_ATTR_FAMILY_NAME, value);
- }
- temp_tags = temp_tags->next;
- }
- val_set = FALSE;
-
- temp_tags = tags;
- while (temp_tags && !val_set)
- {
- GtkTextTag *tag = GTK_TEXT_TAG (temp_tags->data);
-
- g_object_get (tag, "language-set", &val_set, NULL);
-
- if (val_set)
- {
- char *value;
- g_object_get (tag, "language", &value, NULL);
- attrib_set = add_text_attribute (attrib_set, ATK_TEXT_ATTR_LANGUAGE, value);
- }
- temp_tags = temp_tags->next;
- }
- val_set = FALSE;
-
- temp_tags = tags;
- while (temp_tags && !val_set)
- {
- GtkTextTag *tag = GTK_TEXT_TAG (temp_tags->data);
-
- g_object_get (tag, "weight-set", &val_set, NULL);
-
- if (val_set)
- {
- int weight;
- char *value;
- g_object_get (tag, "weight", &weight, NULL);
- value = g_strdup_printf ("%d", weight);
- attrib_set = add_text_attribute (attrib_set, ATK_TEXT_ATTR_WEIGHT, value);
- }
- temp_tags = temp_tags->next;
- }
- val_set = FALSE;
-
- /* scale is special as the effective value is the product
- * of all specified values
- */
- temp_tags = tags;
- while (temp_tags)
- {
- GtkTextTag *tag = GTK_TEXT_TAG (temp_tags->data);
- gboolean scale_set;
-
- g_object_get (tag, "scale-set", &scale_set, NULL);
- if (scale_set)
- {
- double font_scale;
- g_object_get (tag, "scale", &font_scale, NULL);
- val_set = TRUE;
- scale *= font_scale;
- }
- temp_tags = temp_tags->next;
- }
- if (val_set)
- {
- char *value;
- value = g_strdup_printf ("%g", scale);
- attrib_set = add_text_attribute (attrib_set, ATK_TEXT_ATTR_SCALE, value);
- }
- val_set = FALSE;
-
- temp_tags = tags;
- while (temp_tags && !val_set)
- {
- GtkTextTag *tag = GTK_TEXT_TAG (temp_tags->data);
-
- g_object_get (tag, "size-set", &val_set, NULL);
- if (val_set)
- {
- int size;
- char *value;
- g_object_get (tag, "size", &size, NULL);
- value = g_strdup_printf ("%i", size);
- attrib_set = add_text_attribute (attrib_set, ATK_TEXT_ATTR_SIZE, value);
- }
- temp_tags = temp_tags->next;
- }
- val_set = FALSE;
-
- temp_tags = tags;
- while (temp_tags && !val_set)
- {
- GtkTextTag *tag = GTK_TEXT_TAG (temp_tags->data);
-
- g_object_get (tag, "strikethrough-set", &val_set, NULL);
- if (val_set)
- {
- gboolean strikethrough;
- g_object_get (tag, "strikethrough", &strikethrough, NULL);
- attrib_set = add_text_int_attribute (attrib_set, ATK_TEXT_ATTR_STRIKETHROUGH, strikethrough);
- }
- temp_tags = temp_tags->next;
- }
- val_set = FALSE;
-
- temp_tags = tags;
- while (temp_tags && !val_set)
- {
- GtkTextTag *tag = GTK_TEXT_TAG (temp_tags->data);
-
- g_object_get (tag, "underline-set", &val_set, NULL);
- if (val_set)
- {
- PangoUnderline underline;
- g_object_get (tag, "underline", &underline, NULL);
- attrib_set = add_text_int_attribute (attrib_set, ATK_TEXT_ATTR_UNDERLINE, underline);
- }
- temp_tags = temp_tags->next;
- }
- val_set = FALSE;
-
- temp_tags = tags;
- while (temp_tags && !val_set)
- {
- GtkTextTag *tag = GTK_TEXT_TAG (temp_tags->data);
-
- g_object_get (tag, "rise-set", &val_set, NULL);
- if (val_set)
- {
- int rise;
- char *value;
- g_object_get (tag, "rise", &rise, NULL);
- value = g_strdup_printf ("%i", rise);
- attrib_set = add_text_attribute (attrib_set, ATK_TEXT_ATTR_RISE, value);
- }
- temp_tags = temp_tags->next;
- }
- val_set = FALSE;
-
- temp_tags = tags;
- while (temp_tags && !val_set)
- {
- GtkTextTag *tag = GTK_TEXT_TAG (temp_tags->data);
-
- g_object_get (tag, "background-full-height-set", &val_set, NULL);
- if (val_set)
- {
- gboolean bg_full_height;
- g_object_get (tag, "background-full-height", &bg_full_height, NULL);
- attrib_set = add_text_int_attribute (attrib_set, ATK_TEXT_ATTR_BG_FULL_HEIGHT, bg_full_height);
- }
- temp_tags = temp_tags->next;
- }
- val_set = FALSE;
-
- temp_tags = tags;
- while (temp_tags && !val_set)
- {
- GtkTextTag *tag = GTK_TEXT_TAG (temp_tags->data);
-
- g_object_get (tag, "pixels-inside-wrap-set", &val_set, NULL);
- if (val_set)
- {
- int pixels;
- char *value;
- g_object_get (tag, "pixels-inside-wrap", &pixels, NULL);
- value = g_strdup_printf ("%i", pixels);
- attrib_set = add_text_attribute (attrib_set, ATK_TEXT_ATTR_PIXELS_INSIDE_WRAP, value);
- }
- temp_tags = temp_tags->next;
- }
- val_set = FALSE;
-
- temp_tags = tags;
- while (temp_tags && !val_set)
- {
- GtkTextTag *tag = GTK_TEXT_TAG (temp_tags->data);
-
- g_object_get (tag, "pixels-below-lines-set", &val_set, NULL);
- if (val_set)
- {
- int pixels;
- char *value;
- g_object_get (tag, "pixels-below-lines", &pixels, NULL);
- value = g_strdup_printf ("%i", pixels);
- attrib_set = add_text_attribute (attrib_set, ATK_TEXT_ATTR_PIXELS_BELOW_LINES, value);
- }
- temp_tags = temp_tags->next;
- }
- val_set = FALSE;
-
- temp_tags = tags;
- while (temp_tags && !val_set)
- {
- GtkTextTag *tag = GTK_TEXT_TAG (temp_tags->data);
-
- g_object_get (tag, "pixels-above-lines-set", &val_set, NULL);
- if (val_set)
- {
- int pixels;
- char *value;
- g_object_get (tag, "pixels-above-lines", &pixels, NULL);
- value = g_strdup_printf ("%i", pixels);
- attrib_set = add_text_attribute (attrib_set, ATK_TEXT_ATTR_PIXELS_ABOVE_LINES, value);
- }
- temp_tags = temp_tags->next;
- }
- val_set = FALSE;
-
- temp_tags = tags;
- while (temp_tags && !val_set)
- {
- GtkTextTag *tag = GTK_TEXT_TAG (temp_tags->data);
-
- g_object_get (tag, "editable-set", &val_set, NULL);
- if (val_set)
- {
- gboolean editable;
- g_object_get (tag, "editable", &editable, NULL);
- attrib_set = add_text_int_attribute (attrib_set, ATK_TEXT_ATTR_EDITABLE, editable);
- }
- temp_tags = temp_tags->next;
- }
- val_set = FALSE;
-
- temp_tags = tags;
- while (temp_tags && !val_set)
- {
- GtkTextTag *tag = GTK_TEXT_TAG (temp_tags->data);
-
- g_object_get (tag, "invisible-set", &val_set, NULL);
- if (val_set)
- {
- gboolean invisible;
- g_object_get (tag, "invisible", &invisible, NULL);
- attrib_set = add_text_int_attribute (attrib_set, ATK_TEXT_ATTR_INVISIBLE, invisible);
- }
- temp_tags = temp_tags->next;
- }
- val_set = FALSE;
-
- temp_tags = tags;
- while (temp_tags && !val_set)
- {
- GtkTextTag *tag = GTK_TEXT_TAG (temp_tags->data);
-
- g_object_get (tag, "indent-set", &val_set, NULL);
- if (val_set)
- {
- int indent;
- char *value;
- g_object_get (tag, "indent", &indent, NULL);
- value = g_strdup_printf ("%i", indent);
- attrib_set = add_text_attribute (attrib_set, ATK_TEXT_ATTR_INDENT, value);
- }
- temp_tags = temp_tags->next;
- }
- val_set = FALSE;
-
- temp_tags = tags;
- while (temp_tags && !val_set)
- {
- GtkTextTag *tag = GTK_TEXT_TAG (temp_tags->data);
-
- g_object_get (tag, "right-margin-set", &val_set, NULL);
- if (val_set)
- {
- int margin;
- char *value;
- g_object_get (tag, "right-margin", &margin, NULL);
- value = g_strdup_printf ("%i", margin);
- attrib_set = add_text_attribute (attrib_set, ATK_TEXT_ATTR_RIGHT_MARGIN, value);
- }
- temp_tags = temp_tags->next;
- }
- val_set = FALSE;
-
- temp_tags = tags;
- while (temp_tags && !val_set)
- {
- GtkTextTag *tag = GTK_TEXT_TAG (temp_tags->data);
-
- g_object_get (tag, "left-margin-set", &val_set, NULL);
- if (val_set)
- {
- int margin;
- char *value;
- g_object_get (tag, "left-margin", &margin, NULL);
- value = g_strdup_printf ("%i", margin);
- attrib_set = add_text_attribute (attrib_set, ATK_TEXT_ATTR_LEFT_MARGIN, value);
- }
- temp_tags = temp_tags->next;
- }
- val_set = FALSE;
-
- g_slist_free (tags);
- return attrib_set;
-}
-
-static AtkAttributeSet *
-gtk_text_view_accessible_get_default_attributes (AtkText *text)
-{
- GtkTextView *view;
- GtkWidget *widget;
- GtkTextAttributes *text_attrs;
- AtkAttributeSet *attributes;
- PangoFontDescription *font;
- char *value;
-
- widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
- if (widget == NULL)
- return NULL;
-
- view = GTK_TEXT_VIEW (widget);
- text_attrs = gtk_text_view_get_default_attributes (view);
-
- attributes = NULL;
-
- font = text_attrs->font;
-
- if (font)
- {
- attributes = add_text_int_attribute (attributes, ATK_TEXT_ATTR_STYLE,
- pango_font_description_get_style (font));
-
- attributes = add_text_int_attribute (attributes, ATK_TEXT_ATTR_VARIANT,
- pango_font_description_get_variant (font));
-
- attributes = add_text_int_attribute (attributes, ATK_TEXT_ATTR_STRETCH,
- pango_font_description_get_stretch (font));
-
- value = g_strdup (pango_font_description_get_family (font));
- attributes = add_text_attribute (attributes, ATK_TEXT_ATTR_FAMILY_NAME, value);
-
- value = g_strdup_printf ("%d", pango_font_description_get_weight (font));
- attributes = add_text_attribute (attributes, ATK_TEXT_ATTR_WEIGHT, value);
-
- value = g_strdup_printf ("%i", pango_font_description_get_size (font) / PANGO_SCALE);
- attributes = add_text_attribute (attributes, ATK_TEXT_ATTR_SIZE, value);
- }
-
- attributes = add_text_int_attribute (attributes, ATK_TEXT_ATTR_JUSTIFICATION, text_attrs->justification);
- attributes = add_text_int_attribute (attributes, ATK_TEXT_ATTR_DIRECTION, text_attrs->direction);
- attributes = add_text_int_attribute (attributes, ATK_TEXT_ATTR_WRAP_MODE, text_attrs->wrap_mode);
- attributes = add_text_int_attribute (attributes, ATK_TEXT_ATTR_EDITABLE, text_attrs->editable);
- attributes = add_text_int_attribute (attributes, ATK_TEXT_ATTR_INVISIBLE, text_attrs->invisible);
- attributes = add_text_int_attribute (attributes, ATK_TEXT_ATTR_BG_FULL_HEIGHT, text_attrs->bg_full_height);
-
- attributes = add_text_int_attribute (attributes, ATK_TEXT_ATTR_STRIKETHROUGH,
- text_attrs->appearance.strikethrough);
- attributes = add_text_int_attribute (attributes, ATK_TEXT_ATTR_UNDERLINE,
- text_attrs->appearance.underline);
-
- value = g_strdup_printf ("%u,%u,%u",
- (guint)(text_attrs->appearance.bg_rgba->red * 65535),
- (guint)(text_attrs->appearance.bg_rgba->green * 65535),
- (guint)(text_attrs->appearance.bg_rgba->blue * 65535));
- attributes = add_text_attribute (attributes, ATK_TEXT_ATTR_BG_COLOR, value);
-
- value = g_strdup_printf ("%u,%u,%u",
- (guint)(text_attrs->appearance.fg_rgba->red),
- (guint)(text_attrs->appearance.fg_rgba->green),
- (guint)(text_attrs->appearance.fg_rgba->blue));
- attributes = add_text_attribute (attributes, ATK_TEXT_ATTR_FG_COLOR, value);
-
- value = g_strdup_printf ("%g", text_attrs->font_scale);
- attributes = add_text_attribute (attributes, ATK_TEXT_ATTR_SCALE, value);
-
- value = g_strdup ((char *)(text_attrs->language));
- attributes = add_text_attribute (attributes, ATK_TEXT_ATTR_LANGUAGE, value);
-
- value = g_strdup_printf ("%i", text_attrs->appearance.rise);
- attributes = add_text_attribute (attributes, ATK_TEXT_ATTR_RISE, value);
-
- value = g_strdup_printf ("%i", text_attrs->pixels_inside_wrap);
- attributes = add_text_attribute (attributes, ATK_TEXT_ATTR_PIXELS_INSIDE_WRAP, value);
-
- value = g_strdup_printf ("%i", text_attrs->pixels_below_lines);
- attributes = add_text_attribute (attributes, ATK_TEXT_ATTR_PIXELS_BELOW_LINES, value);
-
- value = g_strdup_printf ("%i", text_attrs->pixels_above_lines);
- attributes = add_text_attribute (attributes, ATK_TEXT_ATTR_PIXELS_ABOVE_LINES, value);
-
- value = g_strdup_printf ("%i", text_attrs->indent);
- attributes = add_text_attribute (attributes, ATK_TEXT_ATTR_INDENT, value);
-
- value = g_strdup_printf ("%i", text_attrs->left_margin);
- attributes = add_text_attribute (attributes, ATK_TEXT_ATTR_LEFT_MARGIN, value);
-
- value = g_strdup_printf ("%i", text_attrs->right_margin);
- attributes = add_text_attribute (attributes, ATK_TEXT_ATTR_RIGHT_MARGIN, value);
-
- gtk_text_attributes_unref (text_attrs);
- return attributes;
-}
-
-static int
-gtk_text_view_accessible_get_n_selections (AtkText *text)
-{
- GtkWidget *widget;
- GtkTextBuffer *buffer;
-
- widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
- if (widget == NULL)
- return 0;
-
- buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (widget));
- if (gtk_text_buffer_get_selection_bounds (buffer, NULL, NULL))
- return 1;
-
- return 0;
-}
-
-static char *
-gtk_text_view_accessible_get_selection (AtkText *atk_text,
- int selection_num,
- int *start_pos,
- int *end_pos)
-{
- GtkTextView *view;
- GtkWidget *widget;
- GtkTextBuffer *buffer;
- GtkTextIter start, end;
- char *text;
-
- widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (atk_text));
- if (widget == NULL)
- return NULL;
-
- if (selection_num != 0)
- return NULL;
-
- view = GTK_TEXT_VIEW (widget);
- buffer = gtk_text_view_get_buffer (view);
-
- if (gtk_text_buffer_get_selection_bounds (buffer, &start, &end))
- text = gtk_text_buffer_get_text (buffer, &start, &end, FALSE);
- else
- text = NULL;
-
- *start_pos = gtk_text_iter_get_offset (&start);
- *end_pos = gtk_text_iter_get_offset (&end);
-
- return text;
-}
-
-static gboolean
-gtk_text_view_accessible_add_selection (AtkText *text,
- int start_pos,
- int end_pos)
-{
- GtkWidget *widget;
- GtkTextBuffer *buffer;
- GtkTextIter start, end;
-
- widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
- if (widget == NULL)
- return FALSE;
-
- buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (widget));
-
- if (!gtk_text_buffer_get_selection_bounds (buffer, NULL, NULL))
- {
- gtk_text_buffer_get_iter_at_offset (buffer, &start, start_pos);
- gtk_text_buffer_get_iter_at_offset (buffer, &end, end_pos);
- gtk_text_buffer_select_range (buffer, &end, &start);
-
- return TRUE;
- }
- else
- return FALSE;
-}
-
-static gboolean
-gtk_text_view_accessible_remove_selection (AtkText *text,
- int selection_num)
-{
- GtkWidget *widget;
- GtkTextBuffer *buffer;
- GtkTextMark *insert;
- GtkTextIter iter;
- GtkTextIter start, end;
-
- widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
- if (widget == NULL)
- return FALSE;
-
- if (selection_num != 0)
- return FALSE;
-
- buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (widget));
-
- if (gtk_text_buffer_get_selection_bounds (buffer, &start, &end))
- {
- insert = gtk_text_buffer_get_insert (buffer);
- gtk_text_buffer_get_iter_at_mark (buffer, &iter, insert);
- gtk_text_buffer_place_cursor (buffer, &iter);
- return TRUE;
- }
- else
- return FALSE;
-}
-
-static gboolean
-gtk_text_view_accessible_set_selection (AtkText *text,
- int selection_num,
- int start_pos,
- int end_pos)
-{
- GtkWidget *widget;
- GtkTextBuffer *buffer;
- GtkTextIter start, end;
-
- widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
- if (widget == NULL)
- return FALSE;
-
- if (selection_num != 0)
- return FALSE;
-
- buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (widget));
-
- if (gtk_text_buffer_get_selection_bounds (buffer, &start, &end))
- {
- gtk_text_buffer_get_iter_at_offset (buffer, &start, start_pos);
- gtk_text_buffer_get_iter_at_offset (buffer, &end, end_pos);
- gtk_text_buffer_select_range (buffer, &end, &start);
-
- return TRUE;
- }
- else
- return FALSE;
-}
-
-static void
-atk_text_interface_init (AtkTextIface *iface)
-{
- iface->get_text = gtk_text_view_accessible_get_text;
- iface->get_text_after_offset = gtk_text_view_accessible_get_text_after_offset;
- iface->get_text_at_offset = gtk_text_view_accessible_get_text_at_offset;
- iface->get_text_before_offset = gtk_text_view_accessible_get_text_before_offset;
- iface->get_character_at_offset = gtk_text_view_accessible_get_character_at_offset;
- iface->get_character_count = gtk_text_view_accessible_get_character_count;
- iface->get_caret_offset = gtk_text_view_accessible_get_caret_offset;
- iface->set_caret_offset = gtk_text_view_accessible_set_caret_offset;
- iface->get_offset_at_point = gtk_text_view_accessible_get_offset_at_point;
- iface->get_character_extents = gtk_text_view_accessible_get_character_extents;
- iface->get_n_selections = gtk_text_view_accessible_get_n_selections;
- iface->get_selection = gtk_text_view_accessible_get_selection;
- iface->add_selection = gtk_text_view_accessible_add_selection;
- iface->remove_selection = gtk_text_view_accessible_remove_selection;
- iface->set_selection = gtk_text_view_accessible_set_selection;
- iface->get_run_attributes = gtk_text_view_accessible_get_run_attributes;
- iface->get_default_attributes = gtk_text_view_accessible_get_default_attributes;
-}
-
-/* atkeditabletext.h */
-
-static gboolean
-gtk_text_view_accessible_set_run_attributes (AtkEditableText *text,
- AtkAttributeSet *attributes,
- int start_offset,
- int end_offset)
-{
- GtkTextView *view;
- GtkTextBuffer *buffer;
- GtkWidget *widget;
- GtkTextTag *tag;
- GtkTextIter start;
- GtkTextIter end;
- int j;
- GdkRGBA *color;
- char ** RGB_vals;
- GSList *l;
-
- widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
- if (widget == NULL)
- return FALSE;
-
- view = GTK_TEXT_VIEW (widget);
- if (!gtk_text_view_get_editable (view))
- return FALSE;
-
- buffer = gtk_text_view_get_buffer (view);
-
- if (attributes == NULL)
- return FALSE;
-
- gtk_text_buffer_get_iter_at_offset (buffer, &start, start_offset);
- gtk_text_buffer_get_iter_at_offset (buffer, &end, end_offset);
-
- tag = gtk_text_buffer_create_tag (buffer, NULL, NULL);
-
- for (l = attributes; l; l = l->next)
- {
- char *name;
- char *value;
- AtkAttribute *at;
-
- at = l->data;
-
- name = at->name;
- value = at->value;
-
- if (!strcmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_LEFT_MARGIN)))
- g_object_set (G_OBJECT (tag), "left-margin", atoi (value), NULL);
-
- else if (!strcmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_RIGHT_MARGIN)))
- g_object_set (G_OBJECT (tag), "right-margin", atoi (value), NULL);
-
- else if (!strcmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_INDENT)))
- g_object_set (G_OBJECT (tag), "indent", atoi (value), NULL);
-
- else if (!strcmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_PIXELS_ABOVE_LINES)))
- g_object_set (G_OBJECT (tag), "pixels-above-lines", atoi (value), NULL);
-
- else if (!strcmp(name, atk_text_attribute_get_name (ATK_TEXT_ATTR_PIXELS_BELOW_LINES)))
- g_object_set (G_OBJECT (tag), "pixels-below-lines", atoi (value), NULL);
-
- else if (!strcmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_PIXELS_INSIDE_WRAP)))
- g_object_set (G_OBJECT (tag), "pixels-inside-wrap", atoi (value), NULL);
-
- else if (!strcmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_SIZE)))
- g_object_set (G_OBJECT (tag), "size", atoi (value), NULL);
-
- else if (!strcmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_RISE)))
- g_object_set (G_OBJECT (tag), "rise", atoi (value), NULL);
-
- else if (!strcmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_WEIGHT)))
- g_object_set (G_OBJECT (tag), "weight", atoi (value), NULL);
-
- else if (!strcmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_BG_FULL_HEIGHT)))
- {
- g_object_set (G_OBJECT (tag), "bg-full-height",
- (strcmp (value, atk_text_attribute_get_value (ATK_TEXT_ATTR_BG_FULL_HEIGHT, 0))),
- NULL);
- }
-
- else if (!strcmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_LANGUAGE)))
- g_object_set (G_OBJECT (tag), "language", value, NULL);
-
- else if (!strcmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_FAMILY_NAME)))
- g_object_set (G_OBJECT (tag), "family", value, NULL);
-
- else if (!strcmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_EDITABLE)))
- {
- g_object_set (G_OBJECT (tag), "editable",
- (strcmp (value, atk_text_attribute_get_value (ATK_TEXT_ATTR_EDITABLE, 0))),
- NULL);
- }
-
- else if (!strcmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_INVISIBLE)))
- {
- g_object_set (G_OBJECT (tag), "invisible",
- (strcmp (value, atk_text_attribute_get_value (ATK_TEXT_ATTR_EDITABLE, 0))),
- NULL);
- }
-
- else if (!strcmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_UNDERLINE)))
- {
- for (j = 0; j < 3; j++)
- {
- if (!strcmp (value, atk_text_attribute_get_value (ATK_TEXT_ATTR_UNDERLINE, j)))
- {
- g_object_set (G_OBJECT (tag), "underline", j, NULL);
- break;
- }
- }
- }
-
- else if (!strcmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_STRIKETHROUGH)))
- {
- g_object_set (G_OBJECT (tag), "strikethrough",
- (strcmp (value, atk_text_attribute_get_value (ATK_TEXT_ATTR_STRIKETHROUGH, 0))),
- NULL);
- }
-
- else if (!strcmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_BG_COLOR)))
- {
- RGB_vals = g_strsplit (value, ",", 3);
- color = g_malloc (sizeof (GdkRGBA));
- color->red = atoi (RGB_vals[0]) / 65535.0;
- color->green = atoi (RGB_vals[1]) / 65535.0;
- color->blue = atoi (RGB_vals[2]) / 65535.0;
- g_object_set (G_OBJECT (tag), "background-rgba", color, NULL);
- }
-
- else if (!strcmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_FG_COLOR)))
- {
- RGB_vals = g_strsplit (value, ",", 3);
- color = g_malloc (sizeof (GdkRGBA));
- color->red = atoi (RGB_vals[0]) / 65535.0;
- color->green = atoi (RGB_vals[1]) / 65535.0;
- color->blue = atoi (RGB_vals[2]) / 65535.0;
- g_object_set (G_OBJECT (tag), "foreground-rgba", color, NULL);
- }
-
- else if (!strcmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_STRETCH)))
- {
- for (j = 0; j < 9; j++)
- {
- if (!strcmp (value, atk_text_attribute_get_value (ATK_TEXT_ATTR_STRETCH, j)))
- {
- g_object_set (G_OBJECT (tag), "stretch", j, NULL);
- break;
- }
- }
- }
-
- else if (!strcmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_JUSTIFICATION)))
- {
- for (j = 0; j < 4; j++)
- {
- if (!strcmp (value, atk_text_attribute_get_value (ATK_TEXT_ATTR_JUSTIFICATION, j)))
- {
- g_object_set (G_OBJECT (tag), "justification", j, NULL);
- break;
- }
- }
- }
-
- else if (!strcmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_DIRECTION)))
- {
- for (j = 0; j < 3; j++)
- {
- if (!strcmp (value, atk_text_attribute_get_value (ATK_TEXT_ATTR_DIRECTION, j)))
- {
- g_object_set (G_OBJECT (tag), "direction", j, NULL);
- break;
- }
- }
- }
-
- else if (!strcmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_VARIANT)))
- {
- for (j = 0; j < 2; j++)
- {
- if (!strcmp (value, atk_text_attribute_get_value (ATK_TEXT_ATTR_VARIANT, j)))
- {
- g_object_set (G_OBJECT (tag), "variant", j, NULL);
- break;
- }
- }
- }
-
- else if (!strcmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_WRAP_MODE)))
- {
- for (j = 0; j < 3; j++)
- {
- if (!strcmp (value, atk_text_attribute_get_value (ATK_TEXT_ATTR_WRAP_MODE, j)))
- {
- g_object_set (G_OBJECT (tag), "wrap-mode", j, NULL);
- break;
- }
- }
- }
-
- else if (!strcmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_STYLE)))
- {
- for (j = 0; j < 3; j++)
- {
- if (!strcmp (value, atk_text_attribute_get_value (ATK_TEXT_ATTR_STYLE, j)))
- {
- g_object_set (G_OBJECT (tag), "style", j, NULL);
- break;
- }
- }
- }
-
- else
- return FALSE;
- }
-
- gtk_text_buffer_apply_tag (buffer, tag, &start, &end);
-
- return TRUE;
-}
-
-static void
-gtk_text_view_accessible_set_text_contents (AtkEditableText *text,
- const char *string)
-{
- GtkTextView *view;
- GtkWidget *widget;
- GtkTextBuffer *buffer;
-
- widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
- if (widget == NULL)
- return;
-
- view = GTK_TEXT_VIEW (widget);
- if (!gtk_text_view_get_editable (view))
- return;
-
- buffer = gtk_text_view_get_buffer (view);
- gtk_text_buffer_set_text (buffer, string, -1);
-}
-
-static void
-gtk_text_view_accessible_insert_text (AtkEditableText *text,
- const char *string,
- int length,
- int *position)
-{
- GtkTextView *view;
- GtkWidget *widget;
- GtkTextBuffer *buffer;
- GtkTextIter iter;
-
- widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
- if (widget == NULL)
- return;
-
- view = GTK_TEXT_VIEW (widget);
- if (!gtk_text_view_get_editable (view))
- return;
-
- buffer = gtk_text_view_get_buffer (view);
- gtk_text_buffer_get_iter_at_offset (buffer, &iter, *position);
- gtk_text_buffer_insert (buffer, &iter, string, length);
-}
-
-static void
-gtk_text_view_accessible_copy_text (AtkEditableText *text,
- int start_pos,
- int end_pos)
-{
- GtkWidget *widget;
- GtkTextBuffer *buffer;
- GtkTextIter start, end;
- char *str;
- GdkClipboard *clipboard;
-
- widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
- if (widget == NULL)
- return;
-
- buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (widget));
-
- gtk_text_buffer_get_iter_at_offset (buffer, &start, start_pos);
- gtk_text_buffer_get_iter_at_offset (buffer, &end, end_pos);
- str = gtk_text_buffer_get_text (buffer, &start, &end, FALSE);
-
- clipboard = gtk_widget_get_clipboard (widget);
- gdk_clipboard_set_text (clipboard, str);
-}
-
-static void
-gtk_text_view_accessible_cut_text (AtkEditableText *text,
- int start_pos,
- int end_pos)
-{
- GtkTextView *view;
- GtkWidget *widget;
- GtkTextBuffer *buffer;
- GtkTextIter start, end;
- char *str;
- GdkClipboard *clipboard;
-
- widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
- if (widget == NULL)
- return;
-
- view = GTK_TEXT_VIEW (widget);
- if (!gtk_text_view_get_editable (view))
- return;
- buffer = gtk_text_view_get_buffer (view);
-
- gtk_text_buffer_get_iter_at_offset (buffer, &start, start_pos);
- gtk_text_buffer_get_iter_at_offset (buffer, &end, end_pos);
- str = gtk_text_buffer_get_text (buffer, &start, &end, FALSE);
- clipboard = gtk_widget_get_clipboard (widget);
- gdk_clipboard_set_text (clipboard, str);
- gtk_text_buffer_delete (buffer, &start, &end);
-}
-
-static void
-gtk_text_view_accessible_delete_text (AtkEditableText *text,
- int start_pos,
- int end_pos)
-{
- GtkTextView *view;
- GtkWidget *widget;
- GtkTextBuffer *buffer;
- GtkTextIter start_itr;
- GtkTextIter end_itr;
-
- widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
- if (widget == NULL)
- return;
-
- view = GTK_TEXT_VIEW (widget);
- if (!gtk_text_view_get_editable (view))
- return;
- buffer = gtk_text_view_get_buffer (view);
-
- gtk_text_buffer_get_iter_at_offset (buffer, &start_itr, start_pos);
- gtk_text_buffer_get_iter_at_offset (buffer, &end_itr, end_pos);
- gtk_text_buffer_delete (buffer, &start_itr, &end_itr);
-}
-
-typedef struct
-{
- GtkTextBuffer* buffer;
- int position;
-} PasteData;
-
-static void
-paste_received (GObject *clipboard,
- GAsyncResult *result,
- gpointer data)
-{
- PasteData* paste = data;
- GtkTextIter pos_itr;
- char *text;
-
- text = gdk_clipboard_read_text_finish (GDK_CLIPBOARD (clipboard), result, NULL);
- if (text)
- {
- gtk_text_buffer_get_iter_at_offset (paste->buffer, &pos_itr, paste->position);
- gtk_text_buffer_insert (paste->buffer, &pos_itr, text, -1);
- g_free (text);
- }
-
- g_object_unref (paste->buffer);
-}
-
-static void
-gtk_text_view_accessible_paste_text (AtkEditableText *text,
- int position)
-{
- GtkTextView *view;
- GtkWidget *widget;
- GtkTextBuffer *buffer;
- PasteData paste;
- GdkClipboard *clipboard;
-
- widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
- if (widget == NULL)
- return;
-
- view = GTK_TEXT_VIEW (widget);
- if (!gtk_text_view_get_editable (view))
- return;
- buffer = gtk_text_view_get_buffer (view);
-
- paste.buffer = buffer;
- paste.position = position;
-
- g_object_ref (paste.buffer);
- clipboard = gtk_widget_get_clipboard (widget);
- gdk_clipboard_read_text_async (clipboard, NULL, paste_received, &paste);
-}
-
-static void
-atk_editable_text_interface_init (AtkEditableTextIface *iface)
-{
- iface->set_text_contents = gtk_text_view_accessible_set_text_contents;
- iface->insert_text = gtk_text_view_accessible_insert_text;
- iface->copy_text = gtk_text_view_accessible_copy_text;
- iface->cut_text = gtk_text_view_accessible_cut_text;
- iface->delete_text = gtk_text_view_accessible_delete_text;
- iface->paste_text = gtk_text_view_accessible_paste_text;
- iface->set_run_attributes = gtk_text_view_accessible_set_run_attributes;
-}
-
-/* Callbacks */
-
-static void
-gtk_text_view_accessible_update_cursor (GtkTextViewAccessible *accessible,
- GtkTextBuffer * buffer)
-{
- int prev_insert_offset, prev_selection_bound;
- int insert_offset, selection_bound;
- GtkTextIter iter;
-
- prev_insert_offset = accessible->priv->insert_offset;
- prev_selection_bound = accessible->priv->selection_bound;
-
- gtk_text_buffer_get_iter_at_mark (buffer, &iter, gtk_text_buffer_get_insert (buffer));
- insert_offset = gtk_text_iter_get_offset (&iter);
- gtk_text_buffer_get_iter_at_mark (buffer, &iter, gtk_text_buffer_get_selection_bound (buffer));
- selection_bound = gtk_text_iter_get_offset (&iter);
-
- if (prev_insert_offset == insert_offset && prev_selection_bound == selection_bound)
- return;
-
- accessible->priv->insert_offset = insert_offset;
- accessible->priv->selection_bound = selection_bound;
-
- if (prev_insert_offset != insert_offset)
- g_signal_emit_by_name (accessible, "text-caret-moved", insert_offset);
-
- if (prev_insert_offset != prev_selection_bound || insert_offset != selection_bound)
- g_signal_emit_by_name (accessible, "text-selection-changed");
-}
-
-static void
-insert_text_cb (GtkTextBuffer *buffer,
- GtkTextIter *iter,
- char *text,
- int len,
- gpointer data)
-{
- GtkTextViewAccessible *accessible = data;
- int position;
- int length;
-
- position = gtk_text_iter_get_offset (iter);
- length = g_utf8_strlen (text, len);
-
- g_signal_emit_by_name (accessible, "text-changed::insert", position - length, length);
-
- gtk_text_view_accessible_update_cursor (accessible, buffer);
-}
-
-static void
-delete_range_cb (GtkTextBuffer *buffer,
- GtkTextIter *start,
- GtkTextIter *end,
- gpointer data)
-{
- GtkTextViewAccessible *accessible = data;
- int offset, length;
-
- offset = gtk_text_iter_get_offset (start);
- length = gtk_text_iter_get_offset (end) - offset;
-
- g_signal_emit_by_name (accessible,
- "text-changed::delete",
- offset,
- length);
-}
-
-static void
-delete_range_after_cb (GtkTextBuffer *buffer,
- GtkTextIter *start,
- GtkTextIter *end,
- gpointer data)
-{
- GtkTextViewAccessible *accessible = data;
-
- gtk_text_view_accessible_update_cursor (accessible, buffer);
-}
-
-static void
-mark_set_cb (GtkTextBuffer *buffer,
- GtkTextIter *location,
- GtkTextMark *mark,
- gpointer data)
-{
- GtkTextViewAccessible *accessible = data;
-
- /*
- * Only generate the signal for the "insert" mark, which
- * represents the cursor.
- */
- if (mark == gtk_text_buffer_get_insert (buffer))
- {
- gtk_text_view_accessible_update_cursor (accessible, buffer);
- }
- else if (mark == gtk_text_buffer_get_selection_bound (buffer))
- {
- gtk_text_view_accessible_update_cursor (accessible, buffer);
- }
-}
-
-void
-_gtk_text_view_accessible_set_buffer (GtkTextView *textview,
- GtkTextBuffer *old_buffer)
-{
- GtkTextViewAccessible *accessible;
-
- g_return_if_fail (GTK_IS_TEXT_VIEW (textview));
- g_return_if_fail (old_buffer == NULL || GTK_IS_TEXT_BUFFER (old_buffer));
-
- accessible = GTK_TEXT_VIEW_ACCESSIBLE (_gtk_widget_peek_accessible (GTK_WIDGET (textview)));
- if (accessible == NULL)
- return;
-
- gtk_text_view_accessible_change_buffer (accessible,
- old_buffer,
- gtk_text_view_get_buffer (textview));
-}
-