X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Fdrv%2Fvterm.c;h=7aebd28e65c8d5144e60d39f62c350dabcca66f9;hb=07173b260d76a7e6482838c02d5deb2ead2afbb2;hp=8496b9e0a1234ec3e569476104158031ba5969ac;hpb=52a9bf348782b041daa6b783356fe05833582379;p=tpg%2Facess2.git diff --git a/Kernel/drv/vterm.c b/Kernel/drv/vterm.c index 8496b9e0..7aebd28e 100644 --- a/Kernel/drv/vterm.c +++ b/Kernel/drv/vterm.c @@ -10,6 +10,8 @@ #include #include +#define USE_CTRL_ALT 0 + // === CONSTANTS === #define VERSION ((0<<8)|(50)) @@ -316,7 +318,7 @@ Uint64 VT_Read(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer) break; case TERM_MODE_FB: - case TERM_MODE_OPENGL: + //case TERM_MODE_: while(pos < Length) { while(term->InputRead == term->InputWrite) Threads_Yield(); @@ -346,6 +348,28 @@ Uint64 VT_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer) case TERM_MODE_TEXT: VT_int_PutString(term, Buffer, Length); break; + case TERM_MODE_FB: + if( term->RealWidth > term->Width || term->RealHeight > term->Height ) + { + #if 0 + int x, y, h; + x = Offset/4; y = x / term->Width; x %= term->Width; + w = Length/4+x; h = w / term->Width; w %= term->Width; + while(h--) + { + VFS_WriteAt( giVT_OutputDevHandle, + (x+y*term->RealWidth)*4, + term->Width * 4, + Buffer + ); + Buffer = (void*)( (Uint)Buffer + term->Width*term->Height*4 ); + } + #endif + return 0; + } + else { + return VFS_WriteAt( giVT_OutputDevHandle, Offset, Length, Buffer ); + } } //LEAVE('i', 0); @@ -362,6 +386,10 @@ int VT_Terminal_IOCtl(tVFS_Node *Node, int Id, void *Data) tVTerm *term = Node->ImplPtr; ENTER("pNode iId pData", Node, Id, Data); + if(Id >= DRV_IOCTL_LOOKUP) { + if( Threads_GetUID() != 0 ) return -1; + } + switch(Id) { case DRV_IOCTL_TYPE: @@ -405,6 +433,11 @@ int VT_Terminal_IOCtl(tVFS_Node *Node, int Id, void *Data) Log("VT_Terminal_IOCtl - RETURN term->Height = %i", term->Height); LEAVE('i', term->Height); return term->Height; + + case TERM_IOCTL_FORCESHOW: + VT_SetTerminal( Node->Inode ); + LEAVE('i', 1); + return 1; } LEAVE('i', -1); return -1; @@ -451,6 +484,11 @@ void VT_SetTerminal(int ID) /** * \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) { @@ -465,6 +503,10 @@ void VT_KBCallBack(Uint32 Codepoint) 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; @@ -473,12 +515,17 @@ void VT_KBCallBack(Uint32 Codepoint) 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; @@ -487,10 +534,13 @@ void VT_KBCallBack(Uint32 Codepoint) 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; @@ -908,8 +958,8 @@ void VT_int_ChangeMode(tVTerm *Term, int NewMode) free(Term->Text); Term->Buffer = calloc( Term->Width*Term->Height, sizeof(Uint32) ); break; - case TERM_MODE_OPENGL: - return; + //case TERM_MODE_OPENGL: + // return; } Term->Mode = NewMode;