Embedder

Da Gambas-it.org - Wikipedia.

Questa classe fornisce un controllo che può incorporare qualsiasi altra finestra X11 da qualsiasi altra applicazione X11. L'applicazione integrata dovrebbe seguire il protocollo XEmbed. L'embedder, dunque, è la funzione che permette di inglobare una finestra qualsiasi di un'applicazione del desktop in un progetto Gambas. Essa crea un link con un altro processo X11 (applicazione su desktop), e ne gestisce la comunicazione, in modo da poterla controllare all'interno del programma Gambas. Il processo di embedding non produce un inglobamento di una semplice immagine inerte ed inattiva del programma, bensì, inglobandone la finestra all'interno dell'oggetto Embedder, esso consente all'utente di operare regolarmente sull'applicazione inglobata.

L'inglobamento della finestra non avviene automaticamente, ma è necessario passare alla funzione l'handle della finestra dell'applicazione da inglobare. Questo handle è un identificativo (un Integer), che deve essere ricevuto dalla funzione che intende incorporare la finestra principale dell'applicazione. In definitiva, alla funzione dovrà essere passato il PID{1} della finestra dell'applicazione che si intende inglobare.


Indice

[modifica] Modalità per trovare il PID della finestra di un'applicazione

Vi sono ben quattro modalità per trovare il PID della finestra dell'applicazione da inglobare:

  1. con wmctrl. Esso è un comando che normalmente viene lanciato da terminale, e che pertanto in Gambas si potrà lanciare con Shell o Exec. Esempio: Shell "wmctrl -p -l".
  2. h as Process
    
    Public Sub Form_Open()
    
     h = Shell "nome_programma"
         
    End
    
    
    Public Sub Button1_Click()
    
    Dim a, b, decInt As Integer
    Dim lista As String
    Dim aStr As String[]
    
    ' inserisce nella variabile stringa tutto il risultato del comando "wmctrl"...
    Shell " wmctrl -p -l" To lista
    
    ' ...e lo "spezzetta" nelle sue parole componenti,
    ' che inserisce in piu variabili stringhe[]:
    aStr = Split(lista, " ")
    
     For a = 0 To aStr.Count - 1
     
       If aStr[a] Like "nome_finestra*" Then
         For b = a - 1 To a - 10 Step - 1
           If Right(aStr[b], 10) Like "0x*" Then
    
    ' ottiene il numero esadecimale del PID, e lo converte in decimale...
             Val("&" & Right(aStr[b], 8))
           Endif
         Next
       Endif
     Next
    
    '...per passarlo così ad Embed:
      Embedder1.Embed(decInt)
    
    End
    
    
    Public Sub Button2_Click()  ' chiude "nome_programma" e poi il programma Gambas
    
     h.Kill
     Me.Close
    
    End
    


  3. con xwininfo. Anche questo è un comando che normalmente viene lanciato da terminale, ma bisogna indicare il titolo della finestra dell'applicazione che si vuole inglobare, e che pertanto in Gambas si potrà lanciare con Shell o Exec.
    Esempio: Shell "xwininfo -name " & "\titolo_finestra_programma\" | grep " & "\titolo_finestra_programma\".
  4. h as Process
    
    Public Sub Form_Open()
    
     h = Shell "nome_programma"
         
    End
    
    
    Public Sub Button1_Click()
    
     Dim decInt As Integer
     Dim lista As String
     Dim aStr As String[]
     
    ' inserisce nella variabile stringa tutto il risultato del comando "xwininfo"...
     Shell "xwininfo -name " & "\"titolo_finestra_programma\" | grep " & "\"titolo_finestra_programma\"" To lista
    
    ' ...e lo "spezzetta" nelle sue parole componenti,
    ' che inserisce in piu variabili stringhe[]:
     aStr = Split(lista, " ")
    
    ' prende il contenuto della variabile stringa[] contenente il numero del PID (in esadecimale);
    ' lo converte in esadecimale compresibile da Gambas; poi in decimale...
        decInt = Val("&" & Mid$(aStr[3], 3))
     
    ' ...che va ad inserire in Embed:
      Embedder1.Embed(decInt)
      
    End
    
    
    Public Sub Button2_Click()  ' chiude "nome_programma" e poi il programma Gambas
    
     h.Kill
     Me.Close
    
    End
    


  5. con la funzione propria di Gambas DesktopWindow (sarà necessario caricare il componente gb.desktop). Si procederà con il seguente algoritmo:
  6. Public Sub Button1_Click()
    
     Dim dWin As DesktopWindow
     Dim a As Integer
    
       For Each dWin In Desktop.Windows
       
     ' cerca la finestra avente titolo "titolo_finestra_programma"...
         If dWin.name = "titolo_finestra_programma"{2} Then
     ' ...per estrarne il Pid (già in decimale !)...
           a = dWin.Id
         Endif
    
      Next
    
    ' ...che va ad inserire in Embed:
      Embedder1.Embed(a)
    
    End
    


  7. con la funzione propria di Gambas Desktop.FindWindow (sarà necessario caricare il componente gb.desktop). Questo metodo ritorna un array di identificatori delle finestre X11 presenti sul desktop dell'utente. Si procederà con il seguente algoritmo:
  8. Public Sub Button1_Click()
    
     Dim aHandle As Integer[]
     Dim iHandle As Integer
     
         aHandle = Desktop.FindWindow(titolo_finestra_programma)
    
       If aHandle.Count = 0 Then 
         Message.Warning("Finestra non trovata !")
         Return
       Endif
    
       iHandle = aHandle[0]
    
    ' ...che va ad inserire in Embed:
      Embedder1.Embed(iHandle)
    
    End
    

[modifica] Funzione dell'inglobamento

Il PID della finestra X11 dell'applicazione da inglobare dovrà essere passato alla funzione che consentirà, appunto, l'embedding. Si utilizzarà dunque il metodo embed:
Embedder1.embed(pid_della_finestra).

[modifica] Eliminare l'inglobamento

Per liberare una finestra dall'inglobamento, precedentemente effettuato, si dovrà utilizzare il metodo discard:
Embedder1.discard(pid_della_finestra).

[modifica] Chiudere un'applicazione inglobata

Se, invece, si intende chiudere un'applicazione precedentemente inglobata, si dovrà controllare detta applicazione tramite un processo; altrimenti, chiudendola, il programma lanciato rimarrà in memoria e non verrà terminato:

Public hProc As Process

Public Sub ......()
' si lancia l'applicazione e si controlla con una variabile Process
 hProc = Shell "nome_applicazione"
......
End

Public Sub ......()
 ' qui va l'algoritmo dell'intero processo di inglobamento
 ' della finestra dell'applicazione sopra lanciata 
End

Public Sub Button1_Click()
' si elimina il processo dell'applicazione
 hProc.kill
End

[modifica] Note

[1] Per una definizione del P.I.D. vedere qui.

[2] E' possibile usare anche il metacarattere * sostituendo il segno = con LIKE. Esempio: If dWin.name Like "titolo_finestra_prog*" Then...

Strumenti personali