typedef struct {
int Mode; //!< Current Mode (see ::eTplTerminal_Modes)
int Flags; //!< Flags (see VT_FLAG_*)
-
short NewWidth; //!< Un-applied dimensions (Width)
short NewHeight; //!< Un-applied dimensions (Height)
int WritePos; //!< Write Buffer Offset (Text Only)
Uint32 CurColour; //!< Current Text Colour
+ tMutex ReadingLock; //!< Lock the VTerm when a process is reading from it
+ tTID ReadingThread; //!< Owner of the lock
int InputRead; //!< Input buffer read position
int InputWrite; //!< Input buffer write position
char InputBuffer[MAX_INPUT_CHARS8];
int pos = 0;
tVTerm *term = &gVT_Terminals[ Node->Inode ];
+ Mutex_Acquire( &term->ReadingLock );
+ term->ReadingThread = Threads_GetTID();
+
// Check current mode
switch(term->Mode)
{
case TERM_MODE_TEXT:
while(pos < Length)
{
- while(term->InputRead == term->InputWrite) Threads_Yield();
+ //TODO: Sleep instead
+ while(term->InputRead == term->InputWrite) Threads_Sleep();
((char*)Buffer)[pos] = term->InputBuffer[term->InputRead];
pos ++;
default:
while(pos < Length)
{
- while(term->InputRead == term->InputWrite) Threads_Yield();
+ while(term->InputRead == term->InputWrite) Threads_Sleep();
((Uint32*)Buffer)[pos] = ((Uint32*)term->InputBuffer)[term->InputRead];
pos ++;
term->InputRead ++;
}
break;
}
+
+ term->ReadingThread = -1;
+ Mutex_Release( &term->ReadingLock );
+
return 0;
}
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);
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 )
term->InputRead %= MAX_INPUT_CHARS32;
}
}
+
+ // Wake up the thread waiting on us
+ if( term->ReadingThread >= 0 ) {
+ Threads_WakeTID(term->ReadingThread);
+ }
}
/**
{
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--; )
{
} while(c == ';');
}
- /*
- // Get string (what does this do?)
- if(c == '"') {
- c = Buffer[j++];
- while(c != '"')
- c = Buffer[j++];
- }
- */
-
- //Log_Debug("VTerm", "argc = %i", argc);
-
// Get Command
if( ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z'))
{
{
int base, i;
- //Debug("Scrolling entire buffer");
-
// Move back by one
Term->WritePos -= Term->TextWidth;
// Update the scren
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;