diff options
Diffstat (limited to 'libs/ui/InputManager.cpp')
-rw-r--r-- | libs/ui/InputManager.cpp | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/libs/ui/InputManager.cpp b/libs/ui/InputManager.cpp new file mode 100644 index 0000000..ab354a5 --- /dev/null +++ b/libs/ui/InputManager.cpp @@ -0,0 +1,114 @@ +// +// Copyright 2010 The Android Open Source Project +// +// The input manager. +// +#define LOG_TAG "InputManager" + +//#define LOG_NDEBUG 0 + +#include <cutils/log.h> +#include <ui/InputManager.h> +#include <ui/InputReader.h> +#include <ui/InputDispatcher.h> + +namespace android { + +InputManager::InputManager(const sp<EventHubInterface>& eventHub, + const sp<InputDispatchPolicyInterface>& policy) : + mEventHub(eventHub), mPolicy(policy) { + mDispatcher = new InputDispatcher(policy); + mReader = new InputReader(eventHub, policy, mDispatcher); + + mDispatcherThread = new InputDispatcherThread(mDispatcher); + mReaderThread = new InputReaderThread(mReader); + + configureExcludedDevices(); +} + +InputManager::~InputManager() { + stop(); +} + +void InputManager::configureExcludedDevices() { + Vector<String8> excludedDeviceNames; + mPolicy->getExcludedDeviceNames(excludedDeviceNames); + + for (size_t i = 0; i < excludedDeviceNames.size(); i++) { + mEventHub->addExcludedDevice(excludedDeviceNames[i]); + } +} + +status_t InputManager::start() { + status_t result = mDispatcherThread->run("InputDispatcher", PRIORITY_URGENT_DISPLAY); + if (result) { + LOGE("Could not start InputDispatcher thread due to error %d.", result); + return result; + } + + result = mReaderThread->run("InputReader", PRIORITY_URGENT_DISPLAY); + if (result) { + LOGE("Could not start InputReader thread due to error %d.", result); + + mDispatcherThread->requestExit(); + return result; + } + + return OK; +} + +status_t InputManager::stop() { + status_t result = mReaderThread->requestExitAndWait(); + if (result) { + LOGW("Could not stop InputReader thread due to error %d.", result); + } + + result = mDispatcherThread->requestExitAndWait(); + if (result) { + LOGW("Could not stop InputDispatcher thread due to error %d.", result); + } + + return OK; +} + +status_t InputManager::registerInputChannel(const sp<InputChannel>& inputChannel) { + return mDispatcher->registerInputChannel(inputChannel); +} + +status_t InputManager::unregisterInputChannel(const sp<InputChannel>& inputChannel) { + return mDispatcher->unregisterInputChannel(inputChannel); +} + +int32_t InputManager::getScanCodeState(int32_t deviceId, int32_t deviceClasses, int32_t scanCode) + const { + int32_t vkKeyCode, vkScanCode; + if (mReader->getCurrentVirtualKey(& vkKeyCode, & vkScanCode)) { + if (vkScanCode == scanCode) { + return KEY_STATE_VIRTUAL; + } + } + + return mEventHub->getScanCodeState(deviceId, deviceClasses, scanCode); +} + +int32_t InputManager::getKeyCodeState(int32_t deviceId, int32_t deviceClasses, int32_t keyCode) + const { + int32_t vkKeyCode, vkScanCode; + if (mReader->getCurrentVirtualKey(& vkKeyCode, & vkScanCode)) { + if (vkKeyCode == keyCode) { + return KEY_STATE_VIRTUAL; + } + } + + return mEventHub->getKeyCodeState(deviceId, deviceClasses, keyCode); +} + +int32_t InputManager::getSwitchState(int32_t deviceId, int32_t deviceClasses, int32_t sw) const { + return mEventHub->getSwitchState(deviceId, deviceClasses, sw); +} + +bool InputManager::hasKeys(size_t numCodes, const int32_t* keyCodes, uint8_t* outFlags) const { + return mEventHub->hasKeys(numCodes, keyCodes, outFlags); +} + +} // namespace android |