X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Fdrv%2Fvterm.c;h=57ce0828e8a2e492b05565c939a2a71a3605356e;hb=784b6fc9ee5221ed58ed7a118c0c856d483a2ea7;hp=634865b69dc54bef9c7edd8f85b52189ddfad222;hpb=d0ab59cd0d66573af6e77a0544825ba1e61a2c7b;p=tpg%2Facess2.git diff --git a/Kernel/drv/vterm.c b/Kernel/drv/vterm.c index 634865b6..57ce0828 100644 --- a/Kernel/drv/vterm.c +++ b/Kernel/drv/vterm.c @@ -236,8 +236,8 @@ int VT_Install(char **Arguments) for( i = 0; i < NUM_VTS; i++ ) { gVT_Terminals[i].Mode = TERM_MODE_TEXT; -// gVT_Terminals[i].Flags = 0; - gVT_Terminals[i].Flags = VT_FLAG_HIDECSR; //HACK - Stop all those memcpy calls + gVT_Terminals[i].Flags = 0; +// gVT_Terminals[i].Flags = VT_FLAG_HIDECSR; //HACK - Stop all those memcpy calls gVT_Terminals[i].CurColour = DEFAULT_COLOUR; gVT_Terminals[i].WritePos = 0; gVT_Terminals[i].AltWritePos = 0; @@ -462,14 +462,13 @@ Uint64 VT_Read(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer) Mutex_Acquire( &term->ReadingLock ); - // Update cursor - VT_int_UpdateCursor(term, 1); - // Check current mode switch(term->Mode) { // Text Mode (UTF-8) case TERM_MODE_TEXT: + VT_int_UpdateCursor(term, 1); + VFS_SelectNode(Node, VFS_SELECT_READ, NULL, "VT_Read (UTF-8)"); avail = term->InputWrite - term->InputRead; @@ -483,7 +482,7 @@ Uint64 VT_Read(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer) ((char*)Buffer)[pos] = term->InputBuffer[term->InputRead]; pos ++; term->InputRead ++; - while(term->InputRead > MAX_INPUT_CHARS8) + while(term->InputRead >= MAX_INPUT_CHARS8) term->InputRead -= MAX_INPUT_CHARS8; } break; @@ -496,8 +495,9 @@ Uint64 VT_Read(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer) avail = term->InputWrite - term->InputRead; if(avail < 0) avail += MAX_INPUT_CHARS32; + Length /= 4; if(avail > Length - pos) - avail = Length/4 - pos; + avail = Length - pos; codepoint_in = (void*)term->InputBuffer; codepoint_buf = Buffer; @@ -507,7 +507,7 @@ Uint64 VT_Read(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer) codepoint_buf[pos] = codepoint_in[term->InputRead]; pos ++; term->InputRead ++; - while(term->InputRead > MAX_INPUT_CHARS32) + while(term->InputRead >= MAX_INPUT_CHARS32) term->InputRead -= MAX_INPUT_CHARS32; } pos *= 4; @@ -589,7 +589,8 @@ Uint64 VT_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer) } return 0; } - else { + else + { return VFS_WriteAt( giVT_OutputDevHandle, Offset, Length, Buffer ); } } @@ -889,35 +890,32 @@ void VT_SetTerminal(int ID) void VT_KBCallBack(Uint32 Codepoint) { tVTerm *term = gpVT_CurTerm; - - // How the hell did we get a codepoint of zero? - if(Codepoint == 0) return; - - // Key Up - if( Codepoint & 0x80000000 ) + + // Catch VT binds + switch( Codepoint & KEY_ACTION_MASK ) { - Codepoint &= 0x7FFFFFFF; - switch(Codepoint) + case KEY_ACTION_RELEASE: + switch(Codepoint & KEY_CODEPOINT_MASK) { case KEY_LALT: gbVT_AltDown &= ~1; break; case KEY_RALT: gbVT_AltDown &= ~2; break; case KEY_LCTRL: gbVT_CtrlDown &= ~1; break; case KEY_RCTRL: gbVT_CtrlDown &= ~2; break; } - return; - } - - switch(Codepoint) - { - case KEY_LALT: gbVT_AltDown |= 1; break; - case KEY_RALT: gbVT_AltDown |= 2; break; - case KEY_LCTRL: gbVT_CtrlDown |= 1; break; - case KEY_RCTRL: gbVT_CtrlDown |= 2; break; + break; - default: + case KEY_ACTION_PRESS: + switch(Codepoint & KEY_CODEPOINT_MASK) + { + case KEY_LALT: gbVT_AltDown |= 1; break; + case KEY_RALT: gbVT_AltDown |= 2; break; + case KEY_LCTRL: gbVT_CtrlDown |= 1; break; + case KEY_RCTRL: gbVT_CtrlDown |= 2; break; + } + if(!gbVT_AltDown || !gbVT_CtrlDown) break; - switch(Codepoint) + switch(Codepoint & KEY_CODEPOINT_MASK) { case KEY_F1: VT_SetTerminal(0); return; case KEY_F2: VT_SetTerminal(1); return; @@ -931,24 +929,33 @@ void VT_KBCallBack(Uint32 Codepoint) case KEY_F10: VT_SetTerminal(9); return; case KEY_F11: VT_SetTerminal(10); return; case KEY_F12: VT_SetTerminal(11); return; + } + + // Scrolling is only valid in text mode + if(gpVT_CurTerm->Mode != TERM_MODE_TEXT) + break; + + switch(Codepoint & KEY_CODEPOINT_MASK) + { // Scrolling case KEY_PGUP: if( gpVT_CurTerm->Flags & VT_FLAG_ALTBUF ) return ; - if( gpVT_CurTerm->ViewPos > gpVT_CurTerm->Width ) - gpVT_CurTerm->ViewPos -= gpVT_CurTerm->Width; - else - gpVT_CurTerm->ViewPos = 0; + gpVT_CurTerm->ViewPos = MAX( + 0, + gpVT_CurTerm->ViewPos - gpVT_CurTerm->Width + ); return; case KEY_PGDOWN: if( gpVT_CurTerm->Flags & VT_FLAG_ALTBUF ) return ; - if( gpVT_CurTerm->ViewPos < gpVT_CurTerm->Width*gpVT_CurTerm->Height*(giVT_Scrollback) ) - gpVT_CurTerm->ViewPos += gpVT_CurTerm->Width; - else - gpVT_CurTerm->ViewPos = gpVT_CurTerm->Width*gpVT_CurTerm->Height*(giVT_Scrollback); + gpVT_CurTerm->ViewPos = MIN( + gpVT_CurTerm->ViewPos + gpVT_CurTerm->Width, + gpVT_CurTerm->Width * gpVT_CurTerm->Height*giVT_Scrollback + ); return; } + break; } // Encode key @@ -956,37 +963,49 @@ void VT_KBCallBack(Uint32 Codepoint) { Uint8 buf[6] = {0}; int len = 0; - + + // Ignore anything that isn't a press or refire + if( (Codepoint & KEY_ACTION_MASK) != KEY_ACTION_PRESS + && (Codepoint & KEY_ACTION_MASK) != KEY_ACTION_REFIRE + ) + { + return ; + } + + Codepoint &= KEY_CODEPOINT_MASK; + // Ignore Modifer Keys if(Codepoint > KEY_MODIFIERS) return; // Get UTF-8/ANSI Encoding switch(Codepoint) { + // 0: No translation, don't send to user + case 0: break; case KEY_LEFT: - buf[0] = '\x1B'; buf[1] = '['; buf[2] = 'D'; + buf[0] = '\x1B'; buf[1] = '['; buf[2] = 'D'; len = 3; break; case KEY_RIGHT: - buf[0] = '\x1B'; buf[1] = '['; buf[2] = 'C'; + buf[0] = '\x1B'; buf[1] = '['; buf[2] = 'C'; len = 3; break; case KEY_UP: - buf[0] = '\x1B'; buf[1] = '['; buf[2] = 'A'; + buf[0] = '\x1B'; buf[1] = '['; buf[2] = 'A'; len = 3; break; case KEY_DOWN: - buf[0] = '\x1B'; buf[1] = '['; buf[2] = 'B'; + buf[0] = '\x1B'; buf[1] = '['; buf[2] = 'B'; len = 3; break; case KEY_PGUP: - //buf[0] = '\x1B'; buf[1] = '['; buf[2] = '5'; // Some overline also - //len = 4; // Commented out until I'm sure - len = 0; + buf[0] = '\x1B'; buf[1] = '['; buf[2] = '5'; buf[3] = '~'; + len = 4; break; case KEY_PGDOWN: - len = 0; + buf[0] = '\x1B'; buf[1] = '['; buf[2] = '6'; buf[3] = '~'; + len = 4; break; // Attempt to encode in UTF-8 @@ -1033,15 +1052,28 @@ void VT_KBCallBack(Uint32 Codepoint) } else { - // Encode the raw UTF-32 Key + // 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 ++; - term->InputWrite %= MAX_INPUT_CHARS32; + 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 ++; - term->InputRead %= MAX_INPUT_CHARS32; + if( term->InputRead >= MAX_INPUT_CHARS32 ) + term->InputRead -= MAX_INPUT_CHARS32; } + #endif } VFS_MarkAvaliable(&term->Node, 1); @@ -1306,6 +1338,9 @@ int VT_int_ParseEscape(tVTerm *Term, char *Buffer) if(argc != 1) break; switch(args[0]) { + case 25: + Term->Flags &= ~VT_FLAG_HIDECSR; + break; case 1047: VT_int_ToggleAltBuffer(Term, 1); break; @@ -1315,6 +1350,9 @@ int VT_int_ParseEscape(tVTerm *Term, char *Buffer) if(argc != 1) break; switch(args[0]) { + case 25: + Term->Flags |= VT_FLAG_HIDECSR; + break; case 1047: VT_int_ToggleAltBuffer(Term, 0); break;