Fix touch on some Samsung devices

Change-Id: I3e2a67979c60a8e9f37f46f4fb0b0682c56ec95b
diff --git a/minuitwrp/events.c b/minuitwrp/events.c
index 0fdddf7..e733711 100644
--- a/minuitwrp/events.c
+++ b/minuitwrp/events.c
@@ -331,6 +331,7 @@
     static int discard = 0;
     static int lastWasSynReport = 0;
     static int touchReleaseOnNextSynReport = 0;
+	static int use_tracking_id_negative_as_touch_release = 0; // On some devices, type: 3  code: 39  value: -1, aka EV_ABS ABS_MT_TRACKING_ID -1 indicates a true touch release
     int i;
     int x, y;
 
@@ -433,23 +434,57 @@
 #endif
             break;
 
-#ifdef _EVENT_LOGGING
-		// All of these items are strictly for logging purposes only. Return 1 because they don't need to be handled.
         case ABS_MT_TOUCH_MINOR: //31
+            if (ev->value == 0) {
+                e->mt_p.x = 0;
+                e->mt_p.y = 0;
+                touchReleaseOnNextSynReport = 1;
+            }
+#ifdef _EVENT_LOGGING
             printf("EV: %s => EV_ABS ABS_MT_TOUCH_MINOR %d\n", e->deviceName, ev->value);
-			return 1;
+#endif
             break;
 
         case ABS_MT_WIDTH_MAJOR: //32
+            if (ev->value == 0) {
+                e->mt_p.x = 0;
+                e->mt_p.y = 0;
+                touchReleaseOnNextSynReport = 1;
+            }
+#ifdef _EVENT_LOGGING
             printf("EV: %s => EV_ABS ABS_MT_WIDTH_MAJOR %d\n", e->deviceName, ev->value);
-			return 1;
+#endif
             break;
 
         case ABS_MT_WIDTH_MINOR: //33
+            if (ev->value == 0) {
+                e->mt_p.x = 0;
+                e->mt_p.y = 0;
+                touchReleaseOnNextSynReport = 1;
+            }
+#ifdef _EVENT_LOGGING
             printf("EV: %s => EV_ABS ABS_MT_WIDTH_MINOR %d\n", e->deviceName, ev->value);
-			return 1;
+#endif
             break;
 
+        case ABS_MT_TRACKING_ID: //39
+            if (ev->value < 0) {
+                e->mt_p.x = 0;
+                e->mt_p.y = 0;
+                touchReleaseOnNextSynReport = 2;
+                use_tracking_id_negative_as_touch_release = 1;
+#ifdef _EVENT_LOGGING
+                if (use_tracking_id_negative_as_touch_release)
+                    printf("using ABS_MT_TRACKING_ID value -1 to indicate touch releases\n");
+#endif
+            }
+#ifdef _EVENT_LOGGING
+            printf("EV: %s => EV_ABS ABS_MT_TRACKING_ID %d\n", e->deviceName, ev->value);
+#endif
+            break;
+
+#ifdef _EVENT_LOGGING
+        // These are for touch logging purposes only
         case ABS_MT_ORIENTATION: //34
             printf("EV: %s => EV_ABS ABS_MT_ORIENTATION %d\n", e->deviceName, ev->value);
 			return 1;
@@ -465,11 +500,6 @@
 			return 1;
             break;
 
-        case ABS_MT_TRACKING_ID: //39
-            printf("EV: %s => EV_ABS ABS_MT_TRACKING_ID %d\n", e->deviceName, ev->value);
-			return 1;
-            break;
-
 		case ABS_MT_DISTANCE: //3b
             printf("EV: %s => EV_ABS ABS_MT_DISTANCE %d\n", e->deviceName, ev->value);
 			return 1;
@@ -503,7 +533,7 @@
     // Discard the MT versions
     if (ev->code == SYN_MT_REPORT)      return 0;
 
-    if (lastWasSynReport == 1 || touchReleaseOnNextSynReport == 1)
+    if (((lastWasSynReport == 1 || touchReleaseOnNextSynReport == 1) && !use_tracking_id_negative_as_touch_release) || (use_tracking_id_negative_as_touch_release && touchReleaseOnNextSynReport == 2))
     {
         // Reset the value
         touchReleaseOnNextSynReport = 0;