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 Lesser General Public
11 * License as published by the Free Software Foundation; either
12 * version 2.1 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 * Lesser General Public License for more details.
19 * You should have received a copy of the GNU Lesser General Public
20 * License along with this library; if not, write to the
21 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
22 * Boston, MA 02110-1301, 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 gint intstart_offset = 0, intend_offset = 0;
362 AtkAttributeSet *set;
366 g_return_val_if_fail (ATK_IS_TEXT (user_data),
367 droute_not_yet_handled_error (message));
368 if (!dbus_message_get_args
369 (message, NULL, DBUS_TYPE_INT32, &offset, DBUS_TYPE_STRING,
370 &attributeName, DBUS_TYPE_INVALID))
372 return droute_invalid_arguments_error (message);
375 set = atk_text_get_run_attributes (text, offset,
376 &intstart_offset, &intend_offset);
377 cur_attr = (GSList *) set;
380 at = (AtkAttribute *) cur_attr->data;
381 if (!strcmp (at->name, attributeName))
386 cur_attr = cur_attr->next;
390 reply = dbus_message_new_method_return (message);
393 dbus_message_append_args (reply, DBUS_TYPE_STRING, &rv, DBUS_TYPE_INVALID);
395 atk_attribute_set_free (set);
400 impl_GetAttributes (DBusConnection * bus, DBusMessage * message,
403 AtkText *text = (AtkText *) user_data;
405 dbus_int32_t startOffset, endOffset;
406 gint intstart_offset, intend_offset;
408 AtkAttributeSet *set;
409 DBusMessageIter iter;
411 g_return_val_if_fail (ATK_IS_TEXT (user_data),
412 droute_not_yet_handled_error (message));
413 if (!dbus_message_get_args
414 (message, NULL, DBUS_TYPE_INT32, &offset, DBUS_TYPE_INVALID))
416 return droute_invalid_arguments_error (message);
419 set = atk_text_get_run_attributes (text, offset,
420 &intstart_offset, &intend_offset);
422 startOffset = intstart_offset;
423 endOffset = intend_offset;
424 reply = dbus_message_new_method_return (message);
427 dbus_message_iter_init_append (reply, &iter);
428 spi_object_append_attribute_set (&iter, set);
429 dbus_message_append_args (reply, DBUS_TYPE_INT32, &startOffset,
430 DBUS_TYPE_INT32, &endOffset,
433 atk_attribute_set_free (set);
438 impl_GetDefaultAttributes (DBusConnection * bus, DBusMessage * message,
441 AtkText *text = (AtkText *) user_data;
443 AtkAttributeSet *set;
444 DBusMessageIter iter;
446 g_return_val_if_fail (ATK_IS_TEXT (user_data),
447 droute_not_yet_handled_error (message));
449 set = atk_text_get_default_attributes (text);
450 reply = dbus_message_new_method_return (message);
453 dbus_message_iter_init_append (reply, &iter);
454 spi_object_append_attribute_set (&iter, set);
456 atk_attribute_set_free (set);
461 impl_GetCharacterExtents (DBusConnection * bus, DBusMessage * message,
464 AtkText *text = (AtkText *) user_data;
466 dbus_uint32_t coordType;
467 dbus_int32_t x, y, width, height;
468 gint ix = 0, iy = 0, iw = 0, ih = 0;
471 g_return_val_if_fail (ATK_IS_TEXT (user_data),
472 droute_not_yet_handled_error (message));
473 if (!dbus_message_get_args
474 (message, NULL, DBUS_TYPE_INT32, &offset, DBUS_TYPE_UINT32,
475 &coordType, DBUS_TYPE_INVALID))
477 return droute_invalid_arguments_error (message);
479 atk_text_get_character_extents (text, offset, &ix, &iy, &iw, &ih,
480 (AtkCoordType) coordType);
485 reply = dbus_message_new_method_return (message);
488 dbus_message_append_args (reply, DBUS_TYPE_INT32, &x, DBUS_TYPE_INT32,
489 &y, DBUS_TYPE_INT32, &width, DBUS_TYPE_INT32,
490 &height, DBUS_TYPE_INVALID);
496 impl_GetOffsetAtPoint (DBusConnection * bus, DBusMessage * message,
499 AtkText *text = (AtkText *) user_data;
501 dbus_uint32_t coordType;
505 g_return_val_if_fail (ATK_IS_TEXT (user_data),
506 droute_not_yet_handled_error (message));
507 if (!dbus_message_get_args
508 (message, NULL, DBUS_TYPE_INT32, &x, DBUS_TYPE_INT32, &y,
509 DBUS_TYPE_UINT32, &coordType, DBUS_TYPE_INVALID))
511 return droute_invalid_arguments_error (message);
513 rv = atk_text_get_offset_at_point (text, x, y, coordType);
514 reply = dbus_message_new_method_return (message);
517 dbus_message_append_args (reply, DBUS_TYPE_INT32, &rv,
524 impl_GetNSelections (DBusConnection * bus, DBusMessage * message,
527 AtkText *text = (AtkText *) user_data;
531 g_return_val_if_fail (ATK_IS_TEXT (user_data),
532 droute_not_yet_handled_error (message));
533 rv = atk_text_get_n_selections (text);
534 reply = dbus_message_new_method_return (message);
537 dbus_message_append_args (reply, DBUS_TYPE_INT32, &rv,
544 impl_GetSelection (DBusConnection * bus, DBusMessage * message,
547 AtkText *text = (AtkText *) user_data;
548 dbus_int32_t selectionNum;
549 dbus_int32_t startOffset, endOffset;
550 gint intstart_offset = 0, intend_offset = 0;
553 g_return_val_if_fail (ATK_IS_TEXT (user_data),
554 droute_not_yet_handled_error (message));
555 if (!dbus_message_get_args
556 (message, NULL, DBUS_TYPE_INT32, &selectionNum, DBUS_TYPE_INVALID))
558 return droute_invalid_arguments_error (message);
560 /* atk_text_get_selection returns gchar * which we discard */
561 g_free (atk_text_get_selection
562 (text, selectionNum, &intstart_offset, &intend_offset));
563 startOffset = intstart_offset;
564 endOffset = intend_offset;
565 reply = dbus_message_new_method_return (message);
568 dbus_message_append_args (reply, DBUS_TYPE_INT32, &startOffset,
569 DBUS_TYPE_INT32, &endOffset,
576 impl_AddSelection (DBusConnection * bus, DBusMessage * message,
579 AtkText *text = (AtkText *) user_data;
580 dbus_int32_t startOffset, endOffset;
584 g_return_val_if_fail (ATK_IS_TEXT (user_data),
585 droute_not_yet_handled_error (message));
586 if (!dbus_message_get_args
587 (message, NULL, DBUS_TYPE_INT32, &startOffset, DBUS_TYPE_INT32,
588 &endOffset, DBUS_TYPE_INVALID))
590 return droute_invalid_arguments_error (message);
592 rv = atk_text_add_selection (text, startOffset, endOffset);
593 reply = dbus_message_new_method_return (message);
596 dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &rv,
603 impl_RemoveSelection (DBusConnection * bus, DBusMessage * message,
606 AtkText *text = (AtkText *) user_data;
607 dbus_int32_t selectionNum;
611 g_return_val_if_fail (ATK_IS_TEXT (user_data),
612 droute_not_yet_handled_error (message));
613 if (!dbus_message_get_args
614 (message, NULL, DBUS_TYPE_INT32, &selectionNum, DBUS_TYPE_INVALID))
616 return droute_invalid_arguments_error (message);
618 rv = atk_text_remove_selection (text, selectionNum);
619 reply = dbus_message_new_method_return (message);
622 dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &rv,
629 impl_SetSelection (DBusConnection * bus, DBusMessage * message,
632 AtkText *text = (AtkText *) user_data;
633 dbus_int32_t selectionNum, startOffset, endOffset;
637 g_return_val_if_fail (ATK_IS_TEXT (user_data),
638 droute_not_yet_handled_error (message));
639 if (!dbus_message_get_args
640 (message, NULL, DBUS_TYPE_INT32, &selectionNum, DBUS_TYPE_INT32,
641 &startOffset, DBUS_TYPE_INT32, &endOffset, DBUS_TYPE_INVALID))
643 return droute_invalid_arguments_error (message);
645 rv = atk_text_set_selection (text, selectionNum, startOffset, endOffset);
646 reply = dbus_message_new_method_return (message);
649 dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &rv,
656 impl_GetRangeExtents (DBusConnection * bus, DBusMessage * message,
659 AtkText *text = (AtkText *) user_data;
660 dbus_int32_t startOffset, endOffset;
661 dbus_uint32_t coordType;
662 AtkTextRectangle rect;
663 dbus_int32_t x, y, width, height;
666 g_return_val_if_fail (ATK_IS_TEXT (user_data),
667 droute_not_yet_handled_error (message));
668 if (!dbus_message_get_args
669 (message, NULL, DBUS_TYPE_INT32, &startOffset, DBUS_TYPE_INT32,
670 &endOffset, DBUS_TYPE_UINT32, &coordType, DBUS_TYPE_INVALID))
672 return droute_invalid_arguments_error (message);
674 memset (&rect, 0, sizeof (rect));
675 atk_text_get_range_extents (text, startOffset, endOffset,
676 (AtkCoordType) coordType, &rect);
680 height = rect.height;
681 reply = dbus_message_new_method_return (message);
684 dbus_message_append_args (reply, DBUS_TYPE_INT32, &x, DBUS_TYPE_INT32,
685 &y, DBUS_TYPE_INT32, &width, DBUS_TYPE_INT32,
686 &height, DBUS_TYPE_INVALID);
691 #define MAXRANGELEN 512
694 impl_GetBoundedRanges (DBusConnection * bus, DBusMessage * message,
697 AtkText *text = (AtkText *) user_data;
698 dbus_int32_t x, y, width, height;
699 dbus_uint32_t coordType, xClipType, yClipType;
700 AtkTextRange **range_list = NULL;
701 AtkTextRectangle rect;
703 DBusMessageIter iter, array, struc, variant;
705 g_return_val_if_fail (ATK_IS_TEXT (user_data),
706 droute_not_yet_handled_error (message));
707 if (!dbus_message_get_args
708 (message, NULL, DBUS_TYPE_INT32, &x, DBUS_TYPE_INT32, &y,
709 DBUS_TYPE_INT32, &height, DBUS_TYPE_INT32, &width, DBUS_TYPE_UINT32,
710 &coordType, DBUS_TYPE_UINT32, &xClipType, DBUS_TYPE_UINT32, &yClipType,
713 return droute_invalid_arguments_error (message);
718 rect.height = height;
721 atk_text_get_bounded_ranges (text, &rect, (AtkCoordType) coordType,
722 (AtkTextClipType) xClipType,
723 (AtkTextClipType) yClipType);
724 reply = dbus_message_new_method_return (message);
727 /* This isn't pleasant. */
728 dbus_message_iter_init_append (reply, &iter);
729 if (dbus_message_iter_open_container
730 (&iter, DBUS_TYPE_ARRAY, "(iisv)", &array))
733 int count = (range_list ? MAXRANGELEN : 0);
734 for (len = 0; len < count && range_list[len]; ++len)
736 if (dbus_message_iter_open_container
737 (&array, DBUS_TYPE_STRUCT, NULL, &struc))
740 val = range_list[len]->start_offset;
741 dbus_message_iter_append_basic (&struc, DBUS_TYPE_INT32, &val);
742 val = range_list[len]->end_offset;
743 dbus_message_iter_append_basic (&struc, DBUS_TYPE_INT32, &val);
744 dbus_message_iter_append_basic (&struc, DBUS_TYPE_STRING,
745 &range_list[len]->content);
746 /* The variant is unimplemented in atk, but I don't want to
747 * unilaterally muck with the spec and remove it, so I'll just
748 * throw in a dummy value */
749 if (dbus_message_iter_open_container
750 (&struc, DBUS_TYPE_VARIANT, "i", &variant))
752 dbus_uint32_t dummy = 0;
753 dbus_message_iter_append_basic (&variant, DBUS_TYPE_INT32,
755 dbus_message_iter_close_container (&struc, &variant);
757 dbus_message_iter_close_container (&array, &struc);
758 g_free (range_list[len]->content);
759 g_free (range_list[len]);
762 dbus_message_iter_close_container (&iter, &array);
772 impl_GetAttributeRun (DBusConnection * bus, DBusMessage * message,
775 AtkText *text = (AtkText *) user_data;
777 dbus_bool_t includeDefaults;
778 dbus_int32_t startOffset, endOffset;
779 gint intstart_offset = 0, intend_offset = 0;
781 AtkAttributeSet *attributes = NULL;
782 DBusMessageIter iter;
784 g_return_val_if_fail (ATK_IS_TEXT (user_data),
785 droute_not_yet_handled_error (message));
786 if (!dbus_message_get_args
787 (message, NULL, DBUS_TYPE_INT32, &offset, DBUS_TYPE_BOOLEAN,
788 &includeDefaults, DBUS_TYPE_INVALID))
790 return droute_invalid_arguments_error (message);
795 attributes = g_slist_concat (attributes,
796 atk_text_get_default_attributes (text));
799 attributes = g_slist_concat (attributes,
800 atk_text_get_run_attributes (text, offset,
804 reply = dbus_message_new_method_return (message);
808 dbus_message_iter_init_append (reply, &iter);
809 spi_object_append_attribute_set (&iter, attributes);
811 startOffset = intstart_offset;
812 endOffset = intend_offset;
813 dbus_message_iter_append_basic (&iter, DBUS_TYPE_INT32, &startOffset);
814 dbus_message_iter_append_basic (&iter, DBUS_TYPE_INT32, &endOffset);
816 atk_attribute_set_free (attributes);
822 impl_GetDefaultAttributeSet (DBusConnection * bus, DBusMessage * message,
825 AtkText *text = (AtkText *) user_data;
827 DBusMessageIter iter;
828 AtkAttributeSet *attributes;
830 g_return_val_if_fail (ATK_IS_TEXT (user_data),
831 droute_not_yet_handled_error (message));
833 attributes = atk_text_get_default_attributes (text);
835 reply = dbus_message_new_method_return (message);
838 dbus_message_iter_init_append (reply, &iter);
839 spi_object_append_attribute_set (&iter, attributes);
843 atk_attribute_set_free (attributes);
849 impl_ScrollSubstringTo (DBusConnection * bus,
850 DBusMessage * message, void *user_data)
852 AtkText *text = (AtkText *) user_data;
853 dbus_int32_t startOffset, endOffset;
856 DBusMessage *reply = NULL;
858 g_return_val_if_fail (ATK_IS_TEXT (user_data),
859 droute_not_yet_handled_error (message));
861 if (!dbus_message_get_args
862 (message, NULL, DBUS_TYPE_INT32, &startOffset,
863 DBUS_TYPE_INT32, &endOffset,
864 DBUS_TYPE_UINT32, &type,
867 return droute_invalid_arguments_error (message);
870 ret = atk_text_scroll_substring_to (text, startOffset, endOffset, type);
872 reply = dbus_message_new_method_return (message);
875 dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &ret,
882 impl_ScrollSubstringToPoint (DBusConnection * bus,
883 DBusMessage * message, void *user_data)
885 AtkText *text = (AtkText *) user_data;
886 dbus_int32_t startOffset, endOffset;
890 DBusMessage *reply = NULL;
892 g_return_val_if_fail (ATK_IS_TEXT (user_data),
893 droute_not_yet_handled_error (message));
895 if (!dbus_message_get_args
896 (message, NULL, DBUS_TYPE_INT32, &startOffset,
897 DBUS_TYPE_INT32, &endOffset,
898 DBUS_TYPE_UINT32, &type,
903 return droute_invalid_arguments_error (message);
906 ret = atk_text_scroll_substring_to_point (text, startOffset, endOffset, type, x, y);
908 reply = dbus_message_new_method_return (message);
911 dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &ret,
917 static DRouteMethod methods[] = {
918 {impl_GetText, "GetText"},
919 {impl_SetCaretOffset, "SetCaretOffset"},
920 {impl_GetTextBeforeOffset, "GetTextBeforeOffset"},
921 {impl_GetTextAtOffset, "GetTextAtOffset"},
922 {impl_GetTextAfterOffset, "GetTextAfterOffset"},
923 {impl_GetStringAtOffset, "GetStringAtOffset"},
924 {impl_GetCharacterAtOffset, "GetCharacterAtOffset"},
925 {impl_GetAttributeValue, "GetAttributeValue"},
926 {impl_GetAttributes, "GetAttributes"},
927 {impl_GetDefaultAttributes, "GetDefaultAttributes"},
928 {impl_GetCharacterExtents, "GetCharacterExtents"},
929 {impl_GetOffsetAtPoint, "GetOffsetAtPoint"},
930 {impl_GetNSelections, "GetNSelections"},
931 {impl_GetSelection, "GetSelection"},
932 {impl_AddSelection, "AddSelection"},
933 {impl_RemoveSelection, "RemoveSelection"},
934 {impl_SetSelection, "SetSelection"},
935 {impl_GetRangeExtents, "GetRangeExtents"},
936 {impl_GetBoundedRanges, "GetBoundedRanges"},
937 {impl_GetAttributeRun, "GetAttributeRun"},
938 {impl_GetDefaultAttributeSet, "GetDefaultAttributeSet"},
939 {impl_ScrollSubstringTo, "ScrollSubstringTo"},
940 {impl_ScrollSubstringToPoint, "ScrollSubstringToPoint"},
944 static DRouteProperty properties[] = {
945 {impl_get_CharacterCount, NULL, "CharacterCount"},
946 {impl_get_CaretOffset, NULL, "CaretOffset"},
951 spi_initialize_text (DRoutePath * path)
953 spi_atk_add_interface (path,
954 ATSPI_DBUS_INTERFACE_TEXT, spi_org_a11y_atspi_Text, methods, properties);