static void gail_scale_get_character_extents (AtkText *text, gint offset, gint *x, gint *y, gint *width, gint *height, AtkCoordType coords) { GtkWidget *widget; GtkScale *scale; PangoRectangle char_rect; PangoLayout *layout; gint index, x_layout, y_layout; const gchar *scale_text; widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text)); if (widget == NULL) /* State is defunct */ return; scale = GTK_SCALE (widget); layout = gtk_scale_get_layout (scale); if (!layout) return; scale_text = pango_layout_get_text (layout); if (!scale_text) return; index = g_utf8_offset_to_pointer (scale_text, offset) - scale_text; gtk_scale_get_layout_offsets (scale, &x_layout, &y_layout); pango_layout_index_to_pos (layout, index, &char_rect); gail_misc_get_extents_from_pango_rectangle (widget, &char_rect, x_layout, y_layout, x, y, width, height, coords); }
static void gail_expander_get_character_extents (AtkText *text, gint offset, gint *x, gint *y, gint *width, gint *height, AtkCoordType coords) { GtkWidget *widget; GtkWidget *label; PangoRectangle char_rect; gint index, x_layout, y_layout; const gchar *label_text; widget = GTK_ACCESSIBLE (text)->widget; if (widget == NULL) /* State is defunct */ return; label = gtk_expander_get_label_widget (GTK_EXPANDER (widget)); if (!GTK_IS_LABEL(label)) return; gtk_label_get_layout_offsets (GTK_LABEL (label), &x_layout, &y_layout); label_text = gtk_label_get_text (GTK_LABEL (label)); index = g_utf8_offset_to_pointer (label_text, offset) - label_text; pango_layout_index_to_pos (gtk_label_get_layout (GTK_LABEL (label)), index, &char_rect); gail_misc_get_extents_from_pango_rectangle (label, &char_rect, x_layout, y_layout, x, y, width, height, coords); }
static void gail_notebook_page_get_character_extents (AtkText *text, gint offset, gint *x, gint *y, gint *width, gint *height, AtkCoordType coords) { GtkWidget *label; GailNotebookPage *notebook_page; PangoRectangle char_rect; gint index, x_layout, y_layout; const gchar *label_text; notebook_page = GAIL_NOTEBOOK_PAGE (text); label = get_label_from_notebook_page (notebook_page); if (!GTK_IS_LABEL(label)) return; gtk_label_get_layout_offsets (GTK_LABEL (label), &x_layout, &y_layout); label_text = gtk_label_get_text (GTK_LABEL (label)); index = g_utf8_offset_to_pointer (label_text, offset) - label_text; pango_layout_index_to_pos (gtk_label_get_layout (GTK_LABEL (label)), index, &char_rect); gail_misc_get_extents_from_pango_rectangle (label, &char_rect, x_layout, y_layout, x, y, width, height, coords); }
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; }