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>
30 #include "spi-common/spi-dbus.h"
33 impl_get_characterCount (DBusMessageIter * iter,
36 AtkText *text = (AtkText *) user_data;
37 g_return_val_if_fail (ATK_IS_TEXT (user_data), FALSE);
38 return droute_return_v_int32 (iter, atk_text_get_character_count (text));
42 impl_get_caretOffset (DBusMessageIter * iter,
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 impl_getText (DBusConnection * bus, DBusMessage * message, void *user_data)
53 AtkText *text = (AtkText *) user_data;
54 dbus_int32_t startOffset, endOffset;
59 g_return_val_if_fail (ATK_IS_TEXT (user_data),
60 droute_not_yet_handled_error (message));
61 dbus_error_init (&error);
62 if (!dbus_message_get_args
63 (message, &error, DBUS_TYPE_INT32, &startOffset, DBUS_TYPE_INT32,
64 &endOffset, DBUS_TYPE_INVALID))
66 return droute_invalid_arguments_error (message);
68 txt = atk_text_get_text (text, startOffset, endOffset);
71 reply = dbus_message_new_method_return (message);
74 dbus_message_append_args (reply, DBUS_TYPE_STRING, &txt,
82 impl_setCaretOffset (DBusConnection * bus, DBusMessage * message,
85 AtkText *text = (AtkText *) user_data;
91 g_return_val_if_fail (ATK_IS_TEXT (user_data),
92 droute_not_yet_handled_error (message));
93 dbus_error_init (&error);
94 if (!dbus_message_get_args
95 (message, &error, DBUS_TYPE_INT32, &offset, DBUS_TYPE_INVALID))
97 return droute_invalid_arguments_error (message);
99 rv = atk_text_set_caret_offset (text, offset);
100 reply = dbus_message_new_method_return (message);
103 dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &rv,
110 impl_getTextBeforeOffset (DBusConnection * bus, DBusMessage * message,
113 AtkText *text = (AtkText *) user_data;
117 dbus_int32_t startOffset, endOffset;
118 gint intstart_offset = 0, intend_offset = 0;
122 g_return_val_if_fail (ATK_IS_TEXT (user_data),
123 droute_not_yet_handled_error (message));
124 dbus_error_init (&error);
125 if (!dbus_message_get_args
126 (message, &error, DBUS_TYPE_INT32, &offset, DBUS_TYPE_UINT32, &type,
129 return droute_invalid_arguments_error (message);
132 atk_text_get_text_before_offset (text, offset, (AtkTextBoundary) type,
133 &intstart_offset, &intend_offset);
134 startOffset = intstart_offset;
135 endOffset = intend_offset;
138 reply = dbus_message_new_method_return (message);
141 dbus_message_append_args (reply, DBUS_TYPE_INT32, &startOffset,
142 DBUS_TYPE_INT32, &endOffset, DBUS_TYPE_STRING,
143 &txt, DBUS_TYPE_INVALID);
150 impl_getTextAtOffset (DBusConnection * bus, DBusMessage * message,
153 AtkText *text = (AtkText *) user_data;
154 dbus_int32_t offset, type;
156 dbus_int32_t startOffset, endOffset;
157 gint intstart_offset = 0, intend_offset = 0;
161 g_return_val_if_fail (ATK_IS_TEXT (user_data),
162 droute_not_yet_handled_error (message));
163 dbus_error_init (&error);
164 if (!dbus_message_get_args
165 (message, &error, DBUS_TYPE_INT32, &offset, DBUS_TYPE_UINT32, &type,
168 return droute_invalid_arguments_error (message);
171 atk_text_get_text_at_offset (text, offset, (AtkTextBoundary) type,
172 &intstart_offset, &intend_offset);
173 startOffset = intstart_offset;
174 endOffset = intend_offset;
177 reply = dbus_message_new_method_return (message);
180 dbus_message_append_args (reply, DBUS_TYPE_INT32, &startOffset,
181 DBUS_TYPE_INT32, &endOffset, DBUS_TYPE_STRING,
182 &txt, DBUS_TYPE_INVALID);
189 impl_getTextAfterOffset (DBusConnection * bus, DBusMessage * message,
192 AtkText *text = (AtkText *) user_data;
196 dbus_int32_t startOffset, endOffset;
197 gint intstart_offset = 0, intend_offset = 0;
201 g_return_val_if_fail (ATK_IS_TEXT (user_data),
202 droute_not_yet_handled_error (message));
203 dbus_error_init (&error);
204 if (!dbus_message_get_args
205 (message, &error, DBUS_TYPE_INT32, &offset, DBUS_TYPE_UINT32, &type,
208 return droute_invalid_arguments_error (message);
211 atk_text_get_text_after_offset (text, offset, (AtkTextBoundary) type,
212 &intstart_offset, &intend_offset);
213 startOffset = intstart_offset;
214 endOffset = intend_offset;
217 reply = dbus_message_new_method_return (message);
220 dbus_message_append_args (reply, DBUS_TYPE_INT32, &startOffset,
221 DBUS_TYPE_INT32, &endOffset, DBUS_TYPE_STRING,
222 &txt, DBUS_TYPE_INVALID);
229 impl_getCharacterAtOffset (DBusConnection * bus, DBusMessage * message,
232 AtkText *text = (AtkText *) user_data;
238 g_return_val_if_fail (ATK_IS_TEXT (user_data),
239 droute_not_yet_handled_error (message));
240 dbus_error_init (&error);
241 if (!dbus_message_get_args
242 (message, &error, DBUS_TYPE_INT32, &offset, DBUS_TYPE_INVALID))
244 return droute_invalid_arguments_error (message);
246 ch = atk_text_get_character_at_offset (text, offset);
247 reply = dbus_message_new_method_return (message);
250 dbus_message_append_args (reply, DBUS_TYPE_INT32, &ch, DBUS_TYPE_INVALID);
256 impl_getAttributeValue (DBusConnection * bus, DBusMessage * message,
259 AtkText *text = (AtkText *) user_data;
262 dbus_int32_t startOffset, endOffset;
264 gint intstart_offset = 0, intend_offset = 0;
268 AtkAttributeSet *set;
272 g_return_val_if_fail (ATK_IS_TEXT (user_data),
273 droute_not_yet_handled_error (message));
274 dbus_error_init (&error);
275 if (!dbus_message_get_args
276 (message, &error, DBUS_TYPE_INT32, &offset, DBUS_TYPE_STRING,
277 &attributeName, DBUS_TYPE_INVALID))
279 return droute_invalid_arguments_error (message);
282 set = atk_text_get_run_attributes (text, offset,
283 &intstart_offset, &intend_offset);
284 startOffset = intstart_offset;
285 endOffset = intend_offset;
287 cur_attr = (GSList *) set;
290 at = (AtkAttribute *) cur_attr->data;
291 if (!strcmp (at->name, attributeName))
297 cur_attr = cur_attr->next;
301 reply = dbus_message_new_method_return (message);
304 dbus_message_append_args (reply, DBUS_TYPE_INT32, &startOffset,
305 DBUS_TYPE_INT32, &endOffset,
306 DBUS_TYPE_BOOLEAN, &defined, DBUS_TYPE_STRING,
307 &rv, DBUS_TYPE_INVALID);
309 atk_attribute_set_free (set);
314 _string_from_attribute_set (AtkAttributeSet * set)
316 gchar *attributes, *tmp, *tmp2;
320 attributes = g_strdup ("");
321 cur_attr = (GSList *) set;
324 at = (AtkAttribute *) cur_attr->data;
325 tmp = g_strdup_printf ("%s%s:%s%s",
326 ((GSList *) (set) == cur_attr) ? "" : " ",
328 (cur_attr->next) ? ";" : "");
329 tmp2 = g_strconcat (attributes, tmp, NULL);
333 cur_attr = cur_attr->next;
339 impl_getAttributes (DBusConnection * bus, DBusMessage * message,
342 AtkText *text = (AtkText *) user_data;
344 dbus_int32_t startOffset, endOffset;
345 gint intstart_offset, intend_offset;
349 AtkAttributeSet *set;
351 g_return_val_if_fail (ATK_IS_TEXT (user_data),
352 droute_not_yet_handled_error (message));
353 dbus_error_init (&error);
354 if (!dbus_message_get_args
355 (message, &error, DBUS_TYPE_INT32, &offset, DBUS_TYPE_INVALID))
357 return droute_invalid_arguments_error (message);
360 set = atk_text_get_run_attributes (text, offset,
361 &intstart_offset, &intend_offset);
363 rv = _string_from_attribute_set (set);
365 startOffset = intstart_offset;
366 endOffset = intend_offset;
367 reply = dbus_message_new_method_return (message);
370 dbus_message_append_args (reply, DBUS_TYPE_STRING, &rv, DBUS_TYPE_INT32, &startOffset,
371 DBUS_TYPE_INT32, &endOffset, DBUS_TYPE_INVALID);
373 atk_attribute_set_free (set);
379 impl_getDefaultAttributes (DBusConnection * bus, DBusMessage * message,
382 AtkText *text = (AtkText *) user_data;
386 AtkAttributeSet *set;
388 g_return_val_if_fail (ATK_IS_TEXT (user_data),
389 droute_not_yet_handled_error (message));
390 dbus_error_init (&error);
392 set = atk_text_get_default_attributes (text);
393 rv = _string_from_attribute_set (set);
394 reply = dbus_message_new_method_return (message);
397 dbus_message_append_args (reply, DBUS_TYPE_STRING, &rv,
401 atk_attribute_set_free (set);
406 impl_getCharacterExtents (DBusConnection * bus, DBusMessage * message,
409 AtkText *text = (AtkText *) user_data;
411 dbus_int16_t coordType;
412 dbus_int32_t x, y, width, height;
413 gint ix = 0, iy = 0, iw = 0, ih = 0;
417 g_return_val_if_fail (ATK_IS_TEXT (user_data),
418 droute_not_yet_handled_error (message));
419 dbus_error_init (&error);
420 if (!dbus_message_get_args
421 (message, &error, DBUS_TYPE_INT32, &offset, DBUS_TYPE_INT16, &coordType,
424 return droute_invalid_arguments_error (message);
426 atk_text_get_character_extents (text, offset, &ix, &iy, &iw, &ih,
427 (AtkCoordType) coordType);
432 reply = dbus_message_new_method_return (message);
435 dbus_message_append_args (reply, DBUS_TYPE_INT32, &x, DBUS_TYPE_INT32,
436 &y, DBUS_TYPE_INT32, &width, DBUS_TYPE_INT32,
437 &height, DBUS_TYPE_INVALID);
443 impl_getOffsetAtPoint (DBusConnection * bus, DBusMessage * message,
446 AtkText *text = (AtkText *) user_data;
448 dbus_int16_t coordType;
453 g_return_val_if_fail (ATK_IS_TEXT (user_data),
454 droute_not_yet_handled_error (message));
455 dbus_error_init (&error);
456 if (!dbus_message_get_args
457 (message, &error, DBUS_TYPE_INT32, &x, DBUS_TYPE_INT32, &y,
458 DBUS_TYPE_INT16, &coordType, DBUS_TYPE_INVALID))
460 return droute_invalid_arguments_error (message);
462 rv = atk_text_get_offset_at_point (text, x, y, coordType);
463 reply = dbus_message_new_method_return (message);
466 dbus_message_append_args (reply, DBUS_TYPE_INT32, &rv,
473 impl_getNSelections (DBusConnection * bus, DBusMessage * message,
476 AtkText *text = (AtkText *) user_data;
480 g_return_val_if_fail (ATK_IS_TEXT (user_data),
481 droute_not_yet_handled_error (message));
482 rv = atk_text_get_n_selections (text);
483 reply = dbus_message_new_method_return (message);
486 dbus_message_append_args (reply, DBUS_TYPE_INT32, &rv,
493 impl_getSelection (DBusConnection * bus, DBusMessage * message,
496 AtkText *text = (AtkText *) user_data;
497 dbus_int32_t selectionNum;
498 dbus_int32_t startOffset, endOffset;
499 gint intstart_offset = 0, intend_offset = 0;
503 g_return_val_if_fail (ATK_IS_TEXT (user_data),
504 droute_not_yet_handled_error (message));
505 dbus_error_init (&error);
506 if (!dbus_message_get_args
507 (message, &error, DBUS_TYPE_INT32, &selectionNum, DBUS_TYPE_INVALID))
509 return droute_invalid_arguments_error (message);
511 /* atk_text_get_selection returns gchar * which we discard */
512 g_free (atk_text_get_selection
513 (text, selectionNum, &intstart_offset, &intend_offset));
514 startOffset = intstart_offset;
515 endOffset = intend_offset;
516 reply = dbus_message_new_method_return (message);
519 dbus_message_append_args (reply, DBUS_TYPE_INT32, &startOffset,
520 DBUS_TYPE_INT32, &endOffset,
527 impl_addSelection (DBusConnection * bus, DBusMessage * message,
530 AtkText *text = (AtkText *) user_data;
531 dbus_int32_t startOffset, endOffset;
536 g_return_val_if_fail (ATK_IS_TEXT (user_data),
537 droute_not_yet_handled_error (message));
538 dbus_error_init (&error);
539 if (!dbus_message_get_args
540 (message, &error, DBUS_TYPE_INT32, &startOffset, DBUS_TYPE_INT32,
541 &endOffset, DBUS_TYPE_INVALID))
543 return droute_invalid_arguments_error (message);
545 rv = atk_text_add_selection (text, startOffset, endOffset);
546 reply = dbus_message_new_method_return (message);
549 dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &rv,
556 impl_removeSelection (DBusConnection * bus, DBusMessage * message,
559 AtkText *text = (AtkText *) user_data;
560 dbus_int32_t selectionNum;
565 g_return_val_if_fail (ATK_IS_TEXT (user_data),
566 droute_not_yet_handled_error (message));
567 dbus_error_init (&error);
568 if (!dbus_message_get_args
569 (message, &error, DBUS_TYPE_INT32, &selectionNum, DBUS_TYPE_INVALID))
571 return droute_invalid_arguments_error (message);
573 rv = atk_text_remove_selection (text, selectionNum);
574 reply = dbus_message_new_method_return (message);
577 dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &rv,
584 impl_setSelection (DBusConnection * bus, DBusMessage * message,
587 AtkText *text = (AtkText *) user_data;
588 dbus_int32_t selectionNum, startOffset, endOffset;
593 g_return_val_if_fail (ATK_IS_TEXT (user_data),
594 droute_not_yet_handled_error (message));
595 dbus_error_init (&error);
596 if (!dbus_message_get_args
597 (message, &error, DBUS_TYPE_INT32, &selectionNum, DBUS_TYPE_INT32,
598 &startOffset, DBUS_TYPE_INT32, &endOffset, DBUS_TYPE_INVALID))
600 return droute_invalid_arguments_error (message);
602 rv = atk_text_set_selection (text, selectionNum, startOffset, endOffset);
603 reply = dbus_message_new_method_return (message);
606 dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &rv,
613 impl_getRangeExtents (DBusConnection * bus, DBusMessage * message,
616 AtkText *text = (AtkText *) user_data;
617 dbus_int32_t startOffset, endOffset;
618 dbus_int16_t coordType;
619 AtkTextRectangle rect;
620 dbus_int32_t x, y, width, height;
624 g_return_val_if_fail (ATK_IS_TEXT (user_data),
625 droute_not_yet_handled_error (message));
626 dbus_error_init (&error);
627 if (!dbus_message_get_args
628 (message, &error, DBUS_TYPE_INT32, &startOffset, DBUS_TYPE_INT32,
629 &endOffset, DBUS_TYPE_INT16, &coordType, DBUS_TYPE_INVALID))
631 return droute_invalid_arguments_error (message);
633 memset (&rect, 0, sizeof (rect));
634 atk_text_get_range_extents (text, startOffset, endOffset,
635 (AtkCoordType) coordType, &rect);
639 height = rect.height;
640 reply = dbus_message_new_method_return (message);
643 dbus_message_append_args (reply, DBUS_TYPE_INT32, &x, DBUS_TYPE_INT32,
644 &y, DBUS_TYPE_INT32, &width, DBUS_TYPE_INT32,
645 &height, DBUS_TYPE_INVALID);
650 #define MAXRANGELEN 512
653 impl_getBoundedRanges (DBusConnection * bus, DBusMessage * message,
656 AtkText *text = (AtkText *) user_data;
657 dbus_int32_t x, y, width, height;
658 dbus_int16_t coordType, xClipType, yClipType;
660 AtkTextRange **range_list = NULL;
661 AtkTextRectangle rect;
663 DBusMessageIter iter, array, struc, variant;
665 g_return_val_if_fail (ATK_IS_TEXT (user_data),
666 droute_not_yet_handled_error (message));
667 dbus_error_init (&error);
668 if (!dbus_message_get_args
669 (message, &error, DBUS_TYPE_INT32, &x, DBUS_TYPE_INT32, &y,
670 DBUS_TYPE_INT32, &height, DBUS_TYPE_INT32, &width, DBUS_TYPE_INT32,
671 &coordType, DBUS_TYPE_INT32, &xClipType, DBUS_TYPE_INT32, &yClipType,
674 return droute_invalid_arguments_error (message);
679 rect.height = height;
682 atk_text_get_bounded_ranges (text, &rect, (AtkCoordType) coordType,
683 (AtkTextClipType) xClipType,
684 (AtkTextClipType) yClipType);
685 reply = dbus_message_new_method_return (message);
688 /* This isn't pleasant. */
689 dbus_message_iter_init_append (reply, &iter);
690 if (dbus_message_iter_open_container
691 (&iter, DBUS_TYPE_ARRAY, "(iisv)", &array))
694 for (len = 0; len < MAXRANGELEN && range_list[len]; ++len)
696 if (dbus_message_iter_open_container
697 (&array, DBUS_TYPE_STRUCT, NULL, &struc))
700 val = range_list[len]->start_offset;
701 dbus_message_iter_append_basic (&struc, DBUS_TYPE_INT32, &val);
702 val = range_list[len]->end_offset;
703 dbus_message_iter_append_basic (&struc, DBUS_TYPE_INT32, &val);
704 dbus_message_iter_append_basic (&struc, DBUS_TYPE_STRING,
705 &range_list[len]->content);
706 /* The variant is unimplemented in atk, but I don't want to
707 * unilaterally muck with the spec and remove it, so I'll just
708 * throw in a dummy value */
709 if (dbus_message_iter_open_container
710 (&array, DBUS_TYPE_VARIANT, "i", &variant))
712 dbus_uint32_t dummy = 0;
713 dbus_message_iter_append_basic (&variant, DBUS_TYPE_INT32,
715 dbus_message_iter_close_container (&struc, &variant);
717 dbus_message_iter_close_container (&array, &struc);
720 dbus_message_iter_close_container (&iter, &array);
726 impl_getAttributeRun (DBusConnection * bus, DBusMessage * message,
730 AtkText *text = (AtkText *) user_data;
732 dbus_bool_t includeDefaults;
733 dbus_int32_t startOffset, endOffset;
734 gint intstart_offset = 0, intend_offset = 0;
736 AtkAttributeSet *attributes, *default_attributes = NULL;
737 AtkAttribute *attr = NULL;
739 gint n_attributes = 0, total_attributes = 0, n_default_attributes = 0;
742 g_return_val_if_fail (ATK_IS_TEXT (user_data),
743 droute_not_yet_handled_error (message));
744 dbus_error_init (&error);
745 if (!dbus_message_get_args
746 (message, &error, DBUS_TYPE_INT32, &offset, DBUS_TYPE_BOOLEAN,
747 &includeDefaults, DBUS_TYPE_INVALID))
749 return droute_invalid_arguments_error (message);
753 atk_text_get_run_attributes (text, offset, &intstart_offset,
757 total_attributes = n_attributes = g_slist_length (attributes);
761 default_attributes = atk_text_get_default_attributes (text);
762 if (default_attributes)
763 n_default_attributes = g_slist_length (default_attributes);
764 total_attributes += n_default_attributes;
767 startOffset = intstart_offset;
768 endOffset = intend_offset;
770 retval = (char **) g_malloc (total_attributes * sizeof (char *));
772 if (total_attributes)
774 for (i = 0; i < n_attributes; ++i)
776 attr = g_slist_nth_data (attributes, i);
777 retval[i] = g_strconcat (attr->name, ":", attr->value, NULL);
780 for (j = 0; j < n_default_attributes; ++i, ++j)
782 attr = g_slist_nth_data (default_attributes, j);
783 retval[i] = g_strconcat (attr->name, ":", attr->value, NULL);
786 atk_attribute_set_free (attributes);
787 if (default_attributes)
788 atk_attribute_set_free (default_attributes);
790 reply = dbus_message_new_method_return (message);
793 dbus_message_append_args (reply, DBUS_TYPE_INT32, &startOffset,
794 DBUS_TYPE_INT32, &endOffset, DBUS_TYPE_ARRAY,
795 DBUS_TYPE_STRING, &retval, total_attributes,
798 for (i = 0; i < total_attributes; i++)
805 impl_getDefaultAttributeSet (DBusConnection * bus, DBusMessage * message,
808 AtkText *text = (AtkText *) user_data;
810 AtkAttributeSet *attributes;
811 AtkAttribute *attr = NULL;
813 gint n_attributes = 0;
816 g_return_val_if_fail (ATK_IS_TEXT (user_data),
817 droute_not_yet_handled_error (message));
819 attributes = atk_text_get_default_attributes (text);
821 n_attributes = g_slist_length (attributes);
823 retval = g_new (char *, n_attributes);
825 for (i = 0; i < n_attributes; ++i)
827 attr = g_slist_nth_data (attributes, i);
828 retval[i] = g_strconcat (attr->name, ":", attr->value, NULL);
831 atk_attribute_set_free (attributes);
832 reply = dbus_message_new_method_return (message);
835 dbus_message_append_args (reply, DBUS_TYPE_ARRAY, DBUS_TYPE_STRING,
836 &retval, n_attributes, DBUS_TYPE_INVALID);
838 for (i = 0; i < n_attributes; i++)
844 static DRouteMethod methods[] = {
845 {impl_getText, "getText"},
846 {impl_setCaretOffset, "setCaretOffset"},
847 {impl_getTextBeforeOffset, "getTextBeforeOffset"},
848 {impl_getTextAtOffset, "getTextAtOffset"},
849 {impl_getTextAfterOffset, "getTextAfterOffset"},
850 {impl_getCharacterAtOffset, "getCharacterAtOffset"},
851 {impl_getAttributeValue, "getAttributeValue"},
852 {impl_getAttributes, "getAttributes"},
853 {impl_getDefaultAttributes, "getDefaultAttributes"},
854 {impl_getCharacterExtents, "getCharacterExtents"},
855 {impl_getOffsetAtPoint, "getOffsetAtPoint"},
856 {impl_getNSelections, "getNSelections"},
857 {impl_getSelection, "getSelection"},
858 {impl_addSelection, "addSelection"},
859 {impl_removeSelection, "removeSelection"},
860 {impl_setSelection, "setSelection"},
861 {impl_getRangeExtents, "getRangeExtents"},
862 {impl_getBoundedRanges, "getBoundedRanges"},
863 {impl_getAttributeRun, "getAttributeRun"},
864 {impl_getDefaultAttributeSet, "getDefaultAttributeSet"},
868 static DRouteProperty properties[] = {
869 {impl_get_characterCount, NULL, "characterCount"},
870 {impl_get_caretOffset, NULL, "caretOffset"},
875 spi_initialize_text (DRoutePath *path)
877 droute_path_add_interface (path,
878 SPI_DBUS_INTERFACE_TEXT,