From 15baeb786711027d669d77f7ded5918dede1d6b5 Mon Sep 17 00:00:00 2001 From: chrox Date: Sun, 8 Jun 2014 17:56:52 +0800 Subject: [PATCH] save doc settings when receiving IntoSS or Suspend or SaveState events --- frontend/apps/reader/readerui.lua | 5 +++ frontend/ui/input.lua | 66 ++++++++++++++++++++++++++++--- frontend/ui/uimanager.lua | 4 ++ koreader-base | 2 +- 4 files changed, 71 insertions(+), 6 deletions(-) diff --git a/frontend/apps/reader/readerui.lua b/frontend/apps/reader/readerui.lua index 8e17838b1..c8c460975 100644 --- a/frontend/apps/reader/readerui.lua +++ b/frontend/apps/reader/readerui.lua @@ -293,6 +293,11 @@ function ReaderUI:saveSettings() self.doc_settings:flush() end +function ReaderUI:onFlushSettings() + self:saveSettings() + return true +end + function ReaderUI:onClose() DEBUG("closing reader") self:saveSettings() diff --git a/frontend/ui/input.lua b/frontend/ui/input.lua index c638db82c..8e3e763b7 100644 --- a/frontend/ui/input.lua +++ b/frontend/ui/input.lua @@ -6,12 +6,14 @@ local Screen = require("ui/screen") local Math = require("optmath") local DEBUG = require("dbg") local _ = require("gettext") +local ffi = require("ffi") local util = require("ffi/util") -- constants from local EV_SYN = 0 local EV_KEY = 1 local EV_ABS = 3 +local EV_MSC = 4 -- key press event values (KEY.value) local EVENT_VALUE_KEY_PRESS = 1 @@ -211,6 +213,39 @@ function Input:initKeyMap() [117] = "RPgFwd", -- normal PageDown [119] = "Del", -- Delete } + self.sdl2_event_map = { + [ 4] = "A", [ 5] = "B", [ 6] = "C", [ 7] = "D", [ 8] = "E", [ 9] = "F", + [10] = "G", [11] = "H", [12] = "I", [13] = "J", [14] = "K", [15] = "L", + [16] = "M", [17] = "N", [18] = "O", [19] = "P", [20] = "Q", [21] = "R", + [22] = "S", [23] = "T", [24] = "U", [25] = "V", [26] = "W", [27] = "X", + [28] = "Y", [29] = "Z", [30] = "1", [31] = "2", [32] = "3", [33] = "4", + [34] = "5", [35] = "6", [36] = "7", [37] = "8", [38] = "9", [39] = "0", + + [42] = "Back", -- Backspace + [40] = "Enter", -- Enter + [225] = "Shift", -- left shift + [55] = ".", + [56] = "/", + [229] = "Sym", -- right shift key + [226] = "Alt", -- left alt + [44] = " ", -- Spacebar + [58] = "Menu", -- F[1] + [63] = "LPgBack", -- F[6] + [64] = "LPgFwd", -- F[7] + [68] = "VPlus", -- F[11] + [69] = "VMinus", -- F[12] + [230] = "AA", -- right alt key + [74] = "Home", -- Home + [82] = "Up", -- arrow up + [75] = "RPgBack", -- normal PageUp + [80] = "Left", -- arrow left + [79] = "Right", -- arrow right + [77] = "Press", -- End (above arrows) + [81] = "Down", -- arrow down + [78] = "RPgFwd", -- normal PageDown + [76] = "Del", -- Delete + } + self.modifiers = { Alt = false, Shift = false @@ -261,9 +296,7 @@ function Input:initTouchState() end function Input:init() - if Device:hasKeyboard() then - self:initKeyMap() - end + self:initKeyMap() if Device:isTouchDevice() then self:initTouchState() end @@ -274,12 +307,16 @@ function Input:init() self.event_map[10021] = "NotCharging" if util.isEmulated() then - self:initKeyMap() os.remove("/tmp/emu_event") os.execute("mkfifo /tmp/emu_event") input.open("/tmp/emu_event") -- SDL key codes - self.event_map = self.sdl_event_map + if not util.haveSDL2() then + self.event_map = self.sdl_event_map + else + self.event_map = self.sdl2_event_map + end + else local dev_mod = Device:getModel() if not Device:isKobo() then @@ -389,6 +426,10 @@ function Input:init() input.open("/dev/input/event1") elseif util.isAndroid() then DEBUG("Auto-detected Android") + self:adjustAndroidEventMap() + function Input:handleMiscEv(ev) + return Input:handleAndroidMiscEvent(ev) + end else DEBUG("Not supported device model!") end @@ -425,6 +466,9 @@ function Input:adjustKoboEventMap() self.event_map[116] = "Power" end +function Input:adjustAndroidEventMap() +end + function Input:setTimeout(cb, tv_out) local item = { callback = cb, @@ -486,6 +530,15 @@ function Input:handleKeyBoardEv(ev) end end +function Input:handleMiscEv(ev) +end + +function Input:handleAndroidMiscEvent(ev) + if ev.code == ffi.C.APP_CMD_SAVE_STATE then + return "SaveState" + end +end + function Input:setMtSlot(slot, key, val) if not self.ev_slots[slot] then self.ev_slots[slot] = { @@ -717,9 +770,12 @@ function Input:waitEvent(timeout_us, timeout_s) end ev = self:eventAdjustHook(ev) if ev.type == EV_KEY then + DEBUG("key ev", ev) return self:handleKeyBoardEv(ev) elseif ev.type == EV_ABS or ev.type == EV_SYN then return self:handleTouchEv(ev) + elseif ev.type == EV_MSC then + return self:handleMiscEv(ev) else -- some other kind of event that we do not know yet return Event:new("GenericInput", ev) diff --git a/frontend/ui/uimanager.lua b/frontend/ui/uimanager.lua index 931b54bdc..bce17d82e 100644 --- a/frontend/ui/uimanager.lua +++ b/frontend/ui/uimanager.lua @@ -282,6 +282,7 @@ function UIManager:run() if input_event then --DEBUG("in ui.lua:", input_event) if input_event == "IntoSS" then + self:sendEvent(Event:new("FlushSettings")) Device:intoScreenSaver() elseif input_event == "OutOfSS" then Device:outofScreenSaver() @@ -299,12 +300,15 @@ function UIManager:run() text = _("Standby"), timeout = 1, }) + 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 Device:Resume() self:sendEvent(Event:new("Resume")) + elseif input_event == "SaveState" then + self:sendEvent(Event:new("FlushSettings")) else self:sendEvent(input_event) end diff --git a/koreader-base b/koreader-base index 2b38b16d2..9dc2c6b2a 160000 --- a/koreader-base +++ b/koreader-base @@ -1 +1 @@ -Subproject commit 2b38b16d2795a228b1a541fbc2e09bd093119aad +Subproject commit 9dc2c6b2a2e15d47a17cb811182684a4ed272013