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:
- 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".
- 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\". - con la funzione propria di Gambas DesktopWindow (sarà necessario caricare il componente gb.desktop). Si procederà con il seguente algoritmo:
- 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:
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
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
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
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...
