diff --git a/core/bind/core_bind.cpp b/core/bind/core_bind.cpp index b309544b3..ecc4da1ea 100644 --- a/core/bind/core_bind.cpp +++ b/core/bind/core_bind.cpp @@ -484,6 +484,10 @@ Error _OS::shell_open(String p_uri) { return OS::get_singleton()->shell_open(p_uri); }; +String _OS::read_string_from_stdin() { + return OS::get_singleton()->get_stdin_string(); +} + int _OS::execute(const String &p_path, const Vector &p_arguments, bool p_blocking, Array p_output, bool p_read_stderr, bool p_open_console) { OS::ProcessID pid = -2; int exitcode = 0; @@ -1367,6 +1371,7 @@ void _OS::_bind_methods() { ClassDB::bind_method(D_METHOD("get_processor_name"), &_OS::get_processor_name); ClassDB::bind_method(D_METHOD("get_executable_path"), &_OS::get_executable_path); + ClassDB::bind_method(D_METHOD("read_string_from_stdin"), &_OS::read_string_from_stdin); ClassDB::bind_method(D_METHOD("execute", "path", "arguments", "blocking", "output", "read_stderr", "open_console"), &_OS::execute, DEFVAL(true), DEFVAL(Array()), DEFVAL(false), DEFVAL(false)); ClassDB::bind_method(D_METHOD("kill", "pid"), &_OS::kill); ClassDB::bind_method(D_METHOD("shell_open", "uri"), &_OS::shell_open); diff --git a/core/bind/core_bind.h b/core/bind/core_bind.h index a78fe18e9..0101e63d7 100644 --- a/core/bind/core_bind.h +++ b/core/bind/core_bind.h @@ -242,6 +242,7 @@ public: int get_low_processor_usage_mode_sleep_usec() const; String get_executable_path() const; + String read_string_from_stdin(); int execute(const String &p_path, const Vector &p_arguments, bool p_blocking = true, Array p_output = Array(), bool p_read_stderr = false, bool p_open_console = false); Error kill(int p_pid); diff --git a/core/os/os.h b/core/os/os.h index 71a688ff4..58ae63b86 100644 --- a/core/os/os.h +++ b/core/os/os.h @@ -157,7 +157,7 @@ public: void printerr(const char *p_format, ...) _PRINTF_FORMAT_ATTRIBUTE_2_3; virtual void alert(const String &p_alert, const String &p_title = "ALERT!") = 0; - virtual String get_stdin_string(bool p_block = true) = 0; + virtual String get_stdin_string() = 0; enum MouseMode { MOUSE_MODE_VISIBLE, diff --git a/doc/classes/OS.xml b/doc/classes/OS.xml index f89a5dd59..20e83ba61 100644 --- a/doc/classes/OS.xml +++ b/doc/classes/OS.xml @@ -891,6 +891,13 @@ Shows all resources currently used by the game. + + + + Reads a user input string from the standard input (usually the terminal). This operation is [i]blocking[/i], which causes the window to freeze if [method read_string_from_stdin] is called on the main thread. The thread calling [method read_string_from_stdin] will block until the program receives a line break in standard input (usually by the user pressing [kbd]Enter[/kbd]). + [b]Note:[/b] This method is implemented on Linux, macOS and Windows. + + diff --git a/drivers/unix/os_unix.cpp b/drivers/unix/os_unix.cpp index ec68f7d79..6183451df 100644 --- a/drivers/unix/os_unix.cpp +++ b/drivers/unix/os_unix.cpp @@ -136,15 +136,11 @@ void OS_Unix::alert(const String &p_alert, const String &p_title) { fprintf(stderr, "ALERT: %s: %s\n", p_title.utf8().get_data(), p_alert.utf8().get_data()); } -String OS_Unix::get_stdin_string(bool p_block) { - if (p_block) { - char buff[1024]; - String ret = stdin_buf + fgets(buff, 1024, stdin); - stdin_buf = ""; - return ret; - } - - return ""; +String OS_Unix::get_stdin_string() { + char buff[1024]; + String ret = stdin_buf + fgets(buff, 1024, stdin); + stdin_buf = ""; + return ret; } String OS_Unix::get_name() const { diff --git a/drivers/unix/os_unix.h b/drivers/unix/os_unix.h index 59be382d4..97bde6824 100644 --- a/drivers/unix/os_unix.h +++ b/drivers/unix/os_unix.h @@ -52,7 +52,7 @@ public: OS_Unix(); virtual void alert(const String &p_alert, const String &p_title = "ALERT!"); - virtual String get_stdin_string(bool p_block); + virtual String get_stdin_string(); //virtual void set_mouse_show(bool p_show); //virtual void set_mouse_grab(bool p_grab); diff --git a/platform/windows/os_windows.cpp b/platform/windows/os_windows.cpp index 637c40cec..48e10ce75 100644 --- a/platform/windows/os_windows.cpp +++ b/platform/windows/os_windows.cpp @@ -3165,12 +3165,8 @@ bool OS_Windows::set_environment(const String &p_var, const String &p_value) con } String OS_Windows::get_stdin_string(bool p_block) { - if (p_block) { - char buff[1024]; - return fgets(buff, 1024, stdin); - }; - - return String(); + char buff[1024]; + return fgets(buff, 1024, stdin); } void OS_Windows::enable_for_stealing_focus(ProcessID pid) { diff --git a/platform/windows/os_windows.h b/platform/windows/os_windows.h index 1f9ecfcac..653f0bd1f 100644 --- a/platform/windows/os_windows.h +++ b/platform/windows/os_windows.h @@ -433,7 +433,7 @@ public: LRESULT WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); virtual void alert(const String &p_alert, const String &p_title = "ALERT!"); - String get_stdin_string(bool p_block); + String get_stdin_string(); void set_mouse_mode(MouseMode p_mode); MouseMode get_mouse_mode() const;