SpiderScript - Commenting changes
[tpg/acess2.git] / Kernel / drv / vterm.c
index fc89b3a..9e1055e 100644 (file)
@@ -11,7 +11,7 @@
 #include <errno.h>
 #include <semaphore.h>
 
-#define        USE_CTRL_ALT    0
+#define        USE_CTRL_ALT    1
 
 // === CONSTANTS ===
 #define VERSION        ((0<<8)|(50))
@@ -57,7 +57,7 @@ typedef struct {
         int    InputRead;      //!< Input buffer read position
         int    InputWrite;     //!< Input buffer write position
        char    InputBuffer[MAX_INPUT_CHARS8];
-       tSemaphore      InputSemaphore;
+//     tSemaphore      InputSemaphore;
        
        tVT_Char        *Text;
        Uint32          *Buffer;
@@ -160,10 +160,12 @@ int VT_Install(char **Arguments)
                        Log_Debug("VTerm", "Argument '%s'", arg);
                        
                        if( strcmp(opt, "Video") == 0 ) {
-                               gsVT_OutputDevice = strdup(val);
+                               if( !gsVT_OutputDevice && Modules_InitialiseBuiltin( val ) == 0 )
+                                       gsVT_OutputDevice = strdup(val);
                        }
                        else if( strcmp(opt, "Input") == 0 ) {
-                               gsVT_InputDevice = strdup(val);
+                               if( !gsVT_InputDevice && Modules_InitialiseBuiltin( val ) == 0 )
+                                       gsVT_InputDevice = strdup(val);
                        }
                        else if( strcmp(opt, "Width") == 0 ) {
                                giVT_RealWidth = atoi( val );
@@ -177,9 +179,6 @@ int VT_Install(char **Arguments)
                }
        }
        
-       if(gsVT_OutputDevice)   Modules_InitialiseBuiltin( gsVT_OutputDevice );
-       if(gsVT_InputDevice)    Modules_InitialiseBuiltin( gsVT_InputDevice );
-       
        // Apply Defaults
        if(!gsVT_OutputDevice)  gsVT_OutputDevice = strdup(DEFAULT_OUTPUT);
        if(!gsVT_InputDevice)   gsVT_InputDevice = strdup(DEFAULT_INPUT);
@@ -223,7 +222,7 @@ int VT_Install(char **Arguments)
                gVT_Terminals[i].Node.Read = VT_Read;
                gVT_Terminals[i].Node.Write = VT_Write;
                gVT_Terminals[i].Node.IOCtl = VT_Terminal_IOCtl;
-               Semaphore_Init(&gVT_Terminals[i].InputSemaphore, 0, MAX_INPUT_CHARS8, "VTerm", gVT_Terminals[i].Name);
+//             Semaphore_Init(&gVT_Terminals[i].InputSemaphore, 0, MAX_INPUT_CHARS8, "VTerm", gVT_Terminals[i].Name);
        }
        
        // Add to DevFS
@@ -313,6 +312,9 @@ void VT_SetResolution(int Width, int Height)
                {
                        if( gVT_Terminals[i].Mode != TERM_MODE_TEXT )   continue;
                        
+                       gVT_Terminals[i].TextWidth = giVT_RealWidth/giVT_CharWidth;
+                       gVT_Terminals[i].TextHeight = giVT_RealHeight/giVT_CharHeight;
+                       
                        gVT_Terminals[i].Text = realloc(
                                gVT_Terminals[i].Text,
                                newBufSize*sizeof(tVT_Char)
@@ -421,6 +423,8 @@ Uint64 VT_Read(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer)
         int    pos = 0;
         int    avail;
        tVTerm  *term = &gVT_Terminals[ Node->Inode ];
+       Uint32  *codepoint_buf = Buffer;
+       Uint32  *codepoint_in;
        
        Mutex_Acquire( &term->ReadingLock );
        
@@ -429,7 +433,7 @@ Uint64 VT_Read(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer)
        {
        // Text Mode (UTF-8)
        case TERM_MODE_TEXT:
-               VFS_SelectNode(Node, VFS_SELECT_READ, NULL);
+               VFS_SelectNode(Node, VFS_SELECT_READ, NULL, "VT_Read (UTF-8)");
                
                avail = term->InputWrite - term->InputRead;
                if(avail < 0)
@@ -449,7 +453,7 @@ Uint64 VT_Read(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer)
        //case TERM_MODE_FB:
        // Other - UCS-4
        default:
-               VFS_SelectNode(Node, VFS_SELECT_READ, NULL);
+               VFS_SelectNode(Node, VFS_SELECT_READ, NULL, "VT_Read (UCS-4)");
                        
                avail = term->InputWrite - term->InputRead;
                if(avail < 0)
@@ -457,10 +461,12 @@ Uint64 VT_Read(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer)
                if(avail > Length - pos)
                        avail = Length/4 - pos;
                
+               codepoint_in = (void*)term->InputBuffer;
+               codepoint_buf = Buffer;
                
                while( avail -- )
                {
-                       ((Uint32*)Buffer)[pos] = ((Uint32*)term->InputBuffer)[term->InputRead];
+                       codepoint_buf[pos] = codepoint_in[term->InputRead];
                        pos ++;
                        term->InputRead ++;
                        term->InputRead %= MAX_INPUT_CHARS32;
@@ -735,7 +741,7 @@ void VT_KBCallBack(Uint32 Codepoint)
                #else
                case KEY_LALT:  gbVT_AltDown &= ~1;     break;
                case KEY_RALT:  gbVT_AltDown &= ~2;     break;
-               case KEY_LCTRL: gbVT_CtrlDown &= ~1     break;
+               case KEY_LCTRL: gbVT_CtrlDown &= ~1;    break;
                case KEY_RCTRL: gbVT_CtrlDown &= ~2;    break;
                #endif
                }
@@ -856,7 +862,8 @@ void VT_KBCallBack(Uint32 Codepoint)
        else
        {
                // Encode the raw UTF-32 Key
-               ((Uint32*)term->InputBuffer)[ term->InputWrite ] = Codepoint;
+               Uint32  *raw_in = (void*)term->InputBuffer;
+               raw_in[ term->InputWrite ] = Codepoint;
                term->InputWrite ++;
                term->InputWrite %= MAX_INPUT_CHARS32;
                if(term->InputRead == term->InputWrite) {
@@ -1101,6 +1108,9 @@ void VT_int_PutChar(tVTerm *Term, Uint32 Ch)
        default:
                Term->Text[ Term->WritePos ].Ch = Ch;
                Term->Text[ Term->WritePos ].Colour = Term->CurColour;
+               // Update the line before wrapping
+               if( (Term->WritePos + 1) % Term->TextWidth == 0 )
+                       VT_int_UpdateScreen( Term, 0 );
                Term->WritePos ++;
                break;
        }
@@ -1146,7 +1156,7 @@ void VT_int_PutChar(tVTerm *Term, Uint32 Ch)
        {
                //Debug("Term->WritePos (%i) >= %i",
                //      Term->WritePos,
-               //      Term->ViewPos + Term->Width*Term->Height
+               //      Term->ViewPos + Term->TextWidth*Term->TextHeight
                //      );
                //Debug("Scrolling screen only");
                
@@ -1161,6 +1171,8 @@ void VT_int_PutChar(tVTerm *Term, Uint32 Ch)
                //Debug("Term->ViewPos = %i", Term->ViewPos);
                VT_int_ScrollFramebuffer( Term );
                VT_int_UpdateScreen( Term, 0 );
+               
+               //VT_int_UpdateScreen( Term, 1 );       // HACK!
        }
        
        //LEAVE('-');

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