summaryrefslogtreecommitdiff
path: root/services/inputflinger/dispatcher/InputTarget.cpp
blob: 0588374292298b0e00d95bc74f5f9a06cd9b29a1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
/*
 * Copyright (C) 2019 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "InputTarget.h"

#include <android-base/stringprintf.h>
#include <inttypes.h>
#include <string>

using android::base::StringPrintf;

namespace android::inputdispatcher {

std::string dispatchModeToString(int32_t dispatchMode) {
    switch (dispatchMode) {
        case InputTarget::FLAG_DISPATCH_AS_IS:
            return "DISPATCH_AS_IS";
        case InputTarget::FLAG_DISPATCH_AS_OUTSIDE:
            return "DISPATCH_AS_OUTSIDE";
        case InputTarget::FLAG_DISPATCH_AS_HOVER_ENTER:
            return "DISPATCH_AS_HOVER_ENTER";
        case InputTarget::FLAG_DISPATCH_AS_HOVER_EXIT:
            return "DISPATCH_AS_HOVER_EXIT";
        case InputTarget::FLAG_DISPATCH_AS_SLIPPERY_EXIT:
            return "DISPATCH_AS_SLIPPERY_EXIT";
        case InputTarget::FLAG_DISPATCH_AS_SLIPPERY_ENTER:
            return "DISPATCH_AS_SLIPPERY_ENTER";
    }
    return StringPrintf("%" PRId32, dispatchMode);
}

void InputTarget::addPointers(BitSet32 newPointerIds, float xOffset, float yOffset,
                              float windowXScale, float windowYScale) {
    // The pointerIds can be empty, but still a valid InputTarget. This can happen for Monitors
    // and non splittable windows since we will just use all the pointers from the input event.
    if (newPointerIds.isEmpty()) {
        setDefaultPointerInfo(xOffset, yOffset, windowXScale, windowYScale);
        return;
    }

    // Ensure that the new set of pointers doesn't overlap with the current set of pointers.
    ALOG_ASSERT((pointerIds & newPointerIds) == 0);

    pointerIds |= newPointerIds;
    while (!newPointerIds.isEmpty()) {
        int32_t pointerId = newPointerIds.clearFirstMarkedBit();
        pointerInfos[pointerId].xOffset = xOffset;
        pointerInfos[pointerId].yOffset = yOffset;
        pointerInfos[pointerId].windowXScale = windowXScale;
        pointerInfos[pointerId].windowYScale = windowYScale;
    }
}

void InputTarget::setDefaultPointerInfo(float xOffset, float yOffset, float windowXScale,
                                        float windowYScale) {
    pointerIds.clear();
    pointerInfos[0].xOffset = xOffset;
    pointerInfos[0].yOffset = yOffset;
    pointerInfos[0].windowXScale = windowXScale;
    pointerInfos[0].windowYScale = windowYScale;
}

bool InputTarget::useDefaultPointerInfo() const {
    return pointerIds.isEmpty();
}

const PointerInfo& InputTarget::getDefaultPointerInfo() const {
    return pointerInfos[0];
}

std::string InputTarget::getPointerInfoString() const {
    if (useDefaultPointerInfo()) {
        const PointerInfo& pointerInfo = getDefaultPointerInfo();
        return StringPrintf("xOffset=%.1f, yOffset=%.1f windowScaleFactor=(%.1f, %.1f)",
                            pointerInfo.xOffset, pointerInfo.yOffset, pointerInfo.windowXScale,
                            pointerInfo.windowYScale);
    }

    std::string out;
    for (uint32_t i = pointerIds.firstMarkedBit(); i <= pointerIds.lastMarkedBit(); i++) {
        if (!pointerIds.hasBit(i)) {
            continue;
        }
        out += StringPrintf("\n  pointerId %d: xOffset=%.1f, yOffset=%.1f "
                            "windowScaleFactor=(%.1f, %.1f)",
                            i, pointerInfos[i].xOffset, pointerInfos[i].yOffset,
                            pointerInfos[i].windowXScale, pointerInfos[i].windowYScale);
    }
    return out;
}
} // namespace android::inputdispatcher