VFS - Rework to remove function pointers from tVFS_Node
[tpg/acess2.git] / Kernel / drv / vterm.c
index 82eac3e..03e7c6c 100644 (file)
@@ -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);
 }
 
 /**
@@ -890,7 +899,7 @@ void VT_KBCallBack(Uint32 Codepoint)
 {
        tVTerm  *term = gpVT_CurTerm;
 
-       // Key Up
+       // Catch VT binds
        switch( Codepoint & KEY_ACTION_MASK )
        {
        case KEY_ACTION_RELEASE:
@@ -928,22 +937,30 @@ void VT_KBCallBack(Uint32 Codepoint)
                case KEY_F10:   VT_SetTerminal(9);      return;
                case KEY_F11:   VT_SetTerminal(10);     return;
                case KEY_F12:   VT_SetTerminal(11);     return;
+               }
+               
+               // Scrolling is only valid in text mode
+               if(gpVT_CurTerm->Mode != TERM_MODE_TEXT)
+                       break;
+               
+               switch(Codepoint & KEY_CODEPOINT_MASK)
+               {
                // Scrolling
                case KEY_PGUP:
                        if( gpVT_CurTerm->Flags & VT_FLAG_ALTBUF )
                                return ;
-                       if( gpVT_CurTerm->ViewPos > gpVT_CurTerm->Width )
-                               gpVT_CurTerm->ViewPos -= gpVT_CurTerm->Width;
-                       else
-                               gpVT_CurTerm->ViewPos = 0;
+                       gpVT_CurTerm->ViewPos = MAX(
+                               0,
+                               gpVT_CurTerm->ViewPos - gpVT_CurTerm->Width
+                               );
                        return;
                case KEY_PGDOWN:
                        if( gpVT_CurTerm->Flags & VT_FLAG_ALTBUF )
                                return ;
-                       if( gpVT_CurTerm->ViewPos < gpVT_CurTerm->Width*gpVT_CurTerm->Height*(giVT_Scrollback) )
-                               gpVT_CurTerm->ViewPos += gpVT_CurTerm->Width;
-                       else
-                               gpVT_CurTerm->ViewPos = gpVT_CurTerm->Width*gpVT_CurTerm->Height*(giVT_Scrollback);
+                       gpVT_CurTerm->ViewPos = MIN(
+                               gpVT_CurTerm->ViewPos + gpVT_CurTerm->Width,
+                               gpVT_CurTerm->Width * gpVT_CurTerm->Height*giVT_Scrollback
+                               );
                        return;
                }
                break;
@@ -1045,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);
@@ -1271,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;
@@ -1316,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;
@@ -1325,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;
@@ -1352,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;
@@ -1367,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;
                }
                

UCC git Repository :: git.ucc.asn.au