static AtkAttributeSet* gail_text_cell_get_default_attributes (AtkText *text) { GailRendererCell *gail_renderer; GtkCellRendererText *gtk_renderer; AtkAttributeSet *attrib_set = NULL; PangoLayout *layout; AtkObject *parent; GtkWidget *widget; gail_renderer = GAIL_RENDERER_CELL (text); gtk_renderer = GTK_CELL_RENDERER_TEXT (gail_renderer->renderer); parent = atk_object_get_parent (ATK_OBJECT (text)); if (GAIL_IS_CONTAINER_CELL (parent)) parent = atk_object_get_parent (parent); g_return_val_if_fail (GAIL_IS_CELL_PARENT (parent), NULL); widget = GTK_ACCESSIBLE (parent)->widget; layout = create_pango_layout (gtk_renderer, widget), attrib_set = gail_misc_get_default_attributes (attrib_set, layout, widget); g_object_unref (G_OBJECT (layout)); return attrib_set; }
static void gail_text_cell_get_character_extents (AtkText *text, gint offset, gint *x, gint *y, gint *width, gint *height, AtkCoordType coords) { GailRendererCell *gail_renderer; GtkCellRendererText *gtk_renderer; GdkRectangle rendered_rect; GtkWidget *widget; AtkObject *parent; PangoRectangle char_rect; PangoLayout *layout; gint x_offset, y_offset, index, cell_height, cell_width; if (!GAIL_TEXT_CELL (text)->cell_text) { *x = *y = *height = *width = 0; return; } if (offset < 0 || offset >= GAIL_TEXT_CELL (text)->cell_length) { *x = *y = *height = *width = 0; return; } gail_renderer = GAIL_RENDERER_CELL (text); gtk_renderer = GTK_CELL_RENDERER_TEXT (gail_renderer->renderer); /* * Thus would be inconsistent with the cache */ gail_return_if_fail (gtk_renderer->text); parent = atk_object_get_parent (ATK_OBJECT (text)); if (GAIL_IS_CONTAINER_CELL (parent)) parent = atk_object_get_parent (parent); widget = GTK_ACCESSIBLE (parent)->widget; g_return_if_fail (GAIL_IS_CELL_PARENT (parent)); gail_cell_parent_get_cell_area (GAIL_CELL_PARENT (parent), GAIL_CELL (text), &rendered_rect); gtk_cell_renderer_get_size (GTK_CELL_RENDERER (gtk_renderer), widget, &rendered_rect, &x_offset, &y_offset, &cell_width, &cell_height); layout = create_pango_layout (gtk_renderer, widget); index = g_utf8_offset_to_pointer (gtk_renderer->text, offset) - gtk_renderer->text; pango_layout_index_to_pos (layout, index, &char_rect); gail_misc_get_extents_from_pango_rectangle (widget, &char_rect, x_offset + rendered_rect.x + gail_renderer->renderer->xpad, y_offset + rendered_rect.y + gail_renderer->renderer->ypad, x, y, width, height, coords); g_object_unref (layout); return; }
/* Check to use GetTopLevelViewWindow */ static AtkObject* search_for_parent_window(AtkObject* object) { AtkObject* parent = NULL; for (parent = atk_object_get_parent(object); (parent != NULL) && (atk_object_get_role(parent) != ATK_ROLE_WINDOW); parent = atk_object_get_parent(parent)); return parent; }
GtkWidget * get_widget (GtkTextCellAccessible *text) { AtkObject *parent; parent = atk_object_get_parent (ATK_OBJECT (text)); if (GTK_IS_CONTAINER_CELL_ACCESSIBLE (parent)) parent = atk_object_get_parent (parent); return gtk_accessible_get_widget (GTK_ACCESSIBLE (parent)); }
static gint gail_text_cell_get_offset_at_point (AtkText *text, gint x, gint y, AtkCoordType coords) { AtkObject *parent; GailRendererCell *gail_renderer; GtkCellRendererText *gtk_renderer; GtkWidget *widget; GdkRectangle rendered_rect; PangoLayout *layout; gint x_offset, y_offset, index; if (!GAIL_TEXT_CELL (text)->cell_text) return -1; gail_renderer = GAIL_RENDERER_CELL (text); gtk_renderer = GTK_CELL_RENDERER_TEXT (gail_renderer->renderer); parent = atk_object_get_parent (ATK_OBJECT (text)); g_return_val_if_fail (gtk_renderer->text, -1); if (GAIL_IS_CONTAINER_CELL (parent)) parent = atk_object_get_parent (parent); widget = GTK_ACCESSIBLE (parent)->widget; g_return_val_if_fail (GAIL_IS_CELL_PARENT (parent), -1); gail_cell_parent_get_cell_area (GAIL_CELL_PARENT (parent), GAIL_CELL (text), &rendered_rect); gtk_cell_renderer_get_size (GTK_CELL_RENDERER (gtk_renderer), widget, &rendered_rect, &x_offset, &y_offset, NULL, NULL); layout = create_pango_layout (gtk_renderer, widget); index = gail_misc_get_index_at_point_in_layout (widget, layout, x_offset + rendered_rect.x + gail_renderer->renderer->xpad, y_offset + rendered_rect.y + gail_renderer->renderer->ypad, x, y, coords); g_object_unref (layout); if (index == -1) { if (coords == ATK_XY_WINDOW || coords == ATK_XY_SCREEN) return g_utf8_strlen (gtk_renderer->text, -1); return index; } else return g_utf8_pointer_to_offset (gtk_renderer->text, gtk_renderer->text + index); }
static AtkStateSet * gtk_menu_item_accessible_ref_state_set (AtkObject *obj) { AtkObject *menu_item; AtkStateSet *state_set, *parent_state_set; state_set = ATK_OBJECT_CLASS (_gtk_menu_item_accessible_parent_class)->ref_state_set (obj); menu_item = atk_object_get_parent (obj); if (menu_item) { if (!GTK_IS_MENU_ITEM (gtk_accessible_get_widget (GTK_ACCESSIBLE (menu_item)))) return state_set; parent_state_set = atk_object_ref_state_set (menu_item); if (!atk_state_set_contains_state (parent_state_set, ATK_STATE_SELECTED)) { atk_state_set_remove_state (state_set, ATK_STATE_FOCUSED); atk_state_set_remove_state (state_set, ATK_STATE_SHOWING); } g_object_unref (parent_state_set); } return state_set; }
static gboolean is_combo_window (GtkWidget *widget) { GtkWidget *child; AtkObject *obj; child = gtk_bin_get_child (GTK_BIN (widget)); if (!GTK_IS_EVENT_BOX (child)) return FALSE; child = gtk_bin_get_child (GTK_BIN (child)); if (!GTK_IS_FRAME (child)) return FALSE; child = gtk_bin_get_child (GTK_BIN (child)); if (!GTK_IS_SCROLLED_WINDOW (child)) return FALSE; obj = gtk_widget_get_accessible (child); obj = atk_object_get_parent (obj); return FALSE; }
static void cell_destroyed (GucharmapChartableCellAccessible *cell) { GucharmapChartableAccessiblePrivate *priv; AtkObject *parent; GPtrArray *cells; guint n_cells, n; GucharmapChartableAccessible *accessible; parent = atk_object_get_parent (ATK_OBJECT (cell)); accessible = GUCHARMAP_CHARTABLE_ACCESSIBLE (parent); priv = GET_PRIVATE (accessible); cells = priv->cells; n_cells = cells->len; for (n = 0; n < n_cells; ++n) { GucharmapChartableCellAccessible *another_cell = g_ptr_array_index (cells, n); if (another_cell == cell) { g_ptr_array_remove_index_fast (priv->cells, n); return; } } g_warning ("Cell destroyed but was not in the cells cache?\n"); }
AccessibilityUIElement AccessibilityUIElement::parentElement() { ASSERT(m_element); AtkObject* parent = atk_object_get_parent(ATK_OBJECT(m_element)); return parent ? AccessibilityUIElement(parent) : 0; }
PassRefPtr<AccessibilityUIElement> AccessibilityUIElement::parentElement() { if (!ATK_IS_OBJECT(m_element.get())) return nullptr; AtkObject* parent = atk_object_get_parent(ATK_OBJECT(m_element.get())); return parent ? AccessibilityUIElement::create(parent) : nullptr; }
static void ensure_menus_unposted (GtkMenuItemAccessible *menu_item) { AtkObject *parent; GtkWidget *widget; parent = atk_object_get_parent (ATK_OBJECT (menu_item)); while (parent) { widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (parent)); if (GTK_IS_MENU (widget)) { if (gtk_widget_get_mapped (widget)) gtk_menu_shell_cancel (GTK_MENU_SHELL (widget)); return; } parent = atk_object_get_parent (parent); } }
static void wnck_workspace_accessible_get_extents (AtkComponent *component, int *x, int *y, int *width, int *height, AtkCoordType coords) { AtkGObjectAccessible *atk_gobj; WnckPager *pager; GdkRectangle rect; GtkWidget *widget; AtkObject *parent; GObject *g_obj; int px, py; g_return_if_fail (WNCK_IS_WORKSPACE_ACCESSIBLE (component)); atk_gobj = ATK_GOBJECT_ACCESSIBLE (component); g_obj = atk_gobject_accessible_get_object (atk_gobj); if (g_obj == NULL) return; g_return_if_fail (WNCK_IS_WORKSPACE (g_obj)); parent = atk_object_get_parent (ATK_OBJECT(component)); #if GTK_CHECK_VERSION(2,21,0) widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (parent)); #else widget = GTK_ACCESSIBLE (parent)->widget; #endif if (widget == NULL) { /* *State is defunct */ return; } g_return_if_fail (WNCK_IS_PAGER (widget)); pager = WNCK_PAGER (widget); g_return_if_fail (WNCK_IS_PAGER (pager)); atk_component_get_position (ATK_COMPONENT (parent), &px,&py, coords); _wnck_pager_get_workspace_rect (pager, WNCK_WORKSPACE_ACCESSIBLE (component)->index, &rect); *x = rect.x + px; *y = rect.y + py; *height = rect.height; *width = rect.width; }
static void menu_item_selection (GtkItem *item, gboolean selected) { AtkObject *obj, *parent; obj = gtk_widget_get_accessible (GTK_WIDGET (item)); atk_object_notify_state_change (obj, ATK_STATE_SELECTED, selected); parent = atk_object_get_parent (obj); g_signal_emit_by_name (parent, "selection_changed"); }
static const gchar * ea_day_view_main_item_get_name (AtkObject *accessible) { AtkObject *parent; g_return_val_if_fail (EA_IS_DAY_VIEW_MAIN_ITEM (accessible), NULL); parent = atk_object_get_parent (accessible); if (!parent) return NULL; return atk_object_get_name (parent); }
/* * CORBA Accessibility::Accessible::get_parent method implementation */ static Accessibility_Accessible impl_accessibility_accessible_get_parent (PortableServer_Servant servant, CORBA_Environment *ev) { AtkObject *parent; AtkObject *object = get_atkobject_from_servant (servant); g_return_val_if_fail (object != NULL, CORBA_OBJECT_NIL); parent = atk_object_get_parent (object); return spi_accessible_new_return (parent, FALSE, ev); }
static void ensure_menus_unposted (GailMenuItem *menu_item) { AtkObject *parent; GtkWidget *widget; parent = atk_object_get_parent (ATK_OBJECT (menu_item)); while (parent) { if (GTK_IS_ACCESSIBLE (parent)) { widget = GTK_ACCESSIBLE (parent)->widget; if (GTK_IS_MENU (widget)) { if (GTK_WIDGET_MAPPED (widget)) gtk_menu_shell_cancel (GTK_MENU_SHELL (widget)); return; } } parent = atk_object_get_parent (parent); } }
static gboolean configure_event_watcher (GSignalInvocationHint *hint, guint n_param_values, const GValue *param_values, gpointer data) { GtkAllocation allocation; GObject *object; GtkWidget *widget; AtkObject *atk_obj; AtkObject *parent; GdkEvent *event; gchar *signal_name; object = g_value_get_object (param_values + 0); if (!GTK_IS_WINDOW (object)) return FALSE; event = g_value_get_boxed (param_values + 1); if (event->type != GDK_CONFIGURE) return FALSE; widget = GTK_WIDGET (object); gtk_widget_get_allocation (widget, &allocation); if (allocation.x == ((GdkEventConfigure *)event)->x && allocation.y == ((GdkEventConfigure *)event)->y && allocation.width == ((GdkEventConfigure *)event)->width && allocation.height == ((GdkEventConfigure *)event)->height) return TRUE; if (allocation.width != ((GdkEventConfigure *)event)->width || allocation.height != ((GdkEventConfigure *)event)->height) signal_name = "resize"; else signal_name = "move"; atk_obj = gtk_widget_get_accessible (widget); if (GTK_IS_WINDOW_ACCESSIBLE (atk_obj)) { parent = atk_object_get_parent (atk_obj); if (parent == atk_get_root ()) g_signal_emit_by_name (atk_obj, signal_name); return TRUE; } return FALSE; }
static void subcell_destroyed (gpointer data) { GalA11yECell *cell; AtkObject *parent; GalA11yECellVbox *gaev; g_return_if_fail (GAL_A11Y_IS_E_CELL (data)); cell = GAL_A11Y_E_CELL (data); parent = atk_object_get_parent (ATK_OBJECT (cell)); g_return_if_fail (GAL_A11Y_IS_E_CELL_VBOX (parent)); gaev = GAL_A11Y_E_CELL_VBOX (parent); if (cell->view_col < gaev->a11y_subcell_count) gaev->a11y_subcells[cell->view_col] = NULL; }
static gint gtk_cell_accessible_get_index_in_parent (AtkObject *obj) { GtkCellAccessible *cell; AtkObject *parent; cell = GTK_CELL_ACCESSIBLE (obj); parent = atk_object_get_parent (obj); if (GTK_IS_CONTAINER_CELL_ACCESSIBLE (parent)) return g_list_index (GTK_CONTAINER_CELL_ACCESSIBLE (parent)->children, obj); parent = gtk_widget_get_accessible (gtk_accessible_get_widget (GTK_ACCESSIBLE (cell))); if (parent == NULL) return -1; return _gtk_cell_accessible_parent_get_child_index (GTK_CELL_ACCESSIBLE_PARENT (parent), cell); }
static void gail_focus_tracker (AtkObject *focus_object) { /* * Do not report focus on redundant object */ if (focus_object && (atk_object_get_role(focus_object) != ATK_ROLE_REDUNDANT_OBJECT)) { AtkObject *old_focus_object; if (!GTK_IS_ACCESSIBLE (focus_object)) { AtkObject *parent; parent = focus_object; while (1) { parent = atk_object_get_parent (parent); if (parent == NULL) break; if (GTK_IS_ACCESSIBLE (parent)) break; } if (parent) { gail_set_focus_object (focus_object, parent); } } else { old_focus_object = g_object_get_qdata (G_OBJECT (focus_object), quark_focus_object); if (old_focus_object) { g_object_weak_unref (G_OBJECT (old_focus_object), (GWeakNotify) gail_focus_object_destroyed, focus_object); g_object_set_qdata (G_OBJECT (focus_object), quark_focus_object, NULL); g_object_unref (G_OBJECT (focus_object)); } } } }
static gboolean state_event_watcher (GSignalInvocationHint *hint, guint n_param_values, const GValue *param_values, gpointer data) { GObject *object; GtkWidget *widget; AtkObject *atk_obj; AtkObject *parent; GdkEventWindowState *event; gchar *signal_name; object = g_value_get_object (param_values + 0); if (!GTK_IS_WINDOW (object)) return FALSE; event = g_value_get_boxed (param_values + 1); if (event->type == GDK_WINDOW_STATE) return FALSE; widget = GTK_WIDGET (object); if (event->new_window_state & GDK_WINDOW_STATE_MAXIMIZED) signal_name = "maximize"; else if (event->new_window_state & GDK_WINDOW_STATE_ICONIFIED) signal_name = "minimize"; else if (event->new_window_state == 0) signal_name = "restore"; else return TRUE; atk_obj = gtk_widget_get_accessible (widget); if (GTK_IS_WINDOW_ACCESSIBLE (atk_obj)) { parent = atk_object_get_parent (atk_obj); if (parent == atk_get_root ()) g_signal_emit_by_name (atk_obj, signal_name); return TRUE; } return FALSE; }
static void gucharmap_chartable_cell_accessible_get_extents (AtkComponent *component, gint *x, gint *y, gint *width, gint *height, AtkCoordType coord_type) { GucharmapChartableCellAccessible *cell; AtkObject *cell_parent; GucharmapChartable *chartable; GucharmapChartablePrivate *chartable_priv; gint real_x, real_y, real_width, real_height; gint row, column; cell = GUCHARMAP_CHARTABLE_CELL_ACCESSIBLE (component); cell_parent = atk_object_get_parent (ATK_OBJECT (cell)); /* * Is the cell visible on the screen */ chartable = GUCHARMAP_CHARTABLE (cell->widget); chartable_priv = chartable->priv; if (cell->index >= chartable_priv->page_first_cell && cell->index < chartable_priv->page_first_cell + chartable_priv->rows * chartable_priv->cols) { atk_component_get_extents (ATK_COMPONENT (cell_parent), &real_x, &real_y, &real_width, &real_height, coord_type); row = (cell->index - chartable_priv->page_first_cell)/ chartable_priv->cols; column = _gucharmap_chartable_cell_column (chartable, cell->index); *x = real_x + _gucharmap_chartable_x_offset (chartable, column); *y = real_y + _gucharmap_chartable_y_offset (chartable, row); *width = _gucharmap_chartable_column_width (chartable, column); *height = _gucharmap_chartable_row_height (chartable, row); } else { *x = G_MININT; *y = G_MININT; } }
static void menu_item_selection (GtkItem *item, gboolean selected) { AtkObject *obj, *parent; gint i; obj = gtk_widget_get_accessible (GTK_WIDGET (item)); atk_object_notify_state_change (obj, ATK_STATE_SELECTED, selected); for (i = 0; i < atk_object_get_n_accessible_children (obj); i++) { AtkObject *child; child = atk_object_ref_accessible_child (obj, i); atk_object_notify_state_change (child, ATK_STATE_SHOWING, selected); g_object_unref (child); } parent = atk_object_get_parent (obj); g_signal_emit_by_name (parent, "selection_changed"); }
static JSStringRef indexRangeInTable(PlatformUIElement element, bool isRowRange) { GOwnPtr<gchar> rangeString(g_strdup("{0, 0}")); if (!element) return JSStringCreateWithUTF8CString(rangeString.get()); ASSERT(ATK_IS_OBJECT(element)); AtkObject* axTable = atk_object_get_parent(ATK_OBJECT(element)); if (!axTable || !ATK_IS_TABLE(axTable)) return JSStringCreateWithUTF8CString(rangeString.get()); // Look for the cell in the table. gint indexInParent = atk_object_get_index_in_parent(ATK_OBJECT(element)); if (indexInParent == -1) return JSStringCreateWithUTF8CString(rangeString.get()); int row = -1; int column = -1; row = atk_table_get_row_at_index(ATK_TABLE(axTable), indexInParent); column = atk_table_get_column_at_index(ATK_TABLE(axTable), indexInParent); // Get the actual values, if row and columns are valid values. if (row != -1 && column != -1) { int base = 0; int length = 0; if (isRowRange) { base = row; length = atk_table_get_row_extent_at(ATK_TABLE(axTable), row, column); } else { base = column; length = atk_table_get_column_extent_at(ATK_TABLE(axTable), row, column); } rangeString.set(g_strdup_printf("{%d, %d}", base, length)); } return JSStringCreateWithUTF8CString(rangeString.get()); }
static G_CONST_RETURN gchar* gail_item_get_name (AtkObject *obj) { G_CONST_RETURN gchar* name; g_return_val_if_fail (GAIL_IS_ITEM (obj), NULL); name = ATK_OBJECT_CLASS (parent_class)->get_name (obj); if (name == NULL) { /* * Get the label child */ GtkWidget *widget; GtkWidget *label; widget = GTK_ACCESSIBLE (obj)->widget; if (widget == NULL) /* * State is defunct */ return NULL; label = get_label_from_container (widget); if (GTK_IS_LABEL (label)) return gtk_label_get_text (GTK_LABEL(label)); /* * If we have a menu item in a menu attached to a GtkOptionMenu * the label of the selected item is detached from the menu item */ else if (GTK_IS_MENU_ITEM (widget)) { GtkWidget *parent; GtkWidget *attach; GList *list; AtkObject *parent_obj; gint index; parent = gtk_widget_get_parent (widget); if (GTK_IS_MENU (parent)) { attach = gtk_menu_get_attach_widget (GTK_MENU (parent)); if (GTK_IS_OPTION_MENU (attach)) { label = get_label_from_container (attach); if (GTK_IS_LABEL (label)) return gtk_label_get_text (GTK_LABEL(label)); } list = gtk_container_get_children (GTK_CONTAINER (parent)); index = g_list_index (list, widget); if (index < 0 || index > g_list_length (list)) { g_list_free (list); return NULL; } g_list_free (list); parent_obj = atk_object_get_parent (gtk_widget_get_accessible (parent)); if (GTK_IS_ACCESSIBLE (parent_obj)) { parent = GTK_ACCESSIBLE (parent_obj)->widget; if (GTK_IS_COMBO_BOX (parent)) { GtkTreeModel *model; GtkTreeIter iter; GailItem *item; gint n_columns, i; model = gtk_combo_box_get_model (GTK_COMBO_BOX (parent)); item = GAIL_ITEM (obj); if (gtk_tree_model_iter_nth_child (model, &iter, NULL, index)) { n_columns = gtk_tree_model_get_n_columns (model); for (i = 0; i < n_columns; i++) { GValue value = { 0, }; gtk_tree_model_get_value (model, &iter, i, &value); if (G_VALUE_HOLDS_STRING (&value)) { g_free (item->text); item->text = (gchar *) g_value_dup_string (&value); g_value_unset (&value); break; } } } name = item->text; } } } } } return name; }
static dbus_bool_t impl_get_Parent (DBusMessageIter * iter, void *user_data) { AtkObject *obj = (AtkObject *) user_data; AtkObject *parent; DBusMessageIter iter_variant; dbus_uint32_t role; g_return_val_if_fail (ATK_IS_OBJECT (user_data), FALSE); role = spi_accessible_role_from_atk_role (atk_object_get_role (obj)); dbus_message_iter_open_container (iter, DBUS_TYPE_VARIANT, "(so)", &iter_variant); parent = atk_object_get_parent (obj); if (parent == NULL) { /* TODO, move in to a 'Plug' wrapper. */ if (ATK_IS_PLUG (obj)) { char *id = g_object_get_data (G_OBJECT (obj), "dbus-plug-parent"); char *bus_parent; char *path_parent; if (id) { bus_parent = g_strdup (id); if (bus_parent && (path_parent = g_utf8_strchr (bus_parent + 1, -1, ':'))) { DBusMessageIter iter_parent; *(path_parent++) = '\0'; dbus_message_iter_open_container (&iter_variant, DBUS_TYPE_STRUCT, NULL, &iter_parent); dbus_message_iter_append_basic (&iter_parent, DBUS_TYPE_STRING, &bus_parent); dbus_message_iter_append_basic (&iter_parent, DBUS_TYPE_OBJECT_PATH, &path_parent); dbus_message_iter_close_container (&iter_variant, &iter_parent); } else { spi_object_append_null_reference (&iter_variant); } } else { spi_object_append_null_reference (&iter_variant); } } else if (role != ATSPI_ROLE_APPLICATION) spi_object_append_null_reference (&iter_variant); else spi_object_append_desktop_reference (&iter_variant); } else { spi_object_append_reference (&iter_variant, parent); } dbus_message_iter_close_container (iter, &iter_variant); return TRUE; }
static void _check_object (AtkObject *obj) { AtkRole role; static G_CONST_RETURN char *name = NULL; static gboolean first_time = TRUE; role = atk_object_get_role (obj); if (role == ATK_ROLE_PUSH_BUTTON) /* * Find the specified optionmenu item */ { AtkRole valid_roles[NUM_VALID_ROLES]; AtkObject *atk_option_menu; GtkWidget *widget; if (name == NULL) { name = g_getenv ("TEST_ACCESSIBLE_NAME"); if (name == NULL) name = "foo"; } valid_roles[0] = ATK_ROLE_PUSH_BUTTON; atk_option_menu = find_object_by_accessible_name_and_role (obj, name, valid_roles, NUM_VALID_ROLES); if (atk_option_menu == NULL) { g_print ("Object not found for %s\n", name); return; } else { g_print ("Object found for %s\n", name); } g_assert (GTK_IS_ACCESSIBLE (atk_option_menu)); widget = GTK_ACCESSIBLE (atk_option_menu)->widget; g_assert (GTK_IS_OPTION_MENU (widget)); if (first_time) first_time = FALSE; else return; /* * This action opens the GtkOptionMenu whose name is "foo" or whatever * was specified in the environment variable TEST_ACCESSIBLE_NAME */ atk_action_do_action (ATK_ACTION (atk_option_menu), 0); } else if ((role == ATK_ROLE_MENU_ITEM) || (role == ATK_ROLE_CHECK_MENU_ITEM) || (role == ATK_ROLE_RADIO_MENU_ITEM) || (role == ATK_ROLE_TEAR_OFF_MENU_ITEM)) { AtkObject *parent, *child; AtkRole parent_role; /* * If we receive focus while waiting for the menu to be closed * we return immediately */ if (doing_action) return; parent = atk_object_get_parent (obj); parent_role = atk_object_get_role (parent); g_assert (parent_role == ATK_ROLE_MENU); child = atk_object_ref_accessible_child (parent, 1); doing_action = TRUE; gtk_timeout_add (5000, _do_menu_item_action, child); } else { G_CONST_RETURN char *accessible_name; accessible_name = atk_object_get_name (obj); if (accessible_name) { g_print ("Name: %s\n", accessible_name); } else if (GTK_IS_ACCESSIBLE (obj)) { GtkWidget *widget = GTK_ACCESSIBLE (obj)->widget; g_print ("Type: %s\n", g_type_name (G_OBJECT_TYPE (widget))); } if (role == ATK_ROLE_TABLE) { gint n_cols, i; n_cols = atk_table_get_n_columns (ATK_TABLE (obj)); g_print ("Number of Columns: %d\n", n_cols); for (i = 0; i < n_cols; i++) { AtkObject *header; header = atk_table_get_column_header (ATK_TABLE (obj), i); g_print ("header: %s %s\n", g_type_name (G_OBJECT_TYPE (header)), atk_object_get_name (header)); } } } }
static void gtk_text_cell_accessible_get_character_extents (AtkText *text, gint offset, gint *x, gint *y, gint *width, gint *height, AtkCoordType coords) { GtkRendererCellAccessible *gail_renderer; GtkRequisition min_size; GtkCellRendererText *gtk_renderer; GdkRectangle rendered_rect; GtkWidget *widget; AtkObject *parent; PangoRectangle char_rect; PangoLayout *layout; gchar *renderer_text; gfloat xalign, yalign; gint x_offset, y_offset, index; gint xpad, ypad; gint x_window, y_window, x_toplevel, y_toplevel; if (!GTK_TEXT_CELL_ACCESSIBLE (text)->cell_text) { *x = *y = *height = *width = 0; return; } if (offset < 0 || offset >= GTK_TEXT_CELL_ACCESSIBLE (text)->cell_length) { *x = *y = *height = *width = 0; return; } gail_renderer = GTK_RENDERER_CELL_ACCESSIBLE (text); gtk_renderer = GTK_CELL_RENDERER_TEXT (gail_renderer->renderer); g_object_get (gtk_renderer, "text", &renderer_text, NULL); if (text == NULL) { g_free (renderer_text); return; } parent = atk_object_get_parent (ATK_OBJECT (text)); if (GTK_IS_CONTAINER_CELL_ACCESSIBLE (parent)) parent = atk_object_get_parent (parent); widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (parent)); g_return_if_fail (GTK_IS_CELL_ACCESSIBLE_PARENT (parent)); _gtk_cell_accessible_parent_get_cell_area (GTK_CELL_ACCESSIBLE_PARENT (parent), GTK_CELL_ACCESSIBLE (text), &rendered_rect); gtk_cell_renderer_get_preferred_size (GTK_CELL_RENDERER (gtk_renderer), widget, &min_size, NULL); gtk_cell_renderer_get_alignment (GTK_CELL_RENDERER (gtk_renderer), &xalign, &yalign); if (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL) xalign = 1.0 - xalign; x_offset = MAX (0, xalign * (rendered_rect.width - min_size.width)); y_offset = MAX (0, yalign * (rendered_rect.height - min_size.height)); layout = create_pango_layout (GTK_TEXT_CELL_ACCESSIBLE (text)); index = g_utf8_offset_to_pointer (renderer_text, offset) - renderer_text; pango_layout_index_to_pos (layout, index, &char_rect); gtk_cell_renderer_get_padding (gail_renderer->renderer, &xpad, &ypad); get_origins (widget, &x_window, &y_window, &x_toplevel, &y_toplevel); *x = (char_rect.x / PANGO_SCALE) + x_offset + rendered_rect.x + xpad + x_window; *y = (char_rect.y / PANGO_SCALE) + y_offset + rendered_rect.y + ypad + y_window; *height = char_rect.height / PANGO_SCALE; *width = char_rect.width / PANGO_SCALE; if (coords == ATK_XY_WINDOW) { *x -= x_toplevel; *y -= y_toplevel; } else if (coords != ATK_XY_SCREEN) { *x = 0; *y = 0; *height = 0; *width = 0; } g_free (renderer_text); g_object_unref (layout); }
static gint gtk_text_cell_accessible_get_offset_at_point (AtkText *text, gint x, gint y, AtkCoordType coords) { AtkObject *parent; GtkRendererCellAccessible *gail_renderer; GtkCellRendererText *gtk_renderer; GtkRequisition min_size; GtkWidget *widget; GdkRectangle rendered_rect; PangoLayout *layout; gchar *renderer_text; gfloat xalign, yalign; gint x_offset, y_offset, index; gint xpad, ypad; gint x_window, y_window, x_toplevel, y_toplevel; gint x_temp, y_temp; gboolean ret; if (!GTK_TEXT_CELL_ACCESSIBLE (text)->cell_text) return -1; gail_renderer = GTK_RENDERER_CELL_ACCESSIBLE (text); gtk_renderer = GTK_CELL_RENDERER_TEXT (gail_renderer->renderer); parent = atk_object_get_parent (ATK_OBJECT (text)); g_object_get (gtk_renderer, "text", &renderer_text, NULL); if (text == NULL) { g_free (renderer_text); return -1; } if (GTK_IS_CONTAINER_CELL_ACCESSIBLE (parent)) parent = atk_object_get_parent (parent); widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (parent)); g_return_val_if_fail (GTK_IS_CELL_ACCESSIBLE_PARENT (parent), -1); _gtk_cell_accessible_parent_get_cell_area (GTK_CELL_ACCESSIBLE_PARENT (parent), GTK_CELL_ACCESSIBLE (text), &rendered_rect); gtk_cell_renderer_get_preferred_size (GTK_CELL_RENDERER (gtk_renderer), widget, &min_size, NULL); gtk_cell_renderer_get_alignment (GTK_CELL_RENDERER (gtk_renderer), &xalign, &yalign); if (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL) xalign = 1.0 - xalign; x_offset = MAX (0, xalign * (rendered_rect.width - min_size.width)); y_offset = MAX (0, yalign * (rendered_rect.height - min_size.height)); layout = create_pango_layout (GTK_TEXT_CELL_ACCESSIBLE (text)); gtk_cell_renderer_get_padding (gail_renderer->renderer, &xpad, &ypad); get_origins (widget, &x_window, &y_window, &x_toplevel, &y_toplevel); x_temp = x - (x_offset + rendered_rect.x + xpad) - x_window; y_temp = y - (y_offset + rendered_rect.y + ypad) - y_window; if (coords == ATK_XY_WINDOW) { x_temp += x_toplevel; y_temp += y_toplevel; } else if (coords != ATK_XY_SCREEN) index = -1; ret = pango_layout_xy_to_index (layout, x_temp * PANGO_SCALE, y_temp * PANGO_SCALE, &index, NULL); if (!ret) { if (x_temp < 0 || y_temp < 0) index = 0; else index = -1; } g_object_unref (layout); if (index == -1) { if (coords == ATK_XY_WINDOW || coords == ATK_XY_SCREEN) { glong length; length = g_utf8_strlen (renderer_text, -1); g_free (renderer_text); return length; } g_free (renderer_text); return index; } else { glong offset; offset = g_utf8_pointer_to_offset (renderer_text, renderer_text + index); g_free (renderer_text); return offset; } }
static void gail_label_real_notify_gtk (GObject *obj, GParamSpec *pspec) { GtkWidget *widget = GTK_WIDGET (obj); AtkObject* atk_obj = gtk_widget_get_accessible (widget); GtkLabel *label; GailLabel *gail_label; GObject *gail_obj; AtkObject *top_level; AtkObject *temp_obj; gail_label = GAIL_LABEL (atk_obj); if (strcmp (pspec->name, "label") == 0) { /* * We may get a label change for a label which is not attached to an * application. We wait until the toplevel window is created before * emitting the notification. * * This happens when [Ctrl+]Alt+Tab is pressed in metacity */ if (!gail_label->has_top_level) { temp_obj = atk_obj; top_level = NULL; while (temp_obj) { top_level = temp_obj; temp_obj = atk_object_get_parent (top_level); } if (atk_object_get_role (top_level) != ATK_ROLE_APPLICATION) { if (gail_label->window_create_handler == 0 && GAIL_IS_WINDOW (top_level)) gail_label->window_create_handler = g_signal_connect_after (top_level, "create", G_CALLBACK (window_created), atk_obj); } else gail_label->has_top_level = TRUE; } if (gail_label->has_top_level) notify_name_change (atk_obj); } else if (strcmp (pspec->name, "cursor-position") == 0) { gint start, end, tmp; gboolean text_caret_moved = FALSE; gboolean selection_changed = FALSE; gail_obj = G_OBJECT (atk_obj); label = GTK_LABEL (widget); if (gail_label->selection_bound != -1 && gail_label->selection_bound < gail_label->cursor_position) { tmp = gail_label->selection_bound; gail_label->selection_bound = gail_label->cursor_position; gail_label->cursor_position = tmp; } if (gtk_label_get_selection_bounds (label, &start, &end)) { if (start != gail_label->cursor_position || end != gail_label->selection_bound) { if (end != gail_label->selection_bound) { gail_label->selection_bound = start; gail_label->cursor_position = end; } else { gail_label->selection_bound = end; gail_label->cursor_position = start; } text_caret_moved = TRUE; if (start != end) selection_changed = TRUE; } } else { if (gail_label->cursor_position != gail_label->selection_bound) selection_changed = TRUE; if (gtk_label_get_selectable (label)) { if (gail_label->cursor_position != -1 && start != gail_label->cursor_position) text_caret_moved = TRUE; if (gail_label->selection_bound != -1 && end != gail_label->selection_bound) { text_caret_moved = TRUE; gail_label->cursor_position = end; gail_label->selection_bound = start; } else { gail_label->cursor_position = start; gail_label->selection_bound = end; } } else { /* GtkLabel has become non selectable */ gail_label->cursor_position = 0; gail_label->selection_bound = 0; text_caret_moved = TRUE; } } if (text_caret_moved) g_signal_emit_by_name (gail_obj, "text_caret_moved", gail_label->cursor_position); if (selection_changed) g_signal_emit_by_name (gail_obj, "text_selection_changed"); } else GAIL_WIDGET_CLASS (gail_label_parent_class)->notify_gtk (obj, pspec); }