diff --git a/lisgd.c b/lisgd.c index 9d3442b..af49a80 100644 --- a/lisgd.c +++ b/lisgd.c @@ -1,3 +1,4 @@ +#include #include #include #include @@ -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"); }