diff --git a/frontend/device/generic/device.lua b/frontend/device/generic/device.lua index e96d3accd..d23c219d7 100644 --- a/frontend/device/generic/device.lua +++ b/frontend/device/generic/device.lua @@ -1,5 +1,6 @@ local Event = require("ui/event") local DEBUG = require("dbg") +local _ = require("gettext") local function yes() return true end local function no() return false end @@ -137,7 +138,7 @@ function Device:onPowerEvent(ev) -- always suspend in portrait mode self.orig_rotation_mode = self.screen:getRotationMode() self.screen:setRotationMode(0) - require("ui/screensaver"):show() + require("ui/screensaver"):show("suspend", _("Sleeping")) self.screen:refreshFull() self.screen_saver_mode = true UIManager:scheduleIn(self.suspend_wait_timeout, self.suspend) diff --git a/frontend/ui/screensaver.lua b/frontend/ui/screensaver.lua index 09478ff53..af83a9f41 100644 --- a/frontend/ui/screensaver.lua +++ b/frontend/ui/screensaver.lua @@ -4,7 +4,6 @@ local Device = require("device") local Screen = Device.screen local DocSettings = require("docsettings") local DEBUG = require("dbg") -local _ = require("gettext") local Screensaver = { } @@ -88,56 +87,60 @@ function Screensaver:getCoverImage(file) end end -function Screensaver:show() +function Screensaver:show(kind, default_msg) DEBUG("show screensaver") local InfoMessage = require("ui/widget/infomessage") + local screensaver_settings = G_reader_settings:readSetting(kind .. "_screensaver") or {} -- first check book cover image, on by default - local screen_saver_last_book = + local screensaver_last_book = G_reader_settings:readSetting("use_lastfile_as_screensaver") - if screen_saver_last_book == nil or screen_saver_last_book then + if screensaver_last_book == nil or screensaver_last_book then local lastfile = G_reader_settings:readSetting("lastfile") if lastfile then local doc_settings = DocSettings:open(lastfile) local exclude = doc_settings:readSetting("exclude_screensaver") if not exclude then - self.suspend_msg = self:getCoverImage(lastfile) + self.left_msg = self:getCoverImage(lastfile) end end end -- then screensaver directory or file image - if not self.suspend_msg then - -- FIXME: rename this config to screen_saver_path - local screen_saver_folder = + if not self.left_msg then + -- FIXME: rename screensaver_folder to screensaver_path + local screensaver_path = screensaver_settings.path or G_reader_settings:readSetting("screensaver_folder") - if screen_saver_folder == nil + if screensaver_path == nil and Device.internal_storage_mount_point ~= nil then - screen_saver_folder = + screensaver_path = Device.internal_storage_mount_point .. "screensaver" end - if screen_saver_folder then - local file = screen_saver_folder - if lfs.attributes(file, "mode") == "directory" then - self.suspend_msg = getRandomImage(file) - else - self.suspend_msg = createWidgetFromFile(file) + if screensaver_path then + local mode = lfs.attributes(screensaver_path, "mode") + if mode ~= nil then + if mode == "directory" then + self.left_msg = getRandomImage(screensaver_path) + else + self.left_msg = createWidgetFromFile(screensaver_path) + end end end end - -- fallback to suspended message - if not self.suspend_msg then - self.suspend_msg = InfoMessage:new{ text = _("Suspended") } - UIManager:show(self.suspend_msg) + -- fallback to message box + if not self.left_msg then + local msg = screensaver_settings.message or default_msg + self.left_msg = InfoMessage:new{ text = msg } + UIManager:show(self.left_msg) else -- refresh whole screen for other types - UIManager:show(self.suspend_msg, "full") + UIManager:show(self.left_msg, "full") end end function Screensaver:close() DEBUG("close screensaver") - if self.suspend_msg then - UIManager:close(self.suspend_msg) - self.suspend_msg = nil + if self.left_msg then + UIManager:close(self.left_msg) + self.left_msg = nil end end diff --git a/frontend/ui/uimanager.lua b/frontend/ui/uimanager.lua index 72d06c5ac..efc89a631 100644 --- a/frontend/ui/uimanager.lua +++ b/frontend/ui/uimanager.lua @@ -27,7 +27,7 @@ local UIManager = { _zeromqs = {}, _refresh_stack = {}, _refresh_func_stack = {}, - _power_ev_handled = false, + _entered_poweroff_stage = false, } function UIManager:init() @@ -42,6 +42,16 @@ function UIManager:init() Device:onPowerEvent(input_event) end, } + self.poweroff_action = function() + self._entered_poweroff_stage = true; + Screen:setRotationMode(0) + require("ui/screensaver"):show("poweroff", _("Powered off")) + Screen:refreshFull() + UIManager:nextTick(function() + self:broadcastEvent(Event:new("Close")) + Device:powerOff() + end) + end if Device:isKobo() then -- We do not want auto suspend procedure to waste battery during -- suspend. So let's unschedule it when suspending, and restart it after @@ -57,33 +67,12 @@ function UIManager:init() self:_startAutoSuspend() end self.event_handlers["PowerPress"] = function() - self._power_ev_handled = false - local showPowerOffDialog = function() - if self._power_ev_handled then return end - self._power_ev_handled = true - local ConfirmBox = require("ui/widget/confirmbox") - UIManager:show(ConfirmBox:new{ - text = _("Power off?"), - ok_callback = function() - local InfoMessage = require("ui/widget/infomessage") - - UIManager:show(InfoMessage:new{ - text = _("Powered off."), - }) - -- The message can fail to render if this is executed directly - UIManager:scheduleIn(0.1, function() - self:broadcastEvent(Event:new("Close")) - Device:powerOff() - end) - end, - }) - end - UIManager:scheduleIn(3, showPowerOffDialog) + UIManager:scheduleIn(2, self.poweroff_action) end self.event_handlers["PowerRelease"] = function() - if not self._power_ev_handled then - self._power_ev_handled = true - self.event_handlers["Suspend"]() + if not self._entered_poweroff_stage then + UIManager:unschedule(self.poweroff_action) + self.event_handlers["Suspend"]() end end if not G_reader_settings:readSetting("ignore_power_sleepcover") then