este un simple y simpatico ejemplo para crear una ventana y escribir texto mediante las funciones externas del API de libcaca.
Teclas especiales:
- TAB o Enter, para ir a la linea siguiente;
- Backspace, elimina el carácter anterior;
- Esc, para salir de la aplicacion.
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("Impossible crear un soporte gráfico 'caca' !")
dp = caca_create_display(cv)
If IsNull(dp) Then Error.Raise("Impossible crear un display 'caca' !")
caca_set_cursor(dp, 1)
caca_set_color_ansi(cv, CACA_WHITE, CACA_BLUE)
caca_put_str(cv, 1, 1, "Inserción del texto - presiona la tecla Tab para ir a la línea siguiente")
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, "[Inserción ] " & 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
' Coloca el cursor en la Estructura activa:
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
' Terminando...:
caca_free_canvas(dp)
caca_free_canvas(cv)
End
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("Impossible crear un soporte gráfico 'caca' !")
dp = caca_create_display(cv)
If IsNull(dp) Then Error.Raise("Impossible crear un display 'caca' !")
caca_set_cursor(dp, 1)
caca_set_color_ansi(cv, CACA_WHITE, CACA_BLUE)
caca_put_str(cv, 1, 1, "Inserción del texto - presiona la tecla Tab para ir a la línea siguiente")
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, "[Inserción ] " & 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
' Coloca el cursor en la Estructura activa:
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
' Terminando...:
caca_free_canvas(dp)
caca_free_canvas(cv)
End