ui/gtk/text.c

changeset 1067
4243fcc0aa5c
parent 1065
cb3c1fcecaa0
--- 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;

mercurial