diff --git a/frontend/ui/screensaver.lua b/frontend/ui/screensaver.lua index d56de7c07..c259f3411 100644 --- a/frontend/ui/screensaver.lua +++ b/frontend/ui/screensaver.lua @@ -174,6 +174,7 @@ function Screensaver:setMessage() end self.input_dialog = InputDialog:new{ title = "Screensaver message", + description = _("Enter the message to be displayed by the screensaver. The following escape sequences can be used:\n %p percentage read\n %c current page number\n %t total number of pages\n %T title"), input = screensaver_message, buttons = { { @@ -349,9 +350,14 @@ function Screensaver:show(event, fallback_message) if screensaver_message == nil and prefix ~= "" then screensaver_message = G_reader_settings:readSetting("screensaver_message") end + + local fallback = fallback_message or default_screensaver_message if screensaver_message == nil then - screensaver_message = fallback_message or default_screensaver_message + screensaver_message = fallback + else + screensaver_message = self:expandSpecial(screensaver_message, fallback) end + widget = InfoMessage:new{ text = screensaver_message, readonly = true, @@ -377,6 +383,38 @@ function Screensaver:show(event, fallback_message) end end +function Screensaver:expandSpecial(message, fallback) + -- Expand special character sequences in given message. Use fallback string if there is no document instance + -- %p percentage read + -- %c current page + -- %t total pages + -- %T document title + + local ret = message + + local lastfile = G_reader_settings:readSetting("lastfile") + local doc = DocumentRegistry:openDocument(lastfile) + local instance = require("apps/reader/readerui"):_getRunningInstance() + if instance ~= nil then + local currentpage = instance.view.state.page + ret = string.gsub(ret, "%%c", currentpage) + + local totalpages = doc:getPageCount() + ret = string.gsub(ret, "%%t", totalpages) + + local percent = math.floor(((currentpage * 100) / totalpages) + 0.5) + ret = string.gsub(ret, "%%p", percent) + + local props = doc:getProps() + ret = string.gsub(ret, "%%T", props.title) + else + ret = fallback + end + doc:close() + + return ret +end + function Screensaver:close() if self.left_msg == nil then return end local screensaver_delay = G_reader_settings:readSetting("screensaver_delay")