Newsgroup: it.comp.lang.c++
Titolo: Muovere il mouse in modo cross-platform

Come posso spostare il cursore del mouse sullo schermo in modo indipendente
dalla piattaforma?
Per ora ho usato QCursor delle QT, ma
- Occorre prima inizializzare una QApp
- Le QT sono GPL solo per progetti GPL
Su Windows ci sono le API di Win, su Linux uso le Xlib (anche se muove il
mouse in modo asincrono, e per me non è desiderabile). Mi è sembrato che le
librerire SDL e wxWidgets non possano muovere il cursore. Quali altre
librerie multipiattaforma potrei usare?
-- 
  Narcolessico
 
http://binaryunit.blogspot.com

 librerie multipiattaforma potrei usare?
SDL puo`: SDL_WarpMouse
http://www.libsdl.org/cgi/docwiki.cgi/SDL_5fWarpMouse
e pure GTK: gdk_display_warp_pointer
http://library.gnome.org/devel/gdk/stable/GdkDisplay.html#gdk-display-warp-pointer
Suppongo che pure wx abbia un metodo simile!
---
Bye,
  Gabry

 
http://www.libsdl.org/cgi/docwiki.cgi/SDL_5fWarpMouse
Deve essermi sfuggito... :) Ma le SDL su Windows sono poco usate come le
GTK, o è probabile trovarle già installate?
E per simulare un click immagino che si debba creare un evento ad hoc e
caricarlo nella coda:
http://www.libsdl.org/cgi/docwiki.cgi/SDL_5fPushEvent
Grazie. 
-- 
  Narcolessico
 
http://binaryunit.blogspot.com

 GTK, o è probabile trovarle già installate?
Quel che non capisco è che senso ha legare un'applicazione ad una
specifica libreria per una cosa così limitata ad una sola singola
operazione come lo spostare il puntatore del mouse.
Perché non andare semplicemente di compilazione condizionata,
sull'implementazione di una classe MouseMover? All'interno utilizzi le
api native della piattaforma a seconda che compili per windows linux o
altro.
In questo modo eviti anche fastidiose dipendenze con librerie astruse
(che complicano a volte l'installazione)

 (che complicano a volte l'installazione)
Hai perfettamente ragione, il punto è che sto sviluppando un prototipo che
adesso è solo per riga di comando, ma fra poco avrà bisogno di una piccola
interfaccia (e dovrà essere multipiattaforma). Quindi da qui a poco dovrò
comunque appoggiarmi ad una libreria esterna.
E poi su linux so usare le Xlib, ma lì la funzione per muovere il mouse è
asincrona (essendo X un server...) e il più delle volte il main termina
prima che il movimento venga effettivamente fatto. Sicuramente ci sarà una
soluzione, ma tanto vale cominciare subito con una libreria esterna.
La butto lì: e se simulassi il mouse generando un interrupt? Sarebbe
dipendente dalla piattaforma? Non ho pratica a così basso livello...
-- 
  Narcolessico
 
http://binaryunit.blogspot.com

 dipendente dalla piattaforma? 
Mica tanto :-)
Diciamo che andrebbe a dipendere non solo dal S.O. ma anche
dall'hardware. Meglio lasciar perdere.

 dipendente dalla piattaforma? Non ho pratica a così basso livello...
A basso livello le cose sono COSI' dipendenti dalle piattaforme che la 
differenza di API che trovi ad alto livello ti sembrera` poca cosa :)
--
Bye,
  Gabry

Ci credete che non sto capendo come si fa a generare un evento con le wx se
no si ha una finestra? :/
Ho una deadline tra qualche giorno, quindi credo che per ora userò le SDL,
poi approfondirò il tutto. Grazie dei consigli!
-- 
  Narcolessico
 
http://binaryunit.blogspot.com

 il mouse in modo asincrono, e per me non è desiderabile). 
Dai una occhiata a:
http://tronche.com/gui/x/xlib/event-handling/XSync.html
Qualsiasi libreria multipiattaforma tu usi, viene comunque usata Xlib, se 
l'ambiente grafico è XWindow.
Manlio Perillo

E' incredibile... Una giornata che mi sbatto e ancora nulla...
SDL, GTK, QT: è facile muovere il cursore, ma non si può tenere lo stato del
pulsante! Se genero un evento mousebutton e poi muovo il cursore, è
automaticamente eseguito il release. In altre parole, se provo a disegnare
su Gimp non disegno delle linee ma solo dei punti in corrispondenza degli
eventi mousebuttonpress. E poi queste librerie hanno la struttura degli
eventi e dei metodi uguali uguali a quelli di Xlib: è evidente che vi si
appoggiano direttamente.
XLib: il mouse si muove e genero gli eventi per i pulsanti, ma è possibile
solo riferendosi ad una finestra specifica. Se mi riferisco allo schermo,
alle applicazioni non arrivano i click. Usare XWarpPointer fa perdere lo
stato del button. Ma se non uso warppointer, l'evento di movimento del
muose viene passato solo alla finestra originaria: non posso chiedere il
focus di un'altra finestra, anche se rifaccio il clik (per capirci, in gimp
continuo a disegnare fuori dalla finestra). E poi il cursore del mouse, se
non uso XWarp, rimane fermo, quindi sono generati degli eventi a più alto
livello.
Mi chiedo: ma come fa la classe Robot di java
(
http://java.sun.com/j2se/1.4.2/docs/api/java/awt/Robot.html
) che ha dei
semplicissimi "mouseMove" e "mousePress"? Sarebbero perfetti, li ho provati
e tengono lo stato dei pulsati. Ma non posso usare Java, adesso!
Sto impazzendo... Possibile che non ci siano delle librerie C++ in grado di
fare questa semplice cosa?
-- 
  Narcolessico
 
http://binaryunit.blogspot.com

 [...]
Manlio Perillo

 it.comp.os.linux.development e l'analogo windows.
Hai ragione, cominciavo ad andare un po' OT...
Grazie a tutti delle risposte!
-- 
  Narcolessico
 
http://binaryunit.blogspot.com