+ // How the hell did we get a Codepoint of zero?
+ if(Codepoint == 0) return;
+
+ // Key Up
+ if( Codepoint & 0x80000000 )
+ {
+ Codepoint &= 0x7FFFFFFF;
+ switch(Codepoint)
+ {
+ case KEY_LALT:
+ case KEY_RALT:
+ gbVT_AltDown = 0;
+ break;
+ case KEY_LCTRL:
+ case KEY_RCTRL:
+ gbVT_CtrlDown = 0;
+ break;
+ }
+ return;
+ }
+
+ switch(Codepoint)
+ {
+ case KEY_LALT:
+ case KEY_RALT:
+ gbVT_AltDown = 1;
+ break;
+ case KEY_LCTRL:
+ case KEY_RCTRL:
+ gbVT_CtrlDown = 1;
+ break;
+
+ default:
+ if(!gbVT_AltDown || !gbVT_CtrlDown)
+ break;
+ switch(Codepoint)
+ {
+ case KEY_F1: VT_SetTerminal(0); return;
+ case KEY_F2: VT_SetTerminal(1); return;
+ case KEY_F3: VT_SetTerminal(2); return;
+ case KEY_F4: VT_SetTerminal(3); return;
+ case KEY_F5: VT_SetTerminal(4); return;
+ case KEY_F6: VT_SetTerminal(5); return;
+ case KEY_F7: VT_SetTerminal(6); return;
+ case KEY_F8: VT_SetTerminal(7); return;
+ case KEY_F9: VT_SetTerminal(8); return;
+ case KEY_F10: VT_SetTerminal(9); return;
+ case KEY_F11: VT_SetTerminal(10); return;
+ case KEY_F12: VT_SetTerminal(11); return;
+ case KEY_PGUP:
+ break;
+ case KEY_PGDOWN:
+ break;
+ }
+ }
+
+ // Encode key
+ if(term->Mode == TERM_MODE_TEXT)
+ {
+ Uint8 buf[6] = {0};
+ int len;
+
+ // Ignore Modifer Keys
+ if(Codepoint > KEY_MODIFIERS) return;
+
+ // Get UTF-8/ANSI Encoding
+ switch(Codepoint)
+ {
+ case KEY_LEFT:
+ buf[0] = '\x1B'; buf[1] = '[';
+ buf[2] = 'D'; len = 3;
+ break;
+ case KEY_RIGHT:
+ buf[0] = '\x1B'; buf[1] = '[';
+ buf[2] = 'C'; len = 3;
+ break;
+ default:
+ len = WriteUTF8( buf, Codepoint );
+ //Log("Codepoint = 0x%x", Codepoint);
+ break;
+ }
+
+ //Log("len = %i, buf = %s", len, buf);
+
+ // 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;
+ }
+
+ }
+ else
+ {
+ // Encode the raw UTF-32 Key
+ ((Uint32*)term->InputBuffer)[ term->InputWrite ] = Codepoint;
+ term->InputWrite ++;
+ term->InputWrite %= MAX_INPUT_CHARS32;
+ if(term->InputRead == term->InputWrite) {
+ term->InputRead ++;
+ term->InputRead %= MAX_INPUT_CHARS32;
+ }