summaryrefslogtreecommitdiffstats
path: root/libs
diff options
context:
space:
mode:
authorJeff Brown <jeffbrown@google.com>2010-09-16 12:31:46 -0700
committerJeff Brown <jeffbrown@google.com>2010-09-16 12:31:46 -0700
commit2a95c2a9ec703b9d19b750cb854fb4ec4899e205 (patch)
treece7e86def75520562f38adfe65f3228dfdc6ad76 /libs
parent567c00a86f748ad4d798ae50a09505cc051fc095 (diff)
downloadframeworks_base-2a95c2a9ec703b9d19b750cb854fb4ec4899e205.zip
frameworks_base-2a95c2a9ec703b9d19b750cb854fb4ec4899e205.tar.gz
frameworks_base-2a95c2a9ec703b9d19b750cb854fb4ec4899e205.tar.bz2
Fix input dispatcher regression on launcher drag&drop.
Change-Id: I40e937bd712cd2ed6cceac95dfd1b8c8e070724f
Diffstat (limited to 'libs')
-rw-r--r--libs/ui/InputDispatcher.cpp79
1 files changed, 30 insertions, 49 deletions
diff --git a/libs/ui/InputDispatcher.cpp b/libs/ui/InputDispatcher.cpp
index dea7936..6713817 100644
--- a/libs/ui/InputDispatcher.cpp
+++ b/libs/ui/InputDispatcher.cpp
@@ -776,6 +776,9 @@ void InputDispatcher::resumeAfterTargetsNotReadyTimeoutLocked(nsecs_t newTimeout
// Give up.
mInputTargetWaitTimeoutExpired = true;
+ // Release the touch target.
+ releaseTouchedWindowLocked();
+
// Input state will not be realistic. Mark it out of sync.
if (inputChannel.get()) {
ssize_t connectionIndex = getConnectionIndexLocked(inputChannel);
@@ -2159,9 +2162,8 @@ void InputDispatcher::setInputWindows(const Vector<InputWindow>& inputWindows) {
{ // acquire lock
AutoMutex _l(mLock);
- sp<InputChannel> oldFocusedWindowChannel = mFocusedWindow
- ? mFocusedWindow->inputChannel : NULL;
- int32_t oldFocusedWindowLayer = mFocusedWindow ? mFocusedWindow->layer : -1;
+ // Clear old window pointers but remember their associated channels.
+ mFocusedWindow = NULL;
sp<InputChannel> touchedWindowChannel;
if (mTouchedWindow) {
@@ -2175,11 +2177,11 @@ void InputDispatcher::setInputWindows(const Vector<InputWindow>& inputWindows) {
}
mTouchedWallpaperWindows.clear();
}
-
- mFocusedWindow = NULL;
mWallpaperWindows.clear();
-
mWindows.clear();
+
+ // Loop over new windows and rebuild the necessary window pointers for
+ // tracking focus and touch.
mWindows.appendVector(inputWindows);
size_t numWindows = mWindows.size();
@@ -2203,41 +2205,8 @@ void InputDispatcher::setInputWindows(const Vector<InputWindow>& inputWindows) {
mTouchedWindow = window;
}
}
-
mTempTouchedWallpaperChannels.clear();
- bool preempt = false;
- if (mFocusedWindow
- && mFocusedWindow->inputChannel != oldFocusedWindowChannel
- && mFocusedWindow->canReceiveKeys) {
- // If the new input focus is an error window or appears above the current
- // input focus, drop the current touched window so that we can start
- // delivering events to the new input focus as soon as possible.
- if (mFocusedWindow->layoutParamsFlags & InputWindow::FLAG_SYSTEM_ERROR) {
-#if DEBUG_FOCUS
- LOGD("Preempting: New SYSTEM_ERROR window; resetting state");
-#endif
- preempt = true;
- } else if (oldFocusedWindowChannel.get() != NULL
- && mFocusedWindow->layer > oldFocusedWindowLayer) {
-#if DEBUG_FOCUS
- LOGD("Preempting: Transferring focus to new window at higher layer: "
- "old win layer=%d, new win layer=%d",
- oldFocusedWindowLayer, mFocusedWindow->layer);
-#endif
- preempt = true;
- }
- }
- if (mTouchedWindow && ! mTouchedWindow->visible) {
-#if DEBUG_FOCUS
- LOGD("Preempting: Touched window became invisible.");
-#endif
- preempt = true;
- }
- if (preempt) {
- releaseTouchedWindowLocked();
- }
-
#if DEBUG_FOCUS
logDispatchStateLocked();
#endif
@@ -2312,7 +2281,17 @@ void InputDispatcher::setInputDispatchMode(bool enabled, bool frozen) {
void InputDispatcher::logDispatchStateLocked() {
String8 dump;
dumpDispatchStateLocked(dump);
- LOGD("%s", dump.string());
+
+ char* text = dump.lockBuffer(dump.size());
+ char* start = text;
+ while (*start != '\0') {
+ char* end = strchr(start, '\n');
+ if (*end == '\n') {
+ *(end++) = '\0';
+ }
+ LOGD("%s", start);
+ start = end;
+ }
}
void InputDispatcher::dumpDispatchStateLocked(String8& dump) {
@@ -2326,28 +2305,30 @@ void InputDispatcher::dumpDispatchStateLocked(String8& dump) {
} else {
dump.append(" focusedApplication: <null>\n");
}
- dump.appendFormat(" focusedWindow: '%s'\n",
- mFocusedWindow != NULL ? mFocusedWindow->inputChannel->getName().string() : "<null>");
- dump.appendFormat(" touchedWindow: '%s', touchDown=%d\n",
- mTouchedWindow != NULL ? mTouchedWindow->inputChannel->getName().string() : "<null>",
+ dump.appendFormat(" focusedWindow: name='%s'\n",
+ mFocusedWindow != NULL ? mFocusedWindow->name.string() : "<null>");
+ dump.appendFormat(" touchedWindow: name='%s', touchDown=%d\n",
+ mTouchedWindow != NULL ? mTouchedWindow->name.string() : "<null>",
mTouchDown);
for (size_t i = 0; i < mTouchedWallpaperWindows.size(); i++) {
- dump.appendFormat(" touchedWallpaperWindows[%d]: '%s'\n",
- i, mTouchedWallpaperWindows[i]->inputChannel->getName().string());
+ dump.appendFormat(" touchedWallpaperWindows[%d]: name='%s'\n",
+ i, mTouchedWallpaperWindows[i]->name.string());
}
for (size_t i = 0; i < mWindows.size(); i++) {
- dump.appendFormat(" windows[%d]: '%s', paused=%s, hasFocus=%s, hasWallpaper=%s, "
- "visible=%s, flags=0x%08x, type=0x%08x, "
+ dump.appendFormat(" windows[%d]: name='%s', paused=%s, hasFocus=%s, hasWallpaper=%s, "
+ "visible=%s, canReceiveKeys=%s, flags=0x%08x, type=0x%08x, layer=%d, "
"frame=[%d,%d][%d,%d], "
"visibleFrame=[%d,%d][%d,%d], "
"touchableArea=[%d,%d][%d,%d], "
"ownerPid=%d, ownerUid=%d, dispatchingTimeout=%0.3fms\n",
- i, mWindows[i].inputChannel->getName().string(),
+ i, mWindows[i].name.string(),
toString(mWindows[i].paused),
toString(mWindows[i].hasFocus),
toString(mWindows[i].hasWallpaper),
toString(mWindows[i].visible),
+ toString(mWindows[i].canReceiveKeys),
mWindows[i].layoutParamsFlags, mWindows[i].layoutParamsType,
+ mWindows[i].layer,
mWindows[i].frameLeft, mWindows[i].frameTop,
mWindows[i].frameRight, mWindows[i].frameBottom,
mWindows[i].visibleFrameLeft, mWindows[i].visibleFrameTop,