A mio modesto parere credo che, essendo Gambas un linguaggio "orientato agli oggetti", esso ha una predisposizione "originaria" al superamento, laddove non sia effettivamente necessario (demone o non uso di testo o della grafica), della logica del funzionamento "a riga di comando" all'interno della finestra del Terminale.
Del resto, il tuo uso prevede l'utilizzo comunque di una normale finestra (quella del Terminale), nella quale scrivere del testo. Pertanto, non è comprensibile, agendo in ambiente Gambas, il perché del non-utilizzo di un Form (che è comunque una finestra) e degli oggetti che supportano testo e/o grafica messi a disposizioni dalle risorse di Gambas.
Ad ogni modo, non è certo vietato l'uso del linguaggio Gambas per applicazioni "a riga di comando". Pertanto, vediamo cosa possiamo risolvere riguardo alle domande da te poste.
Affronterei la questione della "pulizia dello schermo", che si risolve nella pulizia del Terminale.
Di norma, la pulizia del Terminale avviene con il comando "clear" (ma anche Ctrl+l). Pertanto, dovrai inviare questo comando al Terminale.
Va segnalato che potrebbe essere necessario inviare preliminarmente la riga: export TERM=xterm, al fine di evitare il problema "TERM environment variable not set".
Il tuo codice quindi assumerebbe per ora questo tenore:
Public Sub Main()
Dim aa As Integer
' Per un corretto funzionamento è necessario conoscere l'esatto
' tipo del terminale su cui si sta lavorando. Andrebbe quindi settata
' la variabile TERM con la sintassi propria del sistema su cui si lavora.
' Va, pertanto, verificato se l'attivazione di questa riga è necessaria:
' Shell "export TERM=xterm"
Print Chr$(10); Chr$(13)
For aa = 1 To 2
Print Space$(8); "pippo"; Space$(16); aa
Sleep 1
Next
Print Space$(8); "fine"; Space$(8); "fine"; Space$(8); "fine";
Print Chr$(10)
Wait 1 ' oppure Sleep se preferisci
' Puliamo il Terminale inviandogli il comando "clear":
Shell "clear"
Wait 0.01
Print "Ultima riga"
Wait 2
End
hai qualche altra idea su come posizionare il cursore del mouse in una qualunque posizione dello schermo, e se non è troppo difficile anche quello del mouse.
A mio avviso si tratta di utilizzare risorse "al di là" di Gambas considerato in senso stretto.
Ad ogni modo, sono per ora riuscito a fare solo questo (è necessario espandere a schermo intero la finestra del terminale):
Public Sub Main()
Dim aa As Integer
Dim s As String
Dim fl As File
s = "aaa bbb cccc ddd eee ffff gggg hhhh iiii llll mmmm nnnn oooo pppp qqqq rrr ssss tttt vvvvv uuuu zzz " &
"aaa bbb cccc ddd eee ffff gggg hhhh iiii llll mmmm nnnn oooo pppp qqqq rrr ssss tttt vvvvv uuuu zzz " &
"aaa bbb cccc ddd eee ffff gggg hhhhh"
' Shell "export TERM=xterm"
fl = Open "/dev/stdout" For Write
Write #fl, s
Wait 3
' Sposta il cursore 100 caratteri a sinistra lungo la riga:
For aa = 1 To 100
Write #fl, "\x08"
Next
Wait 3
' Salta di 8 caratteri alla volta a destra x 10 volte lungo la riga:
For aa = 1 To 10
Write #fl, "\x09"
Wait 0.3
Next
Wait 2
' Si sposta (ora più lentamente) di 150 caratteri a sinistra lungo la riga:
For aa = 1 To 150
Write #fl, "\x08"
Wait 0.05
Next
fl.Close
Wait 4
' Pulisce la finestra del terminale, perché.... è una cosa allucinante operare così !!!
Shell "clear"
End
Che San Midi (http://it.wikipedia.org/wiki/Musical_Instrument_Digital_Interface) mi protegga ! :'(
hai qualche altra idea su come posizionare il cursore del mouse in una qualunque posizione dello schermo
Riprendo questo problema. Tenendo sempre conto che per schermo tu intendi la finestra del Terminale, bisogna operare con il protocollo supportato dal Bash's prompt (PS1).
Quindi nel seguente codice esemplificativo, sposteremo il cursore all'interno del Terminale posizionandolo in due posizioni successive diverse; scriveremo in ciascuno spostamento due parole diverse che coloreremo la prima di giallo e la seconda di rosso.
(Anche questa applicazione va lanciata nel terminale, essendo anch'essa ovviamente "a linea di comando").
Public Sub Main()
Dim fl As File
fl = Open "/dev/stdout" For Write
Write #fl, "\e[1;33m"
Write #fl, "\e[10;10f"
Write #fl, "giallo"
Wait 3
Write #fl, "\e[1;31m"
Write #fl, "\e[20;30f"
Write #fl, "rosso"
Wait 3
Shell "clear"
Write #fl, "\e[0m"
fl.Close
End
... e se non è troppo difficile anche quello del mouse.
Passiamo a risolvere l'ultimo problema.
Tu probabilmente intendevi sapere come spostare il puntatore del mouse all'interno dello schermo, intendendo qui per schermo l'intero schermo in senso proprio.
Mostreremo di seguito un semplice esempio - ovviamente sempre "a riga di comando" - per spostare il puntatore del mouse sullo schermo sia orizzontalmente che verticalmente.
Public Struct timeval
tv_sec As Long ' secondi
tv_usec As Long ' microsecondi
End Struct
Public Struct input_event
tv As Struct Timeval
type As Short
code As Short
value As Integer
End Struct
Private Const EV_SYN As Short = 0
Private Const EV_REL As Short = 2
Private Const REL_X As Short = 0
Private Const REL_Y As Short = 1
Private Const SYN_REPORT As Short = 0
Public Sub Main()
Dim eventoX, eventoY, fine_evento As New Input_event
Dim s As String
Dim ss As String[]
Dim fl As File
Dim b As Byte
' Individuiamo esattamente il file-device del mouse:
s = File.Load("/proc/bus/input/devices")
s = Replace$(s, "\n", " ")
ss = Split(s, " ", "", True)
For b = 0 To ss.Max
' Individuiamo la riga contenente il testo "Handlers=mouse...",
' e quindi raccogliamo l'ultima parola della riga medesima.
' Tale parola sarà il nome del file-device del mouse:
If ss[b] Like "Handlers=mouse*" Then s = ss[b + 1]
Next
''''''''''''''
' Per leggere il file-device individuato, bisogna avere i necessari permessi.
' Pertanto, se non sono stati modificati i permessi del file-device, allora vengono modificati
' (bisognerà inserire la propria password !):
If Stat("/dev/input" &/ s).Auth <> "rwsrwxrwx" Then
Shell "echo 'password' | sudo -S chmod 4777 /dev/input" &/ s Wait
Endif
fl = Open "/dev/input" &/ s For Write
If IsNull(fl) Then Error.Raise("Impossibile aprire il file-device !")
' Assegna i dati per lo spostamento orizzontale del mouse sullo schermo:
With eventoX
.type = EV_REL
.code = REL_X
' Si assegna un valore positivo per lo spostamento a destra,
' un valore negativo per lo spostamento a sinistra:
.value = 100
End With
' Assegna i dati per lo spostamento verticale del mouse sullo schermo:
With eventoY
.type = EV_REL
.code = REL_Y
' Si assegna un valore positivo per lo spostamento in basso,
' un valore negativo per lo spostamento in alto:
.value = 100
End With
With fine_evento
.type = EV_SYN
.code = SYN_REPORT
.value = 0
End With
For b = 1 To 5
Write #fl, eventoX As Input_event ' Sposta il mouse orizzontalmente
Write #fl, fine_evento As Input_event ' Mostra lo spostamento del mouse
Wait 1
Write #fl, eventoY As Input_event ' Sposta il mouse verticalmente
Write #fl, fine_evento As Input_event ' Mostra lo spostamento del mouse
Wait 1
Next
' Va in chiusura:
fl.Close
End
Come avrai notato, questo codice non posiziona il puntatore del mouse a delle coordinate stabilite all'interno dello schermo, ma sposta il puntatore di tot pixel.
...abbiamo visto in due messaggi precedenti come spostare il cursore lungo una riga del Terminale e come piazzare in determinate coordinate del Terminale il predetto cursore.
Ora vediamo come è possibile conoscere la riga e la colonna nelle quali è posizionato il cursore.
(Per ora il risultato, seppur efficace, è ancora un pochino grezzo :-X )
Public Sub Main()
Dim s As String
Dim fl As File
Dim a As Byte
' La stringa, sulla quale sposteremo il cursore, è semplicemente questa:
s = "1234567890"
fl = Open "/dev/stdout" For Read Write
Write #fl, s
Wait 0.1
For a = 1 To 4 ' Ci spostiamo di quattro caratteri a sinistra lungo la stringa visibile sul Terminale
Write #fl, "\x08"
Wait 0.3
Next
Wait 2
' Inviamo al Terminale il comando necessario per conoscere la posizione del cursore.
' Nel risultato mostrato il primo valore numerico è la riga, il secondo è la colonna,
' nelle quali è posizionato il cursore al termine dello spostamento lungo la stringa.
' La scritta per maggiore evidenza sarà in grassetto e colorata di giallo:
Write #fl, "\e[1;33m\e[6n"
Print #fl, "\n\nRiga ; Colonna"
' Esegue il ciclo sino a quando non premeremo il tasto 'Invio':
Do
Read #fl, s, -256
Loop Until s <> Null
' Va finalmente in chiusura:
Write #fl, "\e[0m"
fl.Close
End