Aprire un Terminale con Desktop.OpenTerminal e passargli una riga di comando

Da Gambas-it.org - Wikipedia.

Dopo aver aperto un Terminale mediante il Metodo ".OpenTerminal()" della Classe Desktop, è possibile inviargli una linea di comando eseguibile ed efficace utilizzando il Metodo ".SendKeys()" della predetta Classe.

Ovviamente è necessario attivare i Componenti gb.desktop.x11 e gb.desktop.

Mostriamo un esempio:

Private b As Byte


Public Sub Form_Open()
 
' Apprendiamo il numero dei file-device pseudoterminale nella cartella "/dev/pts":
 b = Dir("/dev/pts", "*", gb.Device).Count
 
End


Public Sub Button1_Click()
 
 Desktop.OpenTerminal

' L'apertura del Terminale determina la creazione di un altro e nuovo file-device "pts".
' Restiamo in attesa fino alla sua creazione, dato che il nuovo file-device "pts" = nuovo Terminale aperto !
 Repeat
   Wait 0.01
 Until Dir("/dev/pts", "*", gb.Device).Count > b
 
' Una volta che il Terminale è stato aperto, gli inviamo la linea di comando (ad esempio "ls"):
 Desktop.SendKeys("ls")
  
End

La linea di comando apparirà nel Terminale e potrà essere utilizzata efficacemente cliccando come di consueto sul tasto "Invio " della tastiera. Qualora si intenda attivare il comando nel Terminale immediatamente dopo la sua stampa, si aggiungerà il carattere escape "\n" nell'argomento del Metodo ".SendKeys()" immediatamente dopo il comando, ossia:

Desktop.SendKeys("ls\n")

In quest'altro esempio dopo aver atteso l'apertura del Terminale, cliccando sul Button il programma Gambas richiederà l'immissione in un ImputBox del numero identificativo della finestra del Terminale aperto. Tale ID può essere copiato nella Console dell'IDE di Gambas (se il programma è stato ovviamente lanciato come progetto, oppure dal Terminale come eseguibile .gambas).
Nel copiare il numero identificativo della finestra del Terminale - al quale trasferire la stringa di caratteri - si dovrà avere cura di copiare, e incollare nell'InputBox, anche i caratteri "&h" che precedono il valore esadecimale riportato.

Private id As Integer
Private pos As Integer

Public Sub Form_Open()

 Desktop.OpenTerminal

End


Public Sub Button1_Click()

 Dim n As Integer
 Dim ob As Object
 Dim s As String

 For Each n In X11.GetWindowProperty(X11.RootWindow, "_NET_CLIENT_LIST")
' Di ciascuna finestra aperta mostra in console:
'   - l'ID (in esadecimale);
'   - il desktop (numero d'indice) nel quale è aperta;
'   - il nome;
   Write "\e[31m&h" & Hex(n, 8) &
         "\e[0m  " &
         Format(X11.GetWindowProperty(n, "_NET_WM_DESKTOP")[0], "-#") & "  "
' Verifica se vi sono finestre, come messaggi di errore dal sistema, che non posseggono nome:
   ob = X11.GetWindowProperty(n, "_NET_WM_NAME")
   If Object.IsValid(ob) Then Write ob[0]
   Print 
 Next

 Repeat 
' Attende l'immissione nell'InputBox dell'ID della finestra, ove inviare successivamente i dati stringa.
' Se si immette il numero dell'ID in rappresentazione esadecimale, bisognerà farlo precedere dal simbolo "&".
   s = InputBox("Inserire il numero identificativo della finestra prescelta:")
 Until IsNumber(s)

 id = Val(s)

 X11.ActiveWindow = id

 Wait 0.1

' Il Metodo ".SendKeys()" consente l'invio di uno o più caratteri alla volta:
 X11.SendKeys("ls\n")

End