mirror of
https://github.com/lihop/godot-xterm.git
synced 2024-11-14 22:30:26 +01:00
b83bf70b64
If gdnative libraries are missing from `addons/godot_xterm/native/bin`, they will be automatically downloaded from GitHub releases using the plugin version defined in `plugin.cfg`.
136 lines
4.2 KiB
GDScript
136 lines
4.2 KiB
GDScript
tool
|
|
extends EditorPlugin
|
|
|
|
const LIBS := [
|
|
"javascript.32.wasm",
|
|
"linux.32.so",
|
|
"linux.64.so",
|
|
"osx.64.dylib",
|
|
"windows.32.dll",
|
|
"windows.64.dll"
|
|
]
|
|
const LIB_DIR := "res://addons/godot_xterm/native/bin"
|
|
const ZIP_FILE := "%s/libgodot-xterm-release.zip" % LIB_DIR
|
|
|
|
const Unzipper := preload("./util/unzipper.gd")
|
|
|
|
signal _native_libs_checked
|
|
|
|
var pty_supported := OS.get_name() in ["X11", "Server", "OSX"]
|
|
var asciicast_import_plugin
|
|
var xrdb_import_plugin
|
|
var terminal_panel: Control
|
|
|
|
|
|
# Downloads release builds of native libraries from GitHub if available, otherwise
|
|
# you will need to compile them yourself.
|
|
func _download_native_libs():
|
|
var dir := Directory.new()
|
|
var skip := true
|
|
|
|
for lib in LIBS:
|
|
if not dir.file_exists("%s/libgodot-xterm.%s" % [LIB_DIR, lib]):
|
|
print("GodotXterm: Downloading native library libgodot-xterm.%s..." % lib)
|
|
skip = false
|
|
|
|
if skip:
|
|
emit_signal("_native_libs_checked")
|
|
return
|
|
|
|
var config_file := ConfigFile.new()
|
|
config_file.load("res://addons/godot_xterm/plugin.cfg")
|
|
|
|
var http_request := HTTPRequest.new()
|
|
add_child(http_request)
|
|
http_request.connect("request_completed", self, "_on_http_request_completed", [http_request])
|
|
http_request.download_file = ZIP_FILE
|
|
http_request.request(
|
|
(
|
|
"https://github.com/lihop/godot-xterm/releases/download/v%s/libgodot-xterm-release.zip"
|
|
% config_file.get_value("plugin", "version")
|
|
)
|
|
)
|
|
|
|
|
|
func _on_http_request_completed(
|
|
result: int,
|
|
response_code: int,
|
|
_headers: PoolStringArray,
|
|
_body: PoolByteArray,
|
|
http_request: HTTPRequest
|
|
):
|
|
http_request.queue_free()
|
|
var dir := Directory.new()
|
|
if result == OK and response_code == 200:
|
|
var unzipped := Unzipper.unzip(ZIP_FILE)
|
|
if unzipped.error != OK:
|
|
push_error("GodotXterm: Error unzipping file: %s" % ZIP_FILE)
|
|
else:
|
|
for path in unzipped.files:
|
|
var target := "%s/%s" % [LIB_DIR, path.get_file()]
|
|
if not dir.file_exists("%s/%s" % [LIB_DIR, path.get_file()]):
|
|
if dir.copy(path, target) == OK:
|
|
print("GodotXterm: Native library %s installed!" % path.get_file())
|
|
else:
|
|
push_error(
|
|
"GodotXterm: Error installing native library %s" % path.get_file()
|
|
)
|
|
dir.remove(path)
|
|
dir.remove("%s/libgodot-xterm-release" % LIB_DIR)
|
|
else:
|
|
push_warning(
|
|
"GodotXterm: Error downloading native libraries. Please compile them yourself."
|
|
)
|
|
dir.remove(ZIP_FILE)
|
|
push_warning("GodotXterm: Installed missing native libraries. A Godot restart may be required.")
|
|
emit_signal("_native_libs_checked")
|
|
|
|
|
|
func _enter_tree():
|
|
call_deferred("_download_native_libs")
|
|
yield(self, "_native_libs_checked")
|
|
|
|
asciicast_import_plugin = preload("./import_plugins/asciicast_import_plugin.gd").new()
|
|
add_import_plugin(asciicast_import_plugin)
|
|
|
|
xrdb_import_plugin = preload("./import_plugins/xrdb_import_plugin.gd").new()
|
|
add_import_plugin(xrdb_import_plugin)
|
|
|
|
var asciicast_script = preload("./resources/asciicast.gd")
|
|
add_custom_type("Asciicast", "Animation", asciicast_script, null)
|
|
|
|
var terminal_script = preload("./terminal.gd")
|
|
var terminal_icon = preload("./nodes/terminal/terminal_icon.svg")
|
|
add_custom_type("Terminal", "Control", terminal_script, terminal_icon)
|
|
|
|
if pty_supported:
|
|
var base_dir = get_script().resource_path.get_base_dir()
|
|
var pty_icon = load("%s/nodes/pty/pty_icon.svg" % base_dir)
|
|
var pty_script
|
|
match OS.get_name():
|
|
"X11", "Server", "OSX":
|
|
pty_script = load("%s/nodes/pty/pty.gd" % base_dir)
|
|
add_custom_type("PTY", "Node", pty_script, pty_icon)
|
|
var terminal_settings_script = preload("./editor_plugins/terminal/settings/terminal_settings.gd")
|
|
add_custom_type("TerminalSettings", "Resource", terminal_settings_script, null)
|
|
terminal_panel = preload("./editor_plugins/terminal/terminal_panel.tscn").instance()
|
|
terminal_panel.editor_plugin = self
|
|
terminal_panel.editor_interface = get_editor_interface()
|
|
add_control_to_bottom_panel(terminal_panel, "Terminal")
|
|
|
|
|
|
func _exit_tree():
|
|
remove_import_plugin(asciicast_import_plugin)
|
|
asciicast_import_plugin = null
|
|
|
|
remove_import_plugin(xrdb_import_plugin)
|
|
xrdb_import_plugin = null
|
|
|
|
remove_custom_type("Asciicast")
|
|
remove_custom_type("Terminal")
|
|
|
|
if pty_supported:
|
|
remove_custom_type("PTY")
|
|
remove_custom_type("TerminalSettings")
|
|
remove_control_from_bottom_panel(terminal_panel)
|
|
terminal_panel.free()
|