diff --git a/lisgd.c b/lisgd.c
index 9d3442b..78f6a3c 100644
--- a/lisgd.c
+++ b/lisgd.c
@@ -109,19 +109,21 @@ touchup(struct libinput_event *e)
 		);
 	}
 
-	if (xend[slot] > xstart[slot] && fabs(xend[slot] - xstart[slot]) > threshold) {
-		start = Left;
-		end = Right;
-	} else if (xend[slot] < xstart[slot] && fabs(xend[slot] - xstart[slot]) > threshold) {
-		start = Right;
-		end = Left;
-	} else if (yend[slot] > ystart[slot] && fabs(yend[slot] - ystart[slot]) > threshold) {
-		start = Up;
-		end = Down;
-	} else if (yend[slot] < ystart[slot] && fabs(yend[slot] - ystart[slot]) > threshold) {
-		start = Down;
-		end = Up;
-	} else {
+	int move_x = fabs(xend[slot] - xstart[slot]) > threshold
+		? (xend[slot] > xstart[slot] ? 1 : -1) : 0;
+	int move_y = fabs(yend[slot] - ystart[slot]) > threshold
+		? (yend[slot] > ystart[slot] ? 1 : -1) : 0;
+	switch (move_x * 100 + move_y) {
+	    case -100 -1: start = Right; end = Up; break;
+	    case -100 +0: start = Right; end = Left; break;
+	    case -100 +1: start = Right; end = Down; break;
+	    case +0   -1: start = Down; end = Up; break;
+	    case +0   +1: start = Up; end = Down; break;
+	    case +100 -1: start = Left; end = Up; break;
+	    case +100 +0: start = Left; end = Right; break;
+	    case +100 +1: start = Left; end = Down; break;
+	    case +0   +0:
+	    default:
 		if (verbose) {
 			fprintf(stderr, "Input didn't match a known gesture\n");
 		}
