X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FKernel%2Fdrv%2Fvterm.c;h=217557058c0376ae5507092f951d9e037ebd7d07;hb=5cab4c07bc13888dc7956194ef9595508072a4eb;hp=a6cf771f800a917e4be3fa7a134c3a9ea4bee03c;hpb=1dc089a0b5b31e8e75e85128a03b7be20d4995f5;p=tpg%2Facess2.git diff --git a/KernelLand/Kernel/drv/vterm.c b/KernelLand/Kernel/drv/vterm.c index a6cf771f..21755705 100644 --- a/KernelLand/Kernel/drv/vterm.c +++ b/KernelLand/Kernel/drv/vterm.c @@ -20,7 +20,6 @@ #define NUM_VTS 8 //#define DEFAULT_OUTPUT "BochsGA" #define DEFAULT_OUTPUT "Vesa" -#define FALLBACK_OUTPUT "x86_VGAText" #define DEFAULT_INPUT "Keyboard" #define DEFAULT_WIDTH 640 #define DEFAULT_HEIGHT 480 @@ -35,7 +34,6 @@ extern void Debug_SetKTerminal(const char *File); // === PROTOTYPES === int VT_Install(char **Arguments); int VT_Root_IOCtl(tVFS_Node *Node, int Id, void *Data); -void VT_int_PutFBData(tVTerm *Term, size_t Offset, size_t Length, const void *Data); void VT_PTYOutput(void *Handle, size_t Length, const void *Data); int VT_PTYResize(void *Handle, const struct ptydims *Dims); int VT_PTYModeset(void *Handle, const struct ptymode *Mode); @@ -98,7 +96,7 @@ int VT_Install(char **Arguments) data[ val - arg ] = '\0'; val ++; } - Log_Debug("VTerm", "Argument '%s'", arg); + Log_Debug("VTerm", "Argument '%s'='%s'", opt, val); if( strcmp(opt, "Video") == 0 ) { if( !gsVT_OutputDevice ) @@ -126,9 +124,9 @@ int VT_Install(char **Arguments) // Apply Defaults if(!gsVT_OutputDevice) gsVT_OutputDevice = (char*)DEFAULT_OUTPUT; else if( Module_EnsureLoaded( gsVT_OutputDevice ) ) gsVT_OutputDevice = (char*)DEFAULT_OUTPUT; - if( Module_EnsureLoaded( gsVT_OutputDevice ) ) gsVT_OutputDevice = (char*)FALLBACK_OUTPUT; + //if( Module_EnsureLoaded( gsVT_OutputDevice ) ) gsVT_OutputDevice = (char*)FALLBACK_OUTPUT; if( Module_EnsureLoaded( gsVT_OutputDevice ) ) { - Log_Error("VTerm", "Fallback video '%s' is not avaliable, giving up", FALLBACK_OUTPUT); + Log_Error("VTerm", "Video device '%s' is not avaliable, giving up", gsVT_OutputDevice); return MODULE_ERR_MISC; } @@ -163,26 +161,26 @@ int VT_Install(char **Arguments) Log_Debug("VTerm", "Initialising nodes (and creating buffers)"); for( i = 0; i < NUM_VTS; i++ ) { - gVT_Terminals[i].Mode = TERM_MODE_TEXT; - gVT_Terminals[i].Flags = 0; // gVT_Terminals[i].Flags = VT_FLAG_HIDECSR; //HACK - Stop all those memcpy calls gVT_Terminals[i].CurColour = DEFAULT_COLOUR; - gVT_Terminals[i].WritePos = 0; - gVT_Terminals[i].AltWritePos = 0; - gVT_Terminals[i].ViewPos = 0; - gVT_Terminals[i].ScrollHeight = 0; + gVT_Terminals[i].Mode = PTYBUFFMT_TEXT; // Initialise VT_int_Resize( &gVT_Terminals[i], giVT_RealWidth, giVT_RealHeight ); - gVT_Terminals[i].Mode = PTYBUFFMT_TEXT; char name[] = {'v','t','0'+i,'\0'}; - gVT_Terminals[i].PTY = PTY_Create(name, &gVT_Terminals[i], - VT_PTYOutput, VT_PTYResize, VT_PTYModeset); + struct ptydims dims = { + .W = giVT_RealWidth / giVT_CharWidth, + .H = giVT_RealHeight / giVT_CharHeight, + .PW = giVT_RealWidth, + .PH = giVT_RealHeight + }; struct ptymode mode = { .OutputMode = PTYBUFFMT_TEXT, .InputMode = PTYIMODE_CANON|PTYIMODE_ECHO }; - PTY_SetAttrib(gVT_Terminals[i].PTY, NULL, &mode, 0); + gVT_Terminals[i].PTY = PTY_Create(name, &gVT_Terminals[i], + VT_PTYOutput, VT_PTYResize, VT_PTYModeset, + &dims, &mode); } // Add to DevFS @@ -190,7 +188,7 @@ int VT_Install(char **Arguments) // Set kernel output to VT0 Log_Debug("VTerm", "Setting kernel output to VT#0"); - Debug_SetKTerminal("/Devices/pts/vt0c"); + Debug_SetKTerminal("/Devices/pts/vt0"); return MODULE_ERR_OK; } @@ -298,17 +296,24 @@ void VT_int_PutFBData(tVTerm *Term, size_t Offset, size_t Length, const void *Bu { size_t maxlen = Term->Width * Term->Height * 4; - if( Offset >= maxlen ) + ENTER("pTerm xOffset xLength pBuffer", Term, Offset, Length, Buffer); + + if( Offset >= maxlen ) { + LEAVE('-'); return ; + } + LOG("maxlen = 0x%x", maxlen); Length = MIN(Length, maxlen - Offset); // If the terminal is currently shown, write directly to the screen if( Term == gpVT_CurTerm ) { // Center the terminal vertically - if( giVT_RealHeight > Term->Height ) + if( giVT_RealHeight > Term->Height ) { Offset += (giVT_RealHeight - Term->Height) / 2 * Term->Width * 4; + LOG("Altered offset 0x%x", Offset); + } // If the terminal is not native width, center it horizontally if( giVT_RealWidth > Term->Width ) @@ -319,7 +324,9 @@ void VT_int_PutFBData(tVTerm *Term, size_t Offset, size_t Length, const void *Bu // TODO: Fix to handle the final line correctly? x = Offset/4; y = x / Term->Width; x %= Term->Width; w = Length/4+x; h = w / Term->Width; w %= Term->Width; - + + LOG("(%i,%i) %ix%i", x, y, w, h); + // Center x += (giVT_RealWidth - Term->Width) / 2; dst_ofs = (x + y * giVT_RealWidth) * 4; @@ -345,9 +352,11 @@ void VT_int_PutFBData(tVTerm *Term, size_t Offset, size_t Length, const void *Bu { if( !Term->Buffer ) Term->Buffer = malloc( Term->Width * Term->Height * 4 ); + LOG("Direct to cache"); // Copy to the local cache memcpy( (char*)Term->Buffer + Offset, Buffer, Length ); } + LEAVE('-'); } void VT_PTYOutput(void *Handle, size_t Length, const void *Data) @@ -359,14 +368,16 @@ void VT_PTYOutput(void *Handle, size_t Length, const void *Data) VT_int_PutString(term, Data, Length); break; case PTYBUFFMT_FB: - // TODO: How do offset? + // TODO: How can the offset be done cleanly? (Ask the PTY for its offset?) + Warning("TODO: Offsets for VT_PTYOutput FBData"); VT_int_PutFBData(term, 0, Length, Data); break; case PTYBUFFMT_2DCMD: - // TODO: Impliment 2D commands + VT_int_Handle2DCmd(term, Length, Data); break; case PTYBUFFMT_3DCMD: - // TODO: Impliment 3D commands + // TODO: Implement 3D commands + Warning("TODO: VTerm 3D commands"); break; } } @@ -386,6 +397,21 @@ int VT_PTYModeset(void *Handle, const struct ptymode *Mode) { tVTerm *term = Handle; term->Mode = (Mode->OutputMode & PTYOMODE_BUFFMT); + + memset(&term->Cmd2D, 0, sizeof(term->Cmd2D)); + + if( term == gpVT_CurTerm ) { + switch(term->Mode) + { + case PTYBUFFMT_TEXT: + VT_SetMode(VIDEO_BUFFMT_TEXT); + break; + default: + VT_SetMode(VIDEO_BUFFMT_FRAMEBUFFER); + break; + } + } + return 0; } @@ -636,7 +662,7 @@ void VT_SetTerminal(int ID) LOG("Attempting VT_SetMode"); - if( gpVT_CurTerm->Mode == TERM_MODE_TEXT ) + if( gpVT_CurTerm->Mode == PTYBUFFMT_TEXT ) { VT_SetMode( VIDEO_BUFFMT_TEXT ); }