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>
32 #include "introspection.h"
35 impl_get_CharacterCount (DBusMessageIter * iter, void *user_data)
37 AtkText *text = (AtkText *) user_data;
38 g_return_val_if_fail (ATK_IS_TEXT (user_data), FALSE);
39 return droute_return_v_int32 (iter, atk_text_get_character_count (text));
43 impl_get_CaretOffset (DBusMessageIter * iter, void *user_data)
45 AtkText *text = (AtkText *) user_data;
46 g_return_val_if_fail (ATK_IS_TEXT (user_data), FALSE);
47 return droute_return_v_int32 (iter, atk_text_get_caret_offset (text));
51 validate_allocated_string (gchar *str)
55 if (!g_utf8_validate (str, -1, NULL))
57 g_warning ("atk-bridge: received bad UTF-8 string from a get_text function");
65 impl_GetText (DBusConnection * bus, DBusMessage * message, void *user_data)
67 AtkText *text = (AtkText *) user_data;
68 dbus_int32_t startOffset, endOffset;
72 g_return_val_if_fail (ATK_IS_TEXT (user_data),
73 droute_not_yet_handled_error (message));
74 if (!dbus_message_get_args
75 (message, NULL, DBUS_TYPE_INT32, &startOffset, DBUS_TYPE_INT32,
76 &endOffset, DBUS_TYPE_INVALID))
78 return droute_invalid_arguments_error (message);
80 txt = atk_text_get_text (text, startOffset, endOffset);
81 txt = validate_allocated_string (txt);
82 reply = dbus_message_new_method_return (message);
85 dbus_message_append_args (reply, DBUS_TYPE_STRING, &txt,
93 impl_SetCaretOffset (DBusConnection * bus, DBusMessage * message,
96 AtkText *text = (AtkText *) user_data;
101 g_return_val_if_fail (ATK_IS_TEXT (user_data),
102 droute_not_yet_handled_error (message));
103 if (!dbus_message_get_args
104 (message, NULL, DBUS_TYPE_INT32, &offset, DBUS_TYPE_INVALID))
106 return droute_invalid_arguments_error (message);
108 rv = atk_text_set_caret_offset (text, offset);
109 reply = dbus_message_new_method_return (message);
112 dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &rv,
119 impl_GetTextBeforeOffset (DBusConnection * bus, DBusMessage * message,
122 AtkText *text = (AtkText *) user_data;
126 dbus_int32_t startOffset, endOffset;
127 gint intstart_offset = 0, intend_offset = 0;
130 g_return_val_if_fail (ATK_IS_TEXT (user_data),
131 droute_not_yet_handled_error (message));
132 if (!dbus_message_get_args
133 (message, NULL, DBUS_TYPE_INT32, &offset, DBUS_TYPE_UINT32, &type,
136 return droute_invalid_arguments_error (message);
139 atk_text_get_text_before_offset (text, offset, (AtkTextBoundary) type,
140 &intstart_offset, &intend_offset);
141 startOffset = intstart_offset;
142 endOffset = intend_offset;
143 txt = validate_allocated_string (txt);
144 reply = dbus_message_new_method_return (message);
147 dbus_message_append_args (reply, DBUS_TYPE_STRING, &txt,
148 DBUS_TYPE_INT32, &startOffset,
149 DBUS_TYPE_INT32, &endOffset,
157 impl_GetTextAtOffset (DBusConnection * bus, DBusMessage * message,
160 AtkText *text = (AtkText *) user_data;
161 dbus_int32_t offset, type;
163 dbus_int32_t startOffset, endOffset;
164 gint intstart_offset = 0, intend_offset = 0;
167 g_return_val_if_fail (ATK_IS_TEXT (user_data),
168 droute_not_yet_handled_error (message));
169 if (!dbus_message_get_args
170 (message, NULL, DBUS_TYPE_INT32, &offset, DBUS_TYPE_UINT32, &type,
173 return droute_invalid_arguments_error (message);
176 atk_text_get_text_at_offset (text, offset, (AtkTextBoundary) type,
177 &intstart_offset, &intend_offset);
178 startOffset = intstart_offset;
179 endOffset = intend_offset;
180 txt = validate_allocated_string (txt);
181 reply = dbus_message_new_method_return (message);
184 dbus_message_append_args (reply, DBUS_TYPE_STRING, &txt,
185 DBUS_TYPE_INT32, &startOffset,
186 DBUS_TYPE_INT32, &endOffset,
194 impl_GetTextAfterOffset (DBusConnection * bus, DBusMessage * message,
197 AtkText *text = (AtkText *) user_data;
201 dbus_int32_t startOffset, endOffset;
202 gint intstart_offset = 0, intend_offset = 0;
205 g_return_val_if_fail (ATK_IS_TEXT (user_data),
206 droute_not_yet_handled_error (message));
207 if (!dbus_message_get_args
208 (message, NULL, DBUS_TYPE_INT32, &offset, DBUS_TYPE_UINT32, &type,
211 return droute_invalid_arguments_error (message);
214 atk_text_get_text_after_offset (text, offset, (AtkTextBoundary) type,
215 &intstart_offset, &intend_offset);
216 startOffset = intstart_offset;
217 endOffset = intend_offset;
218 txt = validate_allocated_string (txt);
219 reply = dbus_message_new_method_return (message);
222 dbus_message_append_args (reply, DBUS_TYPE_STRING, &txt,
223 DBUS_TYPE_INT32, &startOffset,
224 DBUS_TYPE_INT32, &endOffset,
232 impl_GetCharacterAtOffset (DBusConnection * bus, DBusMessage * message,
235 AtkText *text = (AtkText *) user_data;
240 g_return_val_if_fail (ATK_IS_TEXT (user_data),
241 droute_not_yet_handled_error (message));
242 if (!dbus_message_get_args
243 (message, NULL, DBUS_TYPE_INT32, &offset, DBUS_TYPE_INVALID))
245 return droute_invalid_arguments_error (message);
247 ch = atk_text_get_character_at_offset (text, offset);
248 reply = dbus_message_new_method_return (message);
251 dbus_message_append_args (reply, DBUS_TYPE_INT32, &ch,
258 get_text_for_legacy_implementations(AtkText *text,
260 AtkTextGranularity granularity,
265 AtkTextBoundary boundary = 0;
266 switch (granularity) {
267 case ATK_TEXT_GRANULARITY_CHAR:
268 boundary = ATK_TEXT_BOUNDARY_CHAR;
271 case ATK_TEXT_GRANULARITY_WORD:
272 boundary = ATK_TEXT_BOUNDARY_WORD_START;
275 case ATK_TEXT_GRANULARITY_SENTENCE:
276 boundary = ATK_TEXT_BOUNDARY_SENTENCE_START;
279 case ATK_TEXT_GRANULARITY_LINE:
280 boundary = ATK_TEXT_BOUNDARY_LINE_START;
283 case ATK_TEXT_GRANULARITY_PARAGRAPH:
284 /* This is not implemented in previous versions of ATK */
289 g_assert_not_reached();
295 atk_text_get_text_at_offset (text, offset, boundary,
296 start_offset, end_offset);
303 impl_GetStringAtOffset (DBusConnection * bus, DBusMessage * message,
306 AtkText *text = (AtkText *) user_data;
308 dbus_uint32_t granularity;
310 dbus_int32_t startOffset, endOffset;
311 gint intstart_offset = 0, intend_offset = 0;
314 g_return_val_if_fail (ATK_IS_TEXT (user_data),
315 droute_not_yet_handled_error (message));
316 if (!dbus_message_get_args
317 (message, NULL, DBUS_TYPE_INT32, &offset, DBUS_TYPE_UINT32, &granularity,
320 return droute_invalid_arguments_error (message);
324 atk_text_get_string_at_offset (text, offset, (AtkTextGranularity) granularity,
325 &intstart_offset, &intend_offset);
327 /* Accessibility layers implementing an older version of ATK (even if
328 * a new enough version of libatk is installed) might return NULL due
329 * not to provide an implementation for get_string_at_offset(), so we
330 * try with the legacy implementation if that's the case. */
332 txt = get_text_for_legacy_implementations(text, offset,
333 (AtkTextGranularity) granularity,
334 &intstart_offset, &intend_offset);
336 startOffset = intstart_offset;
337 endOffset = intend_offset;
338 txt = validate_allocated_string (txt);
339 reply = dbus_message_new_method_return (message);
342 dbus_message_append_args (reply, DBUS_TYPE_STRING, &txt,
343 DBUS_TYPE_INT32, &startOffset,
344 DBUS_TYPE_INT32, &endOffset,
352 impl_GetAttributeValue (DBusConnection * bus, DBusMessage * message,
355 AtkText *text = (AtkText *) user_data;
358 dbus_int32_t startOffset, endOffset;
360 gint intstart_offset = 0, intend_offset = 0;
363 AtkAttributeSet *set;
367 g_return_val_if_fail (ATK_IS_TEXT (user_data),
368 droute_not_yet_handled_error (message));
369 if (!dbus_message_get_args
370 (message, NULL, DBUS_TYPE_INT32, &offset, DBUS_TYPE_STRING,
371 &attributeName, DBUS_TYPE_INVALID))
373 return droute_invalid_arguments_error (message);
376 set = atk_text_get_run_attributes (text, offset,
377 &intstart_offset, &intend_offset);
378 startOffset = intstart_offset;
379 endOffset = intend_offset;
381 cur_attr = (GSList *) set;
384 at = (AtkAttribute *) cur_attr->data;
385 if (!strcmp (at->name, attributeName))
391 cur_attr = cur_attr->next;
395 reply = dbus_message_new_method_return (message);
398 dbus_message_append_args (reply, DBUS_TYPE_STRING, &rv, DBUS_TYPE_INT32,
399 &startOffset, DBUS_TYPE_INT32, &endOffset,
400 DBUS_TYPE_BOOLEAN, &defined,
403 atk_attribute_set_free (set);
408 impl_GetAttributes (DBusConnection * bus, DBusMessage * message,
411 AtkText *text = (AtkText *) user_data;
413 dbus_int32_t startOffset, endOffset;
414 gint intstart_offset, intend_offset;
416 AtkAttributeSet *set;
417 DBusMessageIter iter;
419 g_return_val_if_fail (ATK_IS_TEXT (user_data),
420 droute_not_yet_handled_error (message));
421 if (!dbus_message_get_args
422 (message, NULL, DBUS_TYPE_INT32, &offset, DBUS_TYPE_INVALID))
424 return droute_invalid_arguments_error (message);
427 set = atk_text_get_run_attributes (text, offset,
428 &intstart_offset, &intend_offset);
430 startOffset = intstart_offset;
431 endOffset = intend_offset;
432 reply = dbus_message_new_method_return (message);
435 dbus_message_iter_init_append (reply, &iter);
436 spi_object_append_attribute_set (&iter, set);
437 dbus_message_append_args (reply, DBUS_TYPE_INT32, &startOffset,
438 DBUS_TYPE_INT32, &endOffset,
441 atk_attribute_set_free (set);
446 impl_GetDefaultAttributes (DBusConnection * bus, DBusMessage * message,
449 AtkText *text = (AtkText *) user_data;
451 AtkAttributeSet *set;
452 DBusMessageIter iter;
454 g_return_val_if_fail (ATK_IS_TEXT (user_data),
455 droute_not_yet_handled_error (message));
457 set = atk_text_get_default_attributes (text);
458 reply = dbus_message_new_method_return (message);
461 dbus_message_iter_init_append (reply, &iter);
462 spi_object_append_attribute_set (&iter, set);
464 atk_attribute_set_free (set);
469 impl_GetCharacterExtents (DBusConnection * bus, DBusMessage * message,
472 AtkText *text = (AtkText *) user_data;
474 dbus_uint32_t coordType;
475 dbus_int32_t x, y, width, height;
476 gint ix = 0, iy = 0, iw = 0, ih = 0;
479 g_return_val_if_fail (ATK_IS_TEXT (user_data),
480 droute_not_yet_handled_error (message));
481 if (!dbus_message_get_args
482 (message, NULL, DBUS_TYPE_INT32, &offset, DBUS_TYPE_UINT32,
483 &coordType, DBUS_TYPE_INVALID))
485 return droute_invalid_arguments_error (message);
487 atk_text_get_character_extents (text, offset, &ix, &iy, &iw, &ih,
488 (AtkCoordType) coordType);
493 reply = dbus_message_new_method_return (message);
496 dbus_message_append_args (reply, DBUS_TYPE_INT32, &x, DBUS_TYPE_INT32,
497 &y, DBUS_TYPE_INT32, &width, DBUS_TYPE_INT32,
498 &height, DBUS_TYPE_INVALID);
504 impl_GetOffsetAtPoint (DBusConnection * bus, DBusMessage * message,
507 AtkText *text = (AtkText *) user_data;
509 dbus_uint32_t coordType;
513 g_return_val_if_fail (ATK_IS_TEXT (user_data),
514 droute_not_yet_handled_error (message));
515 if (!dbus_message_get_args
516 (message, NULL, DBUS_TYPE_INT32, &x, DBUS_TYPE_INT32, &y,
517 DBUS_TYPE_UINT32, &coordType, DBUS_TYPE_INVALID))
519 return droute_invalid_arguments_error (message);
521 rv = atk_text_get_offset_at_point (text, x, y, coordType);
522 reply = dbus_message_new_method_return (message);
525 dbus_message_append_args (reply, DBUS_TYPE_INT32, &rv,
532 impl_GetNSelections (DBusConnection * bus, DBusMessage * message,
535 AtkText *text = (AtkText *) user_data;
539 g_return_val_if_fail (ATK_IS_TEXT (user_data),
540 droute_not_yet_handled_error (message));
541 rv = atk_text_get_n_selections (text);
542 reply = dbus_message_new_method_return (message);
545 dbus_message_append_args (reply, DBUS_TYPE_INT32, &rv,
552 impl_GetSelection (DBusConnection * bus, DBusMessage * message,
555 AtkText *text = (AtkText *) user_data;
556 dbus_int32_t selectionNum;
557 dbus_int32_t startOffset, endOffset;
558 gint intstart_offset = 0, intend_offset = 0;
561 g_return_val_if_fail (ATK_IS_TEXT (user_data),
562 droute_not_yet_handled_error (message));
563 if (!dbus_message_get_args
564 (message, NULL, DBUS_TYPE_INT32, &selectionNum, DBUS_TYPE_INVALID))
566 return droute_invalid_arguments_error (message);
568 /* atk_text_get_selection returns gchar * which we discard */
569 g_free (atk_text_get_selection
570 (text, selectionNum, &intstart_offset, &intend_offset));
571 startOffset = intstart_offset;
572 endOffset = intend_offset;
573 reply = dbus_message_new_method_return (message);
576 dbus_message_append_args (reply, DBUS_TYPE_INT32, &startOffset,
577 DBUS_TYPE_INT32, &endOffset,
584 impl_AddSelection (DBusConnection * bus, DBusMessage * message,
587 AtkText *text = (AtkText *) user_data;
588 dbus_int32_t startOffset, endOffset;
592 g_return_val_if_fail (ATK_IS_TEXT (user_data),
593 droute_not_yet_handled_error (message));
594 if (!dbus_message_get_args
595 (message, NULL, DBUS_TYPE_INT32, &startOffset, DBUS_TYPE_INT32,
596 &endOffset, DBUS_TYPE_INVALID))
598 return droute_invalid_arguments_error (message);
600 rv = atk_text_add_selection (text, startOffset, endOffset);
601 reply = dbus_message_new_method_return (message);
604 dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &rv,
611 impl_RemoveSelection (DBusConnection * bus, DBusMessage * message,
614 AtkText *text = (AtkText *) user_data;
615 dbus_int32_t selectionNum;
619 g_return_val_if_fail (ATK_IS_TEXT (user_data),
620 droute_not_yet_handled_error (message));
621 if (!dbus_message_get_args
622 (message, NULL, DBUS_TYPE_INT32, &selectionNum, DBUS_TYPE_INVALID))
624 return droute_invalid_arguments_error (message);
626 rv = atk_text_remove_selection (text, selectionNum);
627 reply = dbus_message_new_method_return (message);
630 dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &rv,
637 impl_SetSelection (DBusConnection * bus, DBusMessage * message,
640 AtkText *text = (AtkText *) user_data;
641 dbus_int32_t selectionNum, startOffset, endOffset;
645 g_return_val_if_fail (ATK_IS_TEXT (user_data),
646 droute_not_yet_handled_error (message));
647 if (!dbus_message_get_args
648 (message, NULL, DBUS_TYPE_INT32, &selectionNum, DBUS_TYPE_INT32,
649 &startOffset, DBUS_TYPE_INT32, &endOffset, DBUS_TYPE_INVALID))
651 return droute_invalid_arguments_error (message);
653 rv = atk_text_set_selection (text, selectionNum, startOffset, endOffset);
654 reply = dbus_message_new_method_return (message);
657 dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &rv,
664 impl_GetRangeExtents (DBusConnection * bus, DBusMessage * message,
667 AtkText *text = (AtkText *) user_data;
668 dbus_int32_t startOffset, endOffset;
669 dbus_uint32_t coordType;
670 AtkTextRectangle rect;
671 dbus_int32_t x, y, width, height;
674 g_return_val_if_fail (ATK_IS_TEXT (user_data),
675 droute_not_yet_handled_error (message));
676 if (!dbus_message_get_args
677 (message, NULL, DBUS_TYPE_INT32, &startOffset, DBUS_TYPE_INT32,
678 &endOffset, DBUS_TYPE_UINT32, &coordType, DBUS_TYPE_INVALID))
680 return droute_invalid_arguments_error (message);
682 memset (&rect, 0, sizeof (rect));
683 atk_text_get_range_extents (text, startOffset, endOffset,
684 (AtkCoordType) coordType, &rect);
688 height = rect.height;
689 reply = dbus_message_new_method_return (message);
692 dbus_message_append_args (reply, DBUS_TYPE_INT32, &x, DBUS_TYPE_INT32,
693 &y, DBUS_TYPE_INT32, &width, DBUS_TYPE_INT32,
694 &height, DBUS_TYPE_INVALID);
699 #define MAXRANGELEN 512
702 impl_GetBoundedRanges (DBusConnection * bus, DBusMessage * message,
705 AtkText *text = (AtkText *) user_data;
706 dbus_int32_t x, y, width, height;
707 dbus_uint32_t coordType, xClipType, yClipType;
708 AtkTextRange **range_list = NULL;
709 AtkTextRectangle rect;
711 DBusMessageIter iter, array, struc, variant;
713 g_return_val_if_fail (ATK_IS_TEXT (user_data),
714 droute_not_yet_handled_error (message));
715 if (!dbus_message_get_args
716 (message, NULL, DBUS_TYPE_INT32, &x, DBUS_TYPE_INT32, &y,
717 DBUS_TYPE_INT32, &height, DBUS_TYPE_INT32, &width, DBUS_TYPE_UINT32,
718 &coordType, DBUS_TYPE_UINT32, &xClipType, DBUS_TYPE_UINT32, &yClipType,
721 return droute_invalid_arguments_error (message);
726 rect.height = height;
729 atk_text_get_bounded_ranges (text, &rect, (AtkCoordType) coordType,
730 (AtkTextClipType) xClipType,
731 (AtkTextClipType) yClipType);
732 reply = dbus_message_new_method_return (message);
735 /* This isn't pleasant. */
736 dbus_message_iter_init_append (reply, &iter);
737 if (dbus_message_iter_open_container
738 (&iter, DBUS_TYPE_ARRAY, "(iisv)", &array))
741 int count = (range_list ? MAXRANGELEN : 0);
742 for (len = 0; len < count && range_list[len]; ++len)
744 if (dbus_message_iter_open_container
745 (&array, DBUS_TYPE_STRUCT, NULL, &struc))
748 val = range_list[len]->start_offset;
749 dbus_message_iter_append_basic (&struc, DBUS_TYPE_INT32, &val);
750 val = range_list[len]->end_offset;
751 dbus_message_iter_append_basic (&struc, DBUS_TYPE_INT32, &val);
752 dbus_message_iter_append_basic (&struc, DBUS_TYPE_STRING,
753 &range_list[len]->content);
754 /* The variant is unimplemented in atk, but I don't want to
755 * unilaterally muck with the spec and remove it, so I'll just
756 * throw in a dummy value */
757 if (dbus_message_iter_open_container
758 (&struc, DBUS_TYPE_VARIANT, "i", &variant))
760 dbus_uint32_t dummy = 0;
761 dbus_message_iter_append_basic (&variant, DBUS_TYPE_INT32,
763 dbus_message_iter_close_container (&struc, &variant);
765 dbus_message_iter_close_container (&array, &struc);
766 g_free (range_list[len]->content);
767 g_free (range_list[len]);
770 dbus_message_iter_close_container (&iter, &array);
780 impl_GetAttributeRun (DBusConnection * bus, DBusMessage * message,
783 AtkText *text = (AtkText *) user_data;
785 dbus_bool_t includeDefaults;
786 dbus_int32_t startOffset, endOffset;
787 gint intstart_offset = 0, intend_offset = 0;
789 AtkAttributeSet *attributes = NULL;
790 DBusMessageIter iter;
792 g_return_val_if_fail (ATK_IS_TEXT (user_data),
793 droute_not_yet_handled_error (message));
794 if (!dbus_message_get_args
795 (message, NULL, DBUS_TYPE_INT32, &offset, DBUS_TYPE_BOOLEAN,
796 &includeDefaults, DBUS_TYPE_INVALID))
798 return droute_invalid_arguments_error (message);
802 atk_text_get_run_attributes (text, offset, &intstart_offset,
807 attributes = g_slist_concat (attributes,
808 atk_text_get_default_attributes (text));
811 reply = dbus_message_new_method_return (message);
815 dbus_message_iter_init_append (reply, &iter);
816 spi_object_append_attribute_set (&iter, attributes);
818 startOffset = intstart_offset;
819 endOffset = intend_offset;
820 dbus_message_iter_append_basic (&iter, DBUS_TYPE_INT32, &startOffset);
821 dbus_message_iter_append_basic (&iter, DBUS_TYPE_INT32, &endOffset);
823 atk_attribute_set_free (attributes);
829 impl_GetDefaultAttributeSet (DBusConnection * bus, DBusMessage * message,
832 AtkText *text = (AtkText *) user_data;
834 DBusMessageIter iter;
835 AtkAttributeSet *attributes;
837 g_return_val_if_fail (ATK_IS_TEXT (user_data),
838 droute_not_yet_handled_error (message));
840 attributes = atk_text_get_default_attributes (text);
842 reply = dbus_message_new_method_return (message);
845 dbus_message_iter_init_append (reply, &iter);
846 spi_object_append_attribute_set (&iter, attributes);
850 atk_attribute_set_free (attributes);
855 static DRouteMethod methods[] = {
856 {impl_GetText, "GetText"},
857 {impl_SetCaretOffset, "SetCaretOffset"},
858 {impl_GetTextBeforeOffset, "GetTextBeforeOffset"},
859 {impl_GetTextAtOffset, "GetTextAtOffset"},
860 {impl_GetTextAfterOffset, "GetTextAfterOffset"},
861 {impl_GetStringAtOffset, "GetStringAtOffset"},
862 {impl_GetCharacterAtOffset, "GetCharacterAtOffset"},
863 {impl_GetAttributeValue, "GetAttributeValue"},
864 {impl_GetAttributes, "GetAttributes"},
865 {impl_GetDefaultAttributes, "GetDefaultAttributes"},
866 {impl_GetCharacterExtents, "GetCharacterExtents"},
867 {impl_GetOffsetAtPoint, "GetOffsetAtPoint"},
868 {impl_GetNSelections, "GetNSelections"},
869 {impl_GetSelection, "GetSelection"},
870 {impl_AddSelection, "AddSelection"},
871 {impl_RemoveSelection, "RemoveSelection"},
872 {impl_SetSelection, "SetSelection"},
873 {impl_GetRangeExtents, "GetRangeExtents"},
874 {impl_GetBoundedRanges, "GetBoundedRanges"},
875 {impl_GetAttributeRun, "GetAttributeRun"},
876 {impl_GetDefaultAttributeSet, "GetDefaultAttributeSet"},
880 static DRouteProperty properties[] = {
881 {impl_get_CharacterCount, NULL, "CharacterCount"},
882 {impl_get_CaretOffset, NULL, "CaretOffset"},
887 spi_initialize_text (DRoutePath * path)
889 droute_path_add_interface (path,
890 ATSPI_DBUS_INTERFACE_TEXT, spi_org_a11y_atspi_Text, methods, properties);