1 /* GAIL - The GNOME Accessibility Implementation Library
2 * Copyright 2001, 2002, 2003 Sun Microsystems Inc.
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the
16 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17 * Boston, MA 02111-1307, USA.
24 #include "gtkentryaccessible.h"
25 #include "gtkcomboboxaccessible.h"
29 static void insert_text_cb (GtkEditable *editable,
33 static void delete_text_cb (GtkEditable *editable,
36 static void changed_cb (GtkEditable *editable);
38 static gboolean check_for_selection_change (GtkEntryAccessible *entry,
42 static void atk_editable_text_interface_init (AtkEditableTextIface *iface);
43 static void atk_text_interface_init (AtkTextIface *iface);
44 static void atk_action_interface_init (AtkActionIface *iface);
47 G_DEFINE_TYPE_WITH_CODE (GtkEntryAccessible, _gtk_entry_accessible, GTK_TYPE_WIDGET_ACCESSIBLE,
48 G_IMPLEMENT_INTERFACE (ATK_TYPE_EDITABLE_TEXT, atk_editable_text_interface_init)
49 G_IMPLEMENT_INTERFACE (ATK_TYPE_TEXT, atk_text_interface_init)
50 G_IMPLEMENT_INTERFACE (ATK_TYPE_ACTION, atk_action_interface_init))
54 gtk_entry_accessible_ref_state_set (AtkObject *accessible)
56 AtkStateSet *state_set;
60 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (accessible));
64 state_set = ATK_OBJECT_CLASS (_gtk_entry_accessible_parent_class)->ref_state_set (accessible);
66 g_object_get (G_OBJECT (widget), "editable", &value, NULL);
68 atk_state_set_add_state (state_set, ATK_STATE_EDITABLE);
69 atk_state_set_add_state (state_set, ATK_STATE_SINGLE_LINE);
74 static AtkAttributeSet *
75 gtk_entry_accessible_get_attributes (AtkObject *accessible)
78 AtkAttributeSet *attributes;
79 AtkAttribute *placeholder_text;
82 attributes = ATK_OBJECT_CLASS (_gtk_entry_accessible_parent_class)->get_attributes (accessible);
84 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (accessible));
88 text = gtk_entry_get_placeholder_text (GTK_ENTRY (widget));
92 placeholder_text = g_malloc (sizeof (AtkAttribute));
93 placeholder_text->name = g_strdup ("placeholder-text");
94 placeholder_text->value = g_strdup (text);
96 attributes = g_slist_append (attributes, placeholder_text);
102 gtk_entry_accessible_initialize (AtkObject *obj,
106 GtkEntryAccessible *gtk_entry_accessible;
107 gint start_pos, end_pos;
109 ATK_OBJECT_CLASS (_gtk_entry_accessible_parent_class)->initialize (obj, data);
111 gtk_entry_accessible = GTK_ENTRY_ACCESSIBLE (obj);
113 entry = GTK_ENTRY (data);
114 gtk_editable_get_selection_bounds (GTK_EDITABLE (entry),
115 &start_pos, &end_pos);
116 gtk_entry_accessible->cursor_position = end_pos;
117 gtk_entry_accessible->selection_bound = start_pos;
119 /* Set up signal callbacks */
120 g_signal_connect (entry, "insert-text", G_CALLBACK (insert_text_cb), NULL);
121 g_signal_connect (entry, "delete-text", G_CALLBACK (delete_text_cb), NULL);
122 g_signal_connect (entry, "changed", G_CALLBACK (changed_cb), NULL);
124 if (gtk_entry_get_visibility (entry))
125 obj->role = ATK_ROLE_TEXT;
127 obj->role = ATK_ROLE_PASSWORD_TEXT;
131 gtk_entry_accessible_notify_gtk (GObject *obj,
137 GtkEntryAccessible* entry;
139 widget = GTK_WIDGET (obj);
140 atk_obj = gtk_widget_get_accessible (widget);
141 gtk_entry = GTK_ENTRY (widget);
142 entry = GTK_ENTRY_ACCESSIBLE (atk_obj);
144 if (g_strcmp0 (pspec->name, "cursor-position") == 0)
146 if (check_for_selection_change (entry, gtk_entry))
147 g_signal_emit_by_name (atk_obj, "text-selection-changed");
149 * The entry cursor position has moved so generate the signal.
151 g_signal_emit_by_name (atk_obj, "text-caret-moved",
152 entry->cursor_position);
154 else if (g_strcmp0 (pspec->name, "selection-bound") == 0)
156 if (check_for_selection_change (entry, gtk_entry))
157 g_signal_emit_by_name (atk_obj, "text-selection-changed");
159 else if (g_strcmp0 (pspec->name, "editable") == 0)
163 g_object_get (obj, "editable", &value, NULL);
164 atk_object_notify_state_change (atk_obj, ATK_STATE_EDITABLE, value);
166 else if (g_strcmp0 (pspec->name, "visibility") == 0)
171 visibility = gtk_entry_get_visibility (gtk_entry);
172 new_role = visibility ? ATK_ROLE_TEXT : ATK_ROLE_PASSWORD_TEXT;
173 atk_object_set_role (atk_obj, new_role);
176 GTK_WIDGET_ACCESSIBLE_CLASS (_gtk_entry_accessible_parent_class)->notify_gtk (obj, pspec);
180 gtk_entry_accessible_get_index_in_parent (AtkObject *accessible)
183 * If the parent widget is a combo box then the index is 1
184 * otherwise do the normal thing.
186 if (accessible->accessible_parent)
187 if (GTK_IS_COMBO_BOX_ACCESSIBLE (accessible->accessible_parent))
190 return ATK_OBJECT_CLASS (_gtk_entry_accessible_parent_class)->get_index_in_parent (accessible);
194 _gtk_entry_accessible_class_init (GtkEntryAccessibleClass *klass)
196 AtkObjectClass *class = ATK_OBJECT_CLASS (klass);
197 GtkWidgetAccessibleClass *widget_class = (GtkWidgetAccessibleClass*)klass;
199 class->ref_state_set = gtk_entry_accessible_ref_state_set;
200 class->get_index_in_parent = gtk_entry_accessible_get_index_in_parent;
201 class->initialize = gtk_entry_accessible_initialize;
202 class->get_attributes = gtk_entry_accessible_get_attributes;
204 widget_class->notify_gtk = gtk_entry_accessible_notify_gtk;
208 _gtk_entry_accessible_init (GtkEntryAccessible *entry)
210 entry->length_insert = 0;
211 entry->length_delete = 0;
212 entry->cursor_position = 0;
213 entry->selection_bound = 0;
217 gtk_entry_accessible_get_text (AtkText *atk_text,
224 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (atk_text));
228 /* FIXME: is this acceptable ? */
229 if (!gtk_entry_get_visibility (GTK_ENTRY (widget)))
230 return g_strdup ("");
232 text = gtk_entry_get_text (GTK_ENTRY (widget));
235 return g_utf8_substring (text, start_pos, end_pos > -1 ? end_pos : g_utf8_strlen (text, -1));
241 gtk_entry_accessible_get_text_before_offset (AtkText *text,
243 AtkTextBoundary boundary_type,
249 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
253 /* FIXME: is this acceptable ? */
254 if (!gtk_entry_get_visibility (GTK_ENTRY (widget)))
255 return g_strdup ("");
257 return _gtk_pango_get_text_before (gtk_entry_get_layout (GTK_ENTRY (widget)),
258 boundary_type, offset,
259 start_offset, end_offset);
263 gtk_entry_accessible_get_text_at_offset (AtkText *text,
265 AtkTextBoundary boundary_type,
271 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
275 /* FIXME: is this acceptable ? */
276 if (!gtk_entry_get_visibility (GTK_ENTRY (widget)))
277 return g_strdup ("");
279 return _gtk_pango_get_text_at (gtk_entry_get_layout (GTK_ENTRY (widget)),
280 boundary_type, offset,
281 start_offset, end_offset);
285 gtk_entry_accessible_get_text_after_offset (AtkText *text,
287 AtkTextBoundary boundary_type,
293 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
297 /* FIXME: is this acceptable ? */
298 if (!gtk_entry_get_visibility (GTK_ENTRY (widget)))
299 return g_strdup ("");
301 return _gtk_pango_get_text_after (gtk_entry_get_layout (GTK_ENTRY (widget)),
302 boundary_type, offset,
303 start_offset, end_offset);
307 gtk_entry_accessible_get_character_count (AtkText *atk_text)
312 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (atk_text));
316 text = gtk_entry_get_text (GTK_ENTRY (widget));
319 return g_utf8_strlen (text, -1);
325 gtk_entry_accessible_get_caret_offset (AtkText *text)
329 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
333 return gtk_editable_get_position (GTK_EDITABLE (widget));
337 gtk_entry_accessible_set_caret_offset (AtkText *text,
342 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
346 gtk_editable_set_position (GTK_EDITABLE (widget), offset);
351 static AtkAttributeSet *
352 add_text_attribute (AtkAttributeSet *attributes,
353 AtkTextAttribute attr,
358 at = g_new (AtkAttribute, 1);
359 at->name = g_strdup (atk_text_attribute_get_name (attr));
360 at->value = g_strdup (atk_text_attribute_get_value (attr, i));
362 return g_slist_prepend (attributes, at);
365 static AtkAttributeSet *
366 gtk_entry_accessible_get_run_attributes (AtkText *text,
372 AtkAttributeSet *attributes;
374 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
379 attributes = add_text_attribute (attributes, ATK_TEXT_ATTR_DIRECTION,
380 gtk_widget_get_direction (widget));
381 attributes = _gtk_pango_get_run_attributes (attributes,
382 gtk_entry_get_layout (GTK_ENTRY (widget)),
390 static AtkAttributeSet *
391 gtk_entry_accessible_get_default_attributes (AtkText *text)
394 AtkAttributeSet *attributes;
396 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
401 attributes = add_text_attribute (attributes, ATK_TEXT_ATTR_DIRECTION,
402 gtk_widget_get_direction (widget));
403 attributes = _gtk_pango_get_default_attributes (attributes,
404 gtk_entry_get_layout (GTK_ENTRY (widget)));
405 attributes = _gtk_style_context_get_attributes (attributes,
406 gtk_widget_get_style_context (widget),
407 gtk_widget_get_state_flags (widget));
413 gtk_entry_accessible_get_character_extents (AtkText *text,
423 PangoRectangle char_rect;
424 const gchar *entry_text;
425 gint index, x_layout, y_layout;
427 gint x_window, y_window;
429 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
433 entry = GTK_ENTRY (widget);
435 gtk_entry_get_layout_offsets (entry, &x_layout, &y_layout);
436 entry_text = gtk_entry_get_text (entry);
437 index = g_utf8_offset_to_pointer (entry_text, offset) - entry_text;
438 pango_layout_index_to_pos (gtk_entry_get_layout (entry), index, &char_rect);
439 pango_extents_to_pixels (&char_rect, NULL);
441 window = gtk_widget_get_window (widget);
442 gdk_window_get_origin (window, &x_window, &y_window);
444 *x = x_window + x_layout + char_rect.x;
445 *y = y_window + y_layout + char_rect.y;
446 *width = char_rect.width;
447 *height = char_rect.height;
449 if (coords == ATK_XY_WINDOW)
451 window = gdk_window_get_toplevel (window);
452 gdk_window_get_origin (window, &x_window, &y_window);
460 gtk_entry_accessible_get_offset_at_point (AtkText *atk_text,
468 gint index, x_layout, y_layout;
469 gint x_window, y_window;
470 gint x_local, y_local;
473 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (atk_text));
477 entry = GTK_ENTRY (widget);
479 gtk_entry_get_layout_offsets (entry, &x_layout, &y_layout);
481 window = gtk_widget_get_window (widget);
482 gdk_window_get_origin (window, &x_window, &y_window);
484 x_local = x - x_layout - x_window;
485 y_local = y - y_layout - y_window;
487 if (coords == ATK_XY_WINDOW)
489 window = gdk_window_get_toplevel (window);
490 gdk_window_get_origin (window, &x_window, &y_window);
495 if (!pango_layout_xy_to_index (gtk_entry_get_layout (entry),
496 x_local * PANGO_SCALE,
497 y_local * PANGO_SCALE,
500 if (x_local < 0 || y_local < 0)
508 text = gtk_entry_get_text (entry);
509 return g_utf8_pointer_to_offset (text, text + index);
516 gtk_entry_accessible_get_n_selections (AtkText *text)
521 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
525 if (gtk_editable_get_selection_bounds (GTK_EDITABLE (widget), &start, &end))
532 gtk_entry_accessible_get_selection (AtkText *text,
539 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
543 if (selection_num != 0)
546 if (gtk_editable_get_selection_bounds (GTK_EDITABLE (widget), start_pos, end_pos))
547 return gtk_editable_get_chars (GTK_EDITABLE (widget), *start_pos, *end_pos);
553 gtk_entry_accessible_add_selection (AtkText *text,
561 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
565 entry = GTK_ENTRY (widget);
567 if (!gtk_editable_get_selection_bounds (GTK_EDITABLE (entry), &start, &end))
569 gtk_editable_select_region (GTK_EDITABLE (entry), start_pos, end_pos);
577 gtk_entry_accessible_remove_selection (AtkText *text,
583 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
587 if (selection_num != 0)
590 if (gtk_editable_get_selection_bounds (GTK_EDITABLE (widget), &start, &end))
592 gtk_editable_select_region (GTK_EDITABLE (widget), end, end);
600 gtk_entry_accessible_set_selection (AtkText *text,
608 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
612 if (selection_num != 0)
615 if (gtk_editable_get_selection_bounds (GTK_EDITABLE (widget), &start, &end))
617 gtk_editable_select_region (GTK_EDITABLE (widget), start_pos, end_pos);
625 gtk_entry_accessible_get_character_at_offset (AtkText *atk_text,
632 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (atk_text));
636 if (!gtk_entry_get_visibility (GTK_ENTRY (widget)))
639 text = gtk_entry_get_text (GTK_ENTRY (widget));
640 if (offset >= g_utf8_strlen (text, -1))
643 index = g_utf8_offset_to_pointer (text, offset);
645 return g_utf8_get_char (index);
649 atk_text_interface_init (AtkTextIface *iface)
651 iface->get_text = gtk_entry_accessible_get_text;
652 iface->get_character_at_offset = gtk_entry_accessible_get_character_at_offset;
653 iface->get_text_before_offset = gtk_entry_accessible_get_text_before_offset;
654 iface->get_text_at_offset = gtk_entry_accessible_get_text_at_offset;
655 iface->get_text_after_offset = gtk_entry_accessible_get_text_after_offset;
656 iface->get_caret_offset = gtk_entry_accessible_get_caret_offset;
657 iface->set_caret_offset = gtk_entry_accessible_set_caret_offset;
658 iface->get_character_count = gtk_entry_accessible_get_character_count;
659 iface->get_n_selections = gtk_entry_accessible_get_n_selections;
660 iface->get_selection = gtk_entry_accessible_get_selection;
661 iface->add_selection = gtk_entry_accessible_add_selection;
662 iface->remove_selection = gtk_entry_accessible_remove_selection;
663 iface->set_selection = gtk_entry_accessible_set_selection;
664 iface->get_run_attributes = gtk_entry_accessible_get_run_attributes;
665 iface->get_default_attributes = gtk_entry_accessible_get_default_attributes;
666 iface->get_character_extents = gtk_entry_accessible_get_character_extents;
667 iface->get_offset_at_point = gtk_entry_accessible_get_offset_at_point;
671 gtk_entry_accessible_set_text_contents (AtkEditableText *text,
676 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
680 if (!gtk_editable_get_editable (GTK_EDITABLE (widget)))
683 gtk_entry_set_text (GTK_ENTRY (widget), string);
687 gtk_entry_accessible_insert_text (AtkEditableText *text,
693 GtkEditable *editable;
695 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
699 editable = GTK_EDITABLE (widget);
700 if (!gtk_editable_get_editable (editable))
703 gtk_editable_insert_text (editable, string, length, position);
704 gtk_editable_set_position (editable, *position);
708 gtk_entry_accessible_copy_text (AtkEditableText *text,
713 GtkEditable *editable;
715 GtkClipboard *clipboard;
717 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
721 if (!gtk_widget_has_screen (widget))
724 editable = GTK_EDITABLE (widget);
725 str = gtk_editable_get_chars (editable, start_pos, end_pos);
726 clipboard = gtk_widget_get_clipboard (widget, GDK_SELECTION_CLIPBOARD);
727 gtk_clipboard_set_text (clipboard, str, -1);
732 gtk_entry_accessible_cut_text (AtkEditableText *text,
737 GtkEditable *editable;
739 GtkClipboard *clipboard;
741 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
745 if (!gtk_widget_has_screen (widget))
748 editable = GTK_EDITABLE (widget);
749 if (!gtk_editable_get_editable (editable))
752 str = gtk_editable_get_chars (editable, start_pos, end_pos);
753 clipboard = gtk_widget_get_clipboard (widget, GDK_SELECTION_CLIPBOARD);
754 gtk_clipboard_set_text (clipboard, str, -1);
755 gtk_editable_delete_text (editable, start_pos, end_pos);
759 gtk_entry_accessible_delete_text (AtkEditableText *text,
764 GtkEditable *editable;
766 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
770 editable = GTK_EDITABLE (widget);
771 if (!gtk_editable_get_editable (editable))
774 gtk_editable_delete_text (editable, start_pos, end_pos);
784 paste_received_cb (GtkClipboard *clipboard,
788 PasteData *paste = data;
791 gtk_editable_insert_text (GTK_EDITABLE (paste->entry), text, -1,
794 g_object_unref (paste->entry);
799 gtk_entry_accessible_paste_text (AtkEditableText *text,
803 GtkEditable *editable;
805 GtkClipboard *clipboard;
807 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
811 if (!gtk_widget_has_screen (widget))
814 editable = GTK_EDITABLE (widget);
815 if (!gtk_editable_get_editable (editable))
818 paste = g_new0 (PasteData, 1);
819 paste->entry = GTK_ENTRY (widget);
820 paste->position = position;
822 g_object_ref (paste->entry);
823 clipboard = gtk_widget_get_clipboard (widget, GDK_SELECTION_CLIPBOARD);
824 gtk_clipboard_request_text (clipboard, paste_received_cb, paste);
828 atk_editable_text_interface_init (AtkEditableTextIface *iface)
830 iface->set_text_contents = gtk_entry_accessible_set_text_contents;
831 iface->insert_text = gtk_entry_accessible_insert_text;
832 iface->copy_text = gtk_entry_accessible_copy_text;
833 iface->cut_text = gtk_entry_accessible_cut_text;
834 iface->delete_text = gtk_entry_accessible_delete_text;
835 iface->paste_text = gtk_entry_accessible_paste_text;
836 iface->set_run_attributes = NULL;
839 /* We connect to GtkEditable::insert-text, since it carries
840 * the information we need. But we delay emitting our own
841 * text_changed::insert signal until the entry has update
842 * all its internal state and emits GtkEntry::changed.
845 insert_text_cb (GtkEditable *editable,
847 gint new_text_length,
850 GtkEntryAccessible *accessible;
852 if (new_text_length == 0)
855 accessible = GTK_ENTRY_ACCESSIBLE (gtk_widget_get_accessible (GTK_WIDGET (editable)));
856 if (accessible->length_insert == 0)
858 accessible->position_insert = *position;
859 accessible->length_insert = g_utf8_strlen (new_text, new_text_length);
863 /* We connect to GtkEditable::delete-text, since it carries
864 * the information we need. But we delay emitting our own
865 * text_changed::delete signal until the entry has update
866 * all its internal state and emits GtkEntry::changed.
869 delete_text_cb (GtkEditable *editable,
873 GtkEntryAccessible *accessible;
879 text = gtk_entry_get_text (GTK_ENTRY (editable));
880 end = g_utf8_strlen (text, -1);
886 accessible = GTK_ENTRY_ACCESSIBLE (gtk_widget_get_accessible (GTK_WIDGET (editable)));
887 if (accessible->length_delete == 0)
889 accessible->position_delete = start;
890 accessible->length_delete = end - start;
894 /* Note the assumption here: A single ::changed emission
895 * will only collect a single deletion/insertion, and there
896 * won't be multiple insertions or deletions in a single
900 changed_cb (GtkEditable *editable)
902 GtkEntryAccessible *accessible;
904 accessible = GTK_ENTRY_ACCESSIBLE (gtk_widget_get_accessible (GTK_WIDGET (editable)));
906 if (accessible->length_delete > 0)
908 g_signal_emit_by_name (accessible,
909 "text-changed::delete",
910 accessible->position_delete,
911 accessible->length_delete);
912 accessible->length_delete = 0;
914 if (accessible->length_insert > 0)
916 g_signal_emit_by_name (accessible,
917 "text-changed::insert",
918 accessible->position_insert,
919 accessible->length_insert);
920 accessible->length_insert = 0;
925 check_for_selection_change (GtkEntryAccessible *accessible,
928 gboolean ret_val = FALSE;
931 if (gtk_editable_get_selection_bounds (GTK_EDITABLE (entry), &start, &end))
933 if (end != accessible->cursor_position ||
934 start != accessible->selection_bound)
936 * This check is here as this function can be called
937 * for notification of selection_bound and current_pos.
938 * The values of current_pos and selection_bound may be the same
939 * for both notifications and we only want to generate one
940 * text_selection_changed signal.
946 /* We had a selection */
947 ret_val = (accessible->cursor_position != accessible->selection_bound);
950 accessible->cursor_position = end;
951 accessible->selection_bound = start;
957 gtk_entry_accessible_do_action (AtkAction *action,
962 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (action));
966 if (!gtk_widget_get_sensitive (widget) || !gtk_widget_get_visible (widget))
972 gtk_widget_activate (widget);
978 gtk_entry_accessible_get_n_actions (AtkAction *action)
984 gtk_entry_accessible_get_keybinding (AtkAction *action,
990 AtkRelation *relation;
992 gpointer target_object;
998 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (action));
1002 set = atk_object_ref_relation_set (ATK_OBJECT (action));
1007 relation = atk_relation_set_get_relation_by_type (set, ATK_RELATION_LABELLED_BY);
1010 target = atk_relation_get_target (relation);
1012 target_object = g_ptr_array_index (target, 0);
1013 label = gtk_accessible_get_widget (GTK_ACCESSIBLE (target_object));
1016 g_object_unref (set);
1018 if (GTK_IS_LABEL (label))
1020 key_val = gtk_label_get_mnemonic_keyval (GTK_LABEL (label));
1021 if (key_val != GDK_KEY_VoidSymbol)
1022 return gtk_accelerator_name (key_val, GDK_MOD1_MASK);
1029 gtk_entry_accessible_action_get_name (AtkAction *action,
1039 atk_action_interface_init (AtkActionIface *iface)
1041 iface->do_action = gtk_entry_accessible_do_action;
1042 iface->get_n_actions = gtk_entry_accessible_get_n_actions;
1043 iface->get_keybinding = gtk_entry_accessible_get_keybinding;
1044 iface->get_name = gtk_entry_accessible_action_get_name;