@@ -42,6 +42,8 @@ static uint32_t analogPointerMask = 0;
42
42
static float g_gamepadOpacity;
43
43
static double g_lastTouch;
44
44
45
+ MultiTouchButton *primaryButton[TOUCH_MAX_POINTERS]{};
46
+
45
47
void GamepadUpdateOpacity (float force) {
46
48
if (force >= 0 .0f ) {
47
49
g_gamepadOpacity = force;
@@ -100,23 +102,36 @@ void MultiTouchButton::GetContentDimensions(const UIContext &dc, float &w, float
100
102
}
101
103
}
102
104
105
+ bool MultiTouchButton::CanGlide () const {
106
+ return g_Config.bTouchGliding ;
107
+ }
108
+
103
109
bool MultiTouchButton::Touch (const TouchInput &input) {
110
+ _dbg_assert_ (input.id >= 0 && input.id < TOUCH_MAX_POINTERS);
111
+
104
112
bool retval = GamepadView::Touch (input);
105
113
if ((input.flags & TOUCH_DOWN) && bounds_.Contains (input.x , input.y )) {
106
114
pointerDownMask_ |= 1 << input.id ;
107
115
usedPointerMask |= 1 << input.id ;
116
+ if (CanGlide () && !primaryButton[input.id ])
117
+ primaryButton[input.id ] = this ;
108
118
}
109
119
if (input.flags & TOUCH_MOVE) {
110
120
if (!(input.flags & TOUCH_MOUSE) || input.buttons ) {
111
- if (bounds_.Contains (input.x , input.y ) && !(analogPointerMask & (1 << input.id )))
121
+ if (bounds_.Contains (input.x , input.y ) && !(analogPointerMask & (1 << input.id ))) {
122
+ if (CanGlide () && !primaryButton[input.id ]) {
123
+ primaryButton[input.id ] = this ;
124
+ }
112
125
pointerDownMask_ |= 1 << input.id ;
113
- else
126
+ } else if (primaryButton[input. id ] != this ) {
114
127
pointerDownMask_ &= ~(1 << input.id );
128
+ }
115
129
}
116
130
}
117
131
if (input.flags & TOUCH_UP) {
118
132
pointerDownMask_ &= ~(1 << input.id );
119
133
usedPointerMask &= ~(1 << input.id );
134
+ primaryButton[input.id ] = nullptr ;
120
135
}
121
136
if (input.flags & TOUCH_RELEASE_ALL) {
122
137
pointerDownMask_ = 0 ;
0 commit comments