Ich hab dir kurz ein Beispiel für GTK mit den GTK Apis gebastelt.
Dabei auch eine kombinierte Prozedur, da spart man sich ein paar Api Aufrufe und doppelten Code.
Code: Alles auswählen
EnableExplicit
Structure S_Cursorpos
  x.i
  y.i
EndStructure
Procedure.i EditorGadgetCursorX(Gadget.i)
  Protected *TextView, *Buffer, Iter.GtkTextIter, *Mark
  Protected CursorX.i
  
  *TextView = GadgetID(Gadget)
  *Buffer = gtk_text_view_get_buffer_(*TextView)
  *Mark = gtk_text_buffer_get_mark_(*Buffer, "insert")
  gtk_text_buffer_get_iter_at_mark_(*Buffer, @Iter, *Mark)
  ; Get the column (offset) in the current line
  CursorX = gtk_text_iter_get_line_offset_(@Iter) + 1
  ProcedureReturn CursorX
EndProcedure
Procedure.i EditorGadgetCursorY(Gadget.i)
  Protected *TextView, *Buffer, Iter.GtkTextIter, *Mark
  Protected CursorY.i
  
  *TextView = GadgetID(Gadget)
  *Buffer = gtk_text_view_get_buffer_(*TextView)
  *Mark = gtk_text_buffer_get_mark_(*Buffer, "insert")
  gtk_text_buffer_get_iter_at_mark_(*Buffer, @Iter, *Mark)
  
  ; Get the line number
  CursorY = gtk_text_iter_get_line_(@Iter) + 1
  ProcedureReturn CursorY
EndProcedure
Procedure.i EditorGadgetCursorXY(Gadget, *Cursorpos.S_Cursorpos)
  Protected *TextView, *Buffer, Iter.GtkTextIter, *Mark
  
  *TextView = GadgetID(Gadget)
  *Buffer = gtk_text_view_get_buffer_(*TextView)
  *Mark = gtk_text_buffer_get_mark_(*Buffer, "insert")
  gtk_text_buffer_get_iter_at_mark_(*Buffer, @Iter, *Mark)
  
  ; Get the line number
  *Cursorpos\x = gtk_text_iter_get_line_offset_(@Iter) + 1
  *Cursorpos\y = gtk_text_iter_get_line_(@Iter) + 1
EndProcedure
Define Cursor.S_Cursorpos
If OpenWindow(0, 0, 0, 400, 300, "Cursor Position", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  EditorGadget(0, 10, 10, 380, 280)
  SetGadgetText(0, "Line 1"+#LF$+"Line 2"+#LF$+"Line 3")
  
  AddWindowTimer(0, 1, 200)
  
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_Timer
        If EventTimer() = 1
          Define x = EditorGadgetCursorX(0)
          Define y = EditorGadgetCursorY(0)
          EditorGadgetCursorXY(0, @Cursor)
          SetWindowTitle(0, "Cursor Position [" + Str(x) + "," + Str(y) + "] or [" + Str(Cursor\x) + "," + Str(Cursor\y) + "]")
        EndIf
      
      Case #PB_Event_CloseWindow
        Break
    EndSelect
  ForEver
EndIf
Falls du nach den APIs für solche Fragen suchst ist ChatGPT ein guter "Ansprechpartner", aber Vorsicht! Verstehen tut er nicht viel davon.
Als ich ihn fragte mir einen PB Code analog zu deinem zu bauen kam ein nur zu ca 50% stimmender Code raus mit einem Speicherfehler durch falschen Aufruf, einer Menge unnützer ImportC statements (statt dem simplen angehängten _) und weiteren Fehlern  
Hier der falsche Code:
Code: Alles auswählen
; ACHTUNG FALSCHER CODE VON ChatGPT GENERIERT!
EnableExplicit
ImportC ""
  gtk_text_view_get_buffer(*TextView)
  gtk_text_buffer_get_iter_at_mark(*Buffer, *Iter, *Mark)
  gtk_text_buffer_get_iter_at_offset(*Buffer, *Iter, Offset.i)
  gtk_text_buffer_get_text(*Buffer, *Start, *End, IncludeHidden.i)
  gtk_text_buffer_get_iter_at_line(*Buffer, *Iter, LineNumber.i)
  gtk_text_buffer_get_line_offset(*Iter)
  gtk_text_iter_get_line(*Iter)
  gtk_text_iter_get_line_offset(*Iter)
  gtk_text_iter_get_offset(*Iter)
  gtk_text_view_get_cursor_visible(*TextView)
  gtk_text_view_get_iter_location(*TextView, *Iter)
EndImport
Procedure.i EditorGadgetCursorX(Gadget.i)
  Protected TextView, Buffer, Iter, Mark
  Protected CursorX.i
  
  TextView = GadgetID(Gadget)
  Buffer = gtk_text_view_get_buffer(TextView)
  Mark = gtk_text_buffer_get_mark(Buffer, "insert")
  gtk_text_buffer_get_iter_at_mark(Buffer, @Iter, Mark)
  CursorX = gtk_text_iter_get_line_offset(@Iter) + 1
  ProcedureReturn CursorX
EndProcedure
Procedure.i EditorGadgetCursorY(Gadget.i)
  Protected TextView, Buffer, Iter, Mark
  Protected CursorY.i
  
  TextView = GadgetID(Gadget)
  Buffer = gtk_text_view_get_buffer(TextView)
  Mark = gtk_text_buffer_get_mark(Buffer, "insert")
  gtk_text_buffer_get_iter_at_mark(Buffer, @Iter, Mark)
  CursorY = gtk_text_iter_get_line(@Iter) + 1
  ProcedureReturn CursorY
EndProcedure
If OpenWindow(0, 0, 0, 400, 300, "Cursor Position", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  EditorGadget(0, 10, 10, 380, 280)
  SetGadgetText(0, "Line 1"+#LF$+"Line 2"+#LF$+"Line 3")
  
  AddWindowTimer(0, 1, 200)
  
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_Timer
        If EventTimer() = 1
          Define x = EditorGadgetCursorX(0)
          Define y = EditorGadgetCursorY(0)
          SetWindowTitle(0, "Cursor Position [" + Str(x) + "," + Str(y) + "]")
        EndIf
      
      Case #PB_Event_CloseWindow
        Break
    EndSelect
  ForEver
EndIf