From 18c0cee18fc6eca5e1397b54023179c09459df61 Mon Sep 17 00:00:00 2001 From: Cosmin Gorgovan Date: Sun, 1 May 2016 13:46:17 +0100 Subject: [PATCH 1/2] UIManager: add method for broadcasting an event to all widgets --- frontend/ui/uimanager.lua | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/frontend/ui/uimanager.lua b/frontend/ui/uimanager.lua index 11520b30e..8b38bfa54 100644 --- a/frontend/ui/uimanager.lua +++ b/frontend/ui/uimanager.lua @@ -347,7 +347,7 @@ function UIManager:quit() end end --- transmit an event to registered widgets +-- transmit an event to an active widget function UIManager:sendEvent(event) if #self._window_stack == 0 then return end -- top level widget has first access to the event @@ -368,6 +368,20 @@ function UIManager:sendEvent(event) end end +-- transmit an event to all registered widgets +function UIManager:broadcastEvent(event) + -- the widget's event handler might close widgets in which case + -- a simple iterator like ipairs would skip over some entries + local i = 1 + while (i <= #self._window_stack) do + local prev_widget = self._window_stack[i].widget + self._window_stack[i].widget:handleEvent(event) + if (self._window_stack[i].widget == prev_widget) then + i = i + 1 + end + end +end + function UIManager:_checkTasks() local now = { util.gettime() } local now_us = now[1] * MILLION + now[2] From 19338cb439175c53cc1b69a598707e2fffe35b01 Mon Sep 17 00:00:00 2001 From: Cosmin Gorgovan Date: Tue, 26 Apr 2016 23:30:52 +0100 Subject: [PATCH 2/2] Kobo: Offer to power off if the power button is held for at least 3 seconds --- frontend/device/generic/device.lua | 3 +++ frontend/device/input.lua | 24 ++++++++++++++--------- frontend/device/kobo/device.lua | 4 ++++ frontend/ui/uimanager.lua | 31 ++++++++++++++++++++++++++++++ 4 files changed, 53 insertions(+), 9 deletions(-) diff --git a/frontend/device/generic/device.lua b/frontend/device/generic/device.lua index 07f452c10..e8f671c6c 100644 --- a/frontend/device/generic/device.lua +++ b/frontend/device/generic/device.lua @@ -153,6 +153,9 @@ function Device:suspend() end -- Hardware specific method to resume the device function Device:resume() end +-- Hardware specific method to power off the device +function Device:powerOff() end + function Device:usbPlugIn() if self.charging_mode == false and self.screen_saver_mode == false then self.screen:saveCurrentBB() diff --git a/frontend/device/input.lua b/frontend/device/input.lua index e4f8ef878..016be3b90 100644 --- a/frontend/device/input.lua +++ b/frontend/device/input.lua @@ -258,20 +258,26 @@ function Input:handleKeyBoardEv(ev) end end - if ev.value == EVENT_VALUE_KEY_RELEASE then - if keycode == "Light" then - return keycode - elseif keycode == "Power" then - -- Kobo generates Power keycode only, we need to decide whether it's - -- power-on or power-off ourselves. - if self.device.screen_saver_mode then + if keycode == "Power" then + -- Kobo generates Power keycode only, we need to decide whether it's + -- power-on or power-off ourselves. + if self.device.screen_saver_mode then + if ev.value == EVENT_VALUE_KEY_RELEASE then return "Resume" - else - return "Suspend" + end + else + if ev.value == EVENT_VALUE_KEY_PRESS then + return "PowerPress" + elseif ev.value == EVENT_VALUE_KEY_RELEASE then + return "PowerRelease" end end end + if ev.value == EVENT_VALUE_KEY_RELEASE and keycode == "Light" then + return keycode + end + -- handle modifier keys if self.modifiers[keycode] ~= nil then if ev.value == EVENT_VALUE_KEY_PRESS then diff --git a/frontend/device/kobo/device.lua b/frontend/device/kobo/device.lua index 18c598bd6..8f96561ef 100644 --- a/frontend/device/kobo/device.lua +++ b/frontend/device/kobo/device.lua @@ -189,6 +189,10 @@ function Kobo:resume() end end +function Kobo:powerOff() + os.execute("poweroff") +end + -------------- device probe ------------ local codename = Kobo:getCodeName() diff --git a/frontend/ui/uimanager.lua b/frontend/ui/uimanager.lua index 8b38bfa54..f00b842e8 100644 --- a/frontend/ui/uimanager.lua +++ b/frontend/ui/uimanager.lua @@ -27,6 +27,7 @@ local UIManager = { _zeromqs = {}, _refresh_stack = {}, _refresh_func_stack = {}, + _power_ev_handled = false, } function UIManager:init() @@ -55,6 +56,36 @@ function UIManager:init() self:sendEvent(Event:new("Resume")) self:_startAutoSuspend() end + self.event_handlers["PowerPress"] = function(input_event) + 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) + end + self.event_handlers["PowerRelease"] = function(input_event) + if not self._power_ev_handled then + self._power_ev_handled = true + self.event_handlers["Suspend"]("Suspend") + end + end self.event_handlers["Light"] = function() Device:getPowerDevice():toggleFrontlight() end