From d00ee9b6de7fc4d3252c954d10df7bbc96524588 Mon Sep 17 00:00:00 2001 From: chrox Date: Sun, 17 Mar 2013 19:31:57 +0800 Subject: [PATCH 1/3] add fake tap input --- input.c | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) diff --git a/input.c b/input.c index cf4aa17f7..38b7d32dc 100644 --- a/input.c +++ b/input.c @@ -224,6 +224,76 @@ 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)); + } + 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 +425,7 @@ static const struct luaL_Reg input_func[] = { {"open", openInputDevice}, {"closeAll", closeInputDevices}, {"waitForEvent", waitForInput}, + {"fakeTapInput", fakeTapInput}, {NULL, NULL} }; From 819467df0b3b69fc37e97c673a2093ffb4c350e6 Mon Sep 17 00:00:00 2001 From: chrox Date: Sun, 17 Mar 2013 19:33:59 +0800 Subject: [PATCH 2/3] bugfix: hack swipe to unlock after going out of screensaver by feeding a fake tap at the bottom of the screen --- frontend/ui/device.lua | 11 +++++++++++ frontend/ui/inputevent.lua | 2 ++ reader.lua | 13 ++++++++++++- 3 files changed, 25 insertions(+), 1 deletion(-) 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/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 From 6cbb4ed6b4de74865c70e9dd40346e91401298bc Mon Sep 17 00:00:00 2001 From: chrox Date: Sun, 17 Mar 2013 19:50:37 +0800 Subject: [PATCH 3/3] close input dev after feeding --- input.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/input.c b/input.c index 38b7d32dc..083142403 100644 --- a/input.c +++ b/input.c @@ -288,6 +288,8 @@ static int fakeTapInput(lua_State *L) { ev.value = 0; write(inputfd, &ev, sizeof(ev)); } + ioctl(inputfd, EVIOCGRAB, 0); + close(inputfd); return 0; #else return 0;