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: "libcaca.so.0.99.19 ".

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.

Library "libcaca:0.99.19"

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

' 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 cv == 0 Then Error.Raise("Impossibile creare un supporto grafico 'caca' !")
  
 dp = caca_create_display(cv)
 If dp == 0 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