X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Fdrv%2Fvterm.c;h=9e1055ef99dc33eb86375977f2e66f84a4c798b8;hb=4f1a9b430a3fa57bbe52a6a2fe546f6fe93c389d;hp=3e47f939296db927186c8d777e39350e6c39b3d8;hpb=4b59aea79be4992af2b1c38ea43f6dacf939d782;p=tpg%2Facess2.git diff --git a/Kernel/drv/vterm.c b/Kernel/drv/vterm.c index 3e47f939..9e1055ef 100644 --- a/Kernel/drv/vterm.c +++ b/Kernel/drv/vterm.c @@ -9,8 +9,9 @@ #include #include #include +#include -#define USE_CTRL_ALT 0 +#define USE_CTRL_ALT 1 // === CONSTANTS === #define VERSION ((0<<8)|(50)) @@ -56,6 +57,7 @@ typedef struct { int InputRead; //!< Input buffer read position int InputWrite; //!< Input buffer write position char InputBuffer[MAX_INPUT_CHARS8]; +// tSemaphore InputSemaphore; tVT_Char *Text; Uint32 *Buffer; @@ -158,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 ); @@ -175,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); @@ -221,6 +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); } // Add to DevFS @@ -310,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) @@ -416,21 +421,28 @@ int VT_Root_IOCtl(tVFS_Node *Node, int Id, void *Data) 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 ); - term->ReadingThread = Threads_GetTID(); // Check current mode switch(term->Mode) { // Text Mode (UTF-8) case TERM_MODE_TEXT: - while(pos < Length) + VFS_SelectNode(Node, VFS_SELECT_READ, NULL, "VT_Read (UTF-8)"); + + avail = term->InputWrite - term->InputRead; + if(avail < 0) + avail += MAX_INPUT_CHARS8; + if(avail > Length - pos) + avail = Length - pos; + + while( avail -- ) { - //TODO: Sleep instead - while(term->InputRead == term->InputWrite) Threads_Sleep(); - ((char*)Buffer)[pos] = term->InputBuffer[term->InputRead]; pos ++; term->InputRead ++; @@ -441,21 +453,37 @@ Uint64 VT_Read(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer) //case TERM_MODE_FB: // Other - UCS-4 default: - while(pos < Length) + VFS_SelectNode(Node, VFS_SELECT_READ, NULL, "VT_Read (UCS-4)"); + + avail = term->InputWrite - term->InputRead; + if(avail < 0) + avail += MAX_INPUT_CHARS32; + if(avail > Length - pos) + avail = Length/4 - pos; + + codepoint_in = (void*)term->InputBuffer; + codepoint_buf = Buffer; + + while( avail -- ) { - while(term->InputRead == term->InputWrite) Threads_Sleep(); - ((Uint32*)Buffer)[pos] = ((Uint32*)term->InputBuffer)[term->InputRead]; + codepoint_buf[pos] = codepoint_in[term->InputRead]; pos ++; term->InputRead ++; term->InputRead %= MAX_INPUT_CHARS32; } + pos *= 4; break; } + // Mark none avaliable if buffer empty + if( term->InputRead == term->InputWrite ) + VFS_MarkAvaliable(&term->Node, 0); + term->ReadingThread = -1; + Mutex_Release( &term->ReadingLock ); - return 0; + return pos; } /** @@ -713,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 } @@ -830,12 +858,12 @@ void VT_KBCallBack(Uint32 Codepoint) term->InputRead = term->InputWrite + 1; term->InputRead %= MAX_INPUT_CHARS8; } - } 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) { @@ -844,10 +872,12 @@ void VT_KBCallBack(Uint32 Codepoint) } } + VFS_MarkAvaliable(&term->Node, 1); + // Wake up the thread waiting on us - if( term->ReadingThread >= 0 ) { - Threads_WakeTID(term->ReadingThread); - } + //if( term->ReadingThread >= 0 ) { + // Threads_WakeTID(term->ReadingThread); + //} } /** @@ -1078,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; } @@ -1123,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"); @@ -1138,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('-'); @@ -1479,6 +1514,8 @@ Uint32 VT_Colour12toN(Uint16 Col12, int Depth) // Fast returns if( Depth == 24 ) return VT_Colour12to24(Col12); if( Depth == 15 ) return VT_Colour12to15(Col12); + // - 32 is a special case, it's usually 24-bit colour with an unused byte + if( Depth == 32 ) return VT_Colour12to24(Col12); // Bounds checks if( Depth < 8 ) return 0;