mirror of
https://github.com/lihop/godot-xterm.git
synced 2024-11-13 22:10:25 +01:00
c262ea8113
Uses OS.execute to start socat with a tcp server on one end and shell on te other. Connects to the socat server using StreamPeerTCP. Doesn't support reszing and inherits 'dumb' for the TERM env var so doesn't work too well without updating TERM and resizing with stty.
52 lines
1.3 KiB
GDScript
52 lines
1.3 KiB
GDScript
extends "res://addons/godot_xterm/nodes/terminal/terminal.gd"
|
|
|
|
export (String) var exec_path := "bash"
|
|
export (String) var socat_path := "socat" # E.g. /usr/bin/socat
|
|
export (int) var port := 2023
|
|
export (bool) var verbose := false
|
|
|
|
var _timeout = 30
|
|
var _pid: int
|
|
var _stream := StreamPeerTCP.new()
|
|
|
|
|
|
func _ready():
|
|
var args = ["-v"] if verbose else []
|
|
args.append("tcp-l:%d,reuseaddr,fork" % port)
|
|
args.append("exec:%s,pty,setsid,setpgid,stderr,ctty" % exec_path)
|
|
|
|
_pid = OS.execute(socat_path, args, false)
|
|
|
|
|
|
func _process(delta):
|
|
match _stream.get_status():
|
|
StreamPeerTCP.STATUS_NONE, StreamPeerTCP.STATUS_CONNECTING:
|
|
_timeout -= 1
|
|
if _timeout < 1:
|
|
_error("Timeout: could not connect to socat")
|
|
|
|
if not _stream.is_connected_to_host():
|
|
if _stream.connect_to_host("127.0.0.1", port) != OK:
|
|
_error("Could not connect to socat")
|
|
|
|
StreamPeerTCP.STATUS_CONNECTED:
|
|
var avail = _stream.get_available_bytes()
|
|
var data = PoolByteArray()
|
|
for i in range(avail):
|
|
data.append(_stream.get_u8())
|
|
call_deferred("write", data)
|
|
|
|
|
|
func _on_Terminal_data_sent(data):
|
|
if _stream.get_status() == StreamPeerTCP.STATUS_CONNECTED:
|
|
_stream.put_data(data)
|
|
|
|
|
|
func _error(message):
|
|
push_error(message)
|
|
set_process(false)
|
|
|
|
|
|
func _exit_tree():
|
|
if OS.kill(_pid) != OK:
|
|
push_error("Failed to kill socat")
|