Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 41aab00c authored by Jun Mukai's avatar Jun Mukai
Browse files

Allow changing mouse cursor for the edges of resizable window.

Bug: 23193951
Change-Id: I38662a61ff829e5b441e1c8b9f472eb0d75904e4
parent 80435a7f
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -4192,6 +4192,8 @@ public final class ViewRootImpl implements ViewParent,
                        mPointerIconShape = pointerShape;
                        event.getDevice().setPointerShape(pointerShape);
                    }
                } else if (event.getActionMasked() == MotionEvent.ACTION_HOVER_MOVE) {
                    mPointerIconShape = PointerIcon.STYLE_NOT_SPECIFIED;
                }
            }

+47 −0
Original line number Diff line number Diff line
@@ -16,13 +16,22 @@

package com.android.server.wm;

import android.graphics.Rect;
import android.graphics.Region;
import android.view.DisplayInfo;
import android.view.InputDevice;
import android.view.MotionEvent;
import android.view.WindowManagerPolicy.PointerEventListener;

import com.android.server.wm.WindowManagerService.H;

import static android.view.PointerIcon.STYLE_NOT_SPECIFIED;
import static android.view.PointerIcon.STYLE_DEFAULT;
import static android.view.PointerIcon.STYLE_HORIZONTAL_DOUBLE_ARROW;
import static android.view.PointerIcon.STYLE_VERTICAL_DOUBLE_ARROW;
import static android.view.PointerIcon.STYLE_TOP_LEFT_DIAGONAL_DOUBLE_ARROW;
import static android.view.PointerIcon.STYLE_TOP_RIGHT_DIAGONAL_DOUBLE_ARROW;

public class TaskTapPointerEventListener implements PointerEventListener {
    private static final int TAP_TIMEOUT_MSEC = 300;
    private static final float TAP_MOTION_SLOP_INCHES = 0.125f;
@@ -34,6 +43,8 @@ public class TaskTapPointerEventListener implements PointerEventListener {
    final private Region mTouchExcludeRegion = new Region();
    private final WindowManagerService mService;
    private final DisplayContent mDisplayContent;
    private final Rect mTmpRect = new Rect();
    private int mPointerIconShape = STYLE_NOT_SPECIFIED;

    public TaskTapPointerEventListener(WindowManagerService service,
            DisplayContent displayContent) {
@@ -76,6 +87,42 @@ public class TaskTapPointerEventListener implements PointerEventListener {
                break;
            }

            case MotionEvent.ACTION_HOVER_MOVE: {
                final int x = (int) motionEvent.getX();
                final int y = (int) motionEvent.getY();
                final WindowState window = mDisplayContent.findWindowForControlPoint(x, y);
                if (window == null) {
                    break;
                }
                window.getVisibleBounds(mTmpRect, false);
                if (!mTmpRect.isEmpty() && !mTmpRect.contains(x, y)) {
                    int iconShape = STYLE_DEFAULT;
                    if (x < mTmpRect.left) {
                        iconShape =
                            (y < mTmpRect.top) ? STYLE_TOP_LEFT_DIAGONAL_DOUBLE_ARROW :
                            (y > mTmpRect.bottom) ? STYLE_TOP_RIGHT_DIAGONAL_DOUBLE_ARROW :
                            STYLE_HORIZONTAL_DOUBLE_ARROW;
                    } else if (x > mTmpRect.right) {
                        iconShape =
                            (y < mTmpRect.top) ? STYLE_TOP_RIGHT_DIAGONAL_DOUBLE_ARROW :
                            (y > mTmpRect.bottom) ? STYLE_TOP_LEFT_DIAGONAL_DOUBLE_ARROW :
                            STYLE_HORIZONTAL_DOUBLE_ARROW;
                    } else if (y < mTmpRect.top || y > mTmpRect.bottom) {
                        iconShape = STYLE_VERTICAL_DOUBLE_ARROW;
                    }
                    if (mPointerIconShape != iconShape) {
                        mPointerIconShape = iconShape;
                        motionEvent.getDevice().setPointerShape(iconShape);
                    }
                } else {
                    mPointerIconShape = STYLE_NOT_SPECIFIED;
                }
            } break;

            case MotionEvent.ACTION_HOVER_EXIT:
                motionEvent.getDevice().setPointerShape(STYLE_DEFAULT);
                break;

            case MotionEvent.ACTION_UP:
            case MotionEvent.ACTION_POINTER_UP: {
                int index = (action & MotionEvent.ACTION_POINTER_INDEX_MASK)