2012-11-28 14 views
11

Devo disattivare/disattivare a livello di codice i gesti tattili di sistema su Mac OS. Mi riferisco a gesti come lo scorrimento a 4 dita tra gli spazi, ecc.OSX - Disattivazione dei gesti tattili a livello di sistema

Ho cercato su EventTap ma non sembra un'opzione (nonostante i rapporti precedenti qui - forse è cambiato sotto 10.8)

Ho anche provato numerosi modi per modificare le preferenze di sistema in modo programmatico. Ad esempio, ho provato a utilizzare IOConnectSetCFProperties sul servizio che lo ha localizzato utilizzando IORegistryEntryCreateCFProperties.

Ho anche approfondito riquadro trackpad preferenze per vedere come lo fanno, e ho cercato di riprodurlo (ignora qualsiasi CREATE/incongruenze di rilascio, questo è solo il codice di prova):

NSInteger zero = 0; 
    CFNumberRef numberWith0 = CFNumberCreate(kCFAllocatorDefault, kCFNumberNSIntegerType, &zero); 

    CFMutableDictionaryRef propertyDict = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, 
                    &kCFTypeDictionaryKeyCallBacks, 
                    &kCFTypeDictionaryValueCallBacks); 

    CFDictionarySetValue(propertyDict, @"TrackpadFourFingerHorizSwipeGesture", numberWith0); 

    io_connect_t connect = getEVSHandle(); // Found in the MachineSettings framework 

    if (!connect) 
    { 
     NSLog(@"Unable to get EVS handle"); 
    } 

    kern_return_t status = IOConnectSetCFProperties(connect, propertyDict); 

    if (status != KERN_SUCCESS) 
    { 
     NSLog(@"Unable to get set IO properties"); 
    } 

    CFRelease(propertyDict); 
    CFPreferencesSetValue(CFSTR("com.apple.trackpad.fourFingerHorizSwipeGesture"), _numberWith0, kCFPreferencesAnyApplication, kCFPreferencesCurrentUser, kCFPreferencesCurrentHost); 

    CFPreferencesSetValue(CFSTR("TrackpadFourFingerHorizSwipeGesture"), _numberWith0, CFSTR("com.apple.driver.AppleBluetoothMultitouch.trackpad"), kCFPreferencesCurrentUser, kCFPreferencesCurrentHost); 

    CFPreferencesSynchronize(kCFPreferencesAnyApplication, kCFPreferencesCurrentUser, kCFPreferencesCurrentHost); 

    status = BSKernelPreferenceChanged(CFSTR("com.apple.driver.AppleBluetoothMultitouch.trackpad")); 

In in questo caso sembra funzionare, non ci sono errori e l'opzione diventa disabilitata nel pannello delle preferenze di sistema, tuttavia il gesto con quattro dita continua a funzionare. Ho il sospetto che il logout in poi avrà un effetto, ma non l'ho provato perché non è abbastanza buono in ogni caso.

Vale la pena notare che anche il riquadro di prefetto chiama BSKernelPreferenceChanged, ma non conosco quale framework potrebbe essere per collegarsi ad esso. Forse questa è la chiave del problema ...

AGGIORNAMENTO: In realtà ora l'ho trovato e collegato. L'aggiunta di quella chiamata non ha fatto alcuna differenza, sebbene restituisca 1 che potrebbe indicare un errore. Ho aggiunto la chiamata al codice sopra.

Infine ho provato questo dal terminale:

defaults write -globalDomain com.apple.trackpad.fourFingerHorizSwipeGesture 0 
defaults write com.apple.driver.AppleBluetoothMultitouch.trackpad TrackpadFourFingerHorizSwipeGesture 0 

che non ha un effetto immediato o.

Non credo che questo non è possibile, ci deve essere un modo ...

compatibilità MAS non è necessaria.

+0

Per i "defaults write" bit, che cosa si intende per "non avere un immediato effetto "Funziona dopo il riavvio? Molte volte devi "killall dock" e "killall finder" per rendere effettive alcune delle impostazioni predefinite. – jeremy

+0

Ciao Jeremy. Anzi, ma ho bisogno che abbia un effetto immediato, come quando cambia le opzioni del trackpad nel pannello delle preferenze. – tarmes

+0

potresti provare a riavviare il finder, se non vuoi disconnetterti. –

risposta

0

Penso che stiate cercando nel posto sbagliato per disabilitare gli eventi di tocco. Il modo in cui OSX (e molti altri sistemi) è che il primo risponditore nella catena di visualizzazione per gestire l'evento interromperà la propagazione dell'evento. Dovrai scrivere gestori di eventi nelle tue visualizzazioni per ciascuno degli eventi tattili che desideri gestire e, se esistono, il sistema operativo smetterà di inviare gli eventi fino al finder o qualsiasi altra applicazione sia in linea per gestire il tocco eventi.

See: http://developer.apple.com/library/mac/#documentation/cocoa/conceptual/EventOverview/HandlingTouchEvents/HandlingTouchEvents.html

In particolare: Gestione Multi-Touch Events (chiamata setAcceptsTouchEvents, quindi implementare tocchi ... withEvent ...)

Speranza che aiuta!

+0

Ciao. Non ho idea se questo possa funzionare per un'app standard di se i gesti globali si verifichino ancora. In ogni caso non posso farlo perché sto cercando di aggiungere gesti a un'altra app (controllandola tramite l'API Assistive). Quindi, devo fare quello che sto cercando di fare ... – tarmes

+0

Su hotkey, puoi caricare una vista a schermo intero trasparente sullo schermo che può catturare gli eventi? – jeremy

+0

Sfortunatamente no, dal momento che l'utente deve ancora poter interagire con l'altra app. – tarmes

1

Sto anche provando a farlo.

I tocchi degli eventi non funzionano, né hanno una vista che è il primo risponditore.

Da docs Apple:

Tuttavia, ci sono alcuni gesti a livello di sistema, come ad esempio un colpo quattro dita.per il quale l'implementazione del sistema ha la precedenza su qualsiasi gesto gestisca un'applicazione esegue.

L'unico modo in cui sono riuscito a bloccare i gesti del sistema è l'utilizzo di CGDisplayCapture. Ciò consente alla mia applicazione l'accesso esclusivo a tutti gli eventi ... ma anche a un contesto di disegno a schermo intero.

Forse è possibile vedere ciò che le chiamate sono fatte per i servizi per eventi quarzo quando si entra in questa modalità

https://developer.apple.com/library/mac/#documentation/graphicsimaging/Conceptual/QuartzDisplayServicesConceptual/Articles/DisplayCapture.html