mirror of
https://github.com/koreader/koreader
synced 2024-10-31 21:20:20 +00:00
e502bf04d3
* [VirtualKeyboard] Add support for keynaviguation Also rename the variable "layout" to "keyboard_layout" because conflict with the layout from the focusmanager * Make the goto dialog compatible with key naviguation My solution is to change the order of the widget. The last one will the virtualkeybard so it catch all the keybinding, and below it, make the dialog "is_always_active = true" so it can receive touch event. * Correctly show the virtual keyboard on dpad devices * change the order to call the virtualKeyboard so it end up on top * Handle the multi input dialog * Support reopening the virtualKeyboard by the Press key * add check focusmanager * Fix https://github.com/koreader/koreader/issues/3797 * MultiInputDialog : Now work on non touch-device * Set the virtualkeyboard to be a modal widget * Fix the layout in multiinputwidget * Fix for the various combination of hasKeys,hasDpad,isTouchDevice * [Focusmanager] Better handling of malformed layout
98 lines
2.8 KiB
Lua
98 lines
2.8 KiB
Lua
local DataStorage = require("datastorage")
|
|
local Font = require("ui/font")
|
|
local InfoMessage = require("ui/widget/infomessage")
|
|
local InputDialog = require("ui/widget/inputdialog")
|
|
local UIManager = require("ui/uimanager")
|
|
local WidgetContainer = require("ui/widget/container/widgetcontainer")
|
|
local logger = require("logger")
|
|
local util = require("ffi/util")
|
|
local _ = require("gettext")
|
|
local Screen = require("device").screen
|
|
|
|
local Terminal = WidgetContainer:new{
|
|
name = "terminal",
|
|
dump_file = util.realpath(DataStorage:getDataDir()) .. "/terminal_output.txt",
|
|
command = "",
|
|
}
|
|
|
|
function Terminal:init()
|
|
self.ui.menu:registerToMainMenu(self)
|
|
end
|
|
|
|
function Terminal:start()
|
|
self.input = InputDialog:new{
|
|
title = _("Enter a command and press \"Execute\""),
|
|
input = self.command,
|
|
text_height = Screen:getHeight() * 0.4,
|
|
input_type = "string",
|
|
buttons = {{{
|
|
text = _("Cancel"),
|
|
callback = function()
|
|
UIManager:close(self.input)
|
|
end,
|
|
}, {
|
|
text = _("Execute"),
|
|
is_enter_default = true,
|
|
callback = function()
|
|
UIManager:close(self.input)
|
|
self:execute()
|
|
end,
|
|
}}},
|
|
}
|
|
UIManager:show(self.input)
|
|
self.input:onShowKeyboard()
|
|
end
|
|
|
|
function Terminal:execute()
|
|
self.command = self.input:getInputText()
|
|
UIManager:show(InfoMessage:new{
|
|
text = _("Executing…"),
|
|
timeout = 0.1,
|
|
})
|
|
UIManager:forceRePaint()
|
|
local std_out = io.popen(self.command)
|
|
local entries = { self.command }
|
|
if std_out then
|
|
while true do
|
|
local line = std_out:read()
|
|
if line == nil then break end
|
|
table.insert(entries, line)
|
|
end
|
|
std_out:close()
|
|
else
|
|
table.insert(entries, _("Failed to execute command."))
|
|
end
|
|
self:dump(entries)
|
|
table.insert(entries, _("Output will also be written to"))
|
|
table.insert(entries, self.dump_file)
|
|
UIManager:show(InfoMessage:new{
|
|
cface = Font:getFace("xx_smallinfofont"),
|
|
text = _("Command output\n") .. table.concat(entries, "\n"),
|
|
show_icon = false,
|
|
width = Screen:getWidth() * 0.8,
|
|
height = Screen:getHeight() * 0.8,
|
|
})
|
|
end
|
|
|
|
function Terminal:dump(entries)
|
|
local content = table.concat(entries, "\n")
|
|
local file = io.open(self.dump_file, "w")
|
|
if file then
|
|
file:write(content)
|
|
file:close()
|
|
else
|
|
logger.warn("Failed to dump terminal output " .. content .. " to " .. self.dump_file)
|
|
end
|
|
end
|
|
|
|
function Terminal:addToMainMenu(menu_items)
|
|
menu_items.terminal = {
|
|
text = _("Terminal emulator"),
|
|
callback = function()
|
|
self:start()
|
|
end,
|
|
}
|
|
end
|
|
|
|
return Terminal
|