diff options
Diffstat (limited to 'src/multitouch.c')
| -rw-r--r-- | src/multitouch.c | 51 |
1 files changed, 45 insertions, 6 deletions
diff --git a/src/multitouch.c b/src/multitouch.c index 99807b9..11f1e19 100644 --- a/src/multitouch.c +++ b/src/multitouch.c | |||
| @@ -120,20 +120,59 @@ static int device_close(LocalDevicePtr local) | |||
| 120 | 120 | ||
| 121 | //////////////////////////////////////////////////////////////////////////// | 121 | //////////////////////////////////////////////////////////////////////////// |
| 122 | 122 | ||
| 123 | static void tickle_button(LocalDevicePtr local, int id) | ||
| 124 | { | ||
| 125 | xf86PostButtonEvent(local->dev, FALSE, id, 1, 0, 0); | ||
| 126 | xf86PostButtonEvent(local->dev, FALSE, id, 0, 0, 0); | ||
| 127 | } | ||
| 128 | |||
| 129 | //////////////////////////////////////////////////////////////////////////// | ||
| 130 | |||
| 123 | static void handle_gestures(LocalDevicePtr local, | 131 | static void handle_gestures(LocalDevicePtr local, |
| 124 | const struct Gestures *gs) | 132 | const struct Gestures *gs, |
| 133 | const struct Capabilities *caps) | ||
| 125 | { | 134 | { |
| 135 | static int vscroll, hscroll; | ||
| 126 | int i; | 136 | int i; |
| 127 | if (GETBIT(gs->type, GS_MOVE)) { | ||
| 128 | xf86PostMotionEvent(local->dev, 0, 0, 2, gs->dx, gs->dy); | ||
| 129 | //xf86Msg(X_INFO, "motion: %d %d\n", gs->dx, gs->dy); | ||
| 130 | } | ||
| 131 | for (i = 0; i < gs->nbt; i++) { | 137 | for (i = 0; i < gs->nbt; i++) { |
| 132 | xf86PostButtonEvent(local->dev, FALSE, | 138 | xf86PostButtonEvent(local->dev, FALSE, |
| 133 | gs->btix[i], gs->btval[i], | 139 | gs->btix[i], gs->btval[i], |
| 134 | 0, 0); | 140 | 0, 0); |
| 135 | xf86Msg(X_INFO, "button: %d %d\n", gs->btix[i], gs->btval[i]); | 141 | xf86Msg(X_INFO, "button: %d %d\n", gs->btix[i], gs->btval[i]); |
| 136 | } | 142 | } |
| 143 | if (GETBIT(gs->type, GS_MOVE)) { | ||
| 144 | xf86PostMotionEvent(local->dev, 0, 0, 2, | ||
| 145 | gs->dx, gs->dy); | ||
| 146 | xf86Msg(X_INFO, "motion: %d %d\n", gs->dx, gs->dy); | ||
| 147 | } | ||
| 148 | if (GETBIT(gs->type, GS_VSCROLL)) { | ||
| 149 | int vstep = 0.03 * (caps->abs_position_y.maximum - | ||
| 150 | caps->abs_position_y.minimum); | ||
| 151 | vscroll += gs->dy; | ||
| 152 | while (vscroll > vstep) { | ||
| 153 | tickle_button(local, 5); | ||
| 154 | vscroll -= vstep; | ||
| 155 | } | ||
| 156 | while (vscroll < -vstep) { | ||
| 157 | tickle_button(local, 4); | ||
| 158 | vscroll += vstep; | ||
| 159 | } | ||
| 160 | xf86Msg(X_INFO, "vscroll: %d\n", gs->dy); | ||
| 161 | } | ||
| 162 | if (GETBIT(gs->type, GS_HSCROLL)) { | ||
| 163 | int hstep = 0.1 * (caps->abs_position_x.maximum - | ||
| 164 | caps->abs_position_x.minimum); | ||
| 165 | hscroll += gs->dx; | ||
| 166 | while (hscroll > hstep) { | ||
| 167 | tickle_button(local, 6); | ||
| 168 | hscroll -= hstep; | ||
| 169 | } | ||
| 170 | while (hscroll < -hstep) { | ||
| 171 | tickle_button(local, 7); | ||
| 172 | hscroll += hstep; | ||
| 173 | } | ||
| 174 | xf86Msg(X_INFO, "hscroll: %d\n", gs->dx); | ||
| 175 | } | ||
| 137 | } | 176 | } |
| 138 | 177 | ||
| 139 | //////////////////////////////////////////////////////////////////////////// | 178 | //////////////////////////////////////////////////////////////////////////// |
| @@ -146,7 +185,7 @@ static void read_input(LocalDevicePtr local) | |||
| 146 | while (read_synchronized_event(mt, local->fd)) { | 185 | while (read_synchronized_event(mt, local->fd)) { |
| 147 | parse_event(mt); | 186 | parse_event(mt); |
| 148 | extract_gestures(&gs, mt); | 187 | extract_gestures(&gs, mt); |
| 149 | handle_gestures(local, &gs); | 188 | handle_gestures(local, &gs, &mt->caps); |
| 150 | } | 189 | } |
| 151 | } | 190 | } |
| 152 | 191 | ||
