1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-25 19:18:01 +02:00

Properly handle console mode ENABLE_LINE_INPUT

This commit is contained in:
Brian Fiete 2024-01-02 08:25:37 -05:00
parent 035335bf7b
commit 015bf14156
2 changed files with 48 additions and 26 deletions

View file

@ -265,7 +265,21 @@ namespace System
public static Result<char8> Read() => In.Read(); public static Result<char8> Read() => In.Read();
public static Result<void> ReadLine(String strBuffer) => In.ReadLine(strBuffer); public static Result<void> 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<String> ReadLineAsync() => In.ReadLineAsync(); public static Task<String> ReadLineAsync() => In.ReadLineAsync();

View file

@ -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))) if ((file->mIsStd) && (file->mHandle == GetStdHandle(STD_INPUT_HANDLE)))
{ {
INPUT_RECORD record; DWORD consoleMode = 0;
DWORD numRead; GetConsoleMode(file->mHandle, &consoleMode);
while (true) 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; forceNormalRead = true;
break; break;
} }
if (numRead > 0)
if (numRead == 0)
{ {
OUTRESULT(BfpFileResult_Timeout); if ((record.Event.KeyEvent.bKeyDown) && (record.Event.KeyEvent.uChar.AsciiChar != 0))
return 0; {
} memset(buffer, record.Event.KeyEvent.uChar.AsciiChar, 1);
} OUTRESULT(BfpFileResult_Ok);
return 1;
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 ((timeoutMS != -1) && (!forceNormalRead)) if ((timeoutMS != -1) && (!forceNormalRead))