SDL_gesture: Added SDL_RemoveDollarTemplate() and SDL_RemoveAllDollarTemplates()

From 7a28ba13dc40eaebc980b104e37bfa21785e2f51 Mon Sep 17 00:00:00 2001
From: Sam Lantinga <[EMAIL REDACTED]>
Date: Tue, 4 Nov 2025 11:05:38 -0800
Subject: [PATCH] Added SDL_RemoveDollarTemplate() and
 SDL_RemoveAllDollarTemplates()

---
 SDL_gesture.h | 43 +++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 43 insertions(+)

diff --git a/SDL_gesture.h b/SDL_gesture.h
index 61a56b2..b1613d1 100644
--- a/SDL_gesture.h
+++ b/SDL_gesture.h
@@ -422,6 +422,49 @@ static int GestureAddDollar(GestureTouch *inTouch, SDL_FPoint *path)
     return GestureAddDollar_one(inTouch, path);
 }
 
+static void SDL_RemoveDollarTemplate_one(SDL_GestureTouch* inTouch, int index)
+{
+    if (index < inTouch->numDollarTemplates - 1) {
+        SDL_memmove(&inTouch->dollarTemplate[index], &inTouch->dollarTemplate[index + 1],
+            (inTouch->numDollarTemplates - 1 - index) * sizeof(SDL_DollarTemplate));
+    }
+    if (inTouch->numDollarTemplates > 1) {
+        inTouch->dollarTemplate = SDL_realloc(inTouch->dollarTemplate,
+            (inTouch->numDollarTemplates - 1) * sizeof(SDL_DollarTemplate));
+    }
+    else {
+        SDL_free(inTouch->dollarTemplate);
+        inTouch->dollarTemplate = NULL;
+    }
+    --inTouch->numDollarTemplates;
+}
+
+int SDL_RemoveDollarTemplate(SDL_GestureID gestureId)
+{
+    int i, j, ret = 0;
+    for (i = 0; i < SDL_numGestureTouches; i++) {
+        SDL_GestureTouch *touch = &SDL_gestureTouch[i];
+        for (j = 0; j < touch->numDollarTemplates; j++) {
+            if (touch->dollarTemplate[j].hash == (Uint64)gestureId) {
+                SDL_RemoveDollarTemplate_one(touch, j);
+                ret = 1;
+            }
+        }
+    }
+    return ret;
+}
+
+void SDL_RemoveAllDollarTemplates(void)
+{
+    int i;
+    for (i = 0; i < SDL_numGestureTouches; i++) {
+        SDL_GestureTouch *touch = &SDL_gestureTouch[i];
+        SDL_free(touch->dollarTemplate);
+        touch->dollarTemplate = NULL;
+        touch->numDollarTemplates = 0;
+    }
+}
+
 SDL_DECLSPEC int SDLCALL
 Gesture_LoadDollarTemplates(SDL_TouchID touchID, SDL_IOStream *src)
 {