diff --git a/commands.lua b/commands.lua index c47215b8b..b932bac58 100644 --- a/commands.lua +++ b/commands.lua @@ -168,14 +168,15 @@ function Commands:new(obj) Screen:saveCurrentBB() Screen.kpv_rotation_mode = Screen.cur_rotation_mode fb:setOrientation(Screen.native_rotation_mode) - --os.execute("killall -cont cvm") + util.sleep(1) + os.execute("killall -cont cvm") end ) obj:add(KEY_OUTOF_SCREEN_SAVER, nil, "Slider", "toggle screen saver", function() - util.sleep(3) - --os.execute("killall -stop cvm") + util.usleep(1500000) + os.execute("killall -stop cvm") fb:setOrientation(Screen.kpv_rotation_mode) Screen:restoreFromSavedBB() fb:refresh(0) diff --git a/filechooser.lua b/filechooser.lua index 82f821fbc..a6c2c2ab6 100644 --- a/filechooser.lua +++ b/filechooser.lua @@ -138,8 +138,9 @@ function FileChooser:choose(ypos, height) renderUtf8Text(fb.bb, 50, ypos + self.spacing*c, cface, self.files[i-#self.dirs], true) end end + all_page = math.ceil(self.items/perpage) renderUtf8Text(fb.bb, 5, ypos + self.spacing * perpage + 42, fface, - "Page "..self.page.." of "..(math.floor(self.items / perpage)+1), true) + "Page "..self.page.." of "..all_page, true) local msg = self.exception_message and self.exception_message:match("[^%:]+:%d+: (.*)") or "Path: "..self.path self.exception_message = nil renderUtf8Text(fb.bb, 5, ypos + self.spacing * (perpage+1) + 27, fface, msg, true) diff --git a/filesearcher.lua b/filesearcher.lua index 9339ae516..69890e382 100644 --- a/filesearcher.lua +++ b/filesearcher.lua @@ -262,7 +262,7 @@ function FileSearcher:choose(keywords) -- draw footer y = self.title_H + (self.spacing * self.perpage) + self.foot_H x = (G_width / 2) - 50 - all_page = (math.floor(self.items / self.perpage)+1) + all_page = math.ceil(self.items/self.perpage) renderUtf8Text(fb.bb, x, y, fface, "Page "..self.page.." of "..all_page, true) end diff --git a/launchpad/kpdf.sh b/launchpad/kpdf.sh index c43dac6f8..c1f81c700 100755 --- a/launchpad/kpdf.sh +++ b/launchpad/kpdf.sh @@ -18,6 +18,9 @@ if test "$1" == "--framework_stop"; then /etc/init.d/framework stop fi +# stop cvm +killall -stop cvm + # finally call reader ./reader.lua "$1" 2> /mnt/us/kindlepdfviewer/crash.log || cat /mnt/us/kindlepdfviewer/crash.log diff --git a/reader.lua b/reader.lua index abce5bd8b..2a1d882b3 100755 --- a/reader.lua +++ b/reader.lua @@ -53,8 +53,8 @@ function openFile(filename) if ok then reader:loadSettings(filename) page_num = reader:getLastPageOrPos() - reader:goto(tonumber(page_num)) - reader_settings:savesetting("lastfile", filename) + reader:goto(tonumber(page_num), true) + reader_settings:saveSetting("lastfile", filename) return reader:inputLoop() else InfoMessage:show("Error opening document.", 0) @@ -160,7 +160,7 @@ end -- save reader settings -reader_settings:savesetting("fontmap", Font.fontmap) +reader_settings:saveSetting("fontmap", Font.fontmap) reader_settings:close() -- @TODO dirty workaround, find a way to force native system poll @@ -169,6 +169,6 @@ fb:setOrientation(Screen.native_rotation_mode) input.closeAll() if util.isEmulated()==0 then - --os.execute("killall -cont cvm") + os.execute("killall -cont cvm") os.execute('echo "send '..KEY_MENU..'" > /proc/keypad;echo "send '..KEY_MENU..'" > /proc/keypad') end diff --git a/screen.lua b/screen.lua index f7c9b3f6c..3dd0ebfae 100644 --- a/screen.lua +++ b/screen.lua @@ -100,5 +100,9 @@ function Screen:getCurrentScreenBB() end function Screen:restoreFromBB(bb) - fb.bb:blitFullFrom(bb) + if bb then + fb.bb:blitFullFrom(bb) + else + debug("Got nil bb in restoreFromSavedBB!") + end end diff --git a/settings.lua b/settings.lua index 974af3491..7a15b6be9 100644 --- a/settings.lua +++ b/settings.lua @@ -13,10 +13,14 @@ function DocSettings:readSetting(key) return self.data[key] end -function DocSettings:savesetting(key, value) +function DocSettings:saveSetting(key, value) self.data[key] = value end +function DocSettings:delSetting(key) + self.data[key] = nil +end + function dump(data) local out = {} DocSettings:_serialize(data, out, 0) diff --git a/unireader.lua b/unireader.lua index 5481304dd..d13261ad6 100644 --- a/unireader.lua +++ b/unireader.lua @@ -79,7 +79,10 @@ UniReader = { pagehash = nil, - jump_stack = {}, + -- we use array to simluate two stacks, + -- one for backwards, one for forwards + jump_history = {cur = 1}, + bookmarks = {}, highlight = {}, toc = nil, @@ -914,8 +917,26 @@ function UniReader:loadSettings(filename) self.globalgamma = gamma end - local jumpstack = self.settings:readSetting("jumpstack") - self.jump_stack = jumpstack or {} + local jump_history = self.settings:readSetting("jump_history") + if jump_history then + self.jump_history = jump_history + else + self.jump_history = {cur = 1} + end + + local bookmarks = self.settings:readSetting("bookmarks") + self.bookmarks = bookmarks or {} + + -- clear obselate jumpstack settings + -- move jump_stack to bookmarks incase users used + -- it as bookmark feature before. + local jump_stack = self.settings:readSetting("jumpstack") + if jump_stack then + if #self.bookmarks == 0 then + self.bookmarks = jump_stack + end + self.settings:delSetting("jumpstack") + end local highlight = self.settings:readSetting("highlight") self.highlight = highlight or {} @@ -938,7 +959,7 @@ function UniReader:getLastPageOrPos() end function UniReader:saveLastPageOrPos() - self.settings:savesetting("last_page", self.pageno) + self.settings:saveSetting("last_page", self.pageno) end -- guarantee that we have enough memory in cache @@ -1312,69 +1333,85 @@ function UniReader:isSamePage(p1, p2) end --[[ - @ pageno is the page you want to add to jump_stack + @ pageno is the page you want to add to jump_history, this will + clear the forward stack since pageno is the new head. NOTE: for CREReader, pageno refers to xpointer --]] -function UniReader:addJump(pageno, notes) - local jump_item = nil - local notes_to_add = notes - if not notes_to_add then - -- no notes given, auto generate from Toc entry - notes_to_add = self:getTocTitleOfCurrentPage() - if notes_to_add ~= "" then - notes_to_add = "in "..notes_to_add - end - end - -- move pageno page to jump_stack top if already in - for _t,_v in ipairs(self.jump_stack) do - if self:isSamePage(_v.page, pageno) then - jump_item = _v - table.remove(self.jump_stack, _t) - -- if original notes is not empty, probably defined by users, - -- we use the original notes to overwrite auto generated notes - -- from Toc entry - if jump_item.notes ~= "" then - notes_to_add = jump_item.notes - end - jump_item.notes = notes or notes_to_add - break +function UniReader:addJump(pageno) + -- build notes from TOC + local notes = self:getTocTitleOfCurrentPage() + if notes ~= "" then + notes = "in "..notes + end + -- create a head + jump_item = { + page = pageno, + datetime = os.date("%Y-%m-%d %H:%M:%S"), + notes = notes, + } + -- clear forward stack if it is not empty + if self.jump_history.cur < #self.jump_history then + for i=self.jump_history.cur+1, #self.jump_history do + self.jump_history[i] = nil end end - -- create a new one if page not found in stack - if not jump_item then - jump_item = { - page = pageno, - datetime = os.date("%Y-%m-%d %H:%M:%S"), - notes = notes_to_add, - } + -- keep the size less than 10 + if #self.jump_history > 10 then + table.remove(self.jump_history) end - - -- insert item at the start - table.insert(self.jump_stack, 1, jump_item) - - if #self.jump_stack > 10 then - -- remove the last element to keep the size less than 10 - table.remove(self.jump_stack) + -- set up new head + -- if backward stack top is the same as page to record, remove it + if #self.jump_history ~= 0 and + self.jump_history[#self.jump_history].page == pageno then + self.jump_history[#self.jump_history] = nil end + table.insert(self.jump_history, jump_item) + self.jump_history.cur = #self.jump_history + 1 + return true end function UniReader:delJump(pageno) - for _t,_v in ipairs(self.jump_stack) do + for _t,_v in ipairs(self.jump_history) do if _v.page == pageno then - table.remove(self.jump_stack, _t) + table.remove(self.jump_history, _t) end end end +-- return nil if page already marked +-- otherwise, return true +function UniReader:addBookmark(pageno) + for k,v in ipairs(self.bookmarks) do + if v.page == pageno then + return nil + end + end + -- build notes from TOC + local notes = self:getTocTitleOfCurrentPage() + if notes ~= "" then + notes = "in "..notes + end + mark_item = { + page = pageno, + datetime = os.date("%Y-%m-%d %H:%M:%S"), + notes = notes, + } + table.insert(self.bookmarks, mark_item) + return true +end + -- change current page and cache next page after rendering -function UniReader:goto(no) +function UniReader:goto(no, is_ignore_jump) if no < 1 or no > self.doc:getPages() then return end - -- for jump_stack, distinguish jump from normal page turn - if self.pageno and math.abs(self.pageno - no) > 1 then - self:addJump(self.pageno) + -- for jump_history + if not is_ignore_jump then + -- distinguish jump from normal page turn + if self.pageno and math.abs(self.pageno - no) > 1 then + self:addJump(self.pageno) + end end self.pageno = no @@ -1554,25 +1591,60 @@ function UniReader:showToc() end end -function UniReader:showJumpStack() +function UniReader:showJumpHist() local menu_items = {} - for k,v in ipairs(self.jump_stack) do + for k,v in ipairs(self.jump_history) do + if k == self.jump_history.cur then + cur_sign = "*(Cur) " + else + cur_sign = "" + end table.insert(menu_items, - v.datetime.." -> Page "..v.page.." "..v.notes) + cur_sign..v.datetime.." -> Page "..v.page.." "..v.notes) end if #menu_items == 0 then - showInfoMsgWithDelay( - "No jump history found.", 2000, 1) + showInfoMsgWithDelay("No jump history found.", 2000, 1) else + -- if cur points to head, draw entry for current page + if self.jump_history.cur > #self.jump_history then + table.insert(menu_items, + "Current Page "..self.pageno) + end + jump_menu = SelectMenu:new{ - menu_title = "Jump Keeper (current page: "..self.pageno..")", + menu_title = "Jump History", item_array = menu_items, } item_no = jump_menu:choose(0, fb.bb:getHeight()) + if item_no and item_no <= #self.jump_history then + local jump_item = self.jump_history[item_no] + self.jump_history.cur = item_no + self:goto(jump_item.page, true) + else + self:redrawCurrentPage() + end + end +end + +function UniReader:showBookMarks() + local menu_items = {} + -- build menu items + for k,v in ipairs(self.bookmarks) do + table.insert(menu_items, + "Page "..v.page.." "..v.notes.." @ "..v.datetime) + end + if #menu_items == 0 then + showInfoMsgWithDelay( + "No bookmark found.", 2000, 1) + else + toc_menu = SelectMenu:new{ + menu_title = "Bookmarks", + item_array = menu_items, + } + item_no = toc_menu:choose(0, fb.bb:getHeight()) if item_no then - local jump_item = self.jump_stack[item_no] - self:goto(jump_item.page) + self:goto(self.bookmarks[item_no].page) else self:redrawCurrentPage() end @@ -1700,12 +1772,13 @@ function UniReader:inputLoop() end if self.settings ~= nil then self:saveLastPageOrPos() - self.settings:savesetting("gamma", self.globalgamma) - self.settings:savesetting("jumpstack", self.jump_stack) - self.settings:savesetting("bbox", self.bbox) - self.settings:savesetting("globalzoom", self.globalzoom) - self.settings:savesetting("globalzoommode", self.globalzoommode) - self.settings:savesetting("highlight", self.highlight) + self.settings:saveSetting("gamma", self.globalgamma) + self.settings:saveSetting("jump_history", self.jump_history) + self.settings:saveSetting("bookmarks", self.bookmarks) + self.settings:saveSetting("bbox", self.bbox) + self.settings:saveSetting("globalzoom", self.globalzoom) + self.settings:saveSetting("globalzoommode", self.globalzoommode) + self.settings:saveSetting("highlight", self.highlight) self:saveSpecialSettings() self.settings:close() end @@ -1734,10 +1807,25 @@ function UniReader:addAllCommands() unireader:setGlobalZoom(unireader.globalzoom + (keydef.keycode==KEY_PGBCK and -1 or 1)*unireader.globalzoom_orig*0.2) end) self.commands:add(KEY_BACK,nil,"Back", - "back to last jump", + "go backward in jump history", function(unireader) - if #unireader.jump_stack ~= 0 then - unireader:goto(unireader.jump_stack[1].page) + local prev_jump_no = unireader.jump_history.cur - 1 + if prev_jump_no >= 1 then + unireader.jump_history.cur = prev_jump_no + unireader:goto(unireader.jump_history[prev_jump_no].page, true) + else + showInfoMsgWithDelay("Already first jump!", 2000, 1) + end + end) + self.commands:add(KEY_BACK,MOD_SHIFT,"Back", + "go forward in jump history", + function(unireader) + local next_jump_no = unireader.jump_history.cur + 1 + if next_jump_no <= #self.jump_history then + unireader.jump_history.cur = next_jump_no + unireader:goto(unireader.jump_history[next_jump_no].page, true) + else + showInfoMsgWithDelay("Already last jump!", 2000, 1) end end) self.commands:add(KEY_BACK,MOD_ALT,"Back", @@ -1832,14 +1920,24 @@ function UniReader:addAllCommands() unireader:showToc() end) self.commands:add(KEY_B,nil,"B", - "show jump stack", + "show book marks", + function(unireader) + unireader:showBookMarks() + end) + self.commands:add(KEY_B,MOD_ALT,"B", + "add book mark to current page", function(unireader) - unireader:showJumpStack() + ok = unireader:addBookmark(self.pageno) + if not ok then + showInfoMsgWithDelay("Page already marked!", 2000, 1) + else + showInfoMsgWithDelay("Page marked.", 2000, 1) + end end) self.commands:add(KEY_B,MOD_SHIFT,"B", - "add jump", + "show jump history", function(unireader) - unireader:addJump(unireader.pageno) + unireader:showJumpHist() end) self.commands:add(KEY_J,MOD_SHIFT,"J", "rotate 10° clockwise", @@ -1897,15 +1995,13 @@ function UniReader:addAllCommands() unireader.bbox.enabled = true debug("bbox", unireader.pageno, unireader.bbox) unireader.globalzoommode = unireader.ZOOM_FIT_TO_CONTENT -- use bbox - showInfoMsgWithDelay( - "Manual crop setting saved.", 2000, 1) + showInfoMsgWithDelay("Manual crop setting saved.", 2000, 1) end) self.commands:add(KEY_Z,MOD_SHIFT,"Z", "reset crop", function(unireader) unireader.bbox[unireader.pageno] = nil; - showInfoMsgWithDelay( - "Manual crop setting removed.", 2000, 1) + showInfoMsgWithDelay("Manual crop setting removed.", 2000, 1) debug("bbox remove", unireader.pageno, unireader.bbox); end) self.commands:add(KEY_Z,MOD_ALT,"Z", @@ -1913,11 +2009,9 @@ function UniReader:addAllCommands() function(unireader) unireader.bbox.enabled = not unireader.bbox.enabled; if unireader.bbox.enabled then - showInfoMsgWithDelay( - "Manual crop enabled.", 2000, 1) + showInfoMsgWithDelay("Manual crop enabled.", 2000, 1) else - showInfoMsgWithDelay( - "Manual crop disabled.", 2000, 1) + showInfoMsgWithDelay("Manual crop disabled.", 2000, 1) end debug("bbox override", unireader.bbox.enabled); end)