#include <errno.h>
#include <semaphore.h>
-#define USE_CTRL_ALT 0
+#define USE_CTRL_ALT 1
// === CONSTANTS ===
#define VERSION ((0<<8)|(50))
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;
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 );
}
}
- 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);
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
{
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)
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 );
{
// Text Mode (UTF-8)
case TERM_MODE_TEXT:
- while(pos < Length)
- {
- int avail_bytes;
- VFS_SelectNode(Node, VFS_SELECT_READ, NULL);
- avail_bytes = term->InputRead - term->InputWrite;
+ VFS_SelectNode(Node, VFS_SELECT_READ, NULL, "VT_Read (UTF-8)");
- if(avail_bytes < 0)
- avail_bytes += MAX_INPUT_CHARS8;
- if(avail_bytes > Length - pos)
- avail_bytes = Length - pos;
-
- while( avail_bytes -- )
- {
- ((char*)Buffer)[pos] = term->InputBuffer[term->InputRead];
- pos ++;
- term->InputRead ++;
- term->InputRead %= MAX_INPUT_CHARS8;
- }
+ avail = term->InputWrite - term->InputRead;
+ if(avail < 0)
+ avail += MAX_INPUT_CHARS8;
+ if(avail > Length - pos)
+ avail = Length - pos;
+
+ while( avail -- )
+ {
+ ((char*)Buffer)[pos] = term->InputBuffer[term->InputRead];
+ pos ++;
+ term->InputRead ++;
+ term->InputRead %= MAX_INPUT_CHARS8;
}
break;
//case TERM_MODE_FB:
// Other - UCS-4
default:
- while(pos < Length)
- {
- int avail;
- VFS_SelectNode(Node, VFS_SELECT_READ, NULL);
+ VFS_SelectNode(Node, VFS_SELECT_READ, NULL, "VT_Read (UCS-4)");
- avail = term->InputRead - term->InputWrite;
- if(avail < 0)
- avail += MAX_INPUT_CHARS32;
- if(avail > Length - pos)
- avail = Length/4 - pos;
-
-
- while( avail -- )
- {
- ((Uint32*)Buffer)[pos] = ((Uint32*)term->InputBuffer)[term->InputRead];
- pos ++;
- term->InputRead ++;
- term->InputRead %= MAX_INPUT_CHARS32;
- }
+ 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 -- )
+ {
+ codepoint_buf[pos] = codepoint_in[term->InputRead];
+ pos ++;
+ term->InputRead ++;
+ term->InputRead %= MAX_INPUT_CHARS32;
}
pos *= 4;
break;
#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
}
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) {
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;
}
{
//Debug("Term->WritePos (%i) >= %i",
// Term->WritePos,
- // Term->ViewPos + Term->Width*Term->Height
+ // Term->ViewPos + Term->TextWidth*Term->TextHeight
// );
//Debug("Scrolling screen only");
//Debug("Term->ViewPos = %i", Term->ViewPos);
VT_int_ScrollFramebuffer( Term );
VT_int_UpdateScreen( Term, 0 );
+
+ //VT_int_UpdateScreen( Term, 1 ); // HACK!
}
//LEAVE('-');