diff --git a/frontend/ui/gesturedetector.lua b/frontend/ui/gesturedetector.lua index 98cf4f762..b28aed3a4 100644 --- a/frontend/ui/gesturedetector.lua +++ b/frontend/ui/gesturedetector.lua @@ -2,7 +2,10 @@ require "ui/geometry" GestureRange = { ges = nil, + -- spatial range limits the gesture emitting position range = nil, + -- temproal range limits the gesture emitting rate + rate = nil, } function GestureRange:new(o) @@ -18,6 +21,15 @@ function GestureRange:match(gs) end if self.range:contains(gs.pos) then + if self.rate then + local last_time = self.last_time or TimeVal:new{} + if gs.time - last_time > TimeVal:new{usec = 1000000 / self.rate} then + self.last_time = gs.time + return true + else + return false + end + end return true end @@ -194,7 +206,8 @@ function GestureDetector:tapState(tev) x = self.last_tevs[slot].x, y = self.last_tevs[slot].y, w = 0, h = 0, - } + }, + time = tev.timev, } -- cur_tap is used for double tap detection local cur_tap = { @@ -281,6 +294,7 @@ function GestureDetector:panState(tev) direction = swipe_direct, -- use first pan tev coordination as swipe start point pos = start_pos, + time = tev.timev, --@TODO add start and end points? (houqp) } end @@ -298,6 +312,7 @@ function GestureDetector:panState(tev) y = 0, }, pos = nil, + time = tev.timev, } pan_ev.relative.x = tev.x - self.last_tevs[slot].x pan_ev.relative.y = tev.y - self.last_tevs[slot].y @@ -322,7 +337,8 @@ function GestureDetector:holdState(tev, hold) x = self.last_tevs[slot].x, y = self.last_tevs[slot].y, w = 0, h = 0, - } + }, + time = tev.timev, } end if tev.id == -1 then @@ -337,7 +353,8 @@ function GestureDetector:holdState(tev, hold) x = last_x, y = last_y, w = 0, h = 0, - } + }, + time = tev.timev, } end end