From 23d848acf42c888721a9ff6de9be270e93af1793 Mon Sep 17 00:00:00 2001 From: poire-z Date: Fri, 24 Jan 2020 20:05:21 +0100 Subject: [PATCH] Reader: strict ordering of tap & hold gestures (#5789) The lack of proper overrides could make their order/precedence/priority non-deterministic. --- frontend/apps/reader/modules/readerfooter.lua | 8 +++++--- frontend/apps/reader/modules/readergesture.lua | 4 ++++ .../apps/reader/modules/readerhighlight.lua | 18 +++++++++++++++--- frontend/apps/reader/modules/readerlink.lua | 10 ++++++++++ frontend/apps/reader/readerui.lua | 5 +++++ .../ui/widget/container/inputcontainer.lua | 4 ++++ 6 files changed, 43 insertions(+), 6 deletions(-) diff --git a/frontend/apps/reader/modules/readerfooter.lua b/frontend/apps/reader/modules/readerfooter.lua index ed45bfe4b..92b8a990e 100644 --- a/frontend/apps/reader/modules/readerfooter.lua +++ b/frontend/apps/reader/modules/readerfooter.lua @@ -535,15 +535,17 @@ function ReaderFooter:setupTouchZones() "tap_backward", "readerconfigmenu_tap", }, + -- (Low priority: tap on existing highlights + -- or links have priority) }, { id = "readerfooter_hold", ges = "hold", screen_zone = footer_screen_zone, handler = function() return self:onHoldFooter() end, - overrides = { - "readerhighlight_hold", - }, + -- (Low priority: word lookup and text selection + -- have priority - SkimTo widget can be more easily + -- brought up via some other gestures) }, }) end diff --git a/frontend/apps/reader/modules/readergesture.lua b/frontend/apps/reader/modules/readergesture.lua index 28705395b..fe18ad28e 100644 --- a/frontend/apps/reader/modules/readergesture.lua +++ b/frontend/apps/reader/modules/readergesture.lua @@ -1005,6 +1005,10 @@ function ReaderGesture:setupGesture(ges, action) "readerfooter_tap", } overrides_hold_corner = { + -- As hold corners are "ignored" by default, and we have + -- a "Ignore hold on corners" menu item and gesture, let + -- them have priority over word lookup and text selection. + "readerhighlight_hold", "readerfooter_hold", } overrides_vertical_edge = { diff --git a/frontend/apps/reader/modules/readerhighlight.lua b/frontend/apps/reader/modules/readerhighlight.lua index fdaf877ad..430c995b8 100644 --- a/frontend/apps/reader/modules/readerhighlight.lua +++ b/frontend/apps/reader/modules/readerhighlight.lua @@ -38,10 +38,18 @@ function ReaderHighlight:setupTouchZones() ratio_x = 0, ratio_y = 0, ratio_w = 1, ratio_h = 1, }, overrides = { + -- Tap on existing highlights have priority over + -- everything but tap on links (as links can be + -- part of some highlighted text) "tap_forward", "tap_backward", "readermenu_tap", "readerconfigmenu_tap", + "readerfooter_tap", + "tap_top_left_corner", + "tap_top_right_corner", + "tap_left_bottom_corner", + "tap_right_bottom_corner", }, handler = function(ges) return self:onTap(nil, ges) end }, @@ -51,6 +59,9 @@ function ReaderHighlight:setupTouchZones() screen_zone = { ratio_x = 0, ratio_y = 0, ratio_w = 1, ratio_h = 1, }, + overrides = { + "readerfooter_hold", + }, handler = function(ges) return self:onHold(nil, ges) end }, { @@ -521,14 +532,14 @@ end function ReaderHighlight:onHold(arg, ges) -- disable hold gesture if highlighting is disabled - if self.view.highlight.disabled then return true end + if self.view.highlight.disabled then return false end self:clear() -- clear previous highlight (delayed clear may not have done it yet) self.hold_ges_pos = ges.pos -- remember hold original gesture position self.hold_pos = self.view:screenToPageTransform(ges.pos) logger.dbg("hold position in page", self.hold_pos) if not self.hold_pos then logger.dbg("not inside page area") - return true + return false end -- check if we were holding on an image @@ -576,8 +587,9 @@ function ReaderHighlight:onHold(arg, ges) -- is handled in onHoldPan() self.selected_text_start_xpointer = word.pos0 end + return true end - return true + return false end function ReaderHighlight:onHoldPan(_, ges) diff --git a/frontend/apps/reader/modules/readerlink.lua b/frontend/apps/reader/modules/readerlink.lua index 2e95bdf98..7e3e5f8f0 100644 --- a/frontend/apps/reader/modules/readerlink.lua +++ b/frontend/apps/reader/modules/readerlink.lua @@ -34,8 +34,18 @@ function ReaderLink:init() ratio_w = 1, ratio_h = 1, }, overrides = { + -- Tap on links have priority over everything (it can + -- be disabled with "Tap to follow links" menu item) "tap_forward", "tap_backward", + "readermenu_tap", + "readerconfigmenu_tap", + "readerhighlight_tap", + "readerfooter_tap", + "tap_top_left_corner", + "tap_top_right_corner", + "tap_left_bottom_corner", + "tap_right_bottom_corner", }, handler = function(ges) return self:onTap(_, ges) end, }, diff --git a/frontend/apps/reader/readerui.lua b/frontend/apps/reader/readerui.lua index 94d6c7dec..a10b238c2 100644 --- a/frontend/apps/reader/readerui.lua +++ b/frontend/apps/reader/readerui.lua @@ -414,6 +414,11 @@ function ReaderUI:init() v() end self.postReaderCallback = nil + + -- print("Ordered registered gestures:") + -- for _, tzone in ipairs(self._ordered_touch_zones) do + -- print(" "..tzone.def.id) + -- end end function ReaderUI:getLastDirFile() diff --git a/frontend/ui/widget/container/inputcontainer.lua b/frontend/ui/widget/container/inputcontainer.lua index 01aebae02..cd1d47aab 100644 --- a/frontend/ui/widget/container/inputcontainer.lua +++ b/frontend/ui/widget/container/inputcontainer.lua @@ -152,15 +152,19 @@ function InputContainer:registerTouchZones(zones) }, } self.touch_zone_dg:addNode(zone.id) + -- print("added "..zone.id) if zone.overrides then for _, override_zone_id in ipairs(zone.overrides) do + -- print(" override "..override_zone_id) self.touch_zone_dg:addNodeDep(override_zone_id, zone.id) end end end + -- print("ordering:") self._ordered_touch_zones = {} for _, zone_id in ipairs(self.touch_zone_dg:serialize()) do table.insert(self._ordered_touch_zones, self._zones[zone_id]) + -- print(" "..zone_id) end end