Creare una finestra ed inserirvi del testo con le funzioni esterne di Libcaca

Da Gambas-it.org - Wikipedia.

La libreria libcaca è una libreria grafica, con la quale - fra l'altro - è possibile anche generare finestre testuali e intercettare eventi.


Per poter utilizzare le funzionalità di libcaca, è necessario richiamare la libreria condivisa attualmente: "libcaca.so.0.99.18".


Mostriamo di seguito un breve codice esemplificativo, con il quale in ambiente non-grafico viene creata una finestra, nella quale sarà possibile scrivere ed intercettare eventi provenienti dalla pressione dala tastiera.

Public Struct textentry
  buffer[76] As Integer
  size As Integer
  cursor As Integer
  changed As Integer
End Struct

Private entries[5] As Struct Textentry

Private Const CACA_BLACK As Byte = 0
Private Const CACA_BLUE As Byte = 1
Private Const CACA_LIGHTGRAY As Byte = 7
Private Const CACA_WHITE As Byte = 15
Private Const BUFFER_SIZE As Integer = 75
Private Const TEXT_ENTRIES As Integer = 5
Private Const CACA_EVENT_KEY_PRESS As Integer = 1
Private Const CACA_KEY_BACKSPACE As Integer = 8
Private Const CACA_KEY_TAB As Integer = 9
Private Const CACA_KEY_RETURN As Integer = 13
Private Const CACA_KEY_ESCAPE As Integer = 27


Library "libcaca:0.99.18"

' caca_canvas_t * caca_create_canvas(int, int)
' Initialise a libcaca canvas.
Private Extern caca_create_canvas(ca As Integer, cb As Integer) As Pointer

' caca_display_t * caca_create_display (caca_canvas_t *)
' Attach a caca graphical context to a caca canvas.
Private Extern caca_create_display(caca_canvas_t As Pointer) As Pointer

' int caca_set_cursor (caca_display_t *, int)
' Show or hide the cursor.
Private Extern caca_set_cursor(displ As Pointer, cursI As Integer) As Integer

' int caca_set_color_ansi (caca_canvas_t *, uint8_t, uint8_t)
' Set the default colour pair for text (ANSI version).
Private Extern caca_set_color_ansi(caca_canvas_t As Pointer, col1 As Byte, col2 As Byte) As Integer

' int caca_put_str (caca_canvas_t *, int, int, char const *)
' Print a string.
Private Extern caca_put_str(caca_canvas_t As Pointer, i1 As Integer, i2 As Integer, testo As String) As Integer

' int caca_printf (caca_canvas_t *, int, int, char const *,...)
' Print a formated string.
Private Extern caca_printf(caca_canvas_t As Pointer, i1 As Integer, i2 As Integer, testo As String, i3 As Integer) As Integer

' int caca_fill_box (caca_canvas_t *, int, int, int, int, uint32_t)
' Fill a box on the canvas using the given character.
Private Extern caca_fill_box(caca_canvas_t As Pointer, i1 As Integer, i2 As Integer, i3 As Integer, i4 As Integer, i5 As Integer) As Integer

' int caca_put_char (caca_canvas_t *, int, int, uint32_t)
' Print an ASCII or Unicode character.
Private Extern caca_put_char(caca_canvas_t As Pointer, i1 As Integer, i2 As Integer, i3 As Integer) As Integer

' int caca_gotoxy (caca_canvas_t *, int, int)
' Set cursor position.
Private Extern caca_gotoxy(caca_canvas_t As Pointer, ix As Integer, iy As Integer) As Integer

' int caca_refresh_display (caca_display_t *)
' Flush pending changes and redraw the screen.
Private Extern caca_refresh_display(displ As Pointer) As Integer

' int caca_get_event (caca_display_t *, int, caca_event_t *, int)
' Get the next mouse or keyboard input event.
Private Extern caca_get_event(caca_canvas_t As Pointer, i1 As Integer, caca_event_t As Pointer, i2 As Integer) As Integer

' int caca_get_event_key_ch (caca_event_t const *)
' Return a key press or key release event's value.
Private Extern caca_get_event_key_ch(cev As Pointer) As Integer

' uint32_t caca_get_event_key_utf32 (caca_event_t const *)
' Return a key press or key release event's Unicode value.
Private Extern caca_get_event_key_utf32(cev As Pointer) As Integer

' int caca_free_canvas(caca_canvas_t *)
' Free a libcaca canvas.
Private Extern caca_free_canvas(caca_canvas_t As Pointer) As Integer


Public Sub Main()

 Dim cv, dp, ev As Pointer
 Dim i, e, running, j, start, size As Integer
 

  cv = caca_create_canvas(0, 0)
  If IsNull(cv) Then Error.Raise("Impossibile creare un supporto grafico 'caca' !")
  
  dp = caca_create_display(cv)
  If IsNull(dp) Then Error.Raise("Impossibile creare un display 'caca' !")

  caca_set_cursor(dp, 1)
 
  caca_set_color_ansi(cv, CACA_WHITE, CACA_BLUE)

  caca_put_str(cv, 1, 1, "Inserimento del texto - premere il tasto Tab per passare alla riga successiva")

  For i = 0 To TEXT_ENTRIES - 1
    entries[i].buffer[0] = 0
    entries[i].size = 0
    entries[i].cursor = 0
    entries[i].changed = 1
    caca_printf(cv, 3, 3 * i + 4, "[Inserimento ] " & i, i + 1)
  Next
 
  running = 1

  While running

    For i = 0 To TEXT_ENTRIES - 1
      If Not entries[i].changed Then Continue
      caca_set_color_ansi(cv, CACA_BLACK, CACA_LIGHTGRAY)
      caca_fill_box(cv, 2, 3 * i + 5, BUFFER_SIZE + 1, 1, 32)
      start = 0
      size = entries[i].size
      For j = 0 To size - 1
        caca_put_char(cv, 2 + j, 3 * i + 5, entries[i].buffer[start + j])
      Next
      entries[i].changed = 0
    Next

' Posiziona il cursore nella Struttura attiva:
    caca_gotoxy(cv, 2 + entries[e].cursor, 3 * e + 5)
    caca_refresh_display(dp)
   
    If caca_get_event(dp, CACA_EVENT_KEY_PRESS, VarPtr(ev), -1) = 0 Then Continue

    Select Case caca_get_event_key_ch(VarPtr(ev))
      Case CACA_KEY_TAB
        e = (e + 1) Mod TEXT_ENTRIES
      Case CACA_KEY_RETURN
        e = (e + 1) Mod TEXT_ENTRIES
      Case CACA_KEY_BACKSPACE
        If entries[e].cursor Then
          Dec entries[e].size
          Dec entries[e].cursor
          entries[e].changed = 1
        Endif
      Case CACA_KEY_ESCAPE
        running = 0
      Case Else
        If entries[e].size < BUFFER_SIZE Then
          entries[e].buffer[entries[e].cursor] = caca_get_event_key_utf32(VarPtr(ev))
          Inc entries[e].size
          Inc entries[e].cursor
          entries[e].changed = 1
        Endif
    End Select
    
  Wend

 
' Va in chiusura:
   caca_free_canvas(dp)
   caca_free_canvas(cv)

End


Riferimenti