diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/gestures.c | 44 | ||||
| -rw-r--r-- | src/memory.h | 3 |
2 files changed, 44 insertions, 3 deletions
diff --git a/src/gestures.c b/src/gestures.c index d075356..915a521 100644 --- a/src/gestures.c +++ b/src/gestures.c | |||
| @@ -29,6 +29,45 @@ | |||
| 29 | static const int FINGER_ATTACK_MS = 70; | 29 | static const int FINGER_ATTACK_MS = 70; |
| 30 | static const int FINGER_DECAY_MS = 120; | 30 | static const int FINGER_DECAY_MS = 120; |
| 31 | 31 | ||
| 32 | static void extract_pointers(struct Gestures *gs, struct MTouch* mt) | ||
| 33 | { | ||
| 34 | const struct FingerState *f = mt->state.finger; | ||
| 35 | int i; | ||
| 36 | |||
| 37 | if (mt->state.nfinger < 2) { | ||
| 38 | mt->mem.pointing = mt->state.nfinger; | ||
| 39 | mt->mem.npoint = mt->state.nfinger; | ||
| 40 | mt->mem.ybar = mt->caps.abs_position_y.maximum; | ||
| 41 | return; | ||
| 42 | } | ||
| 43 | |||
| 44 | if (mt->state.nfinger == mt->prev_state.nfinger) { | ||
| 45 | for (i = 0; i < mt->state.nfinger; i++) { | ||
| 46 | if (GETBIT(mt->mem.pointing, i)) | ||
| 47 | continue; | ||
| 48 | if (f[i].hw.position_y <= mt->mem.ybar) { | ||
| 49 | mt->mem.pointing = BITONES(mt->state.nfinger); | ||
| 50 | mt->mem.npoint = mt->state.nfinger; | ||
| 51 | return; | ||
| 52 | } | ||
| 53 | } | ||
| 54 | return; | ||
| 55 | } | ||
| 56 | |||
| 57 | mt->mem.pointing = 0; | ||
| 58 | mt->mem.npoint = 0; | ||
| 59 | mt->mem.ybar = mt->caps.yclick; | ||
| 60 | for (i = 0; i < mt->state.nfinger; i++) { | ||
| 61 | if (f[i].hw.position_y > mt->caps.yclick) | ||
| 62 | continue; | ||
| 63 | if (!mt->mem.npoint || f[i].hw.position_y > mt->mem.ybar) | ||
| 64 | mt->mem.ybar = f[i].hw.position_y; | ||
| 65 | SETBIT(mt->mem.pointing, i); | ||
| 66 | mt->mem.npoint++; | ||
| 67 | } | ||
| 68 | |||
| 69 | } | ||
| 70 | |||
| 32 | static void extract_movement(struct Gestures *gs, struct MTouch* mt) | 71 | static void extract_movement(struct Gestures *gs, struct MTouch* mt) |
| 33 | { | 72 | { |
| 34 | const struct FingerState *prev[DIM_FINGER]; | 73 | const struct FingerState *prev[DIM_FINGER]; |
| @@ -73,9 +112,9 @@ static void extract_buttons(struct Gestures *gs, struct MTouch* mt) | |||
| 73 | { | 112 | { |
| 74 | unsigned btdata = mt->state.button & BITONES(DIM_BUTTON); | 113 | unsigned btdata = mt->state.button & BITONES(DIM_BUTTON); |
| 75 | if (mt->state.button == BITMASK(MT_BUTTON_LEFT)) { | 114 | if (mt->state.button == BITMASK(MT_BUTTON_LEFT)) { |
| 76 | if (mt->state.nfinger == 2) | 115 | if (mt->mem.npoint == 2) |
| 77 | btdata = BITMASK(MT_BUTTON_RIGHT); | 116 | btdata = BITMASK(MT_BUTTON_RIGHT); |
| 78 | if (mt->state.nfinger == 3) | 117 | if (mt->mem.npoint == 3) |
| 79 | btdata = BITMASK(MT_BUTTON_MIDDLE); | 118 | btdata = BITMASK(MT_BUTTON_MIDDLE); |
| 80 | } | 119 | } |
| 81 | gs->btmask = (btdata ^ mt->mem.btdata) & BITONES(DIM_BUTTON); | 120 | gs->btmask = (btdata ^ mt->mem.btdata) & BITONES(DIM_BUTTON); |
| @@ -110,6 +149,7 @@ static void extract_type(struct Gestures *gs, struct MTouch* mt) | |||
| 110 | void extract_gestures(struct Gestures *gs, struct MTouch* mt) | 149 | void extract_gestures(struct Gestures *gs, struct MTouch* mt) |
| 111 | { | 150 | { |
| 112 | memset(gs, 0, sizeof(struct Gestures)); | 151 | memset(gs, 0, sizeof(struct Gestures)); |
| 152 | extract_pointers(gs, mt); | ||
| 113 | extract_movement(gs, mt); | 153 | extract_movement(gs, mt); |
| 114 | extract_buttons(gs, mt); | 154 | extract_buttons(gs, mt); |
| 115 | extract_type(gs, mt); | 155 | extract_type(gs, mt); |
diff --git a/src/memory.h b/src/memory.h index 0ab4d04..3b947b9 100644 --- a/src/memory.h +++ b/src/memory.h | |||
| @@ -25,7 +25,8 @@ | |||
| 25 | #include "mtstate.h" | 25 | #include "mtstate.h" |
| 26 | 26 | ||
| 27 | struct Memory { | 27 | struct Memory { |
| 28 | unsigned btdata; | 28 | unsigned btdata, pointing; |
| 29 | int npoint, ybar; | ||
| 29 | mstime_t move_time; | 30 | mstime_t move_time; |
| 30 | int move_x, move_y; | 31 | int move_x, move_y; |
| 31 | }; | 32 | }; |
