Autore Topic: Lanciare un programma senza Shell, ma da una finestra di un Terminale  (Letto 1041 volte)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.297
  • Ne mors quidem nos iunget
    • Mostra profilo
Sono partito da questa discussione http://www.gambas-it.org/smf/index.php?topic=781.0 per provare a lanciare un programma esterno senza  l'ausilio del comando "Shell", bensì da una finestra di Terminale.

Per effettuare l'esperimento, ho tentato di avviare dalla finestra aperta di un Terminale il programma "Gedit", procedendo così (è necessario impostare anche il componente gb.desktop):
Codice: gambas [Seleziona]

Public Sub Form_Open()

' Apro la finestra di un Terminale:
   Desktop.OpenTerminal

End


Public Sub Button1_Click()

  Dim c As Integer[]
  Dim fl As File

' Mi trovo l'identificativo della finestra del Terminale aperta prima...:
   c = Desktop.FindWindow("Terminale")

'...e procedo al suo inglobamento come stratagemma, affinché io possa
'  successivamente attribuirle il "Focus":
    Embedder1.Embed(c[0])

' Scrivo nella finestra del Terminale il comando "gedit",
' per poterlo successivamente lanciare (il file "pts" potrebbe
' anche essere diverso dal nome "1": bisogna verificarlo nella sua cartella):
   fl = Open "/dev/pts/1" For Write
       Wait 0.3
    Write #fl, "gedit"
   fl.Close

' Attribuisco il Focus al controllo Embedder,
' affinché il successivo "Desktop.Sendkeys"
' si possa applicare ad esso:
    Embedder1.SetFocus

' Invio la simulazione del tasto "Invio":
    Desktop.SendKeys(Chr(10))

End


Succede che nel terminale compare una nuova linea vuota per l'inserimento dei comandi (voglio dire che l'istruzione .SendKeys ha svolto la sua specifica funzione di inviare l'evento "Tasto Invio premuto"), ma il programma "Gedit" non parte.  :-\

Avete un'idea del perché ?

Forse perché, come dice la documentazione in linea "Invia eventi tastiera fasulli alla finestra che ha il focus.", quel comando sortisce solo l'effetto del ritorno a capo (come fosse: \n ) senza produrre nient'altro ?  ???
« Ultima modifica: 20 Novembre 2013, 00:29:24 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
In effetti sembra abbia preso solo l'ultimo SendKeys("\n") (alias Chr(10)).

Quando tu scrivi sul pst/1, non credo tu vada a scrivere sul tuo terminale, ma da un'altra parte.

Hai provato ad inviare il comando "gedit" tramite SendKeys?

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.297
  • Ne mors quidem nos iunget
    • Mostra profilo
Lanciare un programma senza Shell, ma da una finestra di un Terminale
« Risposta #2 il: 31 Agosto 2012, 15:56:54 »
Quando tu scrivi sul pst/1, non credo tu vada a scrivere sul tuo terminale, ma da un'altra parte.
Mi sono espresso male: quando ho affermato precedentemente che "nel terminale compare una nuova linea vuota per l'inserimento dei comandi", ho sottinteso che la parola "gedit" nel terminale medesimo era stata scritta, poi con l'esecuzione dello pseudo tasto "Invio" c'era stato un ritorno a capo.
Le righe:
Codice: gambas [Seleziona]

fl = Open "/dev/pts/1" For Write  
   Wait 0.3  
Write #fl, "gedit"  

scrivono regolarmente la parola "gedit" nella finestra del terminale.

Insomma alla fine del processo dell'intero codice ottengo una cosa del genere all'interno della finestra del Terminale:

vuott@vuott-desktop ~/Scrivania $ gedit
vuott@vuott-desktop ~/Scrivania $


Hai provato ad inviare il comando "gedit" tramite SendKeys?
L'ho provato adesso. Questo sarebbe il codice:
Codice: gambas [Seleziona]

Public Sub Form_Open()

  Desktop.OpenTerminal

End


Public Sub Button1_Click()

 Dim c As Integer[]

   c = Desktop.FindWindow("Terminale")

   Embedder1.Embed(c[0])

   Wait 0.1

   Embedder1.SetFocus

   Desktop.SendKeys("{gedit}")

   Wait 0.3

   Desktop.SendKeys(Chr(10))

End


...così invece funziona.

O anche più semplicemente così:
Codice: gambas [Seleziona]

Public Sub Button1_Click()
    
' Apro la finestra di un Terminale:  
      Desktop.OpenTerminal  
      
End


Public Sub Button2_Click()  
      
  Dim c As Integer[]


   c = Desktop.FindWindow("Terminale")  

   Embedder1.Embed(c[0])

   Wait 0.5

   Embedder1.SetFocus

   Desktop.SendKeys("{gedit\n}")
 
End


Da ciò si evince che il dubbio sugli "eventi fasulli", da me sollevato nel mio primo intervento, non c'entra: il metodo .SendKeys è dunque perfettamente in grado di simulare in tutto e per tutto la pressione del tasto "Invio" della tastiera !

Scusa, md9327, cosa intendi dire con "In effetti sembra abbia preso solo l'ultimo SendKeys("\n") (alias Chr(10))."  ? Sembrerebbe dunque questa circostanza il problema del primo codice. Infatti, forse ho compreso quello che intendi dire con "non credo tu vada a scrivere sul tuo terminale": nella finestra del terminale sembra che venga semplicemente mostrata quella parola, ma è come se sostanzialmente ai fini esecutivi non sia scritta ! A riprova di ciò ho notato che se faccio semplicemente scrivere, eliminando il comando .SendKeys, la parola "gedit", e poi attaccato a questa vi scrivo io con la tastiera manualmente un qualsiasi comando (ad esempio ls, in modo tale che vedremo questa stringa geditls), quest'ultimo comando viene riconosciuto ed eseguito senza problemi... proprio come se la prima parte (gedit) dell'intera stringa visibile (geditls) non esistesse ! ...insomma la parola gedit scritta con il primo codice in questa discussione si vede, ma... non si tocca !
In altre parole ciò che si legge nella finestra del Terminale è "visibile", appunto, ma non è utilizzabile !

Devo aggiungere che, sempre eliminando il comando .SendKeys nel primo codice, quando appare nella finestra del terminale la parola "gedit", se provo a tornare dietro con il cursore lampeggiante premendo il tasto con la freccia a sinistra, ciò è impedito... sembra quasi che la scritta "gedit" non sia altro che una mera estensione della linea:
 vuott@vuott-desktop ~/Scrivania $

Al contrario, se si scrive un comando a mano con la tastiera, si potrà notare che è possibile tornare dietro con il cursore premendo il tasto con la freccia a sinistra.

Inoltre, se invece che della parola "gedit", scrivo un testo più lungo, ad esempio "alibaba ed i 40 ladroni", ed impongo questa istruzione:
Codice: gambas [Seleziona]

 Write #fl, Chr(13) & "alibaba ed i 40 ladroni"

la prima riga del mio Terminale:
 vuott@vuott-desktop ~/Scrivania $

viene quasi completamente sovrascritta; ed avrò questo risultato:

 alibaba ed i 40 ladroni/Scrivania $


Insomma, dall'esperienza effettuata, sembra che con il metodo descritto nel mio primo messaggio il Terminale si comporti come la Console dell'IDE di Gambas: può mostrare il testo, ma non può utilizzare quel testo medesimo.
« Ultima modifica: 20 Novembre 2013, 01:28:47 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Lanciare un programma senza Shell, ma da una finestra di un Terminale
« Risposta #3 il: 02 Settembre 2012, 15:45:36 »
Quello che tu vedi sul terminale è come se fosse una echo della stringa inviata al pst/1, risultando quindi solo una print senza possibilità di esecuzione, diciamo come un'immagine di quello che hai scritto senza funzionalità, come se non fosse emessa da tastiera o da uno script shell.

Da come hai potuto riscontrare, la SendKey simula invece proprio l'input da tastiera, inviando i caratteri al device della medesima, e quindi con la possibilità di comporre un comando da eseguire.

L'invio dei caratteri comprende anche i caratteri di controllo, come ad esempio il CR (ritorno a capo), che corrisponde proprio al carattere inviato dal tasto Return della tastiera al sistema operativo.

Se vuoi tentare, probabilmente potresti inviare anche codici di controllo, per far eseguire cose particolari al sistema. Se fosse attivo l'ambiente grafico, invece di un terminale, potresti anche fare attività sul desktop, inserendo i codici appositi tramite smpre SendKeys.

Quindi, per concludere, il metodo SendKeys è quello che ti permette di avere un'interfacciamento attivo con il sistema operativo, mentre il discorso tramite l'esempio che hai fatto con il pst non ha la stessa funzionalità.

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.297
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Lanciare un programma senza Shell, ma da una finestra di un Terminale
« Risposta #4 il: 03 Settembre 2012, 15:50:33 »
Quello che tu vedi sul terminale è come se fosse una echo della stringa inviata al pst/1, risultando quindi solo una print senza possibilità di esecuzione, diciamo come un'immagine di quello che hai scritto senza funzionalità, come se non fosse emessa da tastiera o da uno script shell.

Sì, è appunto così.
Ad ogni modo io credo che quell'esperienza sia stata interessante come prova sul file speciale in /dev/pts/.... Da un punto di vista pratico l'utilizzo di un Terminale per la scrittura forse potrebbe anche servire, ...non so, la prima cosa che mi viene ora in mente  :-\ ..., per avere una sorta di print di controllo in un eseguibile.gambas, dato che in tal caso non è possibile sfruttare la presenza della console (come invece con l'IDE in fase progettuale).


Aggiornamento - vedere qui:
http://www.gambas-it.org/wiki/index.php?title=Lanciare_un_programma_senza_Shell,_ma_da_una_finestra_di_un_Terminale
« Ultima modifica: 04 Luglio 2014, 15:40:17 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Lanciare un programma senza Shell, ma da una finestra di un Terminale
« Risposta #5 il: 04 Settembre 2012, 09:48:54 »
I test fatti sul campo sono sempre utili!  :ok: