2 * AT-SPI - Assistive Technology Service Provider Interface
3 * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap)
5 * Copyright 2008 Novell, Inc.
6 * Copyright 2001, 2002 Sun Microsystems Inc.,
7 * Copyright 2001, 2002 Ximian, Inc.
9 * This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Library General Public
11 * License as published by the Free Software Foundation; either
12 * version 2 of the License, or (at your option) any later version.
14 * This library is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Library General Public License for more details.
19 * You should have received a copy of the GNU Library General Public
20 * License along with this library; if not, write to the
21 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
22 * Boston, MA 02111-1307, USA.
28 #include <droute/droute.h>
33 #include "introspection.h"
36 impl_get_CharacterCount (DBusMessageIter * iter, void *user_data)
38 AtkText *text = (AtkText *) user_data;
39 g_return_val_if_fail (ATK_IS_TEXT (user_data), FALSE);
40 return droute_return_v_int32 (iter, atk_text_get_character_count (text));
44 impl_get_CaretOffset (DBusMessageIter * iter, void *user_data)
46 AtkText *text = (AtkText *) user_data;
47 g_return_val_if_fail (ATK_IS_TEXT (user_data), FALSE);
48 return droute_return_v_int32 (iter, atk_text_get_caret_offset (text));
52 validate_allocated_string (gchar *str)
56 if (!g_utf8_validate (str, -1, NULL))
58 g_warning ("atk-bridge: received bad UTF-8 string from a get_text function");
66 impl_GetText (DBusConnection * bus, DBusMessage * message, void *user_data)
68 AtkText *text = (AtkText *) user_data;
69 dbus_int32_t startOffset, endOffset;
73 g_return_val_if_fail (ATK_IS_TEXT (user_data),
74 droute_not_yet_handled_error (message));
75 if (!dbus_message_get_args
76 (message, NULL, DBUS_TYPE_INT32, &startOffset, DBUS_TYPE_INT32,
77 &endOffset, DBUS_TYPE_INVALID))
79 return droute_invalid_arguments_error (message);
81 txt = atk_text_get_text (text, startOffset, endOffset);
82 txt = validate_allocated_string (txt);
83 reply = dbus_message_new_method_return (message);
86 dbus_message_append_args (reply, DBUS_TYPE_STRING, &txt,
94 impl_SetCaretOffset (DBusConnection * bus, DBusMessage * message,
97 AtkText *text = (AtkText *) user_data;
102 g_return_val_if_fail (ATK_IS_TEXT (user_data),
103 droute_not_yet_handled_error (message));
104 if (!dbus_message_get_args
105 (message, NULL, DBUS_TYPE_INT32, &offset, DBUS_TYPE_INVALID))
107 return droute_invalid_arguments_error (message);
109 rv = atk_text_set_caret_offset (text, offset);
110 reply = dbus_message_new_method_return (message);
113 dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &rv,
120 impl_GetTextBeforeOffset (DBusConnection * bus, DBusMessage * message,
123 AtkText *text = (AtkText *) user_data;
127 dbus_int32_t startOffset, endOffset;
128 gint intstart_offset = 0, intend_offset = 0;
131 g_return_val_if_fail (ATK_IS_TEXT (user_data),
132 droute_not_yet_handled_error (message));
133 if (!dbus_message_get_args
134 (message, NULL, DBUS_TYPE_INT32, &offset, DBUS_TYPE_UINT32, &type,
137 return droute_invalid_arguments_error (message);
140 atk_text_get_text_before_offset (text, offset, (AtkTextBoundary) type,
141 &intstart_offset, &intend_offset);
142 startOffset = intstart_offset;
143 endOffset = intend_offset;
144 txt = validate_allocated_string (txt);
145 reply = dbus_message_new_method_return (message);
148 dbus_message_append_args (reply, DBUS_TYPE_STRING, &txt,
149 DBUS_TYPE_INT32, &startOffset,
150 DBUS_TYPE_INT32, &endOffset,
158 impl_GetTextAtOffset (DBusConnection * bus, DBusMessage * message,
161 AtkText *text = (AtkText *) user_data;
162 dbus_int32_t offset, type;
164 dbus_int32_t startOffset, endOffset;
165 gint intstart_offset = 0, intend_offset = 0;
168 g_return_val_if_fail (ATK_IS_TEXT (user_data),
169 droute_not_yet_handled_error (message));
170 if (!dbus_message_get_args
171 (message, NULL, DBUS_TYPE_INT32, &offset, DBUS_TYPE_UINT32, &type,
174 return droute_invalid_arguments_error (message);
177 atk_text_get_text_at_offset (text, offset, (AtkTextBoundary) type,
178 &intstart_offset, &intend_offset);
179 startOffset = intstart_offset;
180 endOffset = intend_offset;
181 txt = validate_allocated_string (txt);
182 reply = dbus_message_new_method_return (message);
185 dbus_message_append_args (reply, DBUS_TYPE_STRING, &txt,
186 DBUS_TYPE_INT32, &startOffset,
187 DBUS_TYPE_INT32, &endOffset,
195 impl_GetTextAfterOffset (DBusConnection * bus, DBusMessage * message,
198 AtkText *text = (AtkText *) user_data;
202 dbus_int32_t startOffset, endOffset;
203 gint intstart_offset = 0, intend_offset = 0;
206 g_return_val_if_fail (ATK_IS_TEXT (user_data),
207 droute_not_yet_handled_error (message));
208 if (!dbus_message_get_args
209 (message, NULL, DBUS_TYPE_INT32, &offset, DBUS_TYPE_UINT32, &type,
212 return droute_invalid_arguments_error (message);
215 atk_text_get_text_after_offset (text, offset, (AtkTextBoundary) type,
216 &intstart_offset, &intend_offset);
217 startOffset = intstart_offset;
218 endOffset = intend_offset;
219 txt = validate_allocated_string (txt);
220 reply = dbus_message_new_method_return (message);
223 dbus_message_append_args (reply, DBUS_TYPE_STRING, &txt,
224 DBUS_TYPE_INT32, &startOffset,
225 DBUS_TYPE_INT32, &endOffset,
233 impl_GetCharacterAtOffset (DBusConnection * bus, DBusMessage * message,
236 AtkText *text = (AtkText *) user_data;
241 g_return_val_if_fail (ATK_IS_TEXT (user_data),
242 droute_not_yet_handled_error (message));
243 if (!dbus_message_get_args
244 (message, NULL, DBUS_TYPE_INT32, &offset, DBUS_TYPE_INVALID))
246 return droute_invalid_arguments_error (message);
248 ch = atk_text_get_character_at_offset (text, offset);
249 reply = dbus_message_new_method_return (message);
252 dbus_message_append_args (reply, DBUS_TYPE_INT32, &ch,
259 get_text_for_legacy_implementations(AtkText *text,
261 AtkTextGranularity granularity,
266 AtkTextBoundary boundary = 0;
267 switch (granularity) {
268 case ATK_TEXT_GRANULARITY_CHAR:
269 boundary = ATK_TEXT_BOUNDARY_CHAR;
272 case ATK_TEXT_GRANULARITY_WORD:
273 boundary = ATK_TEXT_BOUNDARY_WORD_START;
276 case ATK_TEXT_GRANULARITY_SENTENCE:
277 boundary = ATK_TEXT_BOUNDARY_SENTENCE_START;
280 case ATK_TEXT_GRANULARITY_LINE:
281 boundary = ATK_TEXT_BOUNDARY_LINE_START;
284 case ATK_TEXT_GRANULARITY_PARAGRAPH:
285 /* This is not implemented in previous versions of ATK */
290 g_assert_not_reached();
296 atk_text_get_text_at_offset (text, offset, boundary,
297 start_offset, end_offset);
304 impl_GetStringAtOffset (DBusConnection * bus, DBusMessage * message,
307 AtkText *text = (AtkText *) user_data;
309 dbus_uint32_t granularity;
311 dbus_int32_t startOffset, endOffset;
312 gint intstart_offset = 0, intend_offset = 0;
315 g_return_val_if_fail (ATK_IS_TEXT (user_data),
316 droute_not_yet_handled_error (message));
317 if (!dbus_message_get_args
318 (message, NULL, DBUS_TYPE_INT32, &offset, DBUS_TYPE_UINT32, &granularity,
321 return droute_invalid_arguments_error (message);
325 atk_text_get_string_at_offset (text, offset, (AtkTextGranularity) granularity,
326 &intstart_offset, &intend_offset);
328 /* Accessibility layers implementing an older version of ATK (even if
329 * a new enough version of libatk is installed) might return NULL due
330 * not to provide an implementation for get_string_at_offset(), so we
331 * try with the legacy implementation if that's the case. */
333 txt = get_text_for_legacy_implementations(text, offset,
334 (AtkTextGranularity) granularity,
335 &intstart_offset, &intend_offset);
337 startOffset = intstart_offset;
338 endOffset = intend_offset;
339 txt = validate_allocated_string (txt);
340 reply = dbus_message_new_method_return (message);
343 dbus_message_append_args (reply, DBUS_TYPE_STRING, &txt,
344 DBUS_TYPE_INT32, &startOffset,
345 DBUS_TYPE_INT32, &endOffset,
353 impl_GetAttributeValue (DBusConnection * bus, DBusMessage * message,
356 AtkText *text = (AtkText *) user_data;
359 dbus_int32_t startOffset, endOffset;
361 gint intstart_offset = 0, intend_offset = 0;
364 AtkAttributeSet *set;
368 g_return_val_if_fail (ATK_IS_TEXT (user_data),
369 droute_not_yet_handled_error (message));
370 if (!dbus_message_get_args
371 (message, NULL, DBUS_TYPE_INT32, &offset, DBUS_TYPE_STRING,
372 &attributeName, DBUS_TYPE_INVALID))
374 return droute_invalid_arguments_error (message);
377 set = atk_text_get_run_attributes (text, offset,
378 &intstart_offset, &intend_offset);
379 startOffset = intstart_offset;
380 endOffset = intend_offset;
382 cur_attr = (GSList *) set;
385 at = (AtkAttribute *) cur_attr->data;
386 if (!strcmp (at->name, attributeName))
392 cur_attr = cur_attr->next;
396 reply = dbus_message_new_method_return (message);
399 dbus_message_append_args (reply, DBUS_TYPE_STRING, &rv, DBUS_TYPE_INVALID);
401 atk_attribute_set_free (set);
406 impl_GetAttributes (DBusConnection * bus, DBusMessage * message,
409 AtkText *text = (AtkText *) user_data;
411 dbus_int32_t startOffset, endOffset;
412 gint intstart_offset, intend_offset;
414 AtkAttributeSet *set;
415 DBusMessageIter iter;
417 g_return_val_if_fail (ATK_IS_TEXT (user_data),
418 droute_not_yet_handled_error (message));
419 if (!dbus_message_get_args
420 (message, NULL, DBUS_TYPE_INT32, &offset, DBUS_TYPE_INVALID))
422 return droute_invalid_arguments_error (message);
425 set = atk_text_get_run_attributes (text, offset,
426 &intstart_offset, &intend_offset);
428 startOffset = intstart_offset;
429 endOffset = intend_offset;
430 reply = dbus_message_new_method_return (message);
433 dbus_message_iter_init_append (reply, &iter);
434 spi_object_append_attribute_set (&iter, set);
435 dbus_message_append_args (reply, DBUS_TYPE_INT32, &startOffset,
436 DBUS_TYPE_INT32, &endOffset,
439 atk_attribute_set_free (set);
444 impl_GetDefaultAttributes (DBusConnection * bus, DBusMessage * message,
447 AtkText *text = (AtkText *) user_data;
449 AtkAttributeSet *set;
450 DBusMessageIter iter;
452 g_return_val_if_fail (ATK_IS_TEXT (user_data),
453 droute_not_yet_handled_error (message));
455 set = atk_text_get_default_attributes (text);
456 reply = dbus_message_new_method_return (message);
459 dbus_message_iter_init_append (reply, &iter);
460 spi_object_append_attribute_set (&iter, set);
462 atk_attribute_set_free (set);
467 impl_GetCharacterExtents (DBusConnection * bus, DBusMessage * message,
470 AtkText *text = (AtkText *) user_data;
472 dbus_uint32_t coordType;
473 dbus_int32_t x, y, width, height;
474 gint ix = 0, iy = 0, iw = 0, ih = 0;
477 g_return_val_if_fail (ATK_IS_TEXT (user_data),
478 droute_not_yet_handled_error (message));
479 if (!dbus_message_get_args
480 (message, NULL, DBUS_TYPE_INT32, &offset, DBUS_TYPE_UINT32,
481 &coordType, DBUS_TYPE_INVALID))
483 return droute_invalid_arguments_error (message);
485 atk_text_get_character_extents (text, offset, &ix, &iy, &iw, &ih,
486 (AtkCoordType) coordType);
491 reply = dbus_message_new_method_return (message);
494 dbus_message_append_args (reply, DBUS_TYPE_INT32, &x, DBUS_TYPE_INT32,
495 &y, DBUS_TYPE_INT32, &width, DBUS_TYPE_INT32,
496 &height, DBUS_TYPE_INVALID);
502 impl_GetOffsetAtPoint (DBusConnection * bus, DBusMessage * message,
505 AtkText *text = (AtkText *) user_data;
507 dbus_uint32_t coordType;
511 g_return_val_if_fail (ATK_IS_TEXT (user_data),
512 droute_not_yet_handled_error (message));
513 if (!dbus_message_get_args
514 (message, NULL, DBUS_TYPE_INT32, &x, DBUS_TYPE_INT32, &y,
515 DBUS_TYPE_UINT32, &coordType, DBUS_TYPE_INVALID))
517 return droute_invalid_arguments_error (message);
519 rv = atk_text_get_offset_at_point (text, x, y, coordType);
520 reply = dbus_message_new_method_return (message);
523 dbus_message_append_args (reply, DBUS_TYPE_INT32, &rv,
530 impl_GetNSelections (DBusConnection * bus, DBusMessage * message,
533 AtkText *text = (AtkText *) user_data;
537 g_return_val_if_fail (ATK_IS_TEXT (user_data),
538 droute_not_yet_handled_error (message));
539 rv = atk_text_get_n_selections (text);
540 reply = dbus_message_new_method_return (message);
543 dbus_message_append_args (reply, DBUS_TYPE_INT32, &rv,
550 impl_GetSelection (DBusConnection * bus, DBusMessage * message,
553 AtkText *text = (AtkText *) user_data;
554 dbus_int32_t selectionNum;
555 dbus_int32_t startOffset, endOffset;
556 gint intstart_offset = 0, intend_offset = 0;
559 g_return_val_if_fail (ATK_IS_TEXT (user_data),
560 droute_not_yet_handled_error (message));
561 if (!dbus_message_get_args
562 (message, NULL, DBUS_TYPE_INT32, &selectionNum, DBUS_TYPE_INVALID))
564 return droute_invalid_arguments_error (message);
566 /* atk_text_get_selection returns gchar * which we discard */
567 g_free (atk_text_get_selection
568 (text, selectionNum, &intstart_offset, &intend_offset));
569 startOffset = intstart_offset;
570 endOffset = intend_offset;
571 reply = dbus_message_new_method_return (message);
574 dbus_message_append_args (reply, DBUS_TYPE_INT32, &startOffset,
575 DBUS_TYPE_INT32, &endOffset,
582 impl_AddSelection (DBusConnection * bus, DBusMessage * message,
585 AtkText *text = (AtkText *) user_data;
586 dbus_int32_t startOffset, endOffset;
590 g_return_val_if_fail (ATK_IS_TEXT (user_data),
591 droute_not_yet_handled_error (message));
592 if (!dbus_message_get_args
593 (message, NULL, DBUS_TYPE_INT32, &startOffset, DBUS_TYPE_INT32,
594 &endOffset, DBUS_TYPE_INVALID))
596 return droute_invalid_arguments_error (message);
598 rv = atk_text_add_selection (text, startOffset, endOffset);
599 reply = dbus_message_new_method_return (message);
602 dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &rv,
609 impl_RemoveSelection (DBusConnection * bus, DBusMessage * message,
612 AtkText *text = (AtkText *) user_data;
613 dbus_int32_t selectionNum;
617 g_return_val_if_fail (ATK_IS_TEXT (user_data),
618 droute_not_yet_handled_error (message));
619 if (!dbus_message_get_args
620 (message, NULL, DBUS_TYPE_INT32, &selectionNum, DBUS_TYPE_INVALID))
622 return droute_invalid_arguments_error (message);
624 rv = atk_text_remove_selection (text, selectionNum);
625 reply = dbus_message_new_method_return (message);
628 dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &rv,
635 impl_SetSelection (DBusConnection * bus, DBusMessage * message,
638 AtkText *text = (AtkText *) user_data;
639 dbus_int32_t selectionNum, startOffset, endOffset;
643 g_return_val_if_fail (ATK_IS_TEXT (user_data),
644 droute_not_yet_handled_error (message));
645 if (!dbus_message_get_args
646 (message, NULL, DBUS_TYPE_INT32, &selectionNum, DBUS_TYPE_INT32,
647 &startOffset, DBUS_TYPE_INT32, &endOffset, DBUS_TYPE_INVALID))
649 return droute_invalid_arguments_error (message);
651 rv = atk_text_set_selection (text, selectionNum, startOffset, endOffset);
652 reply = dbus_message_new_method_return (message);
655 dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &rv,
662 impl_GetRangeExtents (DBusConnection * bus, DBusMessage * message,
665 AtkText *text = (AtkText *) user_data;
666 dbus_int32_t startOffset, endOffset;
667 dbus_uint32_t coordType;
668 AtkTextRectangle rect;
669 dbus_int32_t x, y, width, height;
672 g_return_val_if_fail (ATK_IS_TEXT (user_data),
673 droute_not_yet_handled_error (message));
674 if (!dbus_message_get_args
675 (message, NULL, DBUS_TYPE_INT32, &startOffset, DBUS_TYPE_INT32,
676 &endOffset, DBUS_TYPE_UINT32, &coordType, DBUS_TYPE_INVALID))
678 return droute_invalid_arguments_error (message);
680 memset (&rect, 0, sizeof (rect));
681 atk_text_get_range_extents (text, startOffset, endOffset,
682 (AtkCoordType) coordType, &rect);
686 height = rect.height;
687 reply = dbus_message_new_method_return (message);
690 dbus_message_append_args (reply, DBUS_TYPE_INT32, &x, DBUS_TYPE_INT32,
691 &y, DBUS_TYPE_INT32, &width, DBUS_TYPE_INT32,
692 &height, DBUS_TYPE_INVALID);
697 #define MAXRANGELEN 512
700 impl_GetBoundedRanges (DBusConnection * bus, DBusMessage * message,
703 AtkText *text = (AtkText *) user_data;
704 dbus_int32_t x, y, width, height;
705 dbus_uint32_t coordType, xClipType, yClipType;
706 AtkTextRange **range_list = NULL;
707 AtkTextRectangle rect;
709 DBusMessageIter iter, array, struc, variant;
711 g_return_val_if_fail (ATK_IS_TEXT (user_data),
712 droute_not_yet_handled_error (message));
713 if (!dbus_message_get_args
714 (message, NULL, DBUS_TYPE_INT32, &x, DBUS_TYPE_INT32, &y,
715 DBUS_TYPE_INT32, &height, DBUS_TYPE_INT32, &width, DBUS_TYPE_UINT32,
716 &coordType, DBUS_TYPE_UINT32, &xClipType, DBUS_TYPE_UINT32, &yClipType,
719 return droute_invalid_arguments_error (message);
724 rect.height = height;
727 atk_text_get_bounded_ranges (text, &rect, (AtkCoordType) coordType,
728 (AtkTextClipType) xClipType,
729 (AtkTextClipType) yClipType);
730 reply = dbus_message_new_method_return (message);
733 /* This isn't pleasant. */
734 dbus_message_iter_init_append (reply, &iter);
735 if (dbus_message_iter_open_container
736 (&iter, DBUS_TYPE_ARRAY, "(iisv)", &array))
739 int count = (range_list ? MAXRANGELEN : 0);
740 for (len = 0; len < count && range_list[len]; ++len)
742 if (dbus_message_iter_open_container
743 (&array, DBUS_TYPE_STRUCT, NULL, &struc))
746 val = range_list[len]->start_offset;
747 dbus_message_iter_append_basic (&struc, DBUS_TYPE_INT32, &val);
748 val = range_list[len]->end_offset;
749 dbus_message_iter_append_basic (&struc, DBUS_TYPE_INT32, &val);
750 dbus_message_iter_append_basic (&struc, DBUS_TYPE_STRING,
751 &range_list[len]->content);
752 /* The variant is unimplemented in atk, but I don't want to
753 * unilaterally muck with the spec and remove it, so I'll just
754 * throw in a dummy value */
755 if (dbus_message_iter_open_container
756 (&struc, DBUS_TYPE_VARIANT, "i", &variant))
758 dbus_uint32_t dummy = 0;
759 dbus_message_iter_append_basic (&variant, DBUS_TYPE_INT32,
761 dbus_message_iter_close_container (&struc, &variant);
763 dbus_message_iter_close_container (&array, &struc);
764 g_free (range_list[len]->content);
765 g_free (range_list[len]);
768 dbus_message_iter_close_container (&iter, &array);
778 impl_GetAttributeRun (DBusConnection * bus, DBusMessage * message,
781 AtkText *text = (AtkText *) user_data;
783 dbus_bool_t includeDefaults;
784 dbus_int32_t startOffset, endOffset;
785 gint intstart_offset = 0, intend_offset = 0;
787 AtkAttributeSet *attributes = NULL;
788 DBusMessageIter iter;
790 g_return_val_if_fail (ATK_IS_TEXT (user_data),
791 droute_not_yet_handled_error (message));
792 if (!dbus_message_get_args
793 (message, NULL, DBUS_TYPE_INT32, &offset, DBUS_TYPE_BOOLEAN,
794 &includeDefaults, DBUS_TYPE_INVALID))
796 return droute_invalid_arguments_error (message);
801 attributes = g_slist_concat (attributes,
802 atk_text_get_default_attributes (text));
805 attributes = g_slist_concat (attributes,
806 atk_text_get_run_attributes (text, offset,
810 reply = dbus_message_new_method_return (message);
814 dbus_message_iter_init_append (reply, &iter);
815 spi_object_append_attribute_set (&iter, attributes);
817 startOffset = intstart_offset;
818 endOffset = intend_offset;
819 dbus_message_iter_append_basic (&iter, DBUS_TYPE_INT32, &startOffset);
820 dbus_message_iter_append_basic (&iter, DBUS_TYPE_INT32, &endOffset);
822 atk_attribute_set_free (attributes);
828 impl_GetDefaultAttributeSet (DBusConnection * bus, DBusMessage * message,
831 AtkText *text = (AtkText *) user_data;
833 DBusMessageIter iter;
834 AtkAttributeSet *attributes;
836 g_return_val_if_fail (ATK_IS_TEXT (user_data),
837 droute_not_yet_handled_error (message));
839 attributes = atk_text_get_default_attributes (text);
841 reply = dbus_message_new_method_return (message);
844 dbus_message_iter_init_append (reply, &iter);
845 spi_object_append_attribute_set (&iter, attributes);
849 atk_attribute_set_free (attributes);
854 static DRouteMethod methods[] = {
855 {impl_GetText, "GetText"},
856 {impl_SetCaretOffset, "SetCaretOffset"},
857 {impl_GetTextBeforeOffset, "GetTextBeforeOffset"},
858 {impl_GetTextAtOffset, "GetTextAtOffset"},
859 {impl_GetTextAfterOffset, "GetTextAfterOffset"},
860 {impl_GetStringAtOffset, "GetStringAtOffset"},
861 {impl_GetCharacterAtOffset, "GetCharacterAtOffset"},
862 {impl_GetAttributeValue, "GetAttributeValue"},
863 {impl_GetAttributes, "GetAttributes"},
864 {impl_GetDefaultAttributes, "GetDefaultAttributes"},
865 {impl_GetCharacterExtents, "GetCharacterExtents"},
866 {impl_GetOffsetAtPoint, "GetOffsetAtPoint"},
867 {impl_GetNSelections, "GetNSelections"},
868 {impl_GetSelection, "GetSelection"},
869 {impl_AddSelection, "AddSelection"},
870 {impl_RemoveSelection, "RemoveSelection"},
871 {impl_SetSelection, "SetSelection"},
872 {impl_GetRangeExtents, "GetRangeExtents"},
873 {impl_GetBoundedRanges, "GetBoundedRanges"},
874 {impl_GetAttributeRun, "GetAttributeRun"},
875 {impl_GetDefaultAttributeSet, "GetDefaultAttributeSet"},
879 static DRouteProperty properties[] = {
880 {impl_get_CharacterCount, NULL, "CharacterCount"},
881 {impl_get_CaretOffset, NULL, "CaretOffset"},
886 spi_initialize_text (DRoutePath * path)
888 spi_atk_add_interface (path,
889 ATSPI_DBUS_INTERFACE_TEXT, spi_org_a11y_atspi_Text, methods, properties);