Autore Topic: Tastiera virtuale  (Letto 14303 volte)

Offline tornu

  • Gran Maestro dei Gamberi
  • *****
  • Post: 855
    • Mostra profilo
Tastiera virtuale
« il: 12 Novembre 2011, 11:52:37 »
Ho la neccessità di utilizzare in un progetto Gambas3 una tastiera virtuale su un touchscreen,
la prima cosa che mi è venuta in mente è richiamare quella disponibile in Ubuntu, perchè realizzarne
una con Gambas (presumo fattibile) credo sia un pò complicato.
Con la seguente istruzione

Codice: gambas [Seleziona]

Public Sub BtnKeyb_Click()
  Shell "onboard"
End


ho richiamato come detto quella di Ubuntu, che va benissimo come tastiera per le mie esigenze,
ma ho un problema, mi spiego:
Quando richiamata vorrei visulizzarla all'interno di un form con delle dimensioni ben precise posizionandola
in un punto prefissato dello schermo.
Non ho idea di come fare è se la cosa è fattibile.
Il software è come il sesso, è meglio quando è libero. (Linus Torvalds)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.181
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Tastiera virtuale
« Risposta #1 il: 12 Novembre 2011, 14:12:05 »
"all'interno di un form" io direi con l'Embedder ed il metodo Embed.


Se vuoi, invece, semplicemente visualizzarla sullo schermo:

Codice: gambas [Seleziona]

Public Sub BtnKeyb_Click()

Shell "onboard" Wait

' la tastierina virtuale viene posta in basso al centro dello schermo:
  Shell "wmctrl -r onboard -e 0,500,800,600,300"

End


Note:
1) Con il comando bash wmctrl la tastierina virtuale (in realtà: la finestra del programma da gestire) deve essere ovviamente aperta prima che operi il comando wmctrl (perché appunto questo agirà sulla sua finestra);
2) riguardo ai valori dell'esempio precedente:
  • 500 = coordinate x;
  • 800 = coordinate y;
  • 600 = lunghezza della finestra;
  • 300 = altezza della finestra.
Quindi, volendo, puoi anche far modificare la grandezza della tastierina virtuale. Se non vuoi, i due ultimi parametri dovrebbero essere posti a -1.

« Ultima modifica: 21 Agosto 2012, 03:08:52 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 tornu

  • Gran Maestro dei Gamberi
  • *****
  • Post: 855
    • Mostra profilo
Re: Tastiera virtuale
« Risposta #2 il: 12 Novembre 2011, 19:08:04 »
Ciao vuott,
grazie per la risposta ma sinceramente non ho capito i contenuti dei link che mi hai postato.
A me serve non solo visualizzarla ma deve interagire con il programma che sto realizzando in quanto deve funzionare
su un pc con touchscreen senza tastiera.
Ho detto contenuta all'interno di un form (per farmi capire) perchè non ho idea di come fare, inoltre
l'eventuale "contenitore" della tastiera virtuale mi deve dare la possibilità di inserire altri oggetti.
« Ultima modifica: 12 Novembre 2011, 19:10:20 da tornu »
Il software è come il sesso, è meglio quando è libero. (Linus Torvalds)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.181
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Tastiera virtuale
« Risposta #3 il: 12 Novembre 2011, 19:58:15 »
A me serve non solo visualizzarla ma deve interagire con il programma che sto realizzando...
Scusami, non sono stato preciso. Con "wmctrl la tastierina virtuale non viene solo visualizzata, ma funziona regolarmente: il comando wmctrl ti consente semplicemente di gestire la finestra della tastierina.
Se, infatti, provi a piazzare ad esempio una TextArea nel form ed a posizionare sullo schermo la tastierina virtuale con wmctrl, potrai vedere che cliccando sui suoi tasti  :coder: appaiono i caratteri sulla TextArea del programma.


Ho detto contenuta all'interno di un form...
...non ho capito i contenuti dei link che mi hai postato.
Da quel che so, lo puoi fare con Embed; ci sono varie discussioni al riguardo nel forum: prova a fare una ricerca.
« Ultima modifica: 31 Gennaio 2012, 17:10:05 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 tornu

  • Gran Maestro dei Gamberi
  • *****
  • Post: 855
    • Mostra profilo
Re: Tastiera virtuale
« Risposta #4 il: 12 Novembre 2011, 22:30:29 »
Grazie per le spiegazioni, ho fatto una ricerca sul forum (l'avevo fatta prima di postare) ma non ho trovato nulla di illuminante.
Rimango in attesa se tu o qualsiasi altro ha delle idee....
Il software è come il sesso, è meglio quando è libero. (Linus Torvalds)

Offline sotema

  • Maestro Gambero
  • ****
  • Post: 467
    • Mostra profilo
Re: Tastiera virtuale
« Risposta #5 il: 13 Novembre 2011, 13:49:25 »
L'uomo ha inventato la bomba atomica, ma nessun topo al mondo costruirebbe una trappola per topi.
Albert Einstein

Offline tornu

  • Gran Maestro dei Gamberi
  • *****
  • Post: 855
    • Mostra profilo
Re: Tastiera virtuale
« Risposta #6 il: 13 Novembre 2011, 22:29:09 »
Grazie ragazzi per le dritte.
Al momento sono fermo, ho dato uno sguardo alla documentazione che mi avete linkato, salvo che non mi sia sfuggito non ho trovato
niente che mi abbia ispirato, mi è alquanto ostica.
L'unico passo avanti che ho fatto è aver trovato un'esempio per Gambas2 nella Mailing-list Gambas Users, che ho provato è sono rimasto un pò perplesso. Lo posto è se qualcuno più esperto di me ha la volontà di provarlo è riesce a tirarne fuori un'idea da applicare alla mia neccessità lo ringrazio. L'unica cosa che vi anticipo e che ho dato uno sguardo al codice che purtroppo nei commenti, variabili è qunt'altro non siano comandi     
Gambas sono in tedesco.
Il software è come il sesso, è meglio quando è libero. (Linus Torvalds)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.181
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Tastiera virtuale
« Risposta #7 il: 14 Novembre 2011, 16:59:26 »
Ho la soluzione per te
(necessita ancora  ;D la presenza nel sistema del programmino wmctrl):

Codice: gambas [Seleziona]


Private h As Process

Public Sub Form_Open()

'....va be', metto qui a fini esemplificativi l'avvio di "onboard"
  h = Shell "onboard"

End

Public Sub Button1_Click()

 Dim id As Integer
 Dim listaId, s As String
 Dim ss As String[]
 Dim j As Byte

  Shell "wmctrl -p -l" To listaId

' per estrapolare l'ID di "onboard" raccolgo tutte le righe della variabile "listaId"
' distinguendole sulla base del carattere "nuova riga a capo":
    ss = Split(listaId, "\n")
 
    For j = 0 To ss.Max
' Se nella riga presa in considerazione è presente la parola "onboard"...
       If ss[j] Like "*onboard" Then
'...allora ne raccogliamo i caratteri che indicano l'Id in esadecimale della sua finestra...
         s = Replace(Split(ss[j], " ")[0], "0x", Null)
' ...e lo convertiamo in decimale:
         id = Val("&" & s)
' Per curiosità vediamo l'Id in console:
         Print id
       Endif
     Next

 ' Inserisco l'Id della finestra di "onboard" in "Embed":
     Embedder1.Embed(id)

End


Public Sub Button2_Click()  ' con questo puoi anche eliminare la tastierina

   h.kill

End


 :rolleyes:

Io l'ho provato con la calcolatrice KCalc su Kubuntu-KDE, e funziona perfettamente.

Fammi sapere.  :ciao:
« Ultima modifica: 09 Giugno 2015, 11:38:00 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 tornu

  • Gran Maestro dei Gamberi
  • *****
  • Post: 855
    • Mostra profilo
Re: Tastiera virtuale
« Risposta #8 il: 14 Novembre 2011, 18:30:33 »
Ciao vuott,
intanto grazie per l'aiuto che mi stai dando, ho provato il tuo codice ma all'avvio mi da questo errore:
Not enough arguments
Mi manca forse qualcosa?  ???
Il software è come il sesso, è meglio quando è libero. (Linus Torvalds)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.181
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Tastiera virtuale
« Risposta #9 il: 14 Novembre 2011, 20:28:34 »
....ho provato il tuo codice ma all'avvio mi da questo errore:
Not enough arguments
Mi manca forse qualcosa?  ???

...me lo dava anche a me fino a ieri questo medesimo problema, al di là del codice, che ho scritto solo oggi pomeriggio e che t'ho passato. Poi ieri sera ho fatto un aggiornamento di Gambas, ed oggi funziona. Forse il problema stava in qualche bug...  :-\  ..non saprei !  :-\
L'Embdder oggi mi funziona sia con KDE che con Gnome (poco fa - tra l'altro - ho embeddato con Mint-Gnome proprio la tastierina "onboard" !!!  :coder:  Quindi la cosa la potrai fare tranquillamente... se risolvi quel problema.)

Ho notato però che:
  • effettuando l'inglobamento (...embedding) con Mint-Gnome, questo non avviene con impostazione del componente gb.qt4, ma solo impostando il componente gb.gui oppure il componente gb.gtk ! (ma questo fatto solo i più esperti, rispetto ad un semianalfabeta come me, potranno spiegarti il perché);
  • effettuando l'inglobamento, invece, con Kubuntu-KDE, esso avviene anche con gb.qt4 !





Adde:
Dunque... sto provando ancora con l'Embedder: sto inglobando l'ira di dio !  Proprio di tutto !  :coder:  Mr Calamita ! :P Uno spassoooo !  :party:
« Ultima modifica: 17 Novembre 2013, 17:21:07 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 vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.181
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Tastiera virtuale
« Risposta #10 il: 15 Novembre 2011, 12:56:01 »
...ma ho elaborato una strada molto più breve e veloce:  :coder:
(qui non è più necessario wmctrl, né useremo più la Classe Process. Bisogna però attivare il componente: gb.desktop)

Codice: gambas [Seleziona]


Private dw As DesktopWindow  


Public Sub Form_Open()

  Shell "onboard"
      
End


Public Sub Button1_Click()

  Dim a As Integer


' Fra le finestre aperte sul Desktop...
    For Each dw In Desktop.Windows
    
 '...cerca quella avente nome "onboard"...
      If dw.name = "onboard" Then
 ' ...per estrarne l'Id (già in decimale !)...
        a = dw.Id
      Endif

   Next
  
 ' ...che va ad inserire in Embed:
   Embedder1.Embed(a)
  
End


Public Sub Button2_Click()  ' chiude "onboard"

' La finestra di "onboard" viene liberata dall'inglobamento:
   Embedder1.Discard()

' Viene nuovamente individuata...
   For Each dw In Desktop.Windows  
     If dw.name = "onboard" Then  
'  e quindi viene chiusa:
       dw.Close
     Endif  
   Next

End




...... di più "nin zò" !  ;D
« Ultima modifica: 17 Novembre 2013, 21:27:28 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 tornu

  • Gran Maestro dei Gamberi
  • *****
  • Post: 855
    • Mostra profilo
Re: Tastiera virtuale
« Risposta #11 il: 16 Novembre 2011, 12:05:11 »
Ehi! vuott non ti fermi più.... ;D
Abbiamo fatto passi avanti, per quanto riguarda l'errore che ti ho postato precedentemente ho risolto aggiornando (da svn) all'ultima versione.
Ho provato l'ultimo codice che hai postato ed avviene una cosa "strana", si avvia il form che contiene l'Embedder, viene visualizzata la tastiera
(onboard) all'interno del form, ma se sposto con il mouse il form in un'altra posizione la tastiera rimane ferma nella sua posizione.
Ne ho dedotto che la tastiera non è "inglobata" nell'Embedder ma che i due oggetti sono separati. ??? ???
Io uso:
Ubuntu 10.04 LTS
Gambas3 Rev.(svn)4249
Ora se il problema è quello che hai descritto tu
Ti segnalo che:

1 - Ho notato però che:
  • effettuando l'inglobamento (...embedding) con Mint-Gnome, questo non avviene con impostazione del componente gb.qt4, ma solo impostando il componente gb.gtk oppure il componente gb.gtk ! (ma questo fatto solo i più esperti, rispetto ad un semianalfabeta come me, potranno spiegarti il perché);
  • effettuando l'inglobamento, invece, con Kubuntu-KDE, esso avviene anche con gb.qt4 !
vediamo se qualcuno degli esperti del forum mi può dare una mano.
Grazie
Il software è come il sesso, è meglio quando è libero. (Linus Torvalds)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.181
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Tastiera virtuale
« Risposta #12 il: 16 Novembre 2011, 13:29:35 »
Ho provato l'ultimo codice che hai postato ed avviene una cosa "strana", si avvia il form che contiene l'Embedder, viene visualizzata la tastiera
(onboard) all'interno del form, ma se sposto con il mouse il form in un'altra posizione la tastiera rimane ferma nella sua posizione.
Ne ho dedotto che la tastiera non è "inglobata" nell'Embedder ma che i due oggetti sono separati. ??? ???
Io uso:
Ubuntu 10.04 LTS
Gambas3 Rev.(svn)4249

...dunque.... sto provando l'ultimo codice (quello più veloce con le funzioni di Gambas) con Kubuntu-KDE: ho inglobato la calcolatrice, ed ho provato a spostare il form per verificare il problema da te sollevato. Posso confermarti che la calcolatrice resta inglobata regolarmente nel riquadro dell'Embedder, e si sposta coerentemente con il form all'interno (come detto) dell'Embedder. Ti segnalo (ed è una conferma in fondo) che questo mi avviene (ho infatti eseguito per curiosità nuovamente le prove) sia impostando gb.qt4, sia gb.gui, sia gb.gtk.

Il problema da te segnalato, sospetto sia derivato dal fatto che tu - probabilmente (dammi conferma o smentita) - non hai piazzato sul form almeno un Button. Il mio breve codice, infatti, prevede l'azione di inglobamento solo se clicchi su un tasto, che deve chiamarsi "Button1" (come da codice).
La circostanza che la tastierina a te si apra proprio sul form, suppongo sia del tutto casuale. E', però, semplicemente visualizzata lì su.
Se è così, allora fai così:
1) piazza un Button1 nel form;
2) lancia il programmino;
3) clicca sul tasto;
4) verificato l'effettivo inglobamento nel riquadro dell'Embedder, prova a spostare il form.
Puoi piazzare anche un Button2 per chiudere contemporaneamente la tastierina ed il programmino Gambas.

Fammi sapere.
« Ultima modifica: 16 Novembre 2011, 14:02:29 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 vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.181
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Tastiera virtuale
« Risposta #13 il: 16 Novembre 2011, 17:32:56 »
..ad ogni modo... mi ha incuriosito il programmino EMBED.tar.gz, che hai inserito in un tuo messaggio sopra, e gli ho dato uno sguardo. E' vero, le spiegazioni scritte dall'autore sono in tedesco, però ho cercato di capirne il funzionamento e soprattutto di individuare i passaggi più importanti e salienti.
...e ho lì trovato un terzo modo di individuare l'ID della finestra di un programma  ;D . L'algoritmo lo puoi vedere all'interno della subroutine "WindowIDErmitteln()" (che infatti in tedesco insomma significa sostanzialmente "determina l'Id di una finestra).

Allora, il comando essenziale usato per ricavare l'ID è xwininfo:
xwininfo -name "nome_finestra_programma" | grep "nome_finestra_programma"

Ti riporto dunque il mio codice precedente, come sarebbe inserendo però il metodo di identificazione ed estrapolazione dell'ID della finestra utilizzato nel programma dell'autore tedesco:

Codice: gambas [Seleziona]


Private h as Process

Public Sub Form_Open()

  h = Shell "onboard"
      
End


Public Sub Button1_Click()
  Dim iWinId_Dezimal As Integer
  Dim sXWinInfoListe As String
  Dim aMatrix As String[]
  
' inserisce nella variabile stringa tutto il risultato del comando "xwininfo"...
  Shell "xwininfo -name " & "\"onboard\" | grep " & "\"onboard\"" To sXWinInfoListe

' ... e lo "spezzetta" nelle sue parole componenti,
' che inserisce in piu variabili stringhe[]:
  aMatrix = Split(sXWinInfoListe, " ")

' prende il contenuto della variabile stringa[] contenente il numero dell'ID (in esadecimale);
' lo converte in esadecimale compresibile da Gambas; poi in decimale....
     iWinId_Dezimal = Val("&" & Mid$(aMatrix[3], 3))
  
 ' ...che va ad inserire in Embed:
   Embedder1.Embed(iWinId_Dezimal)
  
End


Public Sub Button2_Click()  ' chiude "onboard" e poi il programma

  h.Kill
  Me.Close

End

« Ultima modifica: 17 Novembre 2013, 17:24:12 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 tornu

  • Gran Maestro dei Gamberi
  • *****
  • Post: 855
    • Mostra profilo
Re: Tastiera virtuale
« Risposta #14 il: 16 Novembre 2011, 17:57:28 »
Il form che avevo creato conteneva anche i due pulsanti, ma niente da fare.
Visto che stavo provando nel progetto per cui mi serve questa funzione, per sgombrare ogni dubbio che altro codice rompesse le scatole
all' Embedder ho creato un progetto di test pulito dove c'è soltanto un form, l'embedder e i due pulsanti previsti dal tuo codice che ho
utilizzato senza cambiare una virgola.
Il risultato non cambia.Ti allego uno screenshot del risultato.
Se hai altri suggerimenti ho riesci a capire perchè questo comportamnto, sono qui.
Ciao
« Ultima modifica: 16 Novembre 2011, 17:59:00 da tornu »
Il software è come il sesso, è meglio quando è libero. (Linus Torvalds)