mirror of
https://github.com/koreader/koreader.git
synced 2025-08-10 00:52:38 +00:00
This is a major overhaul of the hardware abstraction layer. A few notes: General platform distinction happens in frontend/device.lua which will delegate everything else to frontend/device/<platform_name>/device.lua which should extend frontend/device/generic/device.lua Screen handling is implemented in frontend/device/screen.lua which includes the *functionality* to support device specifics. Actually setting up the device specific functionality, however, is done in the device specific setup code in the relevant device.lua file. The same goes for input handling.
65 lines
1.9 KiB
Lua
65 lines
1.9 KiB
Lua
local InputContainer = require("ui/widget/container/inputcontainer")
|
|
local Screen = require("device").screen
|
|
local Geom = require("ui/geometry")
|
|
local Device = require("device")
|
|
local Event = require("ui/event")
|
|
local GestureRange = require("ui/gesturerange")
|
|
local _ = require("gettext")
|
|
|
|
local ReaderRotation = InputContainer:new{
|
|
ROTATE_ANGLE_THRESHOLD = 15,
|
|
current_rotation = 0
|
|
}
|
|
|
|
function ReaderRotation:init()
|
|
if Device:hasKeyboard() then
|
|
self.key_events = {
|
|
-- these will all generate the same event, just with different arguments
|
|
RotateLeft = {
|
|
{"J"},
|
|
doc = "rotate left by 90 degrees",
|
|
event = "Rotate", args = -90 },
|
|
RotateRight = {
|
|
{"K"},
|
|
doc = "rotate right by 90 degrees",
|
|
event = "Rotate", args = 90 },
|
|
}
|
|
end
|
|
if Device:isTouchDevice() then
|
|
self.ges_events = {
|
|
RotateGes = {
|
|
GestureRange:new{
|
|
ges = "rotate",
|
|
range = Geom:new{
|
|
x = 0, y = 0,
|
|
w = Screen:getWidth(),
|
|
h = Screen:getHeight(),
|
|
},
|
|
rate = 0.3
|
|
}
|
|
},
|
|
}
|
|
end
|
|
end
|
|
|
|
-- TODO: reset rotation on new document, maybe on new page?
|
|
|
|
function ReaderRotation:onRotate(rotate_by)
|
|
self.current_rotation = (self.current_rotation + rotate_by) % 360
|
|
self.ui:handleEvent(Event:new("RotationUpdate", self.current_rotation))
|
|
return true
|
|
end
|
|
|
|
function ReaderRotation:onRotateGes(arg, ges)
|
|
if ges.angle and ges.angle > self.ROTATE_ANGLE_THRESHOLD then
|
|
if Screen:getScreenMode() == "portrait" then
|
|
self.ui:handleEvent(Event:new("SetScreenMode", "landscape"))
|
|
else
|
|
self.ui:handleEvent(Event:new("SetScreenMode", "portrait"))
|
|
end
|
|
end
|
|
return true
|
|
end
|
|
|
|
return ReaderRotation
|