From 2392dd7c0d88a0831385f8fd31f78b3d51d1749d Mon Sep 17 00:00:00 2001 From: Leroy Hopson Date: Sun, 4 Feb 2024 23:11:14 +1300 Subject: [PATCH] feat: add get_cursor_pos() --- addons/godot_xterm/native/src/terminal.cpp | 7 +++++++ addons/godot_xterm/native/src/terminal.h | 2 ++ addons/godot_xterm/terminal.gd | 4 ++++ test/integration/terminal.test.gd | 15 +++++++++++++++ 4 files changed, 28 insertions(+) diff --git a/addons/godot_xterm/native/src/terminal.cpp b/addons/godot_xterm/native/src/terminal.cpp index 2f0e4ab9..7b4ae5bb 100644 --- a/addons/godot_xterm/native/src/terminal.cpp +++ b/addons/godot_xterm/native/src/terminal.cpp @@ -290,6 +290,8 @@ void Terminal::_register_methods() { register_method("sb_reset", &Terminal::sb_reset); register_method("clear_sb", &Terminal::clear_sb); + register_method("get_cursor_pos", &Terminal::get_cursor_pos); + register_method("start_selection", &Terminal::start_selection); register_method("select_to_pointer", &Terminal::select_to_pointer); register_method("reset_selection", &Terminal::reset_selection); @@ -635,6 +637,11 @@ void Terminal::clear_sb() { update(); } +Vector2 Terminal::get_cursor_pos() { + return Vector2(tsm_screen_get_cursor_x(screen), + tsm_screen_get_cursor_y(screen)); +} + void Terminal::start_selection(Vector2 position) { tsm_screen_selection_start(screen, position.x, position.y); update(); diff --git a/addons/godot_xterm/native/src/terminal.h b/addons/godot_xterm/native/src/terminal.h index 47c364ac..a4a51a16 100644 --- a/addons/godot_xterm/native/src/terminal.h +++ b/addons/godot_xterm/native/src/terminal.h @@ -60,6 +60,8 @@ class Terminal : public Control { void sb_reset(); void clear_sb(); + Vector2 get_cursor_pos(); + void start_selection(Vector2 position); void select_to_pointer(Vector2 position); void reset_selection(); diff --git a/addons/godot_xterm/terminal.gd b/addons/godot_xterm/terminal.gd index f1d41e93..3e5de5f0 100644 --- a/addons/godot_xterm/terminal.gd +++ b/addons/godot_xterm/terminal.gd @@ -71,6 +71,10 @@ func get_rows() -> int: return _rows +func get_cursor_pos() -> Vector2: + return _native_terminal.get_cursor_pos() + + func write(data) -> void: assert( data is PoolByteArray or data is String, diff --git a/test/integration/terminal.test.gd b/test/integration/terminal.test.gd index aa1056ad..a7df7371 100644 --- a/test/integration/terminal.test.gd +++ b/test/integration/terminal.test.gd @@ -33,6 +33,21 @@ func test_bell_cooldown() -> void: assert_signal_emit_count(terminal, "bell", 2) +func test_cursor_get_pos_initially_0_0() -> void: + assert_eq(terminal.get_cursor_pos(), Vector2(0, 0)) + + +func test_cursor_get_pos_increments_immediately() -> void: + terminal.write(" ") + assert_eq(terminal.get_cursor_pos(), Vector2(1, 0)) + + +func test_cursor_get_pos_increments_eventually() -> void: + terminal.write(" ") + yield(yield_to(get_tree(), "idle_frame", 1), YIELD) + assert_eq(terminal.get_cursor_pos(), Vector2(1, 0)) + + func test_writing_random_data_to_terminal_does_not_crash_application(): add_child_autofree(preload("res://test/scenes/write_random.tscn").instance()) yield(yield_frames(5, "Writing random data to terminal"), YIELD)