X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Fdrv%2Fvterm.c;h=8aa7321b805a747bb969ec9ad52ede95f8c0d293;hb=8a867fdf503d26e151bcc084a7147ba0f62271b0;hp=2937b372f1599b9a3409a34df14f469289555922;hpb=d84c449919ed7a288945d043a04802d96daf7047;p=tpg%2Facess2.git diff --git a/Kernel/drv/vterm.c b/Kernel/drv/vterm.c index 2937b372..8aa7321b 100644 --- a/Kernel/drv/vterm.c +++ b/Kernel/drv/vterm.c @@ -5,6 +5,7 @@ #include #include #include +#include // === CONSTANTS === #define NUM_VTS 4 @@ -16,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) @@ -29,6 +32,7 @@ enum eVT_Modes { // === TYPES === typedef struct { int Mode; + int Flags; int Width, Height; int ViewPos, WritePos; Uint32 CurColour; @@ -133,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; @@ -176,6 +181,8 @@ void VT_InitInput() { giVT_InputDevHandle = VFS_Open(gsVT_InputDevice, VFS_OPENFLAG_READ); LOG("giVT_InputDevHandle = %x\n", giVT_InputDevHandle); + if(giVT_InputDevHandle == -1) return ; + VFS_IOCtl(giVT_InputDevHandle, KB_IOCTL_SETCALLBACK, VT_KBCallBack); } /** @@ -237,6 +244,7 @@ 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 ++; } @@ -279,6 +287,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; } @@ -332,6 +341,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); + } } /** @@ -513,11 +531,12 @@ void VT_int_UpdateScreen( tVTerm *Term, int UpdateAll ) &Term->Text[Term->ViewPos] ); } else { + int pos = Term->WritePos - Term->WritePos % Term->Width; VFS_WriteAt( giVT_OutputDevHandle, - Term->ViewPos*sizeof(tVT_Char), + (pos - Term->ViewPos)*sizeof(tVT_Char), Term->Width*sizeof(tVT_Char), - &Term->Text[Term->ViewPos] + &Term->Text[pos] ); } }