
function printUsage()
	print( "Usage: monitor <side> <program> <arguments>" )
	return
end

local tArgs = { ... }
if #tArgs < 2 then
	printUsage()
	return
end

local sSide = tArgs[1]
if peripheral.getType( sSide ) ~= "monitor" then
	print( "No monitor on "..sSide.." side" )
	return
end

local sProgram = tArgs[2]
local sPath = shell.resolveProgram( sProgram )
if sPath == nil then
	print( "No such program: "..sProgram )
	return
end

print( "Running "..sProgram.." on "..sSide.." monitor" )

local monitor = peripheral.wrap( sSide )
term.redirect( monitor )

local function runProgram(...)
    shell.run( sProgram, select( 3, ... ) )
end

local co = coroutine.create(runProgram, ...)

local event = {}
local tFilter = {}

while true do
    if event[1] == "monitor_touch" and event[2] == sSide then
        os.queueEvent( "mouse_click", 1, unpack( event, 3 ) )
    end
    local ok, param = coroutine.resume( co, unpack(event) )
    if not ok then
        term.restore()
        error(param)
    else
        tFilter = param
    end
    
    if coroutine.status(co) == "dead" then
        break
    end
    
    event = { os.pullEventRaw() }
end

term.restore()
