--- a/ui/gtk/text.c Mon Apr 27 21:43:34 2026 +0200 +++ b/ui/gtk/text.c Tue Apr 28 16:36:10 2026 +0200 @@ -221,6 +221,7 @@ GtkWidget *widget = ui_textarea_gettextwidget(textarea); if(!widget) { fprintf(stderr, "Error: ui_textarea_scroll_to: widget is not a textarea\n"); + return; } GtkTextBuffer *buf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(widget)); @@ -230,6 +231,81 @@ gtk_text_view_scroll_to_iter(GTK_TEXT_VIEW(widget), &offset, 0.2, FALSE, 0, 0); } +void ui_textarea_focus(UIWIDGET textarea) { + gtk_widget_grab_focus(textarea); +} + +void ui_textarea_set_selection(UIWIDGET textarea, int begin, int end) { + GtkWidget *widget = ui_textarea_gettextwidget(textarea); + if(!widget) { + fprintf(stderr, "Error: ui_textarea_set_selection: widget is not a textarea\n"); + return; + } + + GtkTextBuffer *buf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(widget)); + GtkTextIter ib; + GtkTextIter ie; + gtk_text_buffer_get_iter_at_offset(buf, &ib, begin); + gtk_text_buffer_get_iter_at_offset(buf, &ie, end); + gtk_text_buffer_select_range(buf, &ib, &ie); +} + +void ui_textarea_select_all(UIWIDGET textarea) { + GtkWidget *widget = ui_textarea_gettextwidget(textarea); + if(!widget) { + fprintf(stderr, "Error: ui_textarea_select_all: widget is not a textarea\n"); + return; + } + GtkTextBuffer *buf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(widget)); + GtkTextIter start; + GtkTextIter end; + gtk_text_buffer_get_bounds(buf, &start, &end); + gtk_text_buffer_select_range(buf, &start, &end); +} + +void ui_textarea_set_editable(UIWIDGET textarea, UiBool editable) { + GtkWidget *widget = ui_textarea_gettextwidget(textarea); + if(!widget) { + fprintf(stderr, "Error: ui_textarea_set_editable: widget is not a textarea\n"); + return; + } + gtk_text_view_set_editable(GTK_TEXT_VIEW(widget), editable); +} + +UiBool ui_textarea_is_editable(UIWIDGET textarea) { + GtkWidget *widget = ui_textarea_gettextwidget(textarea); + if(!widget) { + fprintf(stderr, "Error: ui_textarea_is_editable: widget is not a textarea\n"); + return 0; + } + return gtk_text_view_get_editable(GTK_TEXT_VIEW(widget)); +} + +void ui_textarea_set_position(UIWIDGET textarea, int pos) { + GtkWidget *widget = ui_textarea_gettextwidget(textarea); + if(!widget) { + fprintf(stderr, "Error: ui_textarea_set_position: widget is not a textarea\n"); + return; + } + GtkTextBuffer *buf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(widget)); + GtkTextIter iter; + gtk_text_buffer_get_iter_at_offset(buf, &iter, pos); + gtk_text_buffer_place_cursor(buf, &iter); +} + +int ui_textarea_get_position(UIWIDGET textarea) { + GtkWidget *widget = ui_textarea_gettextwidget(textarea); + if(!widget) { + fprintf(stderr, "Error: ui_textarea_get_position: widget is not a textarea\n"); + return 0; + } + GtkTextBuffer *buf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(widget)); + GtkTextIter begin; + GtkTextIter end; + gtk_text_buffer_get_selection_bounds(buf, &begin, &end); + return gtk_text_iter_get_offset(&begin); +} + UIWIDGET ui_textarea_gettextwidget(UIWIDGET textarea) { return g_object_get_data(G_OBJECT(textarea), "ui_textarea_widget"); }