--- a/ui/gtk/text.c Sun Feb 01 11:42:27 2026 +0100 +++ b/ui/gtk/text.c Sun Feb 01 18:38:06 2026 +0100 @@ -131,6 +131,7 @@ uitext->onchangedata = args->onchangedata; g_object_set_data(G_OBJECT(text_area), "ui_textarea", uitext); + g_object_set_data(G_OBJECT(text_area), "ui_textarea_widget", text_area); g_signal_connect( text_area, @@ -144,6 +145,7 @@ GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); // GTK_POLICY_ALWAYS SCROLLEDWINDOW_SET_CHILD(scroll_area, text_area); + g_object_set_data(G_OBJECT(scroll_area), "ui_textarea_widget", text_area); ui_widget_size_request(scroll_area, args->width, args->height); @@ -186,6 +188,7 @@ value->insert = ui_textarea_insert; value->setposition = ui_textarea_setposition; value->position = ui_textarea_position; + value->showposition = ui_textarea_showposition; value->setselection = ui_textarea_setselection; value->selection = ui_textarea_selection; value->length = ui_textarea_length; @@ -211,8 +214,21 @@ free(textarea); } +void ui_textarea_scroll_to(UIWIDGET textarea, int pos) { + GtkWidget *widget = ui_textarea_gettextwidget(textarea); + if(!widget) { + fprintf(stderr, "Error: ui_textarea_scroll_to: widget is not a textarea\n"); + } + GtkTextBuffer *buf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(widget)); + + GtkTextIter offset; + gtk_text_buffer_get_iter_at_offset(buf, &offset, pos); + + gtk_text_view_scroll_to_iter(GTK_TEXT_VIEW(widget), &offset, 0.2, FALSE, 0, 0); +} + UIWIDGET ui_textarea_gettextwidget(UIWIDGET textarea) { - return SCROLLEDWINDOW_GET_CHILD(textarea); + return g_object_get_data(G_OBJECT(textarea), "ui_textarea_widget"); } void ui_textarea_save(UiText *text) { @@ -296,6 +312,10 @@ return text->pos; } +void ui_textarea_showposition(UiText *text, int pos) { + ui_textarea_scroll_to(text->obj, pos); +} + void ui_textarea_setselection(UiText *text, int begin, int end) { GtkTextBuffer *buf = text->data1; GtkTextIter ib;