EditorGadgetCursorX/Y unter Linux?

In dieser Linux-Ecke dürfen nur Themen rund um Linux geschrieben werden.
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
pickelrobert
Beiträge: 207
Registriert: 09.12.2004 22:09

EditorGadgetCursorX/Y unter Linux?

Beitrag von pickelrobert »

Hallo,

habe hier mal einen Codeschnipsel für Windows "zusammengeklickt".

Code: Alles auswählen

Procedure.i EditorGadgetCursorX(Gadget.i)
  Protected GadgetID.i = GadgetID(Gadget), Range.CHARRANGE
 
  SendMessage_(GadgetID, #EM_EXGETSEL, 0, @Range)
  ProcedureReturn (Range\cpMax - (SendMessage_(GadgetID, #EM_LINEINDEX, SendMessage_(GadgetID, #EM_EXLINEFROMCHAR, 0, Range\cpMin), 0)) + 1)
EndProcedure

Procedure.i EditorGadgetCursorY(Gadget.i)
  Protected GadgetID.i = GadgetID(Gadget), Range.CHARRANGE
 
  SendMessage_(GadgetID, #EM_EXGETSEL, 0, @Range)
  ProcedureReturn SendMessage_(GadgetID, #EM_EXLINEFROMCHAR, 0, Range\cpMin) + 1
EndProcedure

If OpenWindow(0, 0, 0, 200, 200, "Cursorpos [1,1]", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
   EditorGadget(0,0,0,200,200)
   SetGadgetText(0,"Zeile 1"+#CRLF$+"Zeile 2"+#CRLF$+"Zeile 3")
   AddWindowTimer(0,1,200)
   SetActiveGadget(0)
   
   Repeat
      Select WaitWindowEvent()
      
         Case #PB_Event_Timer
            If EventTimer() = 1
               x.l=EditorGadgetCursorX(0)
               y.l=EditorGadgetCursorY(0)
               SetWindowTitle(0,"Cursorpos ["+Str(x)+","+Str(y)+"]")
            EndIf
         Case #PB_Event_CloseWindow
            Quit.l = 1
      EndSelect

  Until Quit = 1
  
EndIf

End 
Hat jemand so etwas schon einmal für Linux umgesetzt?

Danke&Gruß
Benutzeravatar
Macros
Beiträge: 1361
Registriert: 23.12.2005 15:00
Wohnort: Olching(bei FFB)
Kontaktdaten:

Re: EditorGadgetCursorX/Y unter Linux?

Beitrag von Macros »

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 :roll:

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
Bild
pickelrobert
Beiträge: 207
Registriert: 09.12.2004 22:09

Re: EditorGadgetCursorX/Y unter Linux?

Beitrag von pickelrobert »

Danke. Es funktioniert.
Antworten