2009-11-03 7 views
23

Recentemente ho acquistato un Magic Mouse. È fantastico e pieno di potenziale. Sfortunatamente, è seriamente ostacolato dal supporto software. Voglio sistemarlo. Ho fatto un sacco di ricerche e queste sono le mie scoperte sulla catena di eventi finora:Funzionalità estese del mouse magico: ho bisogno di un kext?

  1. Il mouse magico invia eventi multitouch completi al sistema.
  2. eventi Multitouch vengono elaborati nel MultitouchSupport.framework (Carbon)
  3. Gli eventi sono interpretati nel quadro e inviati al sistema come eventi normali
    • Quando si scorre con un dito invia rotella di scorrimento reale eventi.
    • Quando si fa scorrere con due dita, viene inviato un evento di scorrimento.
  4. Nessun evento NSTouch viene inviato al sistema. Non è possibile utilizzare l'API NSTouch per interagire con il mouse.

Dopo ho scoperto tutto quanto sopra, ho diassembled il file MultitouchSupport.framework e, con un po 'googling, capito come inserire un richiamo della mia nella catena quindi vorrei ricevere i dati degli eventi di tocco crudo. Se si enumera l'elenco di dispositivi, è possibile allegare per ciascun dispositivo (trackpad e mouse). Questo risultato ci consentirà di creare una struttura per l'utilizzo del multitouch sul mouse, ma solo in una singola applicazione. Vedi il mio post qui: Raw Multitouch Tracking.

Voglio aggiungere nuove funzionalità al mouse attraverso l'intero sistema , non solo una singola app.

Nel tentativo di farlo, ho scoperto come utilizzare Event Taps per verificare se il tocco di evento di livello più basso mi consentisse di ottenere i dati grezzi, interpretarli e inviare i miei eventi al suo posto. Sfortunatamente, questo non è il caso. Il tocco dell'evento, anche a livello HID, è ancora un gradino sopra il punto in cui l'input viene interpretato in MultitouchSupport.framework.

Vedere il mio tentativo di tentativo del tocco qui: Event Tap - Attempt Raw Multitouch.
Un'interessante nota a margine: quando viene ricevuto un evento multitouch, ad esempio uno scorrimento, viene colpito il caso predefinito e viene stampato un numero di evento di 29. L'intestazione mostra 28 come il numero massimo.

Sulla mia domanda, ora che hai tutte le informazioni e ho visto quello che ho provato: quale sarebbe l'approccio migliore per estendere la funzionalità del Magic Mouse? So che ho bisogno di inserire qualcosa a un livello abbastanza basso per ottenere l'input prima che venga elaborato e vengono inviati gli eventi predefiniti. Quindi, per ridurlo a domande a frase singola:

  • C'è un modo per sovrascrivere i callback predefiniti utilizzati in MultitouchSupport.framework?
  • Devo scrivere un kext e gestire personalmente tutti i dati in arrivo?
  • E 'possibile scrivere un kext che si trova sulla cima del kext che sta gestendo l'ingresso ora, e filtri dopo che kext ha fatto tutto il lavoro duro?

Il mio primo obiettivo è quello di essere in grado di inviare un mezzo evento click del pulsante se ci sono due dita sul dispositivo quando si fa clic. Ovviamente c'è molto, molto più che potrebbe essere fatto, ma questo sembra una buona cosa per cui spara, per ora.

Grazie in anticipo!

-Sastira

+2

Inoltre: se * è * un kext di cui ho bisogno, dove potrei trovare risorse per scriverne uno ? Googling non è stato troppo fruttuoso al riguardo. – Tyler

risposta

4

In che modo ciò che accade in MultitouchSupport.framework è diverso tra Magic Mouse e trackpad in vetro? Se è basato sulle proprietà del dispositivo IOKit, ho il sospetto che ti serva un KEXT che emuli un trackpad ma in realtà comunichi con il mouse. Apple hanno una certa documentazione sulla programmazione del kernel e del kernel Darwin estensioni specificamente:

(Personalmente, mi piacerebbe qualcosa che ha permesso l'ingrandimento pizzico e altro colpo/i gesti dei pulsanti: il Magic Mouse è un downgrade funzionale dai quattro pulsanti di Mighty Mouse e dalla rotella di scorrimento 2D [anche se sempre inceppata]. Aggiornamento: l'anno scorso ho scritto Sesamouse per fare proprio questo, e NON ha bisogno di un kext (solo una settimana o due che fissano i dump esadecimali :-) Vedi la mia altra risposta per i file e il codice sorgente.)

+0

Il trackpad invia tutti i suoi eventi attraverso il framework tramite l'API NSTouch. Inoltre, supporta molte più funzioni. Sono abbastanza sicuro di aver bisogno anche di un kext. Grazie per le informazioni! – Tyler

2

Se si arriva a quel punto, si può prendere in considerazione il clic centrale essendo tre dita sul mouse invece di due. Ho pensato a questo problema con il mouse centrale con il mouse magico e ho notato che spesso lascio il mio secondo dito sul mouse anche se sto premendo solo per un clic sinistro. Quindi un clic "a due dita" potrebbe essere scambiato per un singolo clic sinistro, e richiederebbe allo stesso utente più sforzo nel tenere sempre il secondo dito fuori dal mouse. Pertanto, se è possibile rilevare, tre dita causerebbero meno confusione e mal di testa. Mi chiedo da dove arriverà la prima soluzione di "clic sul pulsante centrale", poiché sono ansioso di restituire la caratteristica centrale "Esci da clic" :). Buona fortuna.

+0

Sì, ho avuto questa discussione con diverse persone e mi sono reso conto che faccio la stessa cosa senza accorgermene.:) Il mouse può tenere traccia di un massimo di tre dita, quindi posso fare facilmente tre dita clic == medio clic. – Tyler

3

I ' abbiamo implementato un proof-of-concept del wrapper di eventi multi-touch personalizzabile per userspace.

Si può leggere su di esso qui: http://aladino.dmi.unict.it/?a=multitouch (si veda in WaybackMachine)

- tutto il meglio

+0

Bel post. Non sapevo tutte quelle varie funzioni per la pubblicazione di eventi, ecc. Sono sicuro che sarà utile. Apprezzerei molto se tu facessi un linkback a questa pagina in modo che possa ottenere più visualizzazioni e forse più input da persone che hanno familiarità con quello che sto cercando di fare. Grazie! – Tyler

3

dispiace ho dimenticato di aggiornare questa risposta, ma ho finito per capire come iniettare multitouch e gesti gli eventi nel sistema da userland tramite Quartz Event Services. Non sono sicuro di quanto bene è sopravvissuto l'aggiornamento del leone, ma è possibile controllare il codice sorgente sottostante al https://github.com/calftrail/Touch

Richiede due hack: utilizzando il framework privato Multitouch per ottenere l'ingresso del dispositivo, e l'iniezione senza documenti Strutture CGEvent in Quartz Event Services. È stato incredibilmente divertente capire come farlo, ma in questi giorni ti consiglio di acquistare un Magic Trackpad :-P