X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Fdrv%2Fvterm.c;h=52c3a944b31e584bfe79319477df0f191fbb7733;hb=02cbaac1233be9c5228973a787431fa5e0aa178e;hp=c2f068546b6cb32381017845412dc9db4d805c34;hpb=15999a03acd4083fb2618c92bebbc557813c5084;p=tpg%2Facess2.git diff --git a/Kernel/drv/vterm.c b/Kernel/drv/vterm.c index c2f06854..52c3a944 100644 --- a/Kernel/drv/vterm.c +++ b/Kernel/drv/vterm.c @@ -140,13 +140,21 @@ int VT_Install(char **Arguments) // Scan Arguments if(Arguments) { - char **args = Arguments; - char *arg, *opt, *val; - for( ; (arg = *args); args++ ) + char **args; + const char *arg; + for(args = Arguments; (arg = *args); args++ ) { + char data[strlen(arg)+1]; + char *opt = data; + char *val; + + val = strchr(arg, '='); + strcpy(data, arg); + if( val ) { + data[ val - arg ] = '\0'; + val ++; + } Log_Debug("VTerm", "Argument '%s'", arg); - opt = arg; - val = arg + strpos(arg, '='); *val++ = '\0'; if( strcmp(opt, "Video") == 0 ) { gsVT_OutputDevice = val; @@ -197,6 +205,7 @@ int VT_Install(char **Arguments) gVT_Terminals[i].CurColour = DEFAULT_COLOUR; gVT_Terminals[i].WritePos = 0; gVT_Terminals[i].ViewPos = 0; + gVT_Terminals[i].ReadingThread = -1; // Initialise VT_int_ChangeMode( &gVT_Terminals[i], @@ -233,7 +242,7 @@ int VT_Install(char **Arguments) void VT_InitOutput() { giVT_OutputDevHandle = VFS_Open(gsVT_OutputDevice, VFS_OPENFLAG_WRITE); - if(giVT_InputDevHandle == -1) { + if(giVT_OutputDevHandle == -1) { Log_Warning("VTerm", "Oh F**k, I can't open the video device '%s'", gsVT_OutputDevice); return ; } @@ -249,7 +258,10 @@ void VT_InitOutput() void VT_InitInput() { giVT_InputDevHandle = VFS_Open(gsVT_InputDevice, VFS_OPENFLAG_READ); - if(giVT_InputDevHandle == -1) return ; + if(giVT_InputDevHandle == -1) { + Log_Warning("VTerm", "Can't open the input device '%s'", gsVT_InputDevice); + return ; + } VFS_IOCtl(giVT_InputDevHandle, KB_IOCTL_SETCALLBACK, VT_KBCallBack); } @@ -623,7 +635,7 @@ int VT_Terminal_IOCtl(tVFS_Node *Node, int Id, void *Data) if( term->NewHeight ) ret = term->NewHeight; else if( term->Mode == TERM_MODE_TEXT ) - ret = term->TextHeight = *iData; + ret = term->TextHeight; else ret = term->Height; LEAVE('i', ret); @@ -657,7 +669,8 @@ void VT_SetTerminal(int ID) tVideo_IOCtl_Pos pos; pos.x = (gpVT_CurTerm->WritePos - gpVT_CurTerm->ViewPos) % gpVT_CurTerm->TextWidth; pos.y = (gpVT_CurTerm->WritePos - gpVT_CurTerm->ViewPos) / gpVT_CurTerm->TextWidth; - VFS_IOCtl(giVT_OutputDevHandle, VIDEO_IOCTL_SETCURSOR, &pos); + if( pos.x < gpVT_CurTerm->TextHeight ) + VFS_IOCtl(giVT_OutputDevHandle, VIDEO_IOCTL_SETCURSOR, &pos); } if( gpVT_CurTerm->Mode == TERM_MODE_TEXT ) @@ -842,7 +855,7 @@ void VT_int_ClearLine(tVTerm *Term, int Num) { int i; tVT_Char *cell = &Term->Text[ Num*Term->TextWidth ]; - if( Num < 0 || Num >= Term->TextHeight ) return ; + if( Num < 0 || Num >= Term->TextHeight * (giVT_Scrollback + 1) ) return ; //ENTER("pTerm iNum", Term, Num); for( i = Term->TextWidth; i--; ) { @@ -1072,8 +1085,6 @@ void VT_int_PutChar(tVTerm *Term, Uint32 Ch) { int base, i; - //Debug("Scrolling entire buffer"); - // Move back by one Term->WritePos -= Term->TextWidth; // Update the scren @@ -1117,6 +1128,7 @@ void VT_int_PutChar(tVTerm *Term, Uint32 Ch) Term->WritePos -= Term->TextWidth; VT_int_UpdateScreen( Term, 0 ); Term->WritePos += Term->TextWidth; + VT_int_ClearLine(Term, Term->WritePos / Term->TextWidth); // Scroll Term->ViewPos += Term->TextWidth;