X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Fdrv%2Fvterm.c;h=03e7c6c784f8626851528c3a4268904759a35e63;hb=5f2024e5977e0cca0993a20dad5ab794c94d5711;hp=4fd0616797e6eae0d38f649da607ef30fa2cb54d;hpb=ec0a3c65da8c3d47895ab2e5b4cec8cf2070f6eb;p=tpg%2Facess2.git diff --git a/Kernel/drv/vterm.c b/Kernel/drv/vterm.c index 4fd06167..03e7c6c7 100644 --- a/Kernel/drv/vterm.c +++ b/Kernel/drv/vterm.c @@ -94,16 +94,16 @@ char *VT_ReadDir(tVFS_Node *Node, int Pos); tVFS_Node *VT_FindDir(tVFS_Node *Node, const char *Name); int VT_Root_IOCtl(tVFS_Node *Node, int Id, void *Data); Uint64 VT_Read(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer); -Uint64 VT_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer); +Uint64 VT_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, const void *Buffer); int VT_Terminal_IOCtl(tVFS_Node *Node, int Id, void *Data); void VT_SetResolution(int Width, int Height); void VT_SetMode(int Mode); void VT_SetTerminal(int ID); void VT_KBCallBack(Uint32 Codepoint); -void VT_int_PutString(tVTerm *Term, Uint8 *Buffer, Uint Count); +void VT_int_PutString(tVTerm *Term, const Uint8 *Buffer, Uint Count); void VT_int_ClearLine(tVTerm *Term, int Num); void VT_int_ParseEscape_StandardLarge(tVTerm *Term, char CmdChar, int argc, int *args); - int VT_int_ParseEscape(tVTerm *Term, char *Buffer); + int VT_int_ParseEscape(tVTerm *Term, const char *Buffer); void VT_int_PutChar(tVTerm *Term, Uint32 Ch); void VT_int_ScrollText(tVTerm *Term, int Count); void VT_int_ScrollFramebuffer( tVTerm *Term, int Count ); @@ -122,6 +122,18 @@ const Uint16 caVT100Colours[] = { // === GLOBALS === MODULE_DEFINE(0, VERSION, VTerm, VT_Install, NULL, DEFAULT_INPUT, NULL); +tVFS_NodeType gVT_RootNodeType = { + .TypeName = "VTerm Root", + .ReadDir = VT_ReadDir, + .FindDir = VT_FindDir, + .IOCtl = VT_Root_IOCtl + }; +tVFS_NodeType gVT_TermNodeType = { + .TypeName = "VTerm", + .Read = VT_Read, + .Write = VT_Write, + .IOCtl = VT_Terminal_IOCtl + }; tDevFS_Driver gVT_DrvInfo = { NULL, "VTerm", { @@ -129,9 +141,7 @@ tDevFS_Driver gVT_DrvInfo = { .Size = NUM_VTS, .Inode = -1, .NumACLs = 0, - .ReadDir = VT_ReadDir, - .FindDir = VT_FindDir, - .IOCtl = VT_Root_IOCtl + .Type = &gVT_RootNodeType } }; // --- Terminals --- @@ -254,10 +264,8 @@ int VT_Install(char **Arguments) gVT_Terminals[i].Node.Inode = i; gVT_Terminals[i].Node.ImplPtr = &gVT_Terminals[i]; gVT_Terminals[i].Node.NumACLs = 0; // Only root can open virtual terminals - - gVT_Terminals[i].Node.Read = VT_Read; - gVT_Terminals[i].Node.Write = VT_Write; - gVT_Terminals[i].Node.IOCtl = VT_Terminal_IOCtl; + + gVT_Terminals[i].Node.Type = &gVT_TermNodeType; // Semaphore_Init(&gVT_Terminals[i].InputSemaphore, 0, MAX_INPUT_CHARS8, "VTerm", gVT_Terminals[i].Name); } @@ -482,7 +490,7 @@ Uint64 VT_Read(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer) ((char*)Buffer)[pos] = term->InputBuffer[term->InputRead]; pos ++; term->InputRead ++; - while(term->InputRead > MAX_INPUT_CHARS8) + while(term->InputRead >= MAX_INPUT_CHARS8) term->InputRead -= MAX_INPUT_CHARS8; } break; @@ -495,8 +503,9 @@ Uint64 VT_Read(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer) avail = term->InputWrite - term->InputRead; if(avail < 0) avail += MAX_INPUT_CHARS32; + Length /= 4; if(avail > Length - pos) - avail = Length/4 - pos; + avail = Length - pos; codepoint_in = (void*)term->InputBuffer; codepoint_buf = Buffer; @@ -506,7 +515,7 @@ Uint64 VT_Read(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer) codepoint_buf[pos] = codepoint_in[term->InputRead]; pos ++; term->InputRead ++; - while(term->InputRead > MAX_INPUT_CHARS32) + while(term->InputRead >= MAX_INPUT_CHARS32) term->InputRead -= MAX_INPUT_CHARS32; } pos *= 4; @@ -527,10 +536,10 @@ Uint64 VT_Read(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer) } /** - * \fn Uint64 VT_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer) + * \fn Uint64 VT_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, const void *Buffer) * \brief Write to a virtual terminal */ -Uint64 VT_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer) +Uint64 VT_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, const void *Buffer) { tVTerm *term = &gVT_Terminals[ Node->Inode ]; int size; @@ -874,7 +883,7 @@ void VT_SetTerminal(int ID) VT_int_UpdateCursor(gpVT_CurTerm, 1); // Update the screen -// VT_int_UpdateScreen(gpVT_CurTerm, 1); + VT_int_UpdateScreen(gpVT_CurTerm, 1); } /** @@ -1053,13 +1062,26 @@ void VT_KBCallBack(Uint32 Codepoint) { // Encode the raw key event Uint32 *raw_in = (void*)term->InputBuffer; + + #if 0 + // Drop new keys + if( term->InputWrite == term->InputRead ) + return ; + #endif + raw_in[ term->InputWrite ] = Codepoint; term->InputWrite ++; - term->InputWrite %= MAX_INPUT_CHARS32; + if(term->InputWrite >= MAX_INPUT_CHARS32) + term->InputWrite -= MAX_INPUT_CHARS32; + + #if 1 + // TODO: Should old or new be dropped? if(term->InputRead == term->InputWrite) { term->InputRead ++; - term->InputRead %= MAX_INPUT_CHARS32; + if( term->InputRead >= MAX_INPUT_CHARS32 ) + term->InputRead -= MAX_INPUT_CHARS32; } + #endif } VFS_MarkAvaliable(&term->Node, 1); @@ -1279,10 +1301,10 @@ void VT_int_ParseEscape_StandardLarge(tVTerm *Term, char CmdChar, int argc, int } /** - * \fn int VT_int_ParseEscape(tVTerm *Term, char *Buffer) + * \fn int VT_int_ParseEscape(tVTerm *Term, const char *Buffer) * \brief Parses a VT100 Escape code */ -int VT_int_ParseEscape(tVTerm *Term, char *Buffer) +int VT_int_ParseEscape(tVTerm *Term, const char *Buffer) { char c; int argc = 0, j = 1; @@ -1324,6 +1346,9 @@ int VT_int_ParseEscape(tVTerm *Term, char *Buffer) if(argc != 1) break; switch(args[0]) { + case 25: + Term->Flags &= ~VT_FLAG_HIDECSR; + break; case 1047: VT_int_ToggleAltBuffer(Term, 1); break; @@ -1333,6 +1358,9 @@ int VT_int_ParseEscape(tVTerm *Term, char *Buffer) if(argc != 1) break; switch(args[0]) { + case 25: + Term->Flags |= VT_FLAG_HIDECSR; + break; case 1047: VT_int_ToggleAltBuffer(Term, 0); break; @@ -1360,10 +1388,10 @@ int VT_int_ParseEscape(tVTerm *Term, char *Buffer) } /** - * \fn void VT_int_PutString(tVTerm *Term, Uint8 *Buffer, Uint Count) + * \fn void VT_int_PutString(tVTerm *Term, const Uint8 *Buffer, Uint Count) * \brief Print a string to the Virtual Terminal */ -void VT_int_PutString(tVTerm *Term, Uint8 *Buffer, Uint Count) +void VT_int_PutString(tVTerm *Term, const Uint8 *Buffer, Uint Count) { Uint32 val; int i; @@ -1375,7 +1403,7 @@ void VT_int_PutString(tVTerm *Term, Uint8 *Buffer, Uint Count) if( Buffer[i] == 0x1B ) { i ++; - i += VT_int_ParseEscape(Term, (char*)&Buffer[i]) - 1; + i += VT_int_ParseEscape(Term, (const char*)&Buffer[i]) - 1; continue; }