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.
25 #include "accessible.h"
29 get_text (DBusMessage * message)
31 AtkObject *obj = spi_dbus_get_object (dbus_message_get_path (message));
34 return ATK_TEXT (obj);
38 get_text_from_path (const char *path, void *user_data)
40 AtkObject *obj = spi_dbus_get_object (path);
43 return ATK_TEXT (obj);
47 impl_get_characterCount (const char *path, DBusMessageIter * iter,
50 AtkText *text = get_text_from_path (path, user_data);
53 return droute_return_v_int32 (iter, atk_text_get_character_count (text));
57 impl_get_characterCount_str (void *datum)
59 g_assert (ATK_IS_TEXT (datum));
61 return g_strdup_printf ("%d",
62 atk_text_get_character_count ((AtkText *) datum));
66 impl_get_caretOffset (const char *path, DBusMessageIter * iter,
69 AtkText *text = get_text_from_path (path, user_data);
72 return droute_return_v_int32 (iter, atk_text_get_caret_offset (text));
76 impl_get_caretOffset_str (void *datum)
78 g_assert (ATK_IS_TEXT (datum));
80 return g_strdup_printf ("%d",
81 atk_text_get_caret_offset ((AtkText *) datum));
85 impl_getText (DBusConnection * bus, DBusMessage * message, void *user_data)
87 AtkText *text = get_text (message);
88 dbus_int32_t startOffset, endOffset;
94 return spi_dbus_general_error (message);
95 dbus_error_init (&error);
96 if (!dbus_message_get_args
97 (message, &error, DBUS_TYPE_INT32, &startOffset, DBUS_TYPE_INT32,
98 &endOffset, DBUS_TYPE_INVALID))
100 return SPI_DBUS_RETURN_ERROR (message, &error);
102 txt = atk_text_get_text (text, startOffset, endOffset);
105 reply = dbus_message_new_method_return (message);
108 dbus_message_append_args (reply, DBUS_TYPE_STRING, &txt,
116 impl_setCaretOffset (DBusConnection * bus, DBusMessage * message,
119 AtkText *text = get_text (message);
126 return spi_dbus_general_error (message);
127 dbus_error_init (&error);
128 if (!dbus_message_get_args
129 (message, &error, DBUS_TYPE_INT32, &offset, DBUS_TYPE_INVALID))
131 return SPI_DBUS_RETURN_ERROR (message, &error);
133 rv = atk_text_set_caret_offset (text, offset);
134 reply = dbus_message_new_method_return (message);
137 dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &rv,
144 impl_getTextBeforeOffset (DBusConnection * bus, DBusMessage * message,
147 AtkText *text = get_text (message);
151 dbus_int32_t startOffset, endOffset;
152 gint intstart_offset = 0, intend_offset = 0;
157 return spi_dbus_general_error (message);
158 dbus_error_init (&error);
159 if (!dbus_message_get_args
160 (message, &error, DBUS_TYPE_INT32, &offset, DBUS_TYPE_UINT32, &type,
163 return SPI_DBUS_RETURN_ERROR (message, &error);
166 atk_text_get_text_before_offset (text, offset, (AtkTextBoundary) type,
167 &intstart_offset, &intend_offset);
168 startOffset = intstart_offset;
169 endOffset = intend_offset;
172 reply = dbus_message_new_method_return (message);
175 dbus_message_append_args (reply, DBUS_TYPE_INT32, &startOffset,
176 DBUS_TYPE_INT32, &endOffset, DBUS_TYPE_STRING,
177 &txt, DBUS_TYPE_INVALID);
184 impl_getTextAtOffset (DBusConnection * bus, DBusMessage * message,
187 AtkText *text = get_text (message);
188 dbus_int32_t offset, type;
190 dbus_int32_t startOffset, endOffset;
191 gint intstart_offset = 0, intend_offset = 0;
196 return spi_dbus_general_error (message);
197 dbus_error_init (&error);
198 if (!dbus_message_get_args
199 (message, &error, DBUS_TYPE_INT32, &offset, DBUS_TYPE_UINT32, &type,
202 return SPI_DBUS_RETURN_ERROR (message, &error);
205 atk_text_get_text_at_offset (text, offset, (AtkTextBoundary) type,
206 &intstart_offset, &intend_offset);
207 startOffset = intstart_offset;
208 endOffset = intend_offset;
211 reply = dbus_message_new_method_return (message);
214 dbus_message_append_args (reply, DBUS_TYPE_INT32, &startOffset,
215 DBUS_TYPE_INT32, &endOffset, DBUS_TYPE_STRING,
216 &txt, DBUS_TYPE_INVALID);
223 impl_getTextAfterOffset (DBusConnection * bus, DBusMessage * message,
226 AtkText *text = get_text (message);
230 dbus_int32_t startOffset, endOffset;
231 gint intstart_offset = 0, intend_offset = 0;
236 return spi_dbus_general_error (message);
237 dbus_error_init (&error);
238 if (!dbus_message_get_args
239 (message, &error, DBUS_TYPE_INT32, &offset, DBUS_TYPE_UINT32, &type,
242 return SPI_DBUS_RETURN_ERROR (message, &error);
245 atk_text_get_text_after_offset (text, offset, (AtkTextBoundary) type,
246 &intstart_offset, &intend_offset);
247 startOffset = intstart_offset;
248 endOffset = intend_offset;
251 reply = dbus_message_new_method_return (message);
254 dbus_message_append_args (reply, DBUS_TYPE_INT32, &startOffset,
255 DBUS_TYPE_INT32, &endOffset, DBUS_TYPE_STRING,
256 &txt, DBUS_TYPE_INVALID);
263 impl_getAttributeValue (DBusConnection * bus, DBusMessage * message,
266 AtkText *text = get_text (message);
269 dbus_int32_t startOffset, endOffset;
271 gint intstart_offset = 0, intend_offset = 0;
275 AtkAttributeSet *set;
280 return spi_dbus_general_error (message);
281 dbus_error_init (&error);
282 if (!dbus_message_get_args
283 (message, &error, DBUS_TYPE_INT32, &offset, DBUS_TYPE_STRING,
284 &attributeName, DBUS_TYPE_INVALID))
286 return SPI_DBUS_RETURN_ERROR (message, &error);
289 set = atk_text_get_run_attributes (text, offset,
290 &intstart_offset, &intend_offset);
291 startOffset = intstart_offset;
292 endOffset = intend_offset;
294 cur_attr = (GSList *) set;
297 at = (AtkAttribute *) cur_attr->data;
298 if (!strcmp (at->name, attributeName))
304 cur_attr = cur_attr->next;
308 reply = dbus_message_new_method_return (message);
311 dbus_message_append_args (reply, DBUS_TYPE_INT32, &startOffset,
312 DBUS_TYPE_INT32, &endOffset,
313 DBUS_TYPE_BOOLEAN, &defined, DBUS_TYPE_STRING,
314 &rv, DBUS_TYPE_INVALID);
316 atk_attribute_set_free (set);
321 _string_from_attribute_set (AtkAttributeSet * set)
323 gchar *attributes, *tmp, *tmp2;
327 attributes = g_strdup ("");
328 cur_attr = (GSList *) set;
331 at = (AtkAttribute *) cur_attr->data;
332 tmp = g_strdup_printf ("%s%s:%s%s",
333 ((GSList *) (set) == cur_attr) ? "" : " ",
335 (cur_attr->next) ? ";" : "");
336 tmp2 = g_strconcat (attributes, tmp, NULL);
340 cur_attr = cur_attr->next;
346 impl_getAttributes (DBusConnection * bus, DBusMessage * message,
349 AtkText *text = get_text (message);
351 dbus_int32_t startOffset, endOffset;
352 gint intstart_offset, intend_offset;
356 AtkAttributeSet *set;
359 return spi_dbus_general_error (message);
360 dbus_error_init (&error);
361 if (!dbus_message_get_args
362 (message, &error, DBUS_TYPE_INT32, &offset, DBUS_TYPE_INVALID))
364 return SPI_DBUS_RETURN_ERROR (message, &error);
367 set = atk_text_get_run_attributes (text, offset,
368 &intstart_offset, &intend_offset);
369 startOffset = intstart_offset;
370 endOffset = intend_offset;
371 rv = _string_from_attribute_set (set);
372 reply = dbus_message_new_method_return (message);
375 dbus_message_append_args (reply, DBUS_TYPE_INT32, &startOffset,
376 DBUS_TYPE_INT32, &endOffset, DBUS_TYPE_STRING,
377 &rv, DBUS_TYPE_INVALID);
380 atk_attribute_set_free (set);
385 impl_getDefaultAttributes (DBusConnection * bus, DBusMessage * message,
388 AtkText *text = get_text (message);
392 AtkAttributeSet *set;
395 return spi_dbus_general_error (message);
396 dbus_error_init (&error);
398 set = atk_text_get_default_attributes (text);
399 rv = _string_from_attribute_set (set);
400 reply = dbus_message_new_method_return (message);
403 dbus_message_append_args (reply, DBUS_TYPE_STRING, &rv,
407 atk_attribute_set_free (set);
412 impl_getCharacterExtents (DBusConnection * bus, DBusMessage * message,
415 AtkText *text = get_text (message);
417 dbus_uint32_t coordType;
418 dbus_int32_t x, y, width, height;
419 gint ix = 0, iy = 0, iw = 0, ih = 0;
424 return spi_dbus_general_error (message);
425 dbus_error_init (&error);
426 if (!dbus_message_get_args
427 (message, &error, DBUS_TYPE_INT32, &offset, DBUS_TYPE_INT32, &coordType,
430 return SPI_DBUS_RETURN_ERROR (message, &error);
432 atk_text_get_character_extents (text, offset, &ix, &iy, &iw, &ih,
433 (AtkCoordType) coordType);
438 reply = dbus_message_new_method_return (message);
441 dbus_message_append_args (reply, DBUS_TYPE_INT32, &x, DBUS_TYPE_INT32,
442 &y, DBUS_TYPE_INT32, &width, DBUS_TYPE_INT32,
443 &height, DBUS_TYPE_INVALID);
449 impl_getOffsetAtPoint (DBusConnection * bus, DBusMessage * message,
452 AtkText *text = get_text (message);
454 dbus_uint32_t coordType;
460 return spi_dbus_general_error (message);
461 dbus_error_init (&error);
462 if (!dbus_message_get_args
463 (message, &error, DBUS_TYPE_INT32, &x, DBUS_TYPE_INT32, &y,
464 DBUS_TYPE_UINT32, &coordType, DBUS_TYPE_INVALID))
466 return SPI_DBUS_RETURN_ERROR (message, &error);
468 rv = atk_text_get_offset_at_point (text, x, y, coordType);
469 reply = dbus_message_new_method_return (message);
472 dbus_message_append_args (reply, DBUS_TYPE_INT32, &rv,
479 impl_getNSelections (DBusConnection * bus, DBusMessage * message,
482 AtkText *text = get_text (message);
487 return spi_dbus_general_error (message);
488 rv = atk_text_get_n_selections (text);
489 reply = dbus_message_new_method_return (message);
492 dbus_message_append_args (reply, DBUS_TYPE_INT32, &rv,
499 impl_getSelection (DBusConnection * bus, DBusMessage * message,
502 AtkText *text = get_text (message);
503 dbus_int32_t selectionNum;
504 dbus_int32_t startOffset, endOffset;
505 gint intstart_offset = 0, intend_offset = 0;
510 return spi_dbus_general_error (message);
511 dbus_error_init (&error);
512 if (!dbus_message_get_args
513 (message, &error, DBUS_TYPE_INT32, &selectionNum, DBUS_TYPE_INVALID))
515 return SPI_DBUS_RETURN_ERROR (message, &error);
517 /* atk_text_get_selection returns gchar * which we discard */
518 g_free (atk_text_get_selection
519 (text, selectionNum, &intstart_offset, &intend_offset));
520 startOffset = intstart_offset;
521 endOffset = intend_offset;
522 reply = dbus_message_new_method_return (message);
525 dbus_message_append_args (reply, DBUS_TYPE_INT32, &startOffset,
526 DBUS_TYPE_INT32, &endOffset,
533 impl_addSelection (DBusConnection * bus, DBusMessage * message,
536 AtkText *text = get_text (message);
537 dbus_int32_t startOffset, endOffset;
543 return spi_dbus_general_error (message);
544 dbus_error_init (&error);
545 if (!dbus_message_get_args
546 (message, &error, DBUS_TYPE_INT32, &startOffset, DBUS_TYPE_INT32,
547 &endOffset, DBUS_TYPE_INVALID))
549 return SPI_DBUS_RETURN_ERROR (message, &error);
551 rv = atk_text_add_selection (text, startOffset, endOffset);
552 reply = dbus_message_new_method_return (message);
555 dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &rv,
562 impl_removeSelection (DBusConnection * bus, DBusMessage * message,
565 AtkText *text = get_text (message);
566 dbus_int32_t selectionNum;
572 return spi_dbus_general_error (message);
573 dbus_error_init (&error);
574 if (!dbus_message_get_args
575 (message, &error, DBUS_TYPE_INT32, &selectionNum, DBUS_TYPE_INVALID))
577 return SPI_DBUS_RETURN_ERROR (message, &error);
579 rv = atk_text_remove_selection (text, selectionNum);
580 reply = dbus_message_new_method_return (message);
583 dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &rv,
590 impl_setSelection (DBusConnection * bus, DBusMessage * message,
593 AtkText *text = get_text (message);
594 dbus_int32_t selectionNum, startOffset, endOffset;
600 return spi_dbus_general_error (message);
601 dbus_error_init (&error);
602 if (!dbus_message_get_args
603 (message, &error, DBUS_TYPE_INT32, &selectionNum, DBUS_TYPE_INT32,
604 &startOffset, DBUS_TYPE_INT32, &endOffset, DBUS_TYPE_INVALID))
606 return SPI_DBUS_RETURN_ERROR (message, &error);
608 rv = atk_text_set_selection (text, selectionNum, startOffset, endOffset);
609 reply = dbus_message_new_method_return (message);
612 dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &rv,
619 impl_getRangeExtents (DBusConnection * bus, DBusMessage * message,
622 AtkText *text = get_text (message);
623 dbus_int32_t startOffset, endOffset;
624 dbus_uint32_t coordType;
625 AtkTextRectangle rect;
626 dbus_int32_t x, y, width, height;
631 return spi_dbus_general_error (message);
632 dbus_error_init (&error);
633 if (!dbus_message_get_args
634 (message, &error, DBUS_TYPE_INT32, &startOffset, DBUS_TYPE_INT32,
635 &endOffset, DBUS_TYPE_UINT32, &coordType, DBUS_TYPE_INVALID))
637 return SPI_DBUS_RETURN_ERROR (message, &error);
639 memset (&rect, 0, sizeof (rect));
640 atk_text_get_range_extents (text, startOffset, endOffset,
641 (AtkCoordType) coordType, &rect);
645 height = rect.height;
646 reply = dbus_message_new_method_return (message);
649 dbus_message_append_args (reply, DBUS_TYPE_INT32, &x, DBUS_TYPE_INT32,
650 &y, DBUS_TYPE_INT32, &width, DBUS_TYPE_INT32,
651 &height, DBUS_TYPE_INVALID);
656 #define MAXRANGELEN 512
659 impl_getBoundedRanges (DBusConnection * bus, DBusMessage * message,
662 AtkText *text = get_text (message);
663 dbus_int32_t x, y, width, height;
664 dbus_uint32_t coordType, xClipType, yClipType;
666 AtkTextRange **range_list = NULL;
667 AtkTextRectangle rect;
669 DBusMessageIter iter, array, struc, variant;
672 return spi_dbus_general_error (message);
673 dbus_error_init (&error);
674 if (!dbus_message_get_args
675 (message, &error, DBUS_TYPE_INT32, &x, DBUS_TYPE_INT32, &y,
676 DBUS_TYPE_INT32, &height, DBUS_TYPE_INT32, &width, DBUS_TYPE_INT32,
677 &coordType, DBUS_TYPE_INT32, &xClipType, DBUS_TYPE_INT32, &yClipType,
680 return SPI_DBUS_RETURN_ERROR (message, &error);
685 rect.height = height;
688 atk_text_get_bounded_ranges (text, &rect, (AtkCoordType) coordType,
689 (AtkTextClipType) xClipType,
690 (AtkTextClipType) yClipType);
691 reply = dbus_message_new_method_return (message);
694 /* This isn't pleasant. */
695 dbus_message_iter_init_append (reply, &iter);
696 if (dbus_message_iter_open_container
697 (&iter, DBUS_TYPE_ARRAY, "(iisv)", &array))
700 for (len = 0; len < MAXRANGELEN && range_list[len]; ++len)
702 if (dbus_message_iter_open_container
703 (&array, DBUS_TYPE_STRUCT, NULL, &struc))
706 val = range_list[len]->start_offset;
707 dbus_message_iter_append_basic (&struc, DBUS_TYPE_INT32, &val);
708 val = range_list[len]->end_offset;
709 dbus_message_iter_append_basic (&struc, DBUS_TYPE_INT32, &val);
710 dbus_message_iter_append_basic (&struc, DBUS_TYPE_STRING,
711 &range_list[len]->content);
712 /* The variant is unimplemented in atk, but I don't want to
713 * unilaterally muck with the spec and remove it, so I'll just
714 * throw in a dummy value */
715 if (dbus_message_iter_open_container
716 (&array, DBUS_TYPE_VARIANT, "i", &variant))
718 dbus_uint32_t dummy = 0;
719 dbus_message_iter_append_basic (&variant, DBUS_TYPE_INT32,
721 dbus_message_iter_close_container (&struc, &variant);
723 dbus_message_iter_close_container (&array, &struc);
726 dbus_message_iter_close_container (&iter, &array);
732 impl_getAttributeRun (DBusConnection * bus, DBusMessage * message,
736 AtkText *text = get_text (message);
738 dbus_bool_t includeDefaults;
739 dbus_int32_t startOffset, endOffset;
740 gint intstart_offset = 0, intend_offset = 0;
742 AtkAttributeSet *attributes, *default_attributes = NULL;
743 AtkAttribute *attr = NULL;
745 gint n_attributes = 0, total_attributes = 0, n_default_attributes = 0;
749 return spi_dbus_general_error (message);
750 dbus_error_init (&error);
751 if (!dbus_message_get_args
752 (message, &error, DBUS_TYPE_INT32, &offset, DBUS_TYPE_BOOLEAN,
753 &includeDefaults, DBUS_TYPE_INVALID))
755 return SPI_DBUS_RETURN_ERROR (message, &error);
759 atk_text_get_run_attributes (text, offset, &intstart_offset,
763 total_attributes = n_attributes = g_slist_length (attributes);
767 default_attributes = atk_text_get_default_attributes (text);
768 if (default_attributes)
769 n_default_attributes = g_slist_length (default_attributes);
770 total_attributes += n_default_attributes;
773 startOffset = intstart_offset;
774 endOffset = intend_offset;
776 retval = (char **) g_malloc (total_attributes * sizeof (char *));
778 if (total_attributes)
780 for (i = 0; i < n_attributes; ++i)
782 attr = g_slist_nth_data (attributes, i);
783 retval[i] = g_strconcat (attr->name, ":", attr->value, NULL);
786 for (j = 0; j < n_default_attributes; ++i, ++j)
788 attr = g_slist_nth_data (default_attributes, j);
789 retval[i] = g_strconcat (attr->name, ":", attr->value, NULL);
792 atk_attribute_set_free (attributes);
793 if (default_attributes)
794 atk_attribute_set_free (default_attributes);
796 reply = dbus_message_new_method_return (message);
799 dbus_message_append_args (reply, DBUS_TYPE_INT32, &startOffset,
800 DBUS_TYPE_INT32, &endOffset, DBUS_TYPE_ARRAY,
801 DBUS_TYPE_STRING, &retval, total_attributes,
804 for (i = 0; i < total_attributes; i++)
811 impl_getDefaultAttributeSet (DBusConnection * bus, DBusMessage * message,
814 AtkText *text = get_text (message);
816 AtkAttributeSet *attributes;
817 AtkAttribute *attr = NULL;
819 gint n_attributes = 0;
823 return spi_dbus_general_error (message);
825 attributes = atk_text_get_default_attributes (text);
827 n_attributes = g_slist_length (attributes);
829 retval = (char **) malloc (n_attributes * sizeof (char *));
831 for (i = 0; i < n_attributes; ++i)
833 attr = g_slist_nth_data (attributes, i);
834 retval[i] = g_strconcat (attr->name, ":", attr->value, NULL);
837 atk_attribute_set_free (attributes);
838 reply = dbus_message_new_method_return (message);
841 dbus_message_append_args (reply, DBUS_TYPE_ARRAY, DBUS_TYPE_STRING,
842 &retval, n_attributes, DBUS_TYPE_INVALID);
844 for (i = 0; i < n_attributes; i++)
850 static DRouteMethod methods[] = {
851 {DROUTE_METHOD, impl_getText, "getText",
852 "i,startOffset,i:i,endOffset,i:s,,o"},
853 {DROUTE_METHOD, impl_setCaretOffset, "setCaretOffset", "i,offset,i:b,,o"},
854 {DROUTE_METHOD, impl_getTextBeforeOffset, "getTextBeforeOffset",
855 "i,offset,i:u,type,i:i,startOffset,o:i,endOffset,o:s,,o"},
856 {DROUTE_METHOD, impl_getTextAtOffset, "getTextAtOffset",
857 "i,offset,i:u,type,i:i,startOffset,o:i,endOffset,o:s,,o"},
858 {DROUTE_METHOD, impl_getTextAfterOffset, "getTextAfterOffset",
859 "i,offset,i:u,type,i:i,startOffset,o:i,endOffset,o:s,,o"},
860 {DROUTE_METHOD, impl_getAttributeValue, "getAttributeValue",
861 "i,offset,i:s,attributeName,i:i,startOffset,o:i,endOffset,o:b,defined,o:s,,o"},
862 {DROUTE_METHOD, impl_getAttributes, "getAttributes",
863 "i,offset,i:i,startOffset,o:i,endOffset,o:s,,o"},
864 {DROUTE_METHOD, impl_getDefaultAttributes, "getDefaultAttributes", "s,,o"},
865 {DROUTE_METHOD, impl_getCharacterExtents, "getCharacterExtents",
866 "i,offset,i:i,x,o:i,y,o:i,width,o:i,height,o:u,coordType,i"},
867 {DROUTE_METHOD, impl_getOffsetAtPoint, "getOffsetAtPoint",
868 "i,x,i:i,y,i:u,coordType,i:i,,o"},
869 {DROUTE_METHOD, impl_getNSelections, "getNSelections", "i,,o"},
870 {DROUTE_METHOD, impl_getSelection, "getSelection",
871 "i,selectionNum,i:i,startOffset,o:i,endOffset,o"},
872 {DROUTE_METHOD, impl_addSelection, "addSelection",
873 "i,startOffset,i:i,endOffset,i:b,,o"},
874 {DROUTE_METHOD, impl_removeSelection, "removeSelection",
875 "i,selectionNum,i:b,,o"},
876 {DROUTE_METHOD, impl_setSelection, "setSelection",
877 "i,selectionNum,i:i,startOffset,i:i,endOffset,i:b,,o"},
878 {DROUTE_METHOD, impl_getRangeExtents, "getRangeExtents",
879 "i,startOffset,i:i,endOffset,i:i,x,o:i,y,o:i,width,o:i,height,o:u,coordType,i"},
880 {DROUTE_METHOD, impl_getBoundedRanges, "getBoundedRanges",
881 "i,x,i:i,y,i:i,width,i:i,height,i:u,coordType,i:u,xClipType,i:u,yClipType,i:a(iisv),,o"},
882 {DROUTE_METHOD, impl_getAttributeRun, "getAttributeRun",
883 "i,offset,i:i,startOffset,o:i,endOffset,o:b,includeDefaults,i:as,,o"},
884 {DROUTE_METHOD, impl_getDefaultAttributeSet, "getDefaultAttributeSet",
886 {0, NULL, NULL, NULL}
889 static DRouteProperty properties[] = {
890 {impl_get_characterCount, impl_get_characterCount_str, NULL, NULL,
891 "characterCount", "i"},
892 {impl_get_caretOffset, impl_get_caretOffset_str, NULL, NULL, "caretOffset",
894 {NULL, NULL, NULL, NULL, NULL, NULL}
898 spi_initialize_text (DRouteData * data)
900 droute_add_interface (data, "org.freedesktop.accessibility.Text", methods,
902 (DRouteGetDatumFunction) get_text_from_path, NULL);