- // Create the video mode
- mode.width = Width;
- mode.height = Height;
- mode.bpp = 32;
- mode.flags = 0;
-
- // Set video mode
- VFS_IOCtl( giVT_OutputDevHandle, VIDEO_IOCTL_FINDMODE, &mode );
- tmp = mode.id;
- giVT_RealWidth = mode.width;
- giVT_RealHeight = mode.height;
- VFS_IOCtl( giVT_OutputDevHandle, VIDEO_IOCTL_GETSETMODE, &tmp );
-
- tmp = IsTextMode ? VIDEO_BUFFMT_TEXT : VIDEO_BUFFMT_FRAMEBUFFER;
- VFS_IOCtl( giVT_OutputDevHandle, VIDEO_IOCTL_SETBUFFORMAT, &tmp );
-}
-
-/**
- * \fn void VT_SetTerminal(int ID)
- * \brief Set the current terminal
- */
-void VT_SetTerminal(int ID)
-{
- // Update current terminal ID
- Log_Log("VTerm", "Changed terminal from %i to %i", giVT_CurrentTerminal, ID);
- giVT_CurrentTerminal = ID;
- gpVT_CurTerm = &gVT_Terminals[ID];
-
- // Update cursor
- if( gpVT_CurTerm->Mode == TERM_MODE_TEXT && !(gpVT_CurTerm->Flags & VT_FLAG_HIDECSR) )
- {
- tVideo_IOCtl_Pos pos;
- pos.x = gpVT_CurTerm->WritePos % gpVT_CurTerm->Width;
- pos.y = gpVT_CurTerm->WritePos / gpVT_CurTerm->Width;
- VFS_IOCtl(giVT_OutputDevHandle, VIDEO_IOCTL_SETCURSOR, &pos);
- }
-
- if( gpVT_CurTerm->Mode == TERM_MODE_TEXT )
- VT_SetResolution( 1, gpVT_CurTerm->Width*giVT_CharWidth, gpVT_CurTerm->Height*giVT_CharHeight );
- else
- VT_SetResolution( 0, gpVT_CurTerm->Width, gpVT_CurTerm->Height );
-
- // Update the screen
- VT_int_UpdateScreen( &gVT_Terminals[ ID ], 1 );
-}
-
-/**
- * \fn void VT_KBCallBack(Uint32 Codepoint)
- * \brief Called on keyboard interrupt
- * \param Codepoint Pseudo-UTF32 character
- *
- * Handles a key press and sends the key code to the user's buffer.
- * If the code creates a kernel-magic sequence, it is not passed to the
- * user and is handled in-kernel.
- */
-void VT_KBCallBack(Uint32 Codepoint)
-{
- tVTerm *term = &gVT_Terminals[giVT_CurrentTerminal];
-
- // How the hell did we get a Codepoint of zero?
- if(Codepoint == 0) return;
-
- // Key Up
- if( Codepoint & 0x80000000 )
- {
- Codepoint &= 0x7FFFFFFF;
- switch(Codepoint)
- {
- #if !USE_CTRL_ALT
- case KEY_RSHIFT: gbVT_CtrlDown = 0; break;
- case KEY_LSHIFT: gbVT_AltDown = 0; break;
- #else
- case KEY_LALT:
- case KEY_RALT:
- gbVT_AltDown = 0;
- break;
- case KEY_LCTRL:
- case KEY_RCTRL:
- gbVT_CtrlDown = 0;
- break;
- #endif
- }
- return;
- }
-
- switch(Codepoint)
- {
- #if !USE_CTRL_ALT
- case KEY_RSHIFT: gbVT_CtrlDown = 1; break;
- case KEY_LSHIFT: gbVT_AltDown = 1; break;
- #else
- case KEY_LALT:
- case KEY_RALT:
- gbVT_AltDown = 1;
- break;
- case KEY_LCTRL:
- case KEY_RCTRL:
- gbVT_CtrlDown = 1;
- break;
- #endif
-
- default:
- #if USE_CTRL_ALT
- if(!gbVT_AltDown || !gbVT_CtrlDown)
- break;
- #endif
- 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:
- if( gpVT_CurTerm->ViewPos > gpVT_CurTerm->Width )
- gpVT_CurTerm->ViewPos -= gpVT_CurTerm->Width;
- else
- gpVT_CurTerm->ViewPos = 0;
- return;
- case KEY_PGDOWN:
- if( gpVT_CurTerm->ViewPos < gpVT_CurTerm->Width*(gpVT_CurTerm->Height*(VT_SCROLLBACK-1)) )
- gpVT_CurTerm->ViewPos += gpVT_CurTerm->Width;
- else
- gpVT_CurTerm->ViewPos = gpVT_CurTerm->Width*(gpVT_CurTerm->Height*(VT_SCROLLBACK-1));
- return;
- }
- }
-
- // Encode key
- if(term->Mode == TERM_MODE_TEXT)
- {
- Uint8 buf[6] = {0};
- int len = 0;
-
- // Ignore Modifer Keys
- if(Codepoint > KEY_MODIFIERS) return;
-
- // Get UTF-8/ANSI Encoding
- switch(Codepoint)