Differenze tra le versioni di "Aprire un Terminale e passargli una riga di comando mediante le funzioni esterne del API di X11"

Da Gambas-it.org - Wikipedia.
 
(Una versione intermedia di uno stesso utente non è mostrata)
Riga 2: Riga 2:
  
 
E' necessario richiamare inGambas ed avere installate nel sistema le librerie dinamiche condivise:
 
E' necessario richiamare inGambas ed avere installate nel sistema le librerie dinamiche condivise:
* "''libX11.so.6.3.0''"
+
* "''libX11.so.6.4.0'' "
* "''libXtst.so.6.1.0''"
+
* "''libXtst.so.6.1.0'' "
  
  
 
Mostriamo un semplice esempio, nel quale si invierà ad un Terminale già aperto i due caratteri "l" e "s", così a formare il comando bash "ls". Tale riga potrà essere efficacemente utilizzata nel Terminale medesimo cliccando come di consueto sul tasto "''Invio''" della tastiera, e vederne così il risultato.
 
Mostriamo un semplice esempio, nel quale si invierà ad un Terminale già aperto i due caratteri "l" e "s", così a formare il comando bash "ls". Tale riga potrà essere efficacemente utilizzata nel Terminale medesimo cliccando come di consueto sul tasto "''Invio''" della tastiera, e vederne così il risultato.
  Library "libX11:6.3.0"
+
  Library "libX11:6.4.0"
 
   
 
   
 
  Private Const XK_l As Integer = &6C
 
  Private Const XK_l As Integer = &6C
Riga 14: Riga 14:
 
  <FONT Color=gray>' ''Display *XOpenDisplay(char *display_name)''
 
  <FONT Color=gray>' ''Display *XOpenDisplay(char *display_name)''
 
  ' ''Opens a connection to the X server that controls a display.''</font>
 
  ' ''Opens a connection to the X server that controls a display.''</font>
  Private Extern XOpenDisplay(display_name As String) As Pointer
+
  Private Extern XOpenDisplay(display_name As Pointer) As Pointer
 
   
 
   
 
  <FONT Color=gray>' ''KeyCode XKeysymToKeycode(Display *display, KeySym keysym)''
 
  <FONT Color=gray>' ''KeyCode XKeysymToKeycode(Display *display, KeySym keysym)''
Riga 41: Riga 41:
 
    
 
    
 
  <FONT Color=gray>' ''Abbiamo 3 secondi per dare il "focus" manualmente al Terminale:''</font>
 
  <FONT Color=gray>' ''Abbiamo 3 secondi per dare il "focus" manualmente al Terminale:''</font>
  Wait 3
+
  Wait 3
 
    
 
    
 
  <FONT Color=gray>' ''Connessione al server X ed impostazione predefinita:''</font>
 
  <FONT Color=gray>' ''Connessione al server X ed impostazione predefinita:''</font>
  disp = XOpenDisplay(Null)
+
  disp = XOpenDisplay(0)
 +
  If disp == 0 Then Error.Raise("Errore !")
 
    
 
    
  InviaCarattere(disp, XK_l)
+
  InviaCarattere(disp, XK_l)
  InviaCarattere(disp, XK_s)
+
  InviaCarattere(disp, XK_s)
 
    
 
    
 
  <FONT Color=gray>' ''Chiude la libreria:''</font>
 
  <FONT Color=gray>' ''Chiude la libreria:''</font>
  XCloseDisplay(disp)
+
  XCloseDisplay(disp)
 
    
 
    
 
  '''End'''
 
  '''End'''
 
 
   
 
   
 
  '''Private''' Procedure InviaCarattere(ds As Pointer, keysym As Integer)
 
  '''Private''' Procedure InviaCarattere(ds As Pointer, keysym As Integer)
Riga 59: Riga 59:
 
   Dim keycode As Integer
 
   Dim keycode As Integer
 
    
 
    
  keycode = XKeysymToKeycode(ds, keysym)
+
  keycode = XKeysymToKeycode(ds, keysym)
 
    
 
    
  If keycode = 0 Then Return
+
  If keycode == 0 Then Return
 
    
 
    
 
  <FONT Color=gray>' ''Genera il regolare effetto del tasto premuto e di quello rilasciato:''</font>
 
  <FONT Color=gray>' ''Genera il regolare effetto del tasto premuto e di quello rilasciato:''</font>
  XTestFakeKeyEvent(ds, keycode, True, 0)
+
  XTestFakeKeyEvent(ds, keycode, True, 0)
  XTestFakeKeyEvent(ds, keycode, False, 0)
+
  XTestFakeKeyEvent(ds, keycode, False, 0)
 
    
 
    
  XSync(ds, False)
+
  XSync(ds, False)
 
    
 
    
 
  '''End'''
 
  '''End'''
 
  
  

Versione attuale delle 16:11, 1 mag 2023

Per passare ad un Terminale un comando, o comunque dei caratteri, con un'applicazione Gambas non in ambiente grafico (ma a riga di comando), si può far uso di alcune risorse del API della libreria di X11.

E' necessario richiamare inGambas ed avere installate nel sistema le librerie dinamiche condivise:

  • "libX11.so.6.4.0 "
  • "libXtst.so.6.1.0 "


Mostriamo un semplice esempio, nel quale si invierà ad un Terminale già aperto i due caratteri "l" e "s", così a formare il comando bash "ls". Tale riga potrà essere efficacemente utilizzata nel Terminale medesimo cliccando come di consueto sul tasto "Invio" della tastiera, e vederne così il risultato.

Library "libX11:6.4.0"

Private Const XK_l As Integer = &6C
Private Const XK_s As Integer = &73

' Display *XOpenDisplay(char *display_name)
' Opens a connection to the X server that controls a display.
Private Extern XOpenDisplay(display_name As Pointer) As Pointer

' KeyCode XKeysymToKeycode(Display *display, KeySym keysym)
' Uses internal Xlib tables and returns the KeyCode defined for the specified KeySym.
Private Extern XKeysymToKeycode(display As Pointer, keysym As Integer) As Integer

' int XCloseDisplay(Display *display)
' Closes the connection to the X server for the display specified in the Display structure and destroys all windows.
Private Extern XCloseDisplay(display As Pointer) As Integer


Library "libXtst:6.1.0"

' int XTestFakeKeyEvent(Display *display, unsigned int keycode, Bool is_press, unsigned long delay)
' Requests the server to simulate either a KeyPress (if is_press is True) or a KeyRelease of the key with the specified keycode.
Private Extern XTestFakeKeyEvent(display As Pointer, keycode As Integer, is_press As Boolean, delay As Long) As Integer

' XSync(Display *display, Bool discard)
' Flushes the output buffer.
Private Extern XSync(display As Pointer, discard As Boolean)


Public Sub Main()
 
 Dim disp As Pointer
 
' Abbiamo 3 secondi per dare il "focus" manualmente al Terminale:
 Wait 3
  
' Connessione al server X ed impostazione predefinita:
 disp = XOpenDisplay(0)
 If disp == 0 Then Error.Raise("Errore !")
 
 InviaCarattere(disp, XK_l)
 InviaCarattere(disp, XK_s)
  
' Chiude la libreria:
 XCloseDisplay(disp)
  
End

Private Procedure InviaCarattere(ds As Pointer, keysym As Integer)
 
 Dim keycode As Integer
  
 keycode = XKeysymToKeycode(ds, keysym)
  
 If keycode == 0 Then Return
  
' Genera il regolare effetto del tasto premuto e di quello rilasciato:
 XTestFakeKeyEvent(ds, keycode, True, 0)
 XTestFakeKeyEvent(ds, keycode, False, 0)
  
 XSync(ds, False)
  
End


Riferimenti