Мне нужно программно отключить/подавить общесистемные сенсорные жесты в Mac OS. Я имею в виду такие жесты, как смахивание четырьмя пальцами между пробелами и т. д.
Я просмотрел EventTap, но это не вариант (несмотря на предыдущие отчеты здесь - возможно, он изменился в версии 10.8)
Я также пробовал множество способов программного изменения системных настроек. Например, я попытался использовать IOConnectSetCFProperties для службы, найдя ее с помощью IORegistryEntryCreateCFProperties.
Я также изучил панель настроек трекпада, чтобы увидеть, как они это делают, и попытался воспроизвести ее (игнорируйте любые несоответствия создания/выпуска, это просто тестовый код):
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"));
В этом случае кажется, что он работает, ошибок нет, и параметр отключается на панели настроек системы, однако жест четырьмя пальцами продолжает работать. Я подозреваю, что выход из системы, а затем вход в нее будут иметь эффект, но я не пробовал, потому что в любом случае этого недостаточно.
Стоит отметить, что сама панель Pref также вызывает BSKernelPreferenceChanged, но я не знаю, какая это может быть структура, чтобы связать ее. Возможно, это ключ к проблеме...
ОБНОВЛЕНИЕ: На самом деле я нашел его и связал с ним. Добавление этого вызова ничего не изменило, хотя он возвращает 1, что может указывать на ошибку. Я добавил вызов в код выше.
Наконец, я попробовал это с терминала:
defaults write -globalDomain com.apple.trackpad.fourFingerHorizSwipeGesture 0
defaults write com.apple.driver.AppleBluetoothMultitouch.trackpad TrackpadFourFingerHorizSwipeGesture 0
Это тоже не дает немедленного эффекта.
Я не верю, что это невозможно, должен же быть способ...
Совместимость с MAS не требуется.