diff --git a/frontend/document/credocument.lua b/frontend/document/credocument.lua index 1697fc0e8..7ea9f91d2 100644 --- a/frontend/document/credocument.lua +++ b/frontend/document/credocument.lua @@ -34,7 +34,7 @@ function CreDocument:engineInit() if _v ~= "Dingbats.cff" and _v ~= "StandardSymL.cff" then local ok, err = pcall(cre.registerFont, Font.fontdir..'/'.._v) if not ok then - Debug(err) + DEBUG(err) end end end diff --git a/frontend/document/document.lua b/frontend/document/document.lua index f9ed27091..2dee7dfde 100644 --- a/frontend/document/document.lua +++ b/frontend/document/document.lua @@ -203,7 +203,7 @@ end function Document:drawCurrentView(target, x, y, rect, pos) self._document:gotoPos(pos) tile_bb = Blitbuffer.new(rect.w, rect.h) - self._document:drawCurrentView(tile_bb) + self._document:drawCurrentPage(tile_bb) target:blitFrom(tile_bb, x, y, 0, 0, rect.w, rect.h) end diff --git a/input.c b/input.c index ca81569d5..245abd483 100644 --- a/input.c +++ b/input.c @@ -56,7 +56,7 @@ void slider_handler(int sig) } } #else -pid_t emu_event_pid = -1; +int is_in_touch = 0; static inline void genEmuEvent(lua_State *L, int fd, int type, int code, int value) { struct input_event input; @@ -224,11 +224,34 @@ static int closeInputDevices(lua_State *L) { #endif } +static inline void set_event_table(lua_State *L, struct input_event input) { + lua_newtable(L); + lua_pushstring(L, "type"); + lua_pushinteger(L, (int) input.type); + lua_settable(L, -3); + lua_pushstring(L, "code"); + lua_pushinteger(L, (int) input.code); + lua_settable(L, -3); + lua_pushstring(L, "value"); + lua_pushinteger(L, (int) input.value); + lua_settable(L, -3); + + lua_pushstring(L, "time"); + lua_newtable(L); + lua_pushstring(L, "sec"); + lua_pushinteger(L, (int) input.time.tv_sec); + lua_settable(L, -3); + lua_pushstring(L, "usec"); + lua_pushinteger(L, (int) input.time.tv_usec); + lua_settable(L, -3); + lua_settable(L, -3); +} + static int waitForInput(lua_State *L) { struct input_event input; int n; -#ifndef EMULATE_READER int usecs = luaL_optint(L, 1, -1); // we check for <0 later +#ifndef EMULATE_READER fd_set fds; struct timeval timeout; int i, num, nfds; @@ -259,16 +282,7 @@ static int waitForInput(lua_State *L) { if(inputfds[i] != -1 && FD_ISSET(inputfds[i], &fds)) { n = read(inputfds[i], &input, sizeof(struct input_event)); if(n == sizeof(struct input_event)) { - lua_newtable(L); - lua_pushstring(L, "type"); - lua_pushinteger(L, (int) input.type); - lua_settable(L, -3); - lua_pushstring(L, "code"); - lua_pushinteger(L, (int) input.code); - lua_settable(L, -3); - lua_pushstring(L, "value"); - lua_pushinteger(L, (int) input.value); - lua_settable(L, -3); + set_event_table(L, input); return 1; } } @@ -280,20 +294,21 @@ static int waitForInput(lua_State *L) { /* so far we only use inputfds[0] in emu mode */ n = read(inputfds[0], &input, sizeof(struct input_event)); if(n == sizeof(struct input_event)) { - lua_newtable(L); - lua_pushstring(L, "type"); - lua_pushinteger(L, (int) input.type); - lua_settable(L, -3); - lua_pushstring(L, "code"); - lua_pushinteger(L, (int) input.code); - lua_settable(L, -3); - lua_pushstring(L, "value"); - lua_pushinteger(L, (int) input.value); - lua_settable(L, -3); + set_event_table(L, input); return 1; } - SDL_WaitEvent(&event); + int ticks = SDL_GetTicks(); + if (usecs < 0) + SDL_WaitEvent(&event); + else { + while (SDL_GetTicks()-ticks <= usecs/1000) { + if (SDL_PollEvent(&event)) break; + SDL_Delay(10); + } + if (SDL_GetTicks()-ticks > usecs/1000) + return luaL_error(L, "Waiting for input failed: timeout\n"); + } switch(event.type) { case SDL_KEYDOWN: genEmuEvent(L, inputfds[0], EV_KEY, event.key.keysym.scancode, 1); @@ -302,20 +317,26 @@ static int waitForInput(lua_State *L) { genEmuEvent(L, inputfds[0], EV_KEY, event.key.keysym.scancode, 0); break; case SDL_MOUSEMOTION: - /* ignore move motion here, we might use it for other - * gesture in future. */ - /*printf("Mouse moved by %d,%d to (%d,%d)\n", */ - /*event.motion.xrel, event.motion.yrel,*/ - /*event.motion.x, event.motion.y);*/ + if (is_in_touch) { + if (event.motion.xrel != 0) + genEmuEvent(L, inputfds[0], EV_ABS, ABS_MT_POSITION_X, event.button.x); + if (event.motion.yrel != 0) + genEmuEvent(L, inputfds[0], EV_ABS, ABS_MT_POSITION_Y, event.button.y); + genEmuEvent(L, inputfds[0], EV_SYN, SYN_REPORT, 0); + } + break; + case SDL_MOUSEBUTTONUP: + is_in_touch = 0; + genEmuEvent(L, inputfds[0], EV_ABS, ABS_MT_TRACKING_ID, -1); + genEmuEvent(L, inputfds[0], EV_SYN, SYN_REPORT, 0); break; case SDL_MOUSEBUTTONDOWN: /* use mouse click to simulate single tap */ + is_in_touch = 1; genEmuEvent(L, inputfds[0], EV_ABS, ABS_MT_TRACKING_ID, 0); genEmuEvent(L, inputfds[0], EV_ABS, ABS_MT_POSITION_X, event.button.x); genEmuEvent(L, inputfds[0], EV_ABS, ABS_MT_POSITION_Y, event.button.y); genEmuEvent(L, inputfds[0], EV_SYN, SYN_REPORT, 0); - genEmuEvent(L, inputfds[0], EV_ABS, ABS_MT_TRACKING_ID, -1); - genEmuEvent(L, inputfds[0], EV_SYN, SYN_REPORT, 0); /*printf("Mouse button %d pressed at (%d,%d)\n",*/ /*event.button.button, event.button.x, event.button.y);*/ break;