diff options
| author | Chris Tate <ctate@google.com> | 2010-11-04 16:02:52 -0700 |
|---|---|---|
| committer | Chris Tate <ctate@google.com> | 2010-11-04 16:29:32 -0700 |
| commit | 7b362e431f3e17a755e56bc7dbc99bd661cb46ba (patch) | |
| tree | fd0b2b0207d8d7669cd0f5355bc22471fb39a1e9 /services | |
| parent | f034f87da8f4c348c36334815214628fccbe5580 (diff) | |
| download | frameworks_base-7b362e431f3e17a755e56bc7dbc99bd661cb46ba.zip frameworks_base-7b362e431f3e17a755e56bc7dbc99bd661cb46ba.tar.gz frameworks_base-7b362e431f3e17a755e56bc7dbc99bd661cb46ba.tar.bz2 | |
Implement local-window-only drags
Change-Id: I19a9c4a045c532b99e3af9eb878797aed5cda1bf
Diffstat (limited to 'services')
| -rw-r--r-- | services/java/com/android/server/WindowManagerService.java | 32 |
1 files changed, 28 insertions, 4 deletions
diff --git a/services/java/com/android/server/WindowManagerService.java b/services/java/com/android/server/WindowManagerService.java index e812fa9..817f0b2 100644 --- a/services/java/com/android/server/WindowManagerService.java +++ b/services/java/com/android/server/WindowManagerService.java @@ -499,6 +499,7 @@ public class WindowManagerService extends IWindowManager.Stub IBinder mToken; Surface mSurface; boolean mLocalOnly; + IBinder mLocalWin; ClipData mData; ClipDescription mDataDescription; boolean mDragResult; @@ -511,10 +512,11 @@ public class WindowManagerService extends IWindowManager.Stub private final Rect tmpRect = new Rect(); - DragState(IBinder token, Surface surface, boolean localOnly) { + DragState(IBinder token, Surface surface, boolean localOnly, IBinder localWin) { mToken = token; mSurface = surface; mLocalOnly = localOnly; + mLocalWin = localWin; mNotifiedWindows = new ArrayList<WindowState>(); } @@ -524,6 +526,7 @@ public class WindowManagerService extends IWindowManager.Stub } mSurface = null; mLocalOnly = false; + mLocalWin = null; mToken = null; mData = null; mThumbOffsetX = mThumbOffsetY = 0; @@ -593,6 +596,18 @@ public class WindowManagerService extends IWindowManager.Stub */ private void sendDragStartedLw(WindowState newWin, float touchX, float touchY, ClipDescription desc) { + // Don't actually send the event if the drag is supposed to be pinned + // to the originating window but 'newWin' is not that window. + if (mLocalOnly) { + final IBinder winBinder = newWin.mClient.asBinder(); + if (winBinder != mLocalWin) { + if (DEBUG_DRAG) { + Slog.d(TAG, "Not dispatching local DRAG_STARTED to " + newWin); + } + return; + } + } + if (mDragInProgress && newWin.isPotentialDragTarget()) { DragEvent event = DragEvent.obtain(DragEvent.ACTION_DRAG_STARTED, touchX - newWin.mFrame.left, touchY - newWin.mFrame.top, @@ -671,6 +686,14 @@ public class WindowManagerService extends IWindowManager.Stub // Tell the affected window WindowState touchedWin = getTouchedWinAtPointLw(x, y); + if (mLocalOnly) { + final IBinder touchedBinder = touchedWin.mClient.asBinder(); + if (touchedBinder != mLocalWin) { + // This drag is pinned only to the originating window, but the drag + // point is outside that window. Pretend it's over empty space. + touchedWin = null; + } + } try { // have we dragged over a new window? if ((touchedWin != mTargetWindow) && (mTargetWindow != null)) { @@ -5454,15 +5477,16 @@ public class WindowManagerService extends IWindowManager.Stub Surface surface = new Surface(session, callerPid, "drag surface", 0, width, height, PixelFormat.TRANSLUCENT, Surface.HIDDEN); outSurface.copyFrom(surface); + final IBinder winBinder = window.asBinder(); token = new Binder(); - mDragState = new DragState(token, surface, localOnly); + mDragState = new DragState(token, surface, localOnly, winBinder); mDragState.mSurface = surface; mDragState.mLocalOnly = localOnly; token = mDragState.mToken = new Binder(); // 5 second timeout for this window to actually begin the drag - mH.removeMessages(H.DRAG_START_TIMEOUT, window); - Message msg = mH.obtainMessage(H.DRAG_START_TIMEOUT, window.asBinder()); + mH.removeMessages(H.DRAG_START_TIMEOUT, winBinder); + Message msg = mH.obtainMessage(H.DRAG_START_TIMEOUT, winBinder); mH.sendMessageDelayed(msg, 5000); } else { Slog.w(TAG, "Drag already in progress"); |
