diff --git a/keys.lua b/keys.lua index a522900ef..f5c5acc37 100755 --- a/keys.lua +++ b/keys.lua @@ -1,18 +1,86 @@ --[[ -This file contains settings related to key codes + This file contains settings related to key codes + + Copyright (C) 2011 Hans-Werner Hilse + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + + + This file is based on include/keydefs.h from "launchpad" + application, which is + Copyright (C) 2010 Andy M. aka h1uke h1ukeguy @ gmail.com + and was licensed under the GPLv2 ]]-- -KEY_PAGEUP = 109 -- nonstandard -KEY_PAGEDOWN = 124 -- nonstandard -KEY_BACK = 91 -- nonstandard +KEY_1 = 2 +KEY_2 = 3 +KEY_3 = 4 +KEY_4 = 5 +KEY_5 = 6 +KEY_6 = 7 +KEY_7 = 8 +KEY_8 = 9 +KEY_9 = 10 +KEY_0 = 11 +KEY_Q = 16 +KEY_W = 17 +KEY_E = 18 +KEY_R = 19 +KEY_T = 20 +KEY_Y = 21 +KEY_U = 22 +KEY_I = 23 +KEY_O = 24 +KEY_P = 25 +KEY_A = 30 +KEY_S = 31 +KEY_D = 32 +KEY_F = 33 +KEY_G = 34 +KEY_H = 35 +KEY_J = 36 +KEY_K = 37 +KEY_L = 38 +KEY_DEL = 14 +KEY_Z = 44 +KEY_X = 45 +KEY_C = 46 +KEY_V = 47 +KEY_B = 48 +KEY_N = 49 +KEY_M = 50 +KEY_DOT = 52 +KEY_SLASH = 53 +KEY_ENTER = 28 +KEY_SHIFT = 42 +KEY_ALT = 56 +KEY_SPACE = 57 +KEY_AA = 90 +KEY_SYM = 94 +KEY_VPLUS = 115 +KEY_VMINUS = 114 +KEY_HOME = 98 +KEY_PGBCK = 109 +KEY_PGFWD = 124 KEY_MENU = 139 - --- DPad: -KEY_UP = 122 -- nonstandard -KEY_DOWN = 123 -- nonstandard -KEY_LEFT = 105 -KEY_RIGHT = 106 -KEY_BTN = 92 -- nonstandard +KEY_BACK = 91 +KEY_FW_LEFT = 105 +KEY_FW_RIGHT = 106 +KEY_FW_UP = 122 +KEY_FW_DOWN = 123 +KEY_FW_PRESS = 92 -- constants from EV_KEY = 1 @@ -21,16 +89,34 @@ EV_KEY = 1 EVENT_VALUE_KEY_PRESS = 1 EVENT_VALUE_KEY_REPEAT = 2 EVENT_VALUE_KEY_RELEASE = 0 - + +function set_k3_keycodes() + KEY_AA = 190 + KEY_SYM = 126 + KEY_HOME = 102 + KEY_BACK = 158 + KEY_PGFWD = 191 + KEY_LPGBCK = 193 + KEY_LPGFWD = 104 + KEY_VPLUS = 115 + KEY_VMINUS = 114 + KEY_FW_UP = 103 + KEY_FW_DOWN = 108 + KEY_FW_PRESS = 194 +end function set_emu_keycodes() - KEY_PAGEDOWN = 112 - KEY_PAGEUP = 117 + KEY_PGFWD = 117 + KEY_PGBCK = 112 KEY_BACK = 22 -- backspace KEY_MENU = 67 -- F1 - KEY_UP = 111 - KEY_DOWN = 116 - KEY_LEFT = 113 - KEY_RIGHT = 114 - KEY_BTN = 36 -- enter for now + KEY_FW_UP = 111 + KEY_FW_DOWN = 116 + KEY_FW_LEFT = 113 + KEY_FW_RIGHT = 114 + KEY_FW_PRESS = 36 -- enter for now + KEY_A = 38 + KEY_S = 39 + KEY_D = 40 + KEY_SHIFT = 50 end diff --git a/reader.lua b/reader.lua index 139a2c4a7..7ea5df51f 100755 --- a/reader.lua +++ b/reader.lua @@ -21,6 +21,16 @@ require "alt_getopt" require "keys" require "tilecache" +ZOOM_BY_VALUE = 0 +ZOOM_FIT_TO_PAGE = -1 +ZOOM_FIT_TO_PAGE_WIDTH = -2 +ZOOM_FIT_TO_PAGE_HEIGHT = -3 +ZOOM_FIT_TO_CONTENT = -4 +ZOOM_FIT_TO_CONTENT_WIDTH = -5 +ZOOM_FIT_TO_CONTENT_HEIGHT = -6 + +GAMMA_NO_GAMMA = -1.0 + -- option parsing: longopts = { password = "p", @@ -50,14 +60,21 @@ end rcount = 5 rcountmax = 5 -globalzoom = -1 -globalgamma = -1.0 +globalzoom = 1.0 +globalzoommode = ZOOM_FIT_TO_PAGE +globalgamma = GAMMA_NO_GAMMA + +fullwidth = 0 +fullheight = 0 + +shiftmode = false if optarg["d"] == "k3" then -- for now, the only difference is the additional input device input.open("/dev/input/event0") input.open("/dev/input/event1") input.open("/dev/input/event2") + set_k3_keycodes() elseif optarg["d"] == "emu" then input.open("") -- SDL key codes @@ -83,22 +100,53 @@ nulldc = pdf.newDC() function setzoom(page, cacheslot) local dc = pdf.newDC() local pwidth, pheight = page:getSize(nulldc) - - -- default zoom: fit to page - local zoom = width / pwidth local offset_x = 0 - local offset_y = (height - (zoom * pheight)) / 2 - if height / pheight < zoom then - zoom = height / pheight - offset_x = (width - (zoom * pwidth)) / 2 + local offset_y = 0 + + if globalzoommode == ZOOM_FIT_TO_PAGE then + globalzoom = width / pwidth + offset_x = 0 + offset_y = (height - (globalzoom * pheight)) / 2 + if height / pheight < globalzoom then + globalzoom = height / pheight + offset_x = (width - (globalzoom * pwidth)) / 2 + offset_y = 0 + end + elseif globalzoommode == ZOOM_FIT_TO_PAGE_WIDTH then + globalzoom = width / pwidth + offset_x = 0 + offset_y = (height - (globalzoom * pheight)) / 2 + elseif globalzoommode == ZOOM_FIT_TO_PAGE_HEIGHT then + globalzoom = height / pheight + offset_x = (width - (globalzoom * pwidth)) / 2 offset_y = 0 + elseif globalzoommode == ZOOM_FIT_TO_CONTENT then + local x0, y0, x1, y1 = page:getUsedBBox() + globalzoom = width / (x1 - x0) + offset_x = -1 * x0 * globalzoom + offset_y = -1 * y0 * globalzoom + (height - (globalzoom * (y1 - y0))) / 2 + if height / (y1 - y0) < globalzoom then + globalzoom = height / (y1 - y0) + offset_x = -1 * x0 * globalzoom + (width - (globalzoom * (x1 - x0))) / 2 + offset_y = -1 * y0 * globalzoom + end + elseif globalzoommode == ZOOM_FIT_TO_CONTENT_WIDTH then + local x0, y0, x1, y1 = page:getUsedBBox() + globalzoom = width / (x1 - x0) + offset_x = -1 * x0 * globalzoom + offset_y = -1 * y0 * globalzoom + (height - (globalzoom * (y1 - y0))) / 2 + elseif globalzoommode == ZOOM_FIT_TO_CONTENT_HEIGHT then + local x0, y0, x1, y1 = page:getUsedBBox() + globalzoom = height / (y1 - y0) + offset_x = -1 * x0 * globalzoom + (width - (globalzoom * (x1 - x0))) / 2 + offset_y = -1 * y0 * globalzoom end - - dc:setZoom(zoom) + dc:setZoom(globalzoom) dc:setOffset(offset_x, offset_y) + fullwidth, fullheight = page:getSize(dc) -- set gamma here, we don't have any other good place for this right now: - if globalgamma ~= -1.0 then + if globalgamma ~= GAMMA_NO_GAMMA then print("gamma correction: "..globalgamma) dc:setGamma(globalgamma) end @@ -106,7 +154,12 @@ function setzoom(page, cacheslot) end function show(no) - local slot = draworcache(no,globalzoom,0,0,width,height,globalgamma) + local slot + if globalzoommode ~= ZOOM_BY_VALUE then + slot = draworcache(no,globalzoommode,0,0,width,height,globalgamma) + else + slot = draworcache(no,globalzoom,0,0,width,height,globalgamma) + end fb:blitFullFrom(cache[slot].bb) if rcount == rcountmax then print("full refresh") @@ -128,7 +181,11 @@ function goto(no) show(no) if no < doc:getPages() then -- always pre-cache next page - draworcache(no+1,globalzoom,0,0,width,height,globalgamma) + if globalzoommode ~= ZOOM_BY_VALUE then + draworcache(no,globalzoommode,0,0,width,height,globalgamma) + else + draworcache(no,globalzoom,0,0,width,height,globalgamma) + end end end @@ -138,29 +195,71 @@ function modify_gamma(offset) end print("modify_gamma, gamma="..globalgamma.." offset="..offset) globalgamma = globalgamma + offset; - clearcache() goto(pageno) end +function setglobalzoommode(newzoommode) + if globalzoommode ~= newzoommode then + globalzoommode = newzoommode + goto(pageno) + end +end +function setglobalzoom(zoom) + if globalzoom ~= zoom then + globalzoommode = ZOOM_BY_VALUE + globalzoom = zoom + goto(pageno) + end +end function mainloop() while 1 do local ev = input.waitForEvent() if ev.type == EV_KEY and ev.value == EVENT_VALUE_KEY_PRESS then local secs, usecs = util.gettime() - if ev.code == KEY_PAGEUP then - goto(pageno + 1) - elseif ev.code == KEY_PAGEDOWN then - goto(pageno - 1) + if ev.code == KEY_SHIFT then + shiftmode = true + elseif ev.code == KEY_PGFWD then + if not shiftmode then + goto(pageno + 1) + else + setglobalzoom(globalzoom*1.25) + end + elseif ev.code == KEY_PGBCK then + if not shiftmode then + goto(pageno - 1) + else + setglobalzoom(globalzoom*0.8) + end elseif ev.code == KEY_BACK then return - elseif ev.code == KEY_UP then + elseif ev.code == KEY_FW_UP then modify_gamma( 0.2 ) - elseif ev.code == KEY_DOWN then + elseif ev.code == KEY_FW_DOWN then modify_gamma( -0.2 ) + elseif ev.code == KEY_A then + if shiftmode then + setglobalzoommode(ZOOM_FIT_TO_CONTENT) + else + setglobalzoommode(ZOOM_FIT_TO_PAGE) + end + elseif ev.code == KEY_S then + if shiftmode then + setglobalzoommode(ZOOM_FIT_TO_CONTENT_WIDTH) + else + setglobalzoommode(ZOOM_FIT_TO_PAGE_WIDTH) + end + elseif ev.code == KEY_D then + if shiftmode then + setglobalzoommode(ZOOM_FIT_TO_CONTENT_HEIGHT) + else + setglobalzoommode(ZOOM_FIT_TO_PAGE_HEIGHT) + end end local nsecs, nusecs = util.gettime() local dur = (nsecs - secs) * 1000000 + nusecs - usecs print("E: T="..ev.type.." V="..ev.value.." C="..ev.code.." DUR="..dur) + elseif ev.type == EV_KEY and ev.value == EVENT_VALUE_KEY_RELEASE and ev.code == KEY_SHIFT then + shiftmode = false end end end