diff options
| author | 2010-06-13 17:55:28 -0700 | |
|---|---|---|
| committer | 2010-06-13 17:55:28 -0700 | |
| commit | 7c8aa44f320f45e8417f0aba9ca67af6a67a5cf7 (patch) | |
| tree | 2d547d9d8ddc5b08310070121616294d92ebca70 /libs/ui/InputManager.cpp | |
| parent | 94f14aeca9e6c6d07b39a7f708eacadcfeb6fbd2 (diff) | |
| parent | 46b9ac0ae2162309774a7478cd9d4e578747bfc2 (diff) | |
am 46b9ac0a: Native input dispatch rewrite work in progress.
Merge commit '46b9ac0ae2162309774a7478cd9d4e578747bfc2' into gingerbread
* commit '46b9ac0ae2162309774a7478cd9d4e578747bfc2':
Native input dispatch rewrite work in progress.
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 000000000000..ab354a5da11c --- /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 |