95 lines
3.0 KiB
Lua
95 lines
3.0 KiB
Lua
-- SPDX-FileCopyrightText: 2017 Daniel Ratcliffe
|
|
--
|
|
-- SPDX-License-Identifier: LicenseRef-CCPL
|
|
|
|
--- @module term
|
|
|
|
local expect = dofile("rom/modules/main/cc/expect.lua").expect
|
|
|
|
local native = term.native and term.native() or term
|
|
local redirectTarget = native
|
|
|
|
local function wrap(_sFunction)
|
|
return function(...)
|
|
return redirectTarget[_sFunction](...)
|
|
end
|
|
end
|
|
|
|
local term = _ENV
|
|
|
|
--- Redirects terminal output to a monitor, a [`window`], or any other custom
|
|
-- terminal object. Once the redirect is performed, any calls to a "term"
|
|
-- function - or to a function that makes use of a term function, as [`print`] -
|
|
-- will instead operate with the new terminal object.
|
|
--
|
|
-- A "terminal object" is simply a table that contains functions with the same
|
|
-- names - and general features - as those found in the term table. For example,
|
|
-- a wrapped monitor is suitable.
|
|
--
|
|
-- The redirect can be undone by pointing back to the previous terminal object
|
|
-- (which this function returns whenever you switch).
|
|
--
|
|
-- @tparam Redirect target The terminal redirect the [`term`] API will draw to.
|
|
-- @treturn Redirect The previous redirect object, as returned by
|
|
-- [`term.current`].
|
|
-- @since 1.31
|
|
-- @usage
|
|
-- Redirect to a monitor on the right of the computer.
|
|
--
|
|
-- term.redirect(peripheral.wrap("right"))
|
|
term.redirect = function(target)
|
|
expect(1, target, "table")
|
|
if target == term or target == _G.term then
|
|
error("term is not a recommended redirect target, try term.current() instead", 2)
|
|
end
|
|
for k, v in pairs(native) do
|
|
if type(k) == "string" and type(v) == "function" then
|
|
if type(target[k]) ~= "function" then
|
|
target[k] = function()
|
|
error("Redirect object is missing method " .. k .. ".", 2)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
local oldRedirectTarget = redirectTarget
|
|
redirectTarget = target
|
|
return oldRedirectTarget
|
|
end
|
|
|
|
--- Returns the current terminal object of the computer.
|
|
--
|
|
-- @treturn Redirect The current terminal redirect
|
|
-- @since 1.6
|
|
-- @usage
|
|
-- Create a new [`window`] which draws to the current redirect target.
|
|
--
|
|
-- window.create(term.current(), 1, 1, 10, 10)
|
|
term.current = function()
|
|
return redirectTarget
|
|
end
|
|
|
|
--- Get the native terminal object of the current computer.
|
|
--
|
|
-- It is recommended you do not use this function unless you absolutely have
|
|
-- to. In a multitasked environment, [`term.native`] will _not_ be the current
|
|
-- terminal object, and so drawing may interfere with other programs.
|
|
--
|
|
-- @treturn Redirect The native terminal redirect.
|
|
-- @since 1.6
|
|
term.native = function()
|
|
return native
|
|
end
|
|
|
|
-- Some methods shouldn't go through redirects, so we move them to the main
|
|
-- term API.
|
|
for _, method in ipairs { "nativePaletteColor", "nativePaletteColour" } do
|
|
term[method] = native[method]
|
|
native[method] = nil
|
|
end
|
|
|
|
for k, v in pairs(native) do
|
|
if type(k) == "string" and type(v) == "function" and rawget(term, k) == nil then
|
|
term[k] = wrap(k)
|
|
end
|
|
end
|