diff --git a/BeefLibs/corlib/src/Console.bf b/BeefLibs/corlib/src/Console.bf index 7f46f54d..8113f54b 100644 --- a/BeefLibs/corlib/src/Console.bf +++ b/BeefLibs/corlib/src/Console.bf @@ -265,7 +265,21 @@ namespace System public static Result Read() => In.Read(); - public static Result ReadLine(String strBuffer) => In.ReadLine(strBuffer); + public static Result ReadLine(String strBuffer) + { +#if BF_PLATFORM_WINDOWS + var fs = In.BaseStream as FileStream; + GetConsoleMode((.)fs.Handle, var consoleMode); + consoleMode |= ENABLE_LINE_INPUT | ENABLE_ECHO_INPUT; + SetConsoleMode((.)fs.Handle, consoleMode); +#endif + var result = In.ReadLine(strBuffer); +#if BF_PLATFORM_WINDOWS + SetConsoleMode((.)fs.Handle, consoleMode); +#endif + + return result; + } public static Task ReadLineAsync() => In.ReadLineAsync(); diff --git a/BeefySysLib/platform/win/Platform.cpp b/BeefySysLib/platform/win/Platform.cpp index 0fc86b97..a1ae8170 100644 --- a/BeefySysLib/platform/win/Platform.cpp +++ b/BeefySysLib/platform/win/Platform.cpp @@ -3047,41 +3047,49 @@ BFP_EXPORT intptr BFP_CALLTYPE BfpFile_Read(BfpFile* file, void* buffer, intptr if ((file->mIsStd) && (file->mHandle == GetStdHandle(STD_INPUT_HANDLE))) { - INPUT_RECORD record; - DWORD numRead; - while (true) + DWORD consoleMode = 0; + GetConsoleMode(file->mHandle, &consoleMode); + if ((consoleMode & ENABLE_LINE_INPUT) != 0) { - if (timeoutMS != -1) + forceNormalRead = true; + } + else + { + INPUT_RECORD record; + DWORD numRead; + while (true) { - if (!GetNumberOfConsoleInputEvents(file->mHandle, &numRead)) + if (timeoutMS != -1) + { + if (!GetNumberOfConsoleInputEvents(file->mHandle, &numRead)) + { + forceNormalRead = true; + break; + } + + if (numRead == 0) + { + OUTRESULT(BfpFileResult_Timeout); + return 0; + } + } + + if (!ReadConsoleInput(file->mHandle, &record, 1, &numRead)) { forceNormalRead = true; break; } - - if (numRead == 0) + if (numRead > 0) { - OUTRESULT(BfpFileResult_Timeout); - return 0; - } - } - - if (!ReadConsoleInput(file->mHandle, &record, 1, &numRead)) - { - forceNormalRead = true; - break; - } - if (numRead > 0) - { - if ((record.Event.KeyEvent.bKeyDown) && (record.Event.KeyEvent.uChar.AsciiChar != 0)) - { - memset(buffer, record.Event.KeyEvent.uChar.AsciiChar, 1); - OUTRESULT(BfpFileResult_Ok); - return 1; + if ((record.Event.KeyEvent.bKeyDown) && (record.Event.KeyEvent.uChar.AsciiChar != 0)) + { + memset(buffer, record.Event.KeyEvent.uChar.AsciiChar, 1); + OUTRESULT(BfpFileResult_Ok); + return 1; + } } } } - } if ((timeoutMS != -1) && (!forceNormalRead))