X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Fdrv%2Fvterm.c;h=4b5a23176b3873f6acfd74a34902a3871b77bed4;hb=60672c2c2c3add9d0c4c498ee79b3475c7b1afef;hp=05c3ab148d40366c70cc080153a3a7bf8d03b335;hpb=414fb447e4ab5d4f8f456a8de2a16b77eeb1df90;p=tpg%2Facess2.git diff --git a/Kernel/drv/vterm.c b/Kernel/drv/vterm.c index 05c3ab14..4b5a2317 100644 --- a/Kernel/drv/vterm.c +++ b/Kernel/drv/vterm.c @@ -17,6 +17,8 @@ #define DEFAULT_HEIGHT 25 #define DEFAULT_COLOUR (VT_COL_BLACK|(VT_COL_WHITE<<16)) +#define VT_FLAG_HIDECSR 0x01 + enum eVT_Modes { VT_MODE_TEXT8, // UTF-8 Text Mode (VT100 Emulation) VT_MODE_TEXT32, // UTF-32 Text Mode (Acess Native) @@ -30,6 +32,7 @@ enum eVT_Modes { // === TYPES === typedef struct { int Mode; + int Flags; int Width, Height; int ViewPos, WritePos; Uint32 CurColour; @@ -134,6 +137,7 @@ int VT_Install(char **Arguments) for( i = 0; i < NUM_VTS; i++ ) { gVT_Terminals[i].Mode = VT_MODE_TEXT8; + gVT_Terminals[i].Flags = 0; gVT_Terminals[i].Width = DEFAULT_WIDTH; gVT_Terminals[i].Height = DEFAULT_HEIGHT; gVT_Terminals[i].CurColour = DEFAULT_COLOUR; @@ -240,8 +244,10 @@ Uint64 VT_Read(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer) while(term->InputRead == term->InputWrite) Proc_Yield(); while(term->InputRead != term->InputWrite) { + LOG("WriteUTF8(%p, 0x%x)", Buffer+pos, term->InputBuffer[term->InputRead]); pos += WriteUTF8(Buffer+pos, term->InputBuffer[term->InputRead]); term->InputRead ++; + term->InputRead %= MAX_INPUT_CHARS; } } break; @@ -255,6 +261,7 @@ Uint64 VT_Read(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer) ((Uint32*)Buffer)[pos] = term->InputBuffer[term->InputRead]; pos ++; term->InputRead ++; + term->InputRead %= MAX_INPUT_CHARS; } } break; @@ -282,6 +289,7 @@ Uint64 VT_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer) //VT_int_PutString32(term, Buffer, Length); break; } + //LEAVE('i', 0); return 0; } @@ -335,6 +343,15 @@ void VT_int_PutString(tVTerm *Term, Uint8 *Buffer, Uint Count) VT_int_PutChar(Term, val); } } + + // Update cursor + if( !(Term->Flags & VT_FLAG_HIDECSR) ) + { + tVideo_IOCtl_Pos pos; + pos.x = Term->WritePos % Term->Width; + pos.y = Term->WritePos / Term->Width; + VFS_IOCtl(giVT_OutputDevHandle, VIDEO_IOCTL_SETCURSOR, &pos); + } } /** @@ -430,6 +447,7 @@ void VT_int_PutChar(tVTerm *Term, Uint32 Ch) switch(Ch) { + case 0: return; // Ignore NULL byte case '\n': Term->WritePos += Term->Width; case '\r':