switch(term->RawScancode)
{
+ case KEYSYM_DELETE:
+ // TODO: Reboot, or poke secure registered app
+ return;
case KEYSYM_F1 : VT_SetTerminal(0); return;
case KEYSYM_F2 : VT_SetTerminal(1); return;
case KEYSYM_F3 : VT_SetTerminal(2); return;
// Log_Debug("VTerm", "Magic Ctrl-Alt-0x%x", term->RawScancode);
+ const unsigned int scroll_step = term->TextHeight / 2;
+ // Note the lack of giVT_Scrollback+1, view top can't go above size-onescreen
+ const unsigned int scroll_max = term->TextHeight * giVT_Scrollback;
switch(term->RawScancode)
{
- // Scrolling
+ // VTerm scrolling
+ // - Scrolls half a screen at a time
+ // - View up (text goes down)
case KEYSYM_PGUP:
if( term->Flags & VT_FLAG_ALTBUF )
return ;
- term->ViewPos = MAX( 0, term->ViewPos - term->Width );
+ term->ViewTopRow = (term->ViewTopRow > scroll_step ? term->ViewTopRow - scroll_step : 0);
VT_int_UpdateScreen(term, 1);
return;
+ // - View down (text goes up)
case KEYSYM_PGDN:
if( term->Flags & VT_FLAG_ALTBUF )
return ;
- term->ViewPos = MIN(
- term->ViewPos + term->Width,
- term->Width * term->Height * giVT_Scrollback
- );
+
+ term->ViewTopRow = MIN(term->ViewTopRow + scroll_step, scroll_max);
VT_int_UpdateScreen(term, 1);
return;
}
}
// Encode key
- if(term->Mode == TERM_MODE_TEXT)
+ if(term->Mode == PTYBUFFMT_TEXT)
{
Uint8 buf[6] = {0};
int len = 0;
Codepoint &= KEY_CODEPOINT_MASK;
- // Ignore Modifer Keys
- if(Codepoint > KEY_MODIFIERS) return;
-
// Get UTF-8/ANSI Encoding
if( Codepoint == 0 )
{
return;
}
- // TODO: Implement Ctrl-C etc
-#if 0
- // Handle meta characters
- if( !(term->Flags & VT_FLAG_RAWIN) )
- {
- // Implementation options for Ctrl-C -> SIGINT
- // - Kernel-land: here in the VT
- // > Pros: No userland change needed
- // > Cons: Requires process groups
- // - User-land, in the shell
- // > Pros: Less threading changes
- // > Cons: Needs the shell to get all user input before the app, worse latency
- // > Won't work with bash etc
- switch(buf[0])
- {
- case '\3': // ^C
-
- break;
- }
- }
-#endif
-
- // Write
- if( MAX_INPUT_CHARS8 - term->InputWrite >= len ) {
- memcpy( &term->InputBuffer[term->InputWrite], buf, len );
- }
- else {
- memcpy( &term->InputBuffer[term->InputWrite], buf, MAX_INPUT_CHARS8 - term->InputWrite );
- memcpy( &term->InputBuffer[0], buf, len - (MAX_INPUT_CHARS8 - term->InputWrite) );
- }
- // Roll the buffer over
- term->InputWrite += len;
- term->InputWrite %= MAX_INPUT_CHARS8;
- if( (term->InputWrite - term->InputRead + MAX_INPUT_CHARS8)%MAX_INPUT_CHARS8 < len ) {
- term->InputRead = term->InputWrite + 1;
- term->InputRead %= MAX_INPUT_CHARS8;
- }
+ PTY_SendInput(term->PTY, (void*)buf, len);
}
else
{
- // Encode the raw key event
- Uint32 *raw_in = (void*)term->InputBuffer;
-
- #if 0
- // Drop new keys
- if( term->InputWrite == term->InputRead )
- return ;
- #endif
-
- raw_in[ term->InputWrite ] = Codepoint;
- term->InputWrite ++;
- if(term->InputWrite >= MAX_INPUT_CHARS32)
- term->InputWrite -= MAX_INPUT_CHARS32;
-
- #if 1
- // TODO: Should old or new be dropped?
- if(term->InputRead == term->InputWrite) {
- term->InputRead ++;
- if( term->InputRead >= MAX_INPUT_CHARS32 )
- term->InputRead -= MAX_INPUT_CHARS32;
- }
- #endif
+ PTY_SendInput(term->PTY, (void*)&Codepoint, sizeof(Codepoint));
}
-
- VFS_MarkAvaliable(&term->Node, 1);
}