diff options
author | Jeff Brown <jeffbrown@google.com> | 2012-04-20 11:38:17 -0700 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2012-04-20 11:38:17 -0700 |
commit | 2b3462eb6fe1e4d008e616d4c5c7f97ee274e2d8 (patch) | |
tree | 2c891779dc6272cb00ddb68db18f91b70af8debb | |
parent | 70c8723e63e2c58115c356bd4e9525b823b7bf28 (diff) | |
parent | f44e39493c471b5e6a0807778c7a6439ea1b8adc (diff) | |
download | frameworks_base-2b3462eb6fe1e4d008e616d4c5c7f97ee274e2d8.zip frameworks_base-2b3462eb6fe1e4d008e616d4c5c7f97ee274e2d8.tar.gz frameworks_base-2b3462eb6fe1e4d008e616d4c5c7f97ee274e2d8.tar.bz2 |
Merge "When ANR happens, only remove ANR'd window."
-rw-r--r-- | services/input/InputDispatcher.cpp | 18 | ||||
-rw-r--r-- | services/input/InputDispatcher.h | 1 |
2 files changed, 16 insertions, 3 deletions
diff --git a/services/input/InputDispatcher.cpp b/services/input/InputDispatcher.cpp index da3548f..dad4ef4 100644 --- a/services/input/InputDispatcher.cpp +++ b/services/input/InputDispatcher.cpp @@ -970,14 +970,17 @@ void InputDispatcher::resumeAfterTargetsNotReadyTimeoutLocked(nsecs_t newTimeout // Give up. mInputTargetWaitTimeoutExpired = true; - // Release the touch targets. - mTouchState.reset(); - // Input state will not be realistic. Mark it out of sync. if (inputChannel.get()) { ssize_t connectionIndex = getConnectionIndexLocked(inputChannel); if (connectionIndex >= 0) { sp<Connection> connection = mConnectionsByFd.valueAt(connectionIndex); + sp<InputWindowHandle> windowHandle = connection->inputWindowHandle; + + if (windowHandle != NULL) { + mTouchState.removeWindow(windowHandle); + } + if (connection->status == Connection::STATUS_NORMAL) { CancelationOptions options(CancelationOptions::CANCEL_ALL_EVENTS, "application not responding"); @@ -4146,6 +4149,15 @@ void InputDispatcher::TouchState::addOrUpdateWindow(const sp<InputWindowHandle>& touchedWindow.pointerIds = pointerIds; } +void InputDispatcher::TouchState::removeWindow(const sp<InputWindowHandle>& windowHandle) { + for (size_t i = 0; i < windows.size(); i++) { + if (windows.itemAt(i).windowHandle == windowHandle) { + windows.removeAt(i); + return; + } + } +} + void InputDispatcher::TouchState::filterNonAsIsTouchWindows() { for (size_t i = 0 ; i < windows.size(); ) { TouchedWindow& window = windows.editItemAt(i); diff --git a/services/input/InputDispatcher.h b/services/input/InputDispatcher.h index 91f7554..07ca9d5 100644 --- a/services/input/InputDispatcher.h +++ b/services/input/InputDispatcher.h @@ -926,6 +926,7 @@ private: void copyFrom(const TouchState& other); void addOrUpdateWindow(const sp<InputWindowHandle>& windowHandle, int32_t targetFlags, BitSet32 pointerIds); + void removeWindow(const sp<InputWindowHandle>& windowHandle); void filterNonAsIsTouchWindows(); sp<InputWindowHandle> getFirstForegroundWindowHandle() const; bool isSlippery() const; |