mirror of
https://github.com/koreader/koreader.git
synced 2025-08-10 00:52:38 +00:00
Input: Unbreak event handling on strict protocol B devices (#9445)
Regression since #9377 Fix #9444
This commit is contained in:
@@ -682,22 +682,28 @@ attribute of the current slot.
|
||||
--]]
|
||||
function Input:handleTouchEv(ev)
|
||||
if ev.type == C.EV_ABS then
|
||||
-- NOTE: Ideally, an input frame starts with either ABS_MT_SLOT or ABS_MT_TRACKING_ID,
|
||||
-- but they *both* may be omitted if the last contact point just moved without lift.
|
||||
-- The use of setCurrentMtSlotChecked instead of setCurrentMtSlot ensures
|
||||
-- we actually setup the slot data storage and/or reference for the current slot in this case,
|
||||
-- as the reference list is empty at the beginning of an input frame (c.f., Input:newFrame).
|
||||
-- The most common platforms where you'll see this happen are:
|
||||
-- * PocketBook, because of our InkView EVT_POINTERMOVE translation
|
||||
-- (c.f., translateEvent @ ffi/input_pocketbook.lua).
|
||||
-- * SDL, because of our SDL_MOUSEMOTION/SDL_FINGERMOTION translation
|
||||
-- (c.f., waitForEvent @ ffi/SDL2_0.lua).
|
||||
if ev.code == C.ABS_MT_SLOT then
|
||||
self:setupSlotData(ev.value)
|
||||
elseif ev.code == C.ABS_MT_TRACKING_ID then
|
||||
if self.snow_protocol then
|
||||
-- We'll never get an ABS_MT_SLOT event,
|
||||
-- instead we have a slot-like ABS_MT_TRACKING_ID value...
|
||||
-- NOTE: We'll never get an ABS_MT_SLOT event, instead we have a slot-like ABS_MT_TRACKING_ID value...
|
||||
-- This also means this may never be set to -1 on contact lift,
|
||||
-- which is why we instead rely on EV_KEY:BTN_TOUCH:0 for that (c.f., handleKeyBoardEv).
|
||||
self:setupSlotData(ev.value)
|
||||
else
|
||||
-- ABS_MT_SLOT *may* be elided if there was only a single contact point in the input frame,
|
||||
-- and as long as it is the *same* contact point as the final contact point of the previous frame...
|
||||
-- (e.g., the Elan driver on the Kobo Sage/Elipsa will do this.
|
||||
-- Ironically enough, that won't stop it from spamming identical ABS_MT_TRACKING_ID values...)
|
||||
-- The Elan driver needlessly repeats unchanged ABS_MT_TRACKING_ID values,
|
||||
-- which allows us to do this here instead of relying more aggressively on setCurrentMtSlotChecked.
|
||||
if #self.MTSlots == 0 then
|
||||
-- That means we have to make sure we have somewhere to put the data from our initial slot
|
||||
-- at the beginning of a frame...
|
||||
-- (This should be initialized to self.main_finger_slot, i.e., most likely 0)...
|
||||
self:addSlot(self.cur_slot)
|
||||
end
|
||||
end
|
||||
@@ -706,9 +712,9 @@ function Input:handleTouchEv(ev)
|
||||
-- NOTE: On the Elipsa: Finger == 0; Pen == 1
|
||||
self:setCurrentMtSlot("tool", ev.value)
|
||||
elseif ev.code == C.ABS_MT_POSITION_X then
|
||||
self:setCurrentMtSlot("x", ev.value)
|
||||
self:setCurrentMtSlotChecked("x", ev.value)
|
||||
elseif ev.code == C.ABS_MT_POSITION_Y then
|
||||
self:setCurrentMtSlot("y", ev.value)
|
||||
self:setCurrentMtSlotChecked("y", ev.value)
|
||||
elseif self.pressure_event and ev.code == self.pressure_event and ev.value == 0 then
|
||||
-- Drop hovering *pen* events
|
||||
local tool = self:getCurrentMtSlotData("tool")
|
||||
@@ -716,12 +722,12 @@ function Input:handleTouchEv(ev)
|
||||
self:setCurrentMtSlot("id", -1)
|
||||
end
|
||||
|
||||
-- code to emulate mt protocol on kobos
|
||||
-- we "confirm" abs_x, abs_y only when pressure ~= 0
|
||||
-- Emulate MT protocol on ST Kobos:
|
||||
-- we "confirm" ABS_X, ABS_Y only when ABS_PRESSURE ~= 0
|
||||
elseif ev.code == C.ABS_X then
|
||||
self:setCurrentMtSlot("abs_x", ev.value)
|
||||
self:setCurrentMtSlotChecked("abs_x", ev.value)
|
||||
elseif ev.code == C.ABS_Y then
|
||||
self:setCurrentMtSlot("abs_y", ev.value)
|
||||
self:setCurrentMtSlotChecked("abs_y", ev.value)
|
||||
elseif ev.code == C.ABS_PRESSURE then
|
||||
if ev.value ~= 0 then
|
||||
self:setCurrentMtSlot("id", 1)
|
||||
@@ -993,6 +999,15 @@ function Input:setCurrentMtSlot(key, val)
|
||||
self:setMtSlot(self.cur_slot, key, val)
|
||||
end
|
||||
|
||||
-- Same as above, but ensures the current slot actually has a live ref first
|
||||
function Input:setCurrentMtSlotChecked(key, val)
|
||||
if #self.MTSlots == 0 then
|
||||
self:addSlot(self.cur_slot)
|
||||
end
|
||||
|
||||
self:setMtSlot(self.cur_slot, key, val)
|
||||
end
|
||||
|
||||
function Input:getMtSlot(slot)
|
||||
return self.ev_slots[slot]
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user