# HG changeset patch # User Olaf Wintermann # Date 1777386970 -7200 # Node ID 388285e877fe479f9b0deec04329f634e80c58ce # Parent 2df0be42b5e09d5140a3c417e4216264fd8d0bcb extend textarea API diff -r 2df0be42b5e0 -r 388285e877fe ui/gtk/text.c --- 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"); } diff -r 2df0be42b5e0 -r 388285e877fe ui/ui/text.h --- a/ui/ui/text.h Mon Apr 27 21:43:34 2026 +0200 +++ b/ui/ui/text.h Tue Apr 28 16:36:10 2026 +0200 @@ -153,6 +153,13 @@ UIEXPORT void ui_text_undo(UiText *value); UIEXPORT void ui_text_redo(UiText *value); +UIEXPORT void ui_textarea_focus(UIWIDGET textarea); +UIEXPORT void ui_textarea_set_selection(UIWIDGET textarea, int begin, int end); +UIEXPORT void ui_textarea_select_all(UIWIDGET textarea); +UIEXPORT void ui_textarea_set_editable(UIWIDGET textarea, UiBool editable); +UIEXPORT UiBool ui_textarea_is_editable(UIWIDGET textarea); +UIEXPORT void ui_textarea_set_position(UIWIDGET textarea, int pos); +UIEXPORT int ui_textarea_get_position(UIWIDGET textarea); UIEXPORT void ui_textarea_scroll_to(UIWIDGET textarea, int pos); #define ui_textfield(obj, ...) ui_textfield_create(obj, &(UiTextFieldArgs) { __VA_ARGS__ })