diff options
Diffstat (limited to 'src/grail-event.c')
| -rw-r--r-- | src/grail-event.c | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/src/grail-event.c b/src/grail-event.c index 6479cc0..2cf8209 100644 --- a/src/grail-event.c +++ b/src/grail-event.c | |||
| @@ -22,8 +22,101 @@ | |||
| 22 | 22 | ||
| 23 | #include "grail-inserter.h" | 23 | #include "grail-inserter.h" |
| 24 | #include "grail-impl.h" | 24 | #include "grail-impl.h" |
| 25 | #include <malloc.h> | ||
| 26 | #include <string.h> | ||
| 27 | #include <errno.h> | ||
| 25 | #include <math.h> | 28 | #include <math.h> |
| 26 | 29 | ||
| 30 | static void compute_bbox(struct grail_coord *min, struct grail_coord *max, | ||
| 31 | const struct touch_frame *frame) | ||
| 32 | { | ||
| 33 | float x, y; | ||
| 34 | int i; | ||
| 35 | if (frame->nactive < 1) | ||
| 36 | return; | ||
| 37 | x = frame->active[0]->x; | ||
| 38 | y = frame->active[0]->y; | ||
| 39 | min->x = max->x = x; | ||
| 40 | min->y = max->y = y; | ||
| 41 | for (i = 1; i < frame->nactive; i++) { | ||
| 42 | x = frame->active[i]->x; | ||
| 43 | y = frame->active[i]->y; | ||
| 44 | if (x < min->x) | ||
| 45 | min->x = x; | ||
| 46 | if (y < min->y) | ||
| 47 | min->y = y; | ||
| 48 | if (x > max->x) | ||
| 49 | max->x = x; | ||
| 50 | if (y > max->y) | ||
| 51 | max->y = y; | ||
| 52 | } | ||
| 53 | } | ||
| 54 | |||
| 55 | int gin_add_contact_props(const struct gesture_inserter *gin, | ||
| 56 | grail_prop_t *prop, const struct touch_frame *frame) | ||
| 57 | { | ||
| 58 | struct grail_coord min, max; | ||
| 59 | int i, n = 0, ntouch = frame->nactive; | ||
| 60 | if (!ntouch) | ||
| 61 | return n; | ||
| 62 | if (ntouch > 5) | ||
| 63 | ntouch = 5; | ||
| 64 | compute_bbox(&min, &max, frame); | ||
| 65 | prop[n++] = gin_prop_x(gin, min.x); | ||
| 66 | prop[n++] = gin_prop_y(gin, min.y); | ||
| 67 | prop[n++] = gin_prop_x(gin, max.x); | ||
| 68 | prop[n++] = gin_prop_y(gin, max.y); | ||
| 69 | for (i = 0; i < ntouch; i++) { | ||
| 70 | const struct touch *ct = frame->active[i]; | ||
| 71 | prop[n++] = ct->id; | ||
| 72 | prop[n++] = gin_prop_x(gin, ct->x); | ||
| 73 | prop[n++] = gin_prop_y(gin, ct->y); | ||
| 74 | } | ||
| 75 | return n; | ||
| 76 | } | ||
| 77 | |||
| 78 | int gin_get_clients(struct grail *ge, | ||
| 79 | struct grail_client_info *info, int maxinfo, | ||
| 80 | const grail_mask_t* types, int btypes, | ||
| 81 | const grail_mask_t* span, int bspan, | ||
| 82 | const struct touch_frame *frame) | ||
| 83 | { | ||
| 84 | struct grail_coord pos[DIM_TOUCH]; | ||
| 85 | int i, npos = 0; | ||
| 86 | if (!ge->get_clients) | ||
| 87 | return 0; | ||
| 88 | grail_mask_foreach(i, span, bspan) { | ||
| 89 | pos[npos].x = gin_prop_x(ge->gin, frame->touch[i].x); | ||
| 90 | pos[npos].y = gin_prop_y(ge->gin, frame->touch[i].y); | ||
| 91 | npos++; | ||
| 92 | } | ||
| 93 | return ge->get_clients(ge, info, maxinfo, pos, npos, types, btypes); | ||
| 94 | } | ||
| 95 | |||
| 96 | void gin_send_event(struct grail *ge, struct slot_state *s, | ||
| 97 | const struct gesture_event *ev, | ||
| 98 | const struct touch_frame *frame) | ||
| 99 | { | ||
| 100 | const struct gesture_inserter *gin = ge->gin; | ||
| 101 | struct grail_event gev; | ||
| 102 | int i; | ||
| 103 | if (!ge->gesture) | ||
| 104 | return; | ||
| 105 | gev.type = s->type; | ||
| 106 | gev.id = s->id; | ||
| 107 | gev.status = ev->status; | ||
| 108 | gev.ntouch = ev->ntouch; | ||
| 109 | gev.nprop = ev->nprop; | ||
| 110 | gev.time = ev->time; | ||
| 111 | gev.pos.x = gin_prop_x(gin, ev->pos.x); | ||
| 112 | gev.pos.y = gin_prop_y(gin, ev->pos.y); | ||
| 113 | memcpy(gev.prop, ev->prop, ev->nprop * sizeof(grail_prop_t)); | ||
| 114 | for (i = 0; i < s->nclient; i++) { | ||
| 115 | gev.client_id = s->client_id[i]; | ||
| 116 | ge->gesture(ge, &gev); | ||
| 117 | } | ||
| 118 | } | ||
| 119 | |||
| 27 | int grail_get_contacts(const struct grail *ge, | 120 | int grail_get_contacts(const struct grail *ge, |
| 28 | struct grail_contact *touch, int max_touch) | 121 | struct grail_contact *touch, int max_touch) |
| 29 | { | 122 | { |
