static PyObject *Evt_LMGetKeyThresh(PyObject *_self, PyObject *_args) { PyObject *_res = NULL; SInt16 _rv; #ifndef LMGetKeyThresh PyMac_PRECHECK(LMGetKeyThresh); #endif if (!PyArg_ParseTuple(_args, "")) return NULL; _rv = LMGetKeyThresh(); _res = Py_BuildValue("h", _rv); return _res; }
UIOHOOK_API long int hook_get_auto_repeat_delay() { #if defined USE_IOKIT || defined USE_COREFOUNDATION || defined USE_CARBON_LEGACY bool successful = false; SInt64 delay; #endif long int value = -1; #ifdef USE_IOKIT if (!successful) { io_service_t service = IOServiceGetMatchingService(kIOMasterPortDefault, IOServiceMatching(kIOHIDSystemClass)); if (service) { kern_return_t kren_ret = kIOReturnError; io_connect_t connection; kren_ret = IOServiceOpen(service, mach_task_self(), kIOHIDParamConnectType, &connection); if (kren_ret == kIOReturnSuccess) { IOByteCount size = sizeof(delay); kren_ret = IOHIDGetParameter(connection, CFSTR(kIOHIDInitialKeyRepeatKey), (IOByteCount) sizeof(delay), &delay, &size); if (kren_ret == kIOReturnSuccess) { /* This is in some undefined unit of time that if we happen * to multiply by 900 gives us the time in milliseconds. We * add 0.5 to the result so that when we cast to long we * actually get a rounded result. Saves the math.h depend. * * 33,333,333.0 / 1000.0 / 1000.0 / 1000.0 == 0.033333333 * Fast * * 100,000,000.0 / 1000.0 / 1000.0 / 1000.0 == 0.1 * 200,000,000.0 / 1000.0 / 1000.0 / 1000.0 == 0.2 * 500,000,000.0 / 1000.0 / 1000.0 / 1000.0 == 0.5 * 1,000,000,000.0 / 1000.0 / 1000.0 / 1000.0 == 1 * 1,500,000,000.0 / 1000.0 / 1000.0 / 1000.0 == 1.5 * 2,000,000,000.0 / 1000.0 / 1000.0 / 1000.0 == 2 * Slow * */ value = (long) (900.0 * ((double) delay) / 1000.0 / 1000.0 / 1000.0 + 0.5); successful = true; logger(LOG_LEVEL_INFO, "%s [%u]: IOHIDGetParameter: %li.\n", __FUNCTION__, __LINE__, value); } } } } #endif #ifdef USE_COREFOUNDATION if (!successful) { CFTypeRef pref_val = CFPreferencesCopyValue(CFSTR("InitialKeyRepeat"), kCFPreferencesAnyApplication, kCFPreferencesCurrentUser, kCFPreferencesAnyHost); if (pref_val != NULL && CFGetTypeID(pref_val) == CFNumberGetTypeID()) { if (CFNumberGetValue((CFNumberRef) pref_val, kCFNumberSInt32Type, &delay)) { // This is the slider value, we must multiply by 15 to convert to // milliseconds. value = (long) delay * 15; successful = true; logger(LOG_LEVEL_INFO, "%s [%u]: CFPreferencesCopyValue: %li.\n", __FUNCTION__, __LINE__, value); } } } #endif #ifdef USE_CARBON_LEGACY if (!successful) { // Apple documentation states that value is in 'ticks'. I am not sure // what that means, but it looks a lot like the arbitrary slider value. delay = LMGetKeyThresh(); if (delay > -1) { // This is the slider value, we must multiply by 15 to convert to // milliseconds. value = (long) delay * 15; successful = true; logger(LOG_LEVEL_INFO, "%s [%u]: LMGetKeyThresh: %li.\n", __FUNCTION__, __LINE__, value); } } #endif return value; }