diff --git a/filechooser.lua b/filechooser.lua index e96939035..82f821fbc 100644 --- a/filechooser.lua +++ b/filechooser.lua @@ -164,7 +164,7 @@ function FileChooser:choose(ypos, height) pagedirty = false end - local ev = input.waitForEvent() + local ev = input.saveWaitForEvent() --print("key code:"..ev.code) ev.code = adjustKeyEvents(ev) if ev.type == EV_KEY and ev.value == EVENT_VALUE_KEY_PRESS then diff --git a/filesearcher.lua b/filesearcher.lua index efc6e2650..c0426029c 100644 --- a/filesearcher.lua +++ b/filesearcher.lua @@ -289,7 +289,7 @@ function FileSearcher:choose(keywords) self.pagedirty = false end - local ev = input.waitForEvent() + local ev = input.saveWaitForEvent() ev.code = adjustKeyEvents(ev) if ev.type == EV_KEY and ev.value == EVENT_VALUE_KEY_PRESS then keydef = Keydef:new(ev.code, getKeyModifier()) diff --git a/helppage.lua b/helppage.lua index 25b9b0a9d..25b475521 100644 --- a/helppage.lua +++ b/helppage.lua @@ -77,7 +77,7 @@ function HelpPage:show(ypos, height, commands) pagedirty = false end - local ev = input.waitForEvent() + local ev = input.saveWaitForEvent() --print("key code:"..ev.code) ev.code = adjustKeyEvents(ev) if ev.type == EV_KEY and ev.value == EVENT_VALUE_KEY_PRESS then diff --git a/inputbox.lua b/inputbox.lua index c26b9e20f..ed581899b 100644 --- a/inputbox.lua +++ b/inputbox.lua @@ -163,7 +163,7 @@ function InputBox:input(ypos, height, title, d_text) fb:refresh(1, 20, ypos, w, h) while true do - local ev = input.waitForEvent() + local ev = input.saveWaitForEvent() ev.code = adjustKeyEvents(ev) if ev.type == EV_KEY and ev.value == EVENT_VALUE_KEY_PRESS then keydef = Keydef:new(ev.code, getKeyModifier()) diff --git a/keys.lua b/keys.lua index 0c155282e..a389bb085 100644 --- a/keys.lua +++ b/keys.lua @@ -254,3 +254,22 @@ function adjustKeyEvents(ev) print("# Unrecognizable rotation mode "..Screen.cur_rotation_mode.."!") return nil end + +-- wrapper for input.waitForEvents that will retry for some cases +function input.saveWaitForEvent(timeout) + local retry = true + while retry do + local ok, ev = pcall(input.waitForEvent, timeout) + if not ok then + print("got error waiting for events:", ev) + if ev == "Waiting for input failed: 4" then + -- EINTR, we got interrupted. Try and restart + retry = true + else + retry = false + end + else + return ev + end + end +end diff --git a/selectmenu.lua b/selectmenu.lua index e32297195..da6f609bd 100644 --- a/selectmenu.lua +++ b/selectmenu.lua @@ -318,7 +318,7 @@ function SelectMenu:choose(ypos, height) self.pagedirty = false end - local ev = input.waitForEvent() + local ev = input.saveWaitForEvent() ev.code = adjustKeyEvents(ev) if ev.type == EV_KEY and ev.value == EVENT_VALUE_KEY_PRESS then keydef = Keydef:new(ev.code, getKeyModifier()) diff --git a/unireader.lua b/unireader.lua index e375f8986..f95ebe275 100644 --- a/unireader.lua +++ b/unireader.lua @@ -508,7 +508,7 @@ function UniReader:startHighLightMode() -- first use cursor to place start pos for highlight while running do - local ev = input.waitForEvent() + local ev = input.saveWaitForEvent() ev.code = adjustKeyEvents(ev) if ev.type == EV_KEY and ev.value == EVENT_VALUE_KEY_PRESS then if ev.code == KEY_FW_LEFT and not is_meet_start then @@ -727,7 +727,7 @@ function UniReader:startHighLightMode() -- go into highlight mode running = true while running do - local ev = input.waitForEvent() + local ev = input.saveWaitForEvent() ev.code = adjustKeyEvents(ev) if ev.type == EV_KEY and ev.value == EVENT_VALUE_KEY_PRESS then if ev.code == KEY_FW_LEFT then @@ -1602,7 +1602,7 @@ function UniReader:showMenu() fb:refresh(1) while 1 do - local ev = input.waitForEvent() + local ev = input.saceWaitForEvent() ev.code = adjustKeyEvents(ev) if ev.type == EV_KEY and ev.value == EVENT_VALUE_KEY_PRESS then if ev.code == KEY_BACK or ev.code == KEY_MENU then @@ -1627,7 +1627,7 @@ end function UniReader:inputLoop() local keep_running = true while 1 do - local ev = input.waitForEvent() + local ev = input.saveWaitForEvent() ev.code = adjustKeyEvents(ev) if ev.type == EV_KEY and ev.value == EVENT_VALUE_KEY_PRESS then local secs, usecs = util.gettime()