diff --git a/.gitignore b/.gitignore index 79d3eb4..47ae8a9 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,3 @@ - # Godot-specific ignores .import/ export.cfg @@ -7,3 +6,6 @@ export_presets.cfg # Mono-specific ignores .mono/ data_*/ + +# Python-specific ignores +.venv diff --git a/addons/godot_xterm/import_plugins/asciicast_import_plugin.gd b/addons/godot_xterm/import_plugins/asciicast_import_plugin.gd index 98897fd..b206311 100644 --- a/addons/godot_xterm/import_plugins/asciicast_import_plugin.gd +++ b/addons/godot_xterm/import_plugins/asciicast_import_plugin.gd @@ -37,40 +37,34 @@ func import(source_file, save_path, options, r_platform_variant, r_gen_files): var err = file.open(source_file, File.READ) if err != OK: return err - + var header = file.get_line() - + var asciicast = Asciicast.new() - + asciicast.add_track(Animation.TYPE_METHOD, 0) asciicast.track_set_path(0, ".") - - var frame = { - "time": 0.0, - "data": { - "method": "write", - "args": [PoolByteArray()] - } - } - + + var frame = {"time": 0.0, "data": {"method": "write", "args": [PoolByteArray()]}} + while not file.eof_reached(): var line = file.get_line() if line == "": continue - + var p = JSON.parse(line) if typeof(p.result) != TYPE_ARRAY: continue - + var event_type: String = p.result[1] var event_data: PoolByteArray = p.result[2].to_utf8() - + # Asciicast recordings have a resolution of 0.000001, however animation # track keys only have a resolution of 0.01, therefore we must combine # events that would occur in the same keyframe, otherwise only the last # event is inserted and the previous events are overwritten. var time = stepify(p.result[0], 0.01) - + if event_type == "o": if time == frame.time: asciicast.track_remove_key_at_position(0, time) @@ -78,9 +72,9 @@ func import(source_file, save_path, options, r_platform_variant, r_gen_files): else: frame.time = time frame.data.args = [event_data] - + asciicast.track_insert_key(0, frame.time, frame.data) - + asciicast.length = frame.time - + return ResourceSaver.save("%s.%s" % [save_path, get_save_extension()], asciicast) diff --git a/addons/godot_xterm/plugin.gd b/addons/godot_xterm/plugin.gd index 6824502..62e4338 100644 --- a/addons/godot_xterm/plugin.gd +++ b/addons/godot_xterm/plugin.gd @@ -1,21 +1,20 @@ tool extends EditorPlugin - var asciicast_import_plugin func _enter_tree(): asciicast_import_plugin = preload("res://addons/godot_xterm/import_plugins/asciicast_import_plugin.gd").new() add_import_plugin(asciicast_import_plugin) - + var asciicast_script = preload("res://addons/godot_xterm/resources/asciicast.gd") add_custom_type("Asciicast", "Animation", asciicast_script, null) - + var terminal_script = preload("res://addons/godot_xterm/nodes/terminal/terminal.gdns") var terminal_icon = preload("res://addons/godot_xterm/nodes/terminal/terminal_icon.svg") add_custom_type("Terminal", "Control", terminal_script, terminal_icon) - + var pseudoterminal_script = preload("res://addons/godot_xterm/nodes/pseudoterminal/pseudoterminal.gdns") var pseudoterminal_icon = preload("res://addons/godot_xterm/nodes/pseudoterminal/pseudoterminal_icon.svg") add_custom_type("Pseudoterminal", "Node", pseudoterminal_script, pseudoterminal_icon) @@ -24,7 +23,7 @@ func _enter_tree(): func _exit_tree(): remove_import_plugin(asciicast_import_plugin) asciicast_import_plugin = null - + remove_custom_type("Asciicast") remove_custom_type("Terminal") remove_custom_type("Psuedoterminal") diff --git a/addons/godot_xterm/resources/asciicast.gd b/addons/godot_xterm/resources/asciicast.gd index aa6b41e..7cc1a8b 100644 --- a/addons/godot_xterm/resources/asciicast.gd +++ b/addons/godot_xterm/resources/asciicast.gd @@ -1,14 +1,13 @@ extends Animation - signal data_written(data) signal data_read(data) -export(int) var version: int = 2 +export (int) var version: int = 2 # Initial terminal width (number of columns). -export(int) var width: int +export (int) var width: int # Initial terminal height (number of rows). -export(int) var height: int +export (int) var height: int func get_class() -> String: @@ -20,4 +19,4 @@ func is_class(name) -> bool: func _init(): - step = 0.01 # Parent override. + step = 0.01 # Parent override. diff --git a/addons/godot_xterm/themes/default_dark.theme b/addons/godot_xterm/themes/default_dark.theme index 81e2610..b4feff3 100644 Binary files a/addons/godot_xterm/themes/default_dark.theme and b/addons/godot_xterm/themes/default_dark.theme differ diff --git a/addons/godot_xterm/util/tput.gd b/addons/godot_xterm/util/tput.gd index e3bb8e5..f9f3f74 100644 --- a/addons/godot_xterm/util/tput.gd +++ b/addons/godot_xterm/util/tput.gd @@ -11,7 +11,6 @@ const CURSOR_LEFT = "\u001b[D" const DEFAULT_FOREGROUND_COLOR = "\u001b[0m" - var terminal @@ -24,12 +23,13 @@ func write_string(string: String, color: Color = Color.white) -> void: if color: var fg = "\u001b[38;2;%d;%d;%dm" % [color.r8, color.g8, color.b8] terminal.write(fg.to_utf8()) - + terminal.write(string.to_utf8()) - + # Reset color back to default. terminal.write("\u001b[0m".to_utf8()) + # tput_* functions based on the tput command. # See: https://man7.org/linux/man-pages/man1/tput.1.html for more info. diff --git a/examples/asciicast/asciicast.gd b/examples/asciicast/asciicast.gd index 9ded643..b3166a8 100644 --- a/examples/asciicast/asciicast.gd +++ b/examples/asciicast/asciicast.gd @@ -5,7 +5,7 @@ extends Container const ESCAPE = 27 const BACKSPACE = 8 -const BEEP = 7 +const BEEP = 7 const SPACE = 32 const LEFT_BRACKET = 91 const ENTER = 10 @@ -13,6 +13,7 @@ const BACKSPACE_ALT = 127 onready var viewport = get_viewport() + func _ready(): viewport.connect("size_changed", self, "_resize") _resize() @@ -24,9 +25,9 @@ func _input(event): if event is InputEventKey and event.pressed: var data = PoolByteArray([]) accept_event() - + # TODO: Handle more of these. - if (event.control and event.scancode == KEY_C): + if event.control and event.scancode == KEY_C: data.append(3) elif event.unicode: data.append(event.unicode) diff --git a/examples/menu/menu.gd b/examples/menu/menu.gd index ecba11c..3c7f084 100644 --- a/examples/menu/menu.gd +++ b/examples/menu/menu.gd @@ -17,9 +17,9 @@ const TITLE = """ const TITLE_WIDTH = 42 var menu_items := [ - { "name": "Asciicast", "scene": preload("../asciicast/asciicast.tscn") }, - { "name": "Terminal", "scene": preload("../terminal/terminal.tscn") }, - { "name": "Exit"} + {"name": "Asciicast", "scene": preload("../asciicast/asciicast.tscn")}, + {"name": "Terminal", "scene": preload("../terminal/terminal.tscn")}, + {"name": "Exit"} ] var selected_index := 0 @@ -42,7 +42,7 @@ func draw_all(_size = Vector2.ZERO): offset = int(floor(($Terminal.cols / 2.0) - (TITLE_WIDTH / 2.0))) tput.reset() row = 5 - tput.civis() # Hide the cursor. + tput.civis() # Hide the cursor. draw_title() draw_menu() tput.sgr0() @@ -51,55 +51,54 @@ func draw_all(_size = Vector2.ZERO): func draw_title(): tput.cup(row, 0) - + for line in TITLE.split("\r"): row += 1 tput.cup(row, offset) $Terminal.write(line) - + # Get the plugin version from the plugin's config file. var config = ConfigFile.new() var err = config.load("res://addons/godot_xterm/plugin.cfg") if err == OK: $Terminal.write("\n") - $Terminal.write("Version: %s" % config.get_value("plugin", "version", - "unknown")) + $Terminal.write("Version: %s" % config.get_value("plugin", "version", "unknown")) row += 2 func draw_menu(): if not menu_start_row: menu_start_row = row + 1 - + row = menu_start_row - + var col_offset: int - + for i in range(menu_items.size()): row += 1 var item = menu_items[i] - + if not col_offset: col_offset = int(floor(($Terminal.cols / 2) - (item.name.length() / 2))) - + tput.cup(row, offset) - + if selected_index == i: tput.setab(Color("#FF7500")) tput.setaf(Color.black) - + $Terminal.write("%s. %s" % [i + 1, item.name]) - + if selected_index == i: tput.sgr0() func _on_Terminal_key_pressed(data: String, event: InputEventKey) -> void: - match(data): - TPut.CURSOR_UP: # Up arrow key + match data: + TPut.CURSOR_UP: # Up arrow key selected_index = int(clamp(selected_index - 1, 0, menu_items.size() - 1)) draw_menu() - TPut.CURSOR_DOWN: # Down arrow key + TPut.CURSOR_DOWN: # Down arrow key selected_index = int(clamp(selected_index + 1, 0, menu_items.size() - 1)) draw_menu() "1": @@ -111,17 +110,16 @@ func _on_Terminal_key_pressed(data: String, event: InputEventKey) -> void: "3": selected_index = 2 draw_menu() - + # We can also match against the raw InputEventKey. if event.scancode == KEY_ENTER: var item = menu_items[selected_index] - + match item.name: "Asciicast": var scene = item.scene.instance() var animation_player: AnimationPlayer = scene.get_node("AnimationPlayer") - scene.connect("key_pressed", self, "_on_Asciicast_key_pressed", - [animation_player]) + scene.connect("key_pressed", self, "_on_Asciicast_key_pressed", [animation_player]) get_tree().get_root().add_child(scene) visible = false scene.grab_focus() @@ -132,9 +130,15 @@ func _on_Terminal_key_pressed(data: String, event: InputEventKey) -> void: scene.queue_free() "Terminal": if OS.get_name() == "Windows": - return OS.call_deferred("alert", "Psuedoterminal node currently" + return OS.call_deferred( + "alert", + ( + "Psuedoterminal node currently" + " uses pty.h but needs to use either winpty or conpty" - + " to work on Windows.", "Terminal not Supported on Windows") + + " to work on Windows." + ), + "Terminal not Supported on Windows" + ) var scene = item.scene.instance() var pty = scene.get_node("Pseudoterminal") get_tree().get_root().add_child(scene) @@ -148,7 +152,8 @@ func _on_Terminal_key_pressed(data: String, event: InputEventKey) -> void: get_tree().quit() -func _on_Asciicast_key_pressed(data: String, _event: InputEventKey, - animation_player: AnimationPlayer) -> void: +func _on_Asciicast_key_pressed( + data: String, _event: InputEventKey, animation_player: AnimationPlayer +) -> void: if data == "\u001b": animation_player.emit_signal("animation_finished") diff --git a/examples/menu/menu.tscn b/examples/menu/menu.tscn index ff227fd..a08183d 100644 --- a/examples/menu/menu.tscn +++ b/examples/menu/menu.tscn @@ -25,4 +25,5 @@ __meta__ = { } rows = 31 cols = 102 + [connection signal="key_pressed" from="Terminal" to="." method="_on_Terminal_key_pressed"] diff --git a/examples/terminal/Node.gd b/examples/terminal/Node.gd index 593387e..3a1be69 100644 --- a/examples/terminal/Node.gd +++ b/examples/terminal/Node.gd @@ -1,7 +1,6 @@ extends Node - func _on_Terminal_key_pressed(event: InputEventKey, data: PoolByteArray): print(data as Array) print(event.scancode)