2
0
mirror of https://github.com/koreader/koreader synced 2024-10-31 21:20:20 +00:00
koreader/plugins/terminal.koplugin/main.lua
poire-z 850be52177
Keep some menus open when Tap or Hold (#4189)
TouchMenu: added options to menu items with the following defaults:
    keep_menu_open = false
    hold_keep_menu_open = true
So, default for Tap callback is to close menu, and for Hold callback
to keep menu open.
In both cases, provide the TouchMenu instance as the 1st argument to
the callback functions (instead of a refresh_menu_func I added in #3941)
so the callback can do more things, like closing, refreshing,
changing menu items text and re-ordering...

ReaderZooming: show symbol for default (like it was done for
ReaderFont, ReaderHyphenation...)
TextEditor plugin: update the previously opened files list in real
time, so the menu can be kept open and used as the TextEditor main
interface.
SSH plugin: keep menu open and update the Start/Stop state in real time
ReadTimer plugin: tried to do what feels right (but I don't use it)

Also remove forgotten cp in the move/paste file code
2018-09-04 23:55:58 +02:00

99 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"),
keep_menu_open = true,
callback = function()
self:start()
end,
}
end
return Terminal