touchscreen(ts),
current_gesture(GESTURE_NONE),
active_points(0),
+ pending_tap(GESTURE_NONE),
invalid_gesture(false)
{
name = "Gesture";
p.x = 0;
p.y = 0;
p.threshold_exceeded = false;
+
+ if(current_gesture==GESTURE_NONE && !invalid_gesture)
+ {
+ if(btn==0)
+ pending_tap = GESTURE_TAP;
+ else if(btn==1)
+ pending_tap = GESTURE_TAP_2;
+ }
}
void GestureDetector::touch_up(unsigned btn)
invalid_gesture = false;
for(unsigned i=0; (i<MAX_POINTS && !invalid_gesture); ++i)
invalid_gesture = points[i].down;
+
+ if(!invalid_gesture && pending_tap!=GESTURE_NONE)
+ {
+ unsigned n_points = min<unsigned>((pending_tap-GESTURE_TAP)+1, MAX_POINTS);
+ set_gesture_location((1<<n_points)-1);
+ set_button_state(pending_tap, true, true);
+ set_button_state(pending_tap, false, true);
+
+ pending_tap = GESTURE_NONE;
+ }
}
}
if(p.down)
{
if(p.x*p.x/threshold_x_sq+p.y*p.y/threshold_y_sq>=1)
+ {
p.threshold_exceeded = true;
+ pending_tap = GESTURE_NONE;
+ }
if(current_gesture==GESTURE_NONE && !invalid_gesture)
start_gesture();
current_gesture = GESTURE_DRAG_2;
if(current_gesture!=GESTURE_NONE)
- {
active_points = 3;
- set_axis_value(0, (p.down_x+p2.down_x)/2, true);
- set_axis_value(1, (p.down_y+p2.down_y)/2, true);
- }
}
else
{
current_gesture = GESTURE_DRAG;
active_points = 1;
- set_axis_value(0, p.down_x, true);
- set_axis_value(1, p.down_y, true);
}
- update_progress();
if(current_gesture!=GESTURE_NONE)
+ {
+ set_gesture_location(active_points);
+ update_progress();
set_button_state(current_gesture, true, true);
+ }
else
invalid_gesture = true;
}
+void GestureDetector::set_gesture_location(unsigned mask)
+{
+ float x = 0;
+ float y = 0;
+ unsigned count = 0;
+ for(unsigned i=0; i<MAX_POINTS; ++i)
+ if(mask&(1<<i))
+ {
+ x += points[i].down_x;
+ y += points[i].down_y;
+ ++count;
+ }
+
+ set_axis_value(0, x/count, true);
+ set_axis_value(1, y/count, true);
+}
+
void GestureDetector::update_progress()
{
TouchPoint &p = points[0];
set_axis_value(2, 0, false);
current_gesture = GESTURE_NONE;
active_points = 0;
+ pending_tap = GESTURE_NONE;
}
void GestureDetector::window_resized(unsigned w, unsigned h)