📄 terminalxterm.java
字号:
"\033P", "\033[", "\033]", "\033^", "\033_", }; public final static char CHARSET_UK = 'A'; public final static char CHARSET_ASCII = 'B'; public final static char CHARSET_LINES = '0'; public final static char CHARSET_ASCII_ALT = '1'; public final static char CHARSET_LINES_ALT = '2'; char[] gSets = new char[4]; int scsType; int curGL; int curSS; int curGLDECSC; char[] gSetsDECSC = new char[4]; String xtermSeq = null; String reply = null; public final static int PARAMNOTUSED = -1; int[] parseState; boolean windowRelative; boolean keypadAppl; boolean cursorKeysMode; public final static int MOUSE_DONTSEND = 0; public final static int MOUSE_X10COMP = 1; public final static int MOUSE_DECVT200 = 2; public final static int MOUSE_HLTRACK = 3; int sendMousePos; int[] param = new int[10]; int nparam ; public TerminalXTerm() { this(DEFAULT_TERM); } public TerminalXTerm(int personality) { try { setTerminalTypeInternal(personality); } catch (NoSuchElementException e) { try { setTerminalTypeInternal(DEFAULT_TERM); } catch (NoSuchElementException ee) { // !!! Can't happen... } } } public static String listAvailableTerminalTypes() { int i; String list = " "; for(i = 0; i < terminalTypes.length; i++) list += terminalTypes[i] + " "; return list; } public static String[] getTerminalTypes() { int i, n = 0; for(i = 0; i < terminalTypes.length; i++) if(!terminalTypes[i].equals("")) n++; String[] types = new String[n]; n = 0; for(i = 0; i < terminalTypes.length; i++) if(!terminalTypes[i].equals("")) types[n++] = terminalTypes[i]; return types; } public String terminalType() { return terminalTypes[whoAmI]; } private void setTerminalTypeInternal(int type) throws NoSuchElementException { if(type < terminalTypes.length && type > -1) { whoAmI = type; whoAmIReally = type; if(whoAmI >= EMUL_ALTERNATENAME) whoAmIReally -= EMUL_ALTERNATENAME; vtReset(); } else { throw new NoSuchElementException(type + " is not a supported terminal-emulation"); } } protected void setTerminalType(String type) throws NoSuchElementException { int i; for(i = 0; i < terminalTypes.length; i++) if(terminalTypes[i].equalsIgnoreCase(type)) break; setTerminalTypeInternal(i); } final int mapLineDrawToAscii(char c) { if(c >= (char)0x5f && c <= (char)0x7e) c = (char)asciiLineDrawChars[(int)c - 0x5f]; else if(c >= (char)0x2b && c <= (char)0x2e) { c = (char)asciiLineDrawChars[((int)c - 0x2b) + 0x20]; } else if (c == 0x20) { // !! <space> } else { if(DEBUGNOTIMPL) notImplemented("ASCII line-draw-char: " + c + " (" + ((int)c) + ")"); } return (int)c; } final char mapLineDrawToLinux(char c) { switch(c) { case ' ': c = ' '; break; case '\004': c = '`'; break; case '\261': c = 'a'; break; case '\370': c = 'f'; break; case '\361': c = 'g'; break; case '\260': c = 'h'; break; case '\331': case '\211': c = 'j'; break; case '\277': case '\214': c = 'k'; break; case '\332': case '\206': c = 'l'; break; case '\300': case '\203': c = 'm'; break; case '\305': c = 'n'; break; case '\304': case '\212': c = 'q'; break; case '\362': c = 'r'; break; case '\303': case '\207': c = 't'; break; case '\264': case '\215': c = 'u'; break; case '\301': c = 'v'; break; case '\302': c = 'w'; break; case '\263': case '\205': c = 'x'; break; case '\363': case '\371': c = 'y'; break; case '\372': c = 'z'; break; case '\343': case '\373': c = '{'; break; case '\374': case '\330': c = '|'; break; case '\375': case '\234': c = '}'; break; case '\376': c = '~'; break; case '\031': c = '.'; break; case '\333': c = '+'; break; case '\030': c = '-'; break; default: if(DEBUGNOTIMPL) notImplemented("linux line-draw-char: " + c + " (" + ((int)c) + ")"); break; } return c; } final char mapLineDrawToATT6386(char c) { switch(c) { case ' ': c = ' '; break; case '`': c = '`'; break; case '1': c = 'a'; break; case 'x': c = 'f'; break; case 'q': c = 'g'; break; case '0': c = 'h'; break; case 'Y': c = 'j'; break; case '?': c = 'k'; break; case 'Z': c = 'l'; break; case '@': c = 'm'; break; case 'E': c = 'n'; break; case 'o': c = 'o'; break; case 'p': c = 'p'; break; case 'D': c = 'q'; break; case 'r': c = 'r'; break; case 's': c = 's'; break; case 'C': c = 't'; break; case '4': c = 'u'; break; case 'A': c = 'v'; break; case 'B': c = 'w'; break; case '3': c = 'x'; break; case 'y': c = 'y'; break; case 'z': c = 'z'; break; case '{': c = '{'; break; case '|': c = '|'; break; case '}': c = '}'; break; case '~': c = '~'; break; default: if(DEBUGNOTIMPL) notImplemented("att6386 line-draw-char: " + c + " (" + ((int)c) + ")"); } return c; } public int interpretChar(char c) { int val, h, v; // If we have encountered a national-character we should print it! // The character comes from ssh as 8-bit but we do a // locale-specific translation to a java unicode-String... it's // definately not in for interpretation, silly bug... :-) // if(((int)c) > 0xff) { return (int)c; } switch(parseState[c]) { case CASE_PRINT: if(DEBUGPRINT) System.out.println("PRINT: " + c + "(" + ((int)c) + ")"); int ic = IGNORE; switch(gSets[curGL]) { case CHARSET_UK: if(c == (char)'#') ic = 0x00a3; // unicode pound-sign break; case CHARSET_ASCII: case CHARSET_ASCII_ALT: // Do nothing... ic = (int)c; // Make ctrl-chars print nice (OK, we should really do this in TerminalWin but this is simpler...) // if(ic < 32) { if(ic == 0 && hasNullPadding(whoAmIReally)) return IGNORE; term.write('^'); ic += 64; } break; case CHARSET_LINES: case CHARSET_LINES_ALT: if(!term.getOption(Terminal.OPT_ASCII_LDC)) { if(whoAmIReally == EMUL_LINUX) { c = mapLineDrawToLinux(c); } else if(whoAmIReally == EMUL_ATT6386) { c = mapLineDrawToATT6386(c); } term.writeLineDrawChar(c); } else { ic = mapLineDrawToAscii(c); } break; default: if(DEBUGNOTIMPL) notImplemented("unknown char-set: " + gSets[curGL] + " (" + ((int)gSets[curGL]) + ")"); } return ic; case CASE_GROUND_STATE: if(DEBUG) System.out.println("GND_STATE"); parseState = groundTable; break; case CASE_IGNORE_STATE: if(DEBUG) System.out.println("IGN_STATE"); parseState = ignTable; break; case CASE_IGNORE_ESC: if(DEBUG) System.out.println("IGN_ESC"); parseState = iesTable; break; case CASE_IGNORE: if(DEBUG) System.out.println("IGNORE"); break; case CASE_BELL: if(DEBUG) System.out.println("BELL"); term.doBell(); break; case CASE_BS: if(DEBUG) System.out.println("BS"); term.doBS(); break; case CASE_CR: if(DEBUG) System.out.println("CR"); term.doCR(); parseState = groundTable; break; case CASE_ESC: if(DEBUG) System.out.println("ESC"); parseState = escTable; break; case CASE_VMOT: if(DEBUG) System.out.println("VMOT"); term.doLF(); parseState = groundTable; break; case CASE_TAB: if(DEBUG) System.out.println("TAB"); term.doTab(); break; case CASE_SI: if(DEBUG) System.out.println("SI(curGL = 0)"); curGL = 0; break; case CASE_SO: if(DEBUG) System.out.println("S0(curGL = 1)"); curGL = 1; break; case CASE_SCR_STATE: if(DEBUG) System.out.println("SCR_STATE"); parseState = scrTable; break; case CASE_SCS0_STATE: if(DEBUG) System.out.println("SCS0"); scsType = 0; parseState = scsTable; break; case CASE_SCS1_STATE: if(DEBUG) System.out.println("SCS1"); scsType = 1; parseState = scsTable; break; case CASE_SCS2_STATE: if(DEBUG) System.out.println("SCS2"); scsType = 2; parseState = scsTable; break; case CASE_SCS3_STATE: if(DEBUG) System.out.println("SCS3"); scsType = 3; parseState = scsTable; break; case CASE_ESC_IGNORE: if(DEBUG) System.out.println("ESC_IGN"); parseState = eigTable; break; case CASE_ESC_DIGIT: if(DEBUG) System.out.println("ESC_DIGIT (" + ((int)(c - '0')) + ")"); val = param[nparam - 1]; if(val == PARAMNOTUSED) val = 0; param[nparam - 1] = 10 * val + (c - '0'); break; case CASE_ESC_SEMI: if(DEBUG) System.out.println("ESC_SEMI"); param[nparam++] = PARAMNOTUSED; break; case CASE_ESC_SEMIOSC: if(DEBUG) System.out.println("ESC_SEMIOSC"); param[nparam++] = PARAMNOTUSED; xtermSeq = ""; parseState = xtermSeqTable; break; case CASE_DEC_STATE: if(DEBUG) System.out.println("DEC_STATE"); parseState = decTable;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -