From f57014cfc3beb9b8218d0093bad7de8b131fa517 Mon Sep 17 00:00:00 2001 From: Qingping Hou Date: Fri, 20 Jun 2014 06:50:11 -0400 Subject: [PATCH 1/4] fix(kobo): partially fix suspend support Tested in Kobo Aura HD. Suspend can still be interrrupted if user touches the screen after slided the power button and before the suspend function is called (2s delay). Reason for this is still unkown. --- frontend/ui/uimanager.lua | 28 +++++++++++++++++----------- kobo/suspend.sh | 2 +- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/frontend/ui/uimanager.lua b/frontend/ui/uimanager.lua index ac6027e9b..5c34a6f21 100644 --- a/frontend/ui/uimanager.lua +++ b/frontend/ui/uimanager.lua @@ -220,6 +220,8 @@ end -- it is intended to manage input events and delegate -- them to dialogs function UIManager:run() + local suspend_msg = nil + self._running = true while self._running do local now = { util.gettime() } @@ -340,7 +342,6 @@ function UIManager:run() -- delegate input_event to handler if input_event then - --DEBUG("in ui.lua:", input_event) if input_event == "IntoSS" then self:sendEvent(Event:new("FlushSettings")) Device:intoScreenSaver() @@ -353,20 +354,25 @@ function UIManager:run() self:sendEvent(Event:new("NotCharging")) elseif input_event == "Light" then Device:getPowerDevice():toggleFrontlight() - elseif (input_event == "Power" and not Device.screen_saver_mode) - or input_event == "Suspend" then - local InfoMessage = require("ui/widget/infomessage") - self:show(InfoMessage:new{ - text = _("Standby"), - timeout = 1, - }) + elseif (input_event == "Power" or input_event == "Suspend") + and not Device.screen_saver_mode then + if not suspend_msg then + local InfoMessage = require("ui/widget/infomessage") + suspend_msg = InfoMessage:new{ + text = _("Suspended"), + } + end + self:show(suspend_msg) self:sendEvent(Event:new("FlushSettings")) Device:prepareSuspend() - self:scheduleIn(0.5, function() Device:Suspend() end) - elseif (input_event == "Power" and Device.screen_saver_mode) - or input_event == "Resume" then + self:scheduleIn(2, function() Device:Suspend() end) + elseif (input_event == "Power" or input_event == "Resume") + and Device.screen_saver_mode then Device:Resume() self:sendEvent(Event:new("Resume")) + if suspend_msg then + self:close(suspend_msg) + end elseif input_event == "SaveState" then self:sendEvent(Event:new("FlushSettings")) else diff --git a/kobo/suspend.sh b/kobo/suspend.sh index 4d0037cda..7dc47a589 100644 --- a/kobo/suspend.sh +++ b/kobo/suspend.sh @@ -2,7 +2,7 @@ export PATH=$PATH:/sbin:/usr/sbin #disable wifi -if lsmod | grep -q sdio_wifi_pwr ; then +if lsmod | grep -q sdio_wifi_pwr ; then wlarm_le -i eth0 down ifconfig eth0 down /sbin/rmmod -r dhd From f7766d9606d852bc49db0200c1a84d39bb474f16 Mon Sep 17 00:00:00 2001 From: Qingping Hou Date: Thu, 26 Jun 2014 13:37:03 -0400 Subject: [PATCH 2/4] feature(device): add isKindle method --- frontend/ui/device.lua | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/frontend/ui/device.lua b/frontend/ui/device.lua index 9e0c8f23a..67f8ac2fc 100644 --- a/frontend/ui/device.lua +++ b/frontend/ui/device.lua @@ -98,6 +98,16 @@ function Device:isKindle2() return (self:getModel() == "Kindle2") end +function Device:isKindle() + local is_kindle = false + local kindle_sn = io.open("/proc/usid", "r") + if kindle_sn then + is_kindle = true + kindle_sn:close() + end + return is_kindle +end + function Device:isKobo() return string.find(self:getModel() or "", "Kobo_") == 1 end From 440046874188c76e09004866775aa78e917a025f Mon Sep 17 00:00:00 2001 From: Qingping Hou Date: Thu, 26 Jun 2014 13:37:33 -0400 Subject: [PATCH 3/4] refactor(uimanager): use event_handlers to dispatch events --- frontend/ui/uimanager.lua | 146 ++++++++++++++++++++++---------------- 1 file changed, 85 insertions(+), 61 deletions(-) diff --git a/frontend/ui/uimanager.lua b/frontend/ui/uimanager.lua index 5c34a6f21..6dbb3837a 100644 --- a/frontend/ui/uimanager.lua +++ b/frontend/ui/uimanager.lua @@ -39,6 +39,8 @@ local UIManager = { FULL_REFRESH_COUNT = DRCOUNTMAX, refresh_count = 0, + event_handlers = nil, + _running = true, _window_stack = {}, _execution_stack = {}, @@ -46,36 +48,87 @@ local UIManager = { _zeromqs = {}, } --- For the Kobo Aura an offset is needed, because the bezel make the visible screen smaller. -if Device:getModel() ~= 'Kobo_phoenix' then - function UIManager:offsetX() - return 0 - end - function UIManager:offsetY() - return 0 - end -else - function UIManager:offsetX() - if Screen.cur_rotation_mode == 0 then - return 4 - elseif Screen.cur_rotation_mode == 1 then - return 15 - else - return 3 + +function UIManager:init() + -- For the Kobo Aura an offset is needed, because the bezel make the + -- visible screen smaller. + if Device:getModel() ~= 'Kobo_phoenix' then + function self:offsetX() return 0 end + function self:offsetY() return 0 end + else + function self:offsetX() + if Screen.cur_rotation_mode == 0 then + return 4 + elseif Screen.cur_rotation_mode == 1 then + return 15 + else + return 3 + end + end + function self:offsetY() + if Screen.cur_rotation_mode == 0 then + return 3 + else + return 4 + end end end - function UIManager:offsetY() - if Screen.cur_rotation_mode == 0 then - return 3 - elseif Screen.cur_rotation_mode == 1 then - return 4 - else - return 4 + + self.event_handlers = { + __default__ = function(input_event) + self:sendEvent(input_event) + end, + SaveState = function() + self:sendEvent(Event:new("FlushSettings")) + end + } + if Device:isKobo() then + -- lazy create suspend_msg to avoid dependence loop + local suspend_msg = nil + function kobo_power(input_event) + if (input_event == "Power" or input_event == "Suspend") + and not Device.screen_saver_mode then + if not suspend_msg then + local InfoMessage = require("ui/widget/infomessage") + suspend_msg = InfoMessage:new{ text = _("Suspended") } + end + self:show(suspend_msg) + self:sendEvent(Event:new("FlushSettings")) + Device:prepareSuspend() + self:scheduleIn(2, function() Device:Suspend() end) + elseif (input_event == "Power" or input_event == "Resume") + and Device.screen_saver_mode then + Device:Resume() + self:sendEvent(Event:new("Resume")) + if suspend_msg then + self:close(suspend_msg) + end + end + end + self.event_handlers["Power"] = kobo_power + self.event_handlers["Suspend"] = kobo_power + self.event_handlers["Resume"] = kobo_power + self.event_handlers["Light"] = function() + Device:getPowerDevice():toggleFrontlight() + end + elseif Device:isKindle() then + self.event_handlers["IntoSS"] = function() + self:sendEvent(Event:new("FlushSettings")) + Device:intoScreenSaver() + end + self.event_handlers["OutOfSS"] = function() + Device:outofScreenSaver() + end + self.event_handlers["Charging"] = function() + Device:usbPlugIn() + end + self.event_handlers["NotCharging"] = function() + Device:usbPlugOut() + self:sendEvent(Event:new("NotCharging")) end end end - -- register & show a widget function UIManager:show(widget, x, y) -- put widget on top of stack @@ -220,8 +273,6 @@ end -- it is intended to manage input events and delegate -- them to dialogs function UIManager:run() - local suspend_msg = nil - self._running = true while self._running do local now = { util.gettime() } @@ -248,7 +299,9 @@ function UIManager:run() local force_fast_refresh = false for _, widget in ipairs(self._window_stack) do if self.repaint_all or self._dirty[widget.widget] then - widget.widget:paintTo(Screen.bb, widget.x + UIManager:offsetX(), widget.y + UIManager:offsetY() ) + widget.widget:paintTo(Screen.bb, + widget.x + UIManager:offsetX(), + widget.y + UIManager:offsetY()) if self._dirty[widget.widget] == "auto" then request_full_refresh = true end @@ -342,45 +395,16 @@ function UIManager:run() -- delegate input_event to handler if input_event then - if input_event == "IntoSS" then - self:sendEvent(Event:new("FlushSettings")) - Device:intoScreenSaver() - elseif input_event == "OutOfSS" then - Device:outofScreenSaver() - elseif input_event == "Charging" then - Device:usbPlugIn() - elseif input_event == "NotCharging" then - Device:usbPlugOut() - self:sendEvent(Event:new("NotCharging")) - elseif input_event == "Light" then - Device:getPowerDevice():toggleFrontlight() - elseif (input_event == "Power" or input_event == "Suspend") - and not Device.screen_saver_mode then - if not suspend_msg then - local InfoMessage = require("ui/widget/infomessage") - suspend_msg = InfoMessage:new{ - text = _("Suspended"), - } - end - self:show(suspend_msg) - self:sendEvent(Event:new("FlushSettings")) - Device:prepareSuspend() - self:scheduleIn(2, function() Device:Suspend() end) - elseif (input_event == "Power" or input_event == "Resume") - and Device.screen_saver_mode then - Device:Resume() - self:sendEvent(Event:new("Resume")) - if suspend_msg then - self:close(suspend_msg) - end - elseif input_event == "SaveState" then - self:sendEvent(Event:new("FlushSettings")) + local handler = self.event_handlers[input_event] + if handler then + handler(input_event) else - self:sendEvent(input_event) + self.event_handlers["__default__"](input_event) end end end end +UIManager:init() return UIManager From 45f3294f8d2d17ea6144cbae94e5b71dac491b0e Mon Sep 17 00:00:00 2001 From: Qingping Hou Date: Thu, 26 Jun 2014 14:28:57 -0400 Subject: [PATCH 4/4] fix(kobo suspend): ignore user input in suspend mode --- frontend/ui/uimanager.lua | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/frontend/ui/uimanager.lua b/frontend/ui/uimanager.lua index 6dbb3837a..81079bbe2 100644 --- a/frontend/ui/uimanager.lua +++ b/frontend/ui/uimanager.lua @@ -111,6 +111,16 @@ function UIManager:init() self.event_handlers["Light"] = function() Device:getPowerDevice():toggleFrontlight() end + self.event_handlers["__default__"] = function(input_event) + if Device.screen_saver_mode then + -- Suspension in Kobo can be interrupted by screen updates. We + -- ignore user touch input here so screen udpate won't be + -- triggered in suspend mode + return + else + self:sendEvent(input_event) + end + end elseif Device:isKindle() then self.event_handlers["IntoSS"] = function() self:sendEvent(Event:new("FlushSettings"))