3 * - By John Hodge (thePowersGang)
6 * - Virtual Terminal - Input code
9 #include <api_drv_keyboard.h>
13 // --- Key States --- (Used for VT Switching/Magic Combos)
14 int gbVT_CtrlDown = 0;
16 int gbVT_SysrqDown = 0;
20 * \fn void VT_InitInput()
21 * \brief Initialises the input
25 giVT_InputDevHandle = VFS_Open(gsVT_InputDevice, VFS_OPENFLAG_READ);
26 if(giVT_InputDevHandle == -1) {
27 Log_Warning("VTerm", "Can't open the input device '%s'", gsVT_InputDevice);
30 VFS_IOCtl(giVT_InputDevHandle, KB_IOCTL_SETCALLBACK, VT_KBCallBack);
31 LOG("VTerm input initialised");
35 * \fn void VT_KBCallBack(Uint32 Codepoint)
36 * \brief Called on keyboard interrupt
37 * \param Codepoint Pseudo-UTF32 character
39 * Handles a key press and sends the key code to the user's buffer.
40 * If the code creates a kernel-magic sequence, it is not passed to the
41 * user and is handled in-kernel.
43 void VT_KBCallBack(Uint32 Codepoint)
45 tVTerm *term = gpVT_CurTerm;
48 switch( Codepoint & KEY_ACTION_MASK )
50 case KEY_ACTION_RAWSYM:
51 term->RawScancode = Codepoint & KEY_CODEPOINT_MASK;
53 case KEY_ACTION_RELEASE:
54 switch(term->RawScancode)
56 case KEYSYM_LEFTALT: gbVT_AltDown &= ~1; break;
57 case KEYSYM_RIGHTALT: gbVT_AltDown &= ~2; break;
58 case KEYSYM_LEFTCTRL: gbVT_CtrlDown &= ~1; break;
59 case KEYSYM_RIGHTCTRL: gbVT_CtrlDown &= ~2; break;
63 case KEY_ACTION_PRESS:
64 switch(term->RawScancode)
66 case KEYSYM_LEFTALT: gbVT_AltDown |= 1; break;
67 case KEYSYM_RIGHTALT: gbVT_AltDown |= 2; break;
68 case KEYSYM_LEFTCTRL: gbVT_CtrlDown |= 1; break;
69 case KEYSYM_RIGHTCTRL: gbVT_CtrlDown |= 2; break;
72 // Check if the magic keys are held
73 if(!gbVT_AltDown || !gbVT_CtrlDown)
76 switch(term->RawScancode)
78 case KEYSYM_F1 : VT_SetTerminal(0); return;
79 case KEYSYM_F2 : VT_SetTerminal(1); return;
80 case KEYSYM_F3 : VT_SetTerminal(2); return;
81 case KEYSYM_F4 : VT_SetTerminal(3); return;
82 case KEYSYM_F5 : VT_SetTerminal(4); return;
83 case KEYSYM_F6 : VT_SetTerminal(5); return;
84 case KEYSYM_F7 : VT_SetTerminal(6); return;
85 case KEYSYM_F8 : VT_SetTerminal(7); return;
86 case KEYSYM_F9 : VT_SetTerminal(8); return;
87 case KEYSYM_F10: VT_SetTerminal(9); return;
88 case KEYSYM_F11: VT_SetTerminal(10); return;
89 case KEYSYM_F12: VT_SetTerminal(11); return;
92 // Scrolling is only valid in text mode
93 if(term->Mode != TERM_MODE_TEXT)
96 // Log_Debug("VTerm", "Magic Ctrl-Alt-0x%x", term->RawScancode);
98 switch(term->RawScancode)
102 if( term->Flags & VT_FLAG_ALTBUF )
104 term->ViewPos = MAX( 0, term->ViewPos - term->Width );
105 VT_int_UpdateScreen(term, 1);
108 if( term->Flags & VT_FLAG_ALTBUF )
111 term->ViewPos + term->Width,
112 term->Width * term->Height * giVT_Scrollback
114 VT_int_UpdateScreen(term, 1);
121 if(term->Mode == PTYBUFFMT_TEXT)
126 // Ignore anything that isn't a press or refire
127 if( (Codepoint & KEY_ACTION_MASK) != KEY_ACTION_PRESS
128 && (Codepoint & KEY_ACTION_MASK) != KEY_ACTION_REFIRE
134 Codepoint &= KEY_CODEPOINT_MASK;
136 // Get UTF-8/ANSI Encoding
139 // Non-printable keys
140 switch(term->RawScancode)
142 case KEYSYM_LEFTARROW:
144 buf[0] = '\x1B'; buf[1] = '['; buf[2] = 'D';
147 case KEYSYM_RIGHTARROW:
149 buf[0] = '\x1B'; buf[1] = '['; buf[2] = 'C';
154 buf[0] = '\x1B'; buf[1] = '['; buf[2] = 'A';
157 case KEYSYM_DOWNARROW:
159 buf[0] = '\x1B'; buf[1] = '['; buf[2] = 'B';
164 case KEYSYM_KP9: // If Codepoint=0, It's page up
165 buf[0] = '\x1B'; buf[1] = '['; buf[2] = '5'; buf[3] = '~';
169 case KEYSYM_KP3: // If Codepoint=0, It's page down
170 buf[0] = '\x1B'; buf[1] = '['; buf[2] = '6'; buf[3] = '~';
175 case KEYSYM_KP7: // Codepoint==0, then it's home (not translated)
176 buf[0] = '\x1B'; buf[1] = 'O'; buf[2] = 'H';
180 case KEYSYM_KP1: // You get the drill
181 buf[0] = '\x1B'; buf[1] = 'O'; buf[2] = 'F';
186 case KEYSYM_KP0: // See above
187 buf[0] = '\x1B'; buf[1] = '['; buf[2] = '2'; buf[3] = '~';
191 case KEYSYM_KPPERIOD: // Are you that dumb? Look up
192 buf[0] = '\x1B'; buf[1] = '['; buf[2] = '3'; buf[3] = '~';
197 else if( gbVT_CtrlDown )
200 switch( term->RawScancode )
205 case KEYSYM_3 ... KEYSYM_7:
206 buf[0] = 0x1b + (term->RawScancode - KEYSYM_3);
211 // - Ctrl-A = \1, Ctrl-Z = \x1a
212 case KEYSYM_a ... KEYSYM_z:
213 buf[0] = 0x01 + (term->RawScancode - KEYSYM_a);
222 // Attempt to encode in UTF-8
223 len = WriteUTF8( buf, Codepoint );
225 Warning("Codepoint (%x) is unrepresentable in UTF-8", Codepoint);
230 // Unprintable / Don't Pass
234 PTY_SendInput(term->PTY, (void*)buf, len);
238 PTY_SendInput(term->PTY, (void*)&Codepoint, sizeof(Codepoint));