Differenze tra le versioni di "Creare una finestra ed inserirvi del testo con le funzioni esterne di Libcaca"

Da Gambas-it.org - Wikipedia.
 
(2 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
La libreria libcaca è una libreria grafica, con la quale - fra l'altro - è possibile anche generare finestre testuali e intercettare eventi.
+
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.20'' ".
  
Per poter utilizzare le funzionalità di libcaca, è necessario richiamare la libreria condivisa attualmente: "''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 dalla tastiera.
 
+
Library "libcaca:0.99.20"
 
+
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
 
  Public Struct textentry
 
   buffer[76] As Integer
 
   buffer[76] As Integer
Riga 12: Riga 12:
 
   changed As Integer
 
   changed As Integer
 
  End Struct
 
  End Struct
 
 
  Private entries[5] As Struct Textentry
 
  Private entries[5] As Struct Textentry
 
   
 
   
Riga 26: Riga 25:
 
  Private Const CACA_KEY_RETURN As Integer = 13
 
  Private Const CACA_KEY_RETURN As Integer = 13
 
  Private Const CACA_KEY_ESCAPE As Integer = 27
 
  Private Const CACA_KEY_ESCAPE As Integer = 27
 
 
Library "libcaca:0.99.19"
 
 
   
 
   
 
  <FONT color=gray>' ''caca_canvas_t * caca_create_canvas(int, int)''
 
  <FONT color=gray>' ''caca_canvas_t * caca_create_canvas(int, int)''
Riga 87: Riga 83:
 
   
 
   
 
   
 
   
  '''Public''' Sub Main()
+
  Public Sub Main()
 
   
 
   
 
   Dim cv, dp, ev As Pointer
 
   Dim cv, dp, ev As Pointer
 
   Dim i, e, running, j, start, size As Integer
 
   Dim i, e, running, j, start, size As Integer
 
    
 
    
+
  cv = caca_create_canvas(0, 0)
  cv = caca_create_canvas(0, 0)
+
  If cv == 0 Then Error.Raise("Impossibile creare un supporto grafico 'caca' !")
  If IsNull(cv) Then Error.Raise("Impossibile creare un supporto grafico 'caca' !")
 
 
    
 
    
  dp = caca_create_display(cv)
+
  dp = caca_create_display(cv)
  If IsNull(dp) Then Error.Raise("Impossibile creare un display 'caca' !")
+
  If dp == 0 Then Error.Raise("Impossibile creare un display 'caca' !")
 
   
 
   
  caca_set_cursor(dp, 1)
+
  caca_set_cursor(dp, 1)
 
    
 
    
  caca_set_color_ansi(cv, CACA_WHITE, CACA_BLUE)
+
  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")
+
  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
+
  For i = 0 To TEXT_ENTRIES - 1
    entries[i].buffer[0] = 0
+
    entries[i].buffer[0] = 0
    entries[i].size = 0
+
    entries[i].size = 0
    entries[i].cursor = 0
+
    entries[i].cursor = 0
    entries[i].changed = 1
+
    entries[i].changed = 1
    caca_printf(cv, 3, 3 * i + 4, "[Inserimento ] " & i, i + 1)
+
    caca_printf(cv, 3, 3 * i + 4, "[Inserimento ] " & i, i + 1)
  Next
+
  Next
 
    
 
    
  running = 1
+
  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
 
 
   
 
   
 +
  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
 
  <FONT color=gray>' ''Posiziona il cursore nella Struttura attiva:''</font>
 
  <FONT color=gray>' ''Posiziona il cursore nella Struttura attiva:''</font>
    caca_gotoxy(cv, 2 + entries[e].cursor, 3 * e + 5)
+
    caca_gotoxy(cv, 2 + entries[e].cursor, 3 * e + 5)
    caca_refresh_display(dp)
+
    caca_refresh_display(dp)
      
+
     If caca_get_event(dp, CACA_EVENT_KEY_PRESS, VarPtr(ev), -1) = 0 Then Continue
    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
 
   
 
   
    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
 
 
 
 
 
  <FONT color=gray>' ''Va in chiusura:''</font>
 
  <FONT color=gray>' ''Va in chiusura:''</font>
    caca_free_canvas(dp)
+
  caca_free_canvas(dp)
    caca_free_canvas(cv)
+
  caca_free_canvas(cv)
 
   
 
   
  '''End'''
+
  End
  
  

Versione attuale delle 15:34, 25 giu 2024

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.20 ".

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 dalla tastiera.

Library "libcaca:0.99.20"

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