fix(ohos): process only the changed touch point in touch events

The previous implementation processed all touch points in the array for every touch event, which could cause duplicate or incorrect events since the array contains the current state of all fingers. Now we correctly identify and process only the finger that triggered the current event (touchEvent.id), improving touch event accuracy on OpenHarmony platforms.
This commit is contained in:
artin 2026-02-04 02:02:06 +08:00
parent 4a3c920d8a
commit 4cb2b0c71b

View file

@ -662,36 +662,48 @@ static void onNativeTouch(OH_NativeXComponent *component, void *window)
OH_NativeXComponent_GetTouchEvent(component, window, &touchEvent);
OH_NativeXComponent_GetTouchPointToolType(component, 0, &toolType);
// Only process the finger that triggered this event (touchEvent.id).
// The touchPoints array contains current state of all fingers, not just the changed one.
int targetIndex = -1;
for (int i = 0; i < touchEvent.numPoints; i++) {
SDL_OHOSTouchEvent e;
e.timestamp = touchEvent.timeStamp;
// skip assertions
e.deviceId = touchEvent.deviceId + 1;
e.fingerId = touchEvent.touchPoints[i].id + 1;
e.area = touchEvent.touchPoints[i].size;
e.x = touchEvent.touchPoints[i].x / (float)wid;
e.y = touchEvent.touchPoints[i].y / (float)hei;
e.p = touchEvent.touchPoints[i].force;
switch (touchEvent.touchPoints[i].type) {
case OH_NATIVEXCOMPONENT_DOWN:
e.type = SDL_EVENT_FINGER_DOWN;
break;
case OH_NATIVEXCOMPONENT_MOVE:
e.type = SDL_EVENT_FINGER_MOTION;
break;
case OH_NATIVEXCOMPONENT_UP:
e.type = SDL_EVENT_FINGER_UP;
break;
case OH_NATIVEXCOMPONENT_CANCEL:
case OH_NATIVEXCOMPONENT_UNKNOWN:
e.type = SDL_EVENT_FINGER_CANCELED;
if (touchEvent.touchPoints[i].id == touchEvent.id) {
targetIndex = i;
break;
}
OHOS_OnTouch(e);
}
if (targetIndex < 0) {
OHOS_UnlockPage();
return;
}
SDL_OHOSTouchEvent e;
e.timestamp = touchEvent.timeStamp;
e.deviceId = touchEvent.deviceId + 1;
e.fingerId = touchEvent.touchPoints[targetIndex].id + 1;
e.area = touchEvent.touchPoints[targetIndex].size;
e.x = touchEvent.touchPoints[targetIndex].x / (float)wid;
e.y = touchEvent.touchPoints[targetIndex].y / (float)hei;
e.p = touchEvent.touchPoints[targetIndex].force;
switch (touchEvent.touchPoints[targetIndex].type) {
case OH_NATIVEXCOMPONENT_DOWN:
e.type = SDL_EVENT_FINGER_DOWN;
break;
case OH_NATIVEXCOMPONENT_MOVE:
e.type = SDL_EVENT_FINGER_MOTION;
break;
case OH_NATIVEXCOMPONENT_UP:
e.type = SDL_EVENT_FINGER_UP;
break;
case OH_NATIVEXCOMPONENT_CANCEL:
case OH_NATIVEXCOMPONENT_UNKNOWN:
e.type = SDL_EVENT_FINGER_CANCELED;
break;
}
OHOS_OnTouch(e);
OHOS_UnlockPage();
}
// TODO mouse data