1
0
mirror of https://github.com/Dejvino/pinephone-sway-poc.git synced 2024-11-14 10:53:28 +00:00
pinephone-sway-poc/patches/lisgd.patch

103 lines
2.8 KiB
Diff

diff --git a/lisgd.c b/lisgd.c
index 9d3442b..af49a80 100644
--- a/lisgd.c
+++ b/lisgd.c
@@ -1,3 +1,4 @@
+#include <stdbool.h>
#include <errno.h>
#include <fcntl.h>
#include <libinput.h>
@@ -86,6 +87,51 @@ touchmotion(struct libinput_event *e)
yend[slot] = libinput_event_touch_get_y(tevent);
}
+bool display_rotation_matches(char* transform) {
+ char cmd[256];
+ snprintf(cmd, sizeof(cmd),
+ "swaymsg -t get_outputs | grep DSI-1 -A 50 | grep transform | grep %s",
+ transform);
+ return system(cmd) == 0;
+}
+
+enum rotation{normal, left, right, invert};
+enum rotation get_display_rotation()
+{
+ if (display_rotation_matches("normal"))
+ return normal;
+ if (display_rotation_matches("90"))
+ return left;
+ if (display_rotation_matches("180"))
+ return invert;
+ if (display_rotation_matches("270"))
+ return right;
+ return normal;
+}
+
+void rotate_move_based_on_display(int* move_x, int* move_y)
+{
+ enum rotation rot = get_display_rotation();
+ int t;
+ switch (get_display_rotation()) {
+ case normal:
+ break;
+ case left:
+ t = *move_x;
+ (*move_x) = (*move_y);
+ (*move_y) = -t;
+ break;
+ case right:
+ t = *move_x;
+ (*move_x) = -(*move_y);
+ (*move_y) = t;
+ break;
+ case invert:
+ (*move_y) = -(*move_y);
+ break;
+ }
+}
+
void
touchup(struct libinput_event *e)
{
@@ -109,19 +155,27 @@ 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;
+
+ rotate_move_based_on_display(&move_x, &move_y);
+
+#define X_DIR 4
+#define Y_DIR 1
+#define NODIR 0
+ switch (move_x * X_DIR + move_y * Y_DIR) {
+ case -X_DIR -Y_DIR: start = Right; end = Up; break;
+ case -X_DIR +NODIR: start = Right; end = Left; break;
+ case -X_DIR +Y_DIR: start = Right; end = Down; break;
+ case +NODIR -Y_DIR: start = Down; end = Up; break;
+ case +NODIR +Y_DIR: start = Up; end = Down; break;
+ case +X_DIR -Y_DIR: start = Left; end = Up; break;
+ case +X_DIR +NODIR: start = Left; end = Right; break;
+ case +X_DIR +Y_DIR: start = Left; end = Down; break;
+ case +NODIR +NODIR:
+ default:
if (verbose) {
fprintf(stderr, "Input didn't match a known gesture\n");
}