static gint gail_label_get_offset_at_point (AtkText *text, gint x, gint y, AtkCoordType coords) { GtkWidget *widget; GtkLabel *label; const gchar *label_text; gint index, x_layout, y_layout; widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text)); if (widget == NULL) /* State is defunct */ return -1; label = GTK_LABEL (widget); gtk_label_get_layout_offsets (label, &x_layout, &y_layout); index = gail_misc_get_index_at_point_in_layout (widget, gtk_label_get_layout (label), x_layout, y_layout, x, y, coords); label_text = gtk_label_get_text (label); if (index == -1) { if (coords == ATK_XY_WINDOW || coords == ATK_XY_SCREEN) return g_utf8_strlen (label_text, -1); return index; } else return g_utf8_pointer_to_offset (label_text, label_text + index); }
static gint gail_notebook_page_get_offset_at_point (AtkText *text, gint x, gint y, AtkCoordType coords) { GtkWidget *label; GailNotebookPage *notebook_page; 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 -1; gtk_label_get_layout_offsets (GTK_LABEL (label), &x_layout, &y_layout); index = gail_misc_get_index_at_point_in_layout (label, gtk_label_get_layout (GTK_LABEL (label)), x_layout, y_layout, x, y, coords); label_text = gtk_label_get_text (GTK_LABEL (label)); if (index == -1) { if (coords == ATK_XY_WINDOW || coords == ATK_XY_SCREEN) return g_utf8_strlen (label_text, -1); return index; } else return g_utf8_pointer_to_offset (label_text, label_text + index); }
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 gint gail_scale_get_offset_at_point (AtkText *text, gint x, gint y, AtkCoordType coords) { GtkWidget *widget; GtkScale *scale; 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 -1; scale = GTK_SCALE (widget); layout = gtk_scale_get_layout (scale); if (!layout) return -1; scale_text = pango_layout_get_text (layout); if (!scale_text) return -1; gtk_scale_get_layout_offsets (scale, &x_layout, &y_layout); index = gail_misc_get_index_at_point_in_layout (widget, layout, x_layout, y_layout, x, y, coords); if (index == -1) { if (coords == ATK_XY_WINDOW || coords == ATK_XY_SCREEN) index = g_utf8_strlen (scale_text, -1); } else index = g_utf8_pointer_to_offset (scale_text, scale_text + index); return index; }