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