diff --git a/frontend/device/input.lua b/frontend/device/input.lua index 5f87a4900..bb41156f6 100644 --- a/frontend/device/input.lua +++ b/frontend/device/input.lua @@ -145,17 +145,13 @@ local Input = { }, fake_event_set = { - IntoSS = true, OutOfSS = true, + IntoSS = true, OutOfSS = true, ExitingSS = true, UsbPlugIn = true, UsbPlugOut = true, Charging = true, NotCharging = true, WakeupFromSuspend = true, ReadyToSuspend = true, UsbDevicePlugIn = true, UsbDevicePlugOut = true, }, - -- Subset of fake_event_set for events that require passing a parameter along - complex_fake_event_set = { - UsbDevicePlugIn = true, UsbDevicePlugOut = true, - }, - -- Crappy FIFO to forward parameters for those events to UIManager + -- Crappy FIFO to forward parameters to UIManager for the subset of fake_event_set that require passing a parameter along fake_event_args = { UsbDevicePlugIn = {}, UsbDevicePlugOut = {}, @@ -246,8 +242,9 @@ function Input:init() end -- set up fake event map - self.event_map[10000] = "IntoSS" -- go into screen saver - self.event_map[10001] = "OutOfSS" -- go out of screen saver + self.event_map[10000] = "IntoSS" -- Requested to go into screen saver + self.event_map[10001] = "OutOfSS" -- Requested to go out of screen saver + self.event_map[10002] = "ExitingSS" -- Specific to Kindle, SS *actually* closed self.event_map[10010] = "UsbPlugIn" self.event_map[10011] = "UsbPlugOut" self.event_map[10020] = "Charging" @@ -618,7 +615,7 @@ function Input:handleKeyBoardEv(ev) -- So, we simply store it somewhere our handler can find and call it a day. -- And we use an array as a FIFO because we cannot guarantee that insertions and removals will interleave nicely. -- (This is all in the name of avoiding complexifying the common codepaths for events that should be few and far between). - if self.complex_fake_event_set[keycode] then + if self.fake_event_args[keycode] then table.insert(self.fake_event_args[keycode], ev.value) end return keycode @@ -708,6 +705,9 @@ function Input:handlePowerManagementOnlyEv(ev) end if self.fake_event_set[keycode] then + if self.fake_event_args[keycode] then + table.insert(self.fake_event_args[keycode], ev.value) + end return keycode end diff --git a/frontend/device/kindle/device.lua b/frontend/device/kindle/device.lua index 6e333a960..98d7aabcb 100644 --- a/frontend/device/kindle/device.lua +++ b/frontend/device/kindle/device.lua @@ -280,7 +280,18 @@ function Kindle:usbPlugIn() -- NOTE: If the device is put in USBNet mode before we even start, everything's peachy, though :). end -function Kindle:intoScreenSaver() +-- Hopefully, the event sources are fairly portable... +-- c.f., https://github.com/koreader/koreader/pull/11174#issuecomment-1830064445 +-- NOTE: There's no distinction between real button presses and powerd_test -p or lipc-set-prop -i com.lab126.powerd powerButton 1 +local POWERD_EVENT_SOURCES = { + [1] = "BUTTON_WAKEUP", -- outOfScreenSaver 1 + [2] = "BUTTON_SUSPEND", -- goingToScreenSaver 2 + [4] = "HALL_SUSPEND", -- goingToScreenSaver 4 + [6] = "HALL_WAKEUP", -- outOfScreenSaver 6 +} + +function Kindle:intoScreenSaver(source) + logger.dbg("Kindle:intoScreenSaver via", POWERD_EVENT_SOURCES[source] or string.format("UNKNOWN_SUSPEND (%d)", source or -1)) if not self.screen_saver_mode then if self:supportsScreensaver() then -- NOTE: Meaning this is not a SO device ;) @@ -304,7 +315,8 @@ function Kindle:intoScreenSaver() self.powerd:beforeSuspend() end -function Kindle:outofScreenSaver() +function Kindle:outofScreenSaver(source) + logger.dbg("Kindle:outofScreenSaver via", POWERD_EVENT_SOURCES[source] or string.format("UNKNOWN_WAKEUP (%d)", source or -1)) if self.screen_saver_mode then if self:supportsScreensaver() then local Screensaver = require("ui/screensaver") @@ -357,6 +369,9 @@ function Kindle:outofScreenSaver() self.powerd:afterResume() end +-- On stock, there's a distinction between OutOfSS (which *requests* closing the SS) and ExitingSS, which fires once they're *actually* closed... +function Kindle:exitingScreenSaver() end + function Kindle:usbPlugOut() -- NOTE: See usbPlugIn(), we don't have anything fancy to do here either. end @@ -382,14 +397,24 @@ function Kindle:UIManagerReady(uimgr) end function Kindle:setEventHandlers(uimgr) + -- These custom fake events *will* pass an argument... + self.input.fake_event_args.IntoSS = {} + self.input.fake_event_args.OutOfSS = {} + UIManager.event_handlers.Suspend = function() self.powerd:toggleSuspend() end - UIManager.event_handlers.IntoSS = function() - self:intoScreenSaver() + UIManager.event_handlers.IntoSS = function(input_event) + -- Retrieve the argument set by Input:handleKeyBoardEv + local arg = table.remove(self.input.fake_event_args[input_event]) + self:intoScreenSaver(arg) + end + UIManager.event_handlers.OutOfSS = function(input_event) + local arg = table.remove(self.input.fake_event_args[input_event]) + self:outofScreenSaver(arg) end - UIManager.event_handlers.OutOfSS = function() - self:outofScreenSaver() + UIManager.event_handlers.ExitingSS = function() + self:exitingScreenSaver() end UIManager.event_handlers.Charging = function() self:_beforeCharging()