diff --git a/frontend/ui/device.lua b/frontend/ui/device.lua index 9e63294f9..f75923bb3 100644 --- a/frontend/ui/device.lua +++ b/frontend/ui/device.lua @@ -1,6 +1,8 @@ Device = { screen_saver_mode = false, charging_mode = false, + survive_screen_saver = false, + touch_dev = nil, model = nil, } @@ -79,6 +81,14 @@ function Device:isTouchDevice() return (self.model == "KindlePaperWhite") or (self.model == "KindleTouch") or util.isEmulated() end +function Device:setTouchInputDev(dev) + self.touch_dev = dev +end + +function Device:getTouchInputDev() + return self.touch_dev +end + function Device:intoScreenSaver() --os.execute("echo 'screensaver in' >> /mnt/us/event_test.txt") if self.charging_mode == false and self.screen_saver_mode == false then @@ -102,6 +112,7 @@ function Device:outofScreenSaver() --os.execute("killall -stop cvm") Screen:restoreFromSavedBB() Screen:refresh(0) + self.survive_screen_saver = true end self.screen_saver_mode = false end diff --git a/frontend/ui/inputevent.lua b/frontend/ui/inputevent.lua index 5daec6c61..337a51950 100644 --- a/frontend/ui/inputevent.lua +++ b/frontend/ui/inputevent.lua @@ -275,6 +275,7 @@ function Input:init() local dev_mod = Device:getModel() if dev_mod ~= "KindleTouch" then -- event0 in KindleTouch is "WM8962 Beep Generator" (useless) + Device:setTouchInputDev("/dev/input/event0") input.open("/dev/input/event0") end if dev_mod ~= "KindleTouch" and dev_mod ~= "KindlePaperWhite" then @@ -285,6 +286,7 @@ function Input:init() if dev_mod == "KindlePaperWhite" then print("Auto-detected Kindle PaperWhite") elseif dev_mod == "KindleTouch" then + Device:setTouchInputDev("/dev/input/event3") input.open("/dev/input/event2") -- Home button input.open("/dev/input/event3") -- touchscreen -- KT does have one key! diff --git a/input.c b/input.c index cf4aa17f7..083142403 100644 --- a/input.c +++ b/input.c @@ -224,6 +224,78 @@ static int closeInputDevices(lua_State *L) { #endif } +static int fakeTapInput(lua_State *L) { +#ifndef EMULATE_READER + const char* inputdevice = luaL_checkstring(L, 1); + int x = luaL_checkint(L, 2); + int y = luaL_checkint(L, 3); + int i; + int inputfd = -1; + struct input_event ev; + inputfd = open(inputdevice, O_WRONLY | O_NDELAY); + if (inputfd == NULL) { + return luaL_error(L, "cannot open input device <%s>", inputdevice); + } + if(inputfd != -1) { + gettimeofday(&ev.time, NULL); + ev.type = 3; + ev.code = 57; + ev.value = 0; + write(inputfd, &ev, sizeof(ev)); + gettimeofday(&ev.time, NULL); + ev.type = 3; + ev.code = 53; + ev.value = x; + write(inputfd, &ev, sizeof(ev)); + gettimeofday(&ev.time, NULL); + ev.type = 3; + ev.code = 54; + ev.value = y; + write(inputfd, &ev, sizeof(ev)); + gettimeofday(&ev.time, NULL); + ev.type = 1; + ev.code = 330; + ev.value = 1; + write(inputfd, &ev, sizeof(ev)); + gettimeofday(&ev.time, NULL); + ev.type = 1; + ev.code = 325; + ev.value = 1; + write(inputfd, &ev, sizeof(ev)); + gettimeofday(&ev.time, NULL); + ev.type = 0; + ev.code = 0; + ev.value = 0; + write(inputfd, &ev, sizeof(ev)); + gettimeofday(&ev.time, NULL); + ev.type = 3; + ev.code = 57; + ev.value = -1; + write(inputfd, &ev, sizeof(ev)); + gettimeofday(&ev.time, NULL); + ev.type = 1; + ev.code = 330; + ev.value = 0; + write(inputfd, &ev, sizeof(ev)); + gettimeofday(&ev.time, NULL); + ev.type = 1; + ev.code = 325; + ev.value = 0; + write(inputfd, &ev, sizeof(ev)); + gettimeofday(&ev.time, NULL); + ev.type = 0; + ev.code = 0; + ev.value = 0; + write(inputfd, &ev, sizeof(ev)); + } + ioctl(inputfd, EVIOCGRAB, 0); + close(inputfd); + return 0; +#else + return 0; +#endif +} + static inline void set_event_table(lua_State *L, struct input_event input) { lua_newtable(L); lua_pushstring(L, "type"); @@ -355,6 +427,7 @@ static const struct luaL_Reg input_func[] = { {"open", openInputDevice}, {"closeAll", closeInputDevices}, {"waitForEvent", waitForInput}, + {"fakeTapInput", fakeTapInput}, {NULL, NULL} }; diff --git a/reader.lua b/reader.lua index 28755a2b0..439428c90 100755 --- a/reader.lua +++ b/reader.lua @@ -34,11 +34,22 @@ function exitReader() input.closeAll() - if util.isEmulated() ==0 then + if util.isEmulated() == 0 then if Device:isKindle3() or (Device:getModel() == "KindleDXG") then -- send double menu key press events to trigger screen refresh os.execute("echo 'send 139' > /proc/keypad;echo 'send 139' > /proc/keypad") end + if Device:isTouchDevice() and Device.survive_screen_saver then + -- hack the swipe to unlock screen + local dev = Device:getTouchInputDev() + if dev then + local width, height = Screen:getWidth(), Screen:getHeight() + input.fakeTapInput(dev, + math.min(width, height)/2, + math.max(width, height)-30 + ) + end + end end end