commit - de4154976cdc9b37862f87246b1a30991302d4d8
commit + f4da90ffc0fa17ab863ca5ddbbec7c02e0458e06
blob - 6f9aabefe34294ca8db22e8c61c72edc92db1e32
blob + 96d4daf424f25339f31924b4c9e124a13975c564
--- de/mud/terminal/vt320.java
+++ de/mud/terminal/vt320.java
b[4] = (byte) (0x20 + pos.x + 1);
b[5] = (byte) (0x20 + pos.y + 1);
- write(b);
+ write(b); // FIXME: writeSpecial here
}
public void mouseReleased(MouseEvent evt) {
if (mouserpt==0)
b[3] = (byte)mousecode;
b[4] = (byte) (0x20 + pos.x + 1);
b[5] = (byte) (0x20 + pos.y + 1);
- write(b);
+ write(b); // FIXME: writeSpecial here
mousebut = 0;
}
});
int insertmode = 0;
int statusmode = 0;
boolean vt52mode = false;
+ boolean keypadmode = false; /* false - numeric, true - application */
+ boolean output8bit = false;
int normalcursor = 0;
boolean moveoutsidemargins = true;
boolean wraparound = true;
private final static int TSTATE_ESCSPACE = 13; /* ESC <space> */
private final static int TSTATE_VT52X = 14;
private final static int TSTATE_VT52Y = 15;
+ private final static int TSTATE_CSI_TICKS = 16;
/* The graphics charsets
* B - default ASCII
/**
* A small conveniance method thar converts a 7bit string to the 8bit
- * version if VT52 mode is not set.
+ * version depending on VT52/Output8Bit mode.
+ *
* @param s the string to be sent
- * @param doecho echo to terminal
*/
- private boolean writeNumpad(String s) {
- if (((s.length() == 3) && (s.charAt(0) == 27) && (s.charAt(1)=='O'))) {
+ private boolean writeSpecial(String s) {
+ if (((s.length() >= 3) && (s.charAt(0) == 27) && (s.charAt(1)=='O'))) {
if (vt52mode) {
s="\u001b?"+s.substring(2); /* ESC ? x */
} else {
- s="\u008f"+s.substring(2); /* SS3 ? x */
+ if (output8bit) {
+ s="\u008f"+s.substring(2); /* SS3 x */
+ } /* else keep string as it is */
}
}
+ if (((s.length() >= 3) && (s.charAt(0) == 27) && (s.charAt(1)=='['))) {
+ if (output8bit) {
+ s="\u009b"+s.substring(2); /* CSI ... */
+ } /* else keep */
+ }
return write(s,false);
}
if (shift || control)
sendTelnetCommand((byte)243); // BREAK
break;
- case KeyEvent.VK_F1: write(fmap[1],false); break;
- case KeyEvent.VK_F2: write(fmap[2],false); break;
- case KeyEvent.VK_F3: write(fmap[3],false); break;
- case KeyEvent.VK_F4: write(fmap[4],false); break;
- case KeyEvent.VK_F5: write(fmap[5],false); break;
- case KeyEvent.VK_F6: write(fmap[6],false); break;
- case KeyEvent.VK_F7: write(fmap[7],false); break;
- case KeyEvent.VK_F8: write(fmap[8],false); break;
- case KeyEvent.VK_F9: write(fmap[9],false); break;
- case KeyEvent.VK_F10: write(fmap[10],false); break;
- case KeyEvent.VK_F11: write(fmap[11],false); break;
- case KeyEvent.VK_F12: write(fmap[12],false); break;
- case KeyEvent.VK_UP: write(KeyUp[xind],false); break;
- case KeyEvent.VK_DOWN: write(KeyDown[xind],false); break;
- case KeyEvent.VK_LEFT: write(KeyLeft[xind],false); break;
- case KeyEvent.VK_RIGHT: write(KeyRight[xind],false); break;
- case KeyEvent.VK_PAGE_DOWN: write(NextScn[xind],false); break;
- case KeyEvent.VK_PAGE_UP: write(PrevScn[xind],false); break;
- case KeyEvent.VK_INSERT: write(Insert[xind],false); break;
- case KeyEvent.VK_DELETE: write(Remove[xind],false); break;
- case KeyEvent.VK_ESCAPE: write(Escape[xind],false); break;
- case KeyEvent.VK_BACK_SPACE: write(BackSpace[xind]); break;
- case KeyEvent.VK_HOME: write(KeyHome[xind],false); break;
- case KeyEvent.VK_END: write(KeyEnd[xind],false); break;
+ case KeyEvent.VK_F1: writeSpecial(fmap[1]); break;
+ case KeyEvent.VK_F2: writeSpecial(fmap[2]); break;
+ case KeyEvent.VK_F3: writeSpecial(fmap[3]); break;
+ case KeyEvent.VK_F4: writeSpecial(fmap[4]); break;
+ case KeyEvent.VK_F5: writeSpecial(fmap[5]); break;
+ case KeyEvent.VK_F6: writeSpecial(fmap[6]); break;
+ case KeyEvent.VK_F7: writeSpecial(fmap[7]); break;
+ case KeyEvent.VK_F8: writeSpecial(fmap[8]); break;
+ case KeyEvent.VK_F9: writeSpecial(fmap[9]); break;
+ case KeyEvent.VK_F10: writeSpecial(fmap[10]); break;
+ case KeyEvent.VK_F11: writeSpecial(fmap[11]); break;
+ case KeyEvent.VK_F12: writeSpecial(fmap[12]); break;
+ case KeyEvent.VK_UP: writeSpecial(KeyUp[xind]); break;
+ case KeyEvent.VK_DOWN: writeSpecial(KeyDown[xind]); break;
+ case KeyEvent.VK_LEFT: writeSpecial(KeyLeft[xind]); break;
+ case KeyEvent.VK_RIGHT: writeSpecial(KeyRight[xind]); break;
+ case KeyEvent.VK_PAGE_DOWN: writeSpecial(NextScn[xind]); break;
+ case KeyEvent.VK_PAGE_UP: writeSpecial(PrevScn[xind]); break;
+ case KeyEvent.VK_INSERT: writeSpecial(Insert[xind]); break;
+ case KeyEvent.VK_DELETE: writeSpecial(Remove[xind]); break;
+ case KeyEvent.VK_ESCAPE: writeSpecial(Escape[xind]); break;
+ case KeyEvent.VK_BACK_SPACE: writeSpecial(BackSpace[xind]); break;
+ case KeyEvent.VK_HOME: writeSpecial(KeyHome[xind]); break;
+ case KeyEvent.VK_END: writeSpecial(KeyEnd[xind]); break;
case KeyEvent.VK_NUM_LOCK:
if(vms && control) {
- writeNumpad(PF1);
+ writeSpecial(PF1);
}
if(!control)
numlock = !numlock;
if(vms) {
if(keyChar == 127 && !control) {
if (shift)
- writeNumpad(Insert[0]); // VMS shift delete = insert
+ writeSpecial(Insert[0]); // VMS shift delete = insert
else
- writeNumpad(Remove[0]); // VMS delete = remove
+ writeSpecial(Remove[0]); // VMS delete = remove
return;
} else if(control)
switch(keyChar) {
- case '0': writeNumpad(Numpad[0]); return;
- case '1': writeNumpad(Numpad[1]); return;
- case '2': writeNumpad(Numpad[2]); return;
- case '3': writeNumpad(Numpad[3]); return;
- case '4': writeNumpad(Numpad[4]); return;
- case '5': writeNumpad(Numpad[5]); return;
- case '6': writeNumpad(Numpad[6]); return;
- case '7': writeNumpad(Numpad[7]); return;
- case '8': writeNumpad(Numpad[8]); return;
- case '9': writeNumpad(Numpad[9]); return;
- case '.': writeNumpad(KPPeriod); return;
+ case '0': writeSpecial(Numpad[0]); return;
+ case '1': writeSpecial(Numpad[1]); return;
+ case '2': writeSpecial(Numpad[2]); return;
+ case '3': writeSpecial(Numpad[3]); return;
+ case '4': writeSpecial(Numpad[4]); return;
+ case '5': writeSpecial(Numpad[5]); return;
+ case '6': writeSpecial(Numpad[6]); return;
+ case '7': writeSpecial(Numpad[7]); return;
+ case '8': writeSpecial(Numpad[8]); return;
+ case '9': writeSpecial(Numpad[9]); return;
+ case '.': writeSpecial(KPPeriod); return;
case '-':
- case 31: writeNumpad(KPMinus); return;
- case '+': writeNumpad(KPComma); return;
- case 10: writeNumpad(KPEnter); return;
- case '/': writeNumpad(PF2); return;
- case '*': writeNumpad(PF3); return;
+ case 31: writeSpecial(KPMinus); return;
+ case '+': writeSpecial(KPComma); return;
+ case 10: writeSpecial(KPEnter); return;
+ case '/': writeSpecial(PF2); return;
+ case '*': writeSpecial(PF3); return;
/* NUMLOCK handled in keyPressed */
default:
break;
if(alt) { fmap = FunctionKeyAlt; xind=3; }
if(evt.isActionKey()) switch(keyCode) {
- case KeyEvent.VK_NUMPAD0: write(Numpad[0],false); return;
- case KeyEvent.VK_NUMPAD1: write(Numpad[1],false); return;
- case KeyEvent.VK_NUMPAD2: write(Numpad[2],false); return;
- case KeyEvent.VK_NUMPAD3: write(Numpad[3],false); return;
- case KeyEvent.VK_NUMPAD4: write(Numpad[4],false); return;
- case KeyEvent.VK_NUMPAD5: write(Numpad[5],false); return;
- case KeyEvent.VK_NUMPAD6: write(Numpad[6],false); return;
- case KeyEvent.VK_NUMPAD7: write(Numpad[7],false); return;
- case KeyEvent.VK_NUMPAD8: write(Numpad[8],false); return;
- case KeyEvent.VK_NUMPAD9: write(Numpad[9],false); return;
- case KeyEvent.VK_DECIMAL: write(NUMDot[xind],false); return;
- case KeyEvent.VK_ADD: write(NUMPlus[xind],false); return;
+ case KeyEvent.VK_NUMPAD0: writeSpecial(Numpad[0]); return;
+ case KeyEvent.VK_NUMPAD1: writeSpecial(Numpad[1]); return;
+ case KeyEvent.VK_NUMPAD2: writeSpecial(Numpad[2]); return;
+ case KeyEvent.VK_NUMPAD3: writeSpecial(Numpad[3]); return;
+ case KeyEvent.VK_NUMPAD4: writeSpecial(Numpad[4]); return;
+ case KeyEvent.VK_NUMPAD5: writeSpecial(Numpad[5]); return;
+ case KeyEvent.VK_NUMPAD6: writeSpecial(Numpad[6]); return;
+ case KeyEvent.VK_NUMPAD7: writeSpecial(Numpad[7]); return;
+ case KeyEvent.VK_NUMPAD8: writeSpecial(Numpad[8]); return;
+ case KeyEvent.VK_NUMPAD9: writeSpecial(Numpad[9]); return;
+ case KeyEvent.VK_DECIMAL: writeSpecial(NUMDot[xind]); return;
+ case KeyEvent.VK_ADD: writeSpecial(NUMPlus[xind]); return;
}
if (!((keyChar == 8) || (keyChar == 127) || (keyChar =='\r') || (keyChar == '\n'))) {
mapped = true;
break;
default:
- System.out.println("Unsupported GL mapping: "+gx[thisgl]+"\n");
+ System.out.println("Unsupported GL mapping: "+gx[thisgl]);
break;
}
}
break;
case 'A':case 'B': mapped = true; break;
default:
- System.out.println("Unsupported GR mapping: "+gx[thisgl]+"\n");
+ System.out.println("Unsupported GR mapping: "+gx[gr]);
break;
}
}
case TSTATE_ESCSPACE:
term_state = TSTATE_DATA;
switch (c) {
- default: System.out.println("ESC <space> "+c+" unhandled.");
+ case 'F': /* S7C1T, Disable output of 8-bit controls, use 7-bit */
+ output8bit=false;
+ break;
+ case 'G': /* S8C1T, Enable output of 8-bit control codes*/
+ output8bit=true;
+ break;
+ default:
+ System.out.println("ESC <space> "+c+" unhandled.");
}
break;
case TSTATE_ESC:
/*application keypad*/
if (debug>0)
System.out.println("ESC =");
+ keypadmode = true;
break;
case '>': /*normal keypad*/
if (debug>0)
System.out.println("ESC >");
+ keypadmode = false;
break;
case '7': /*save cursor, attributes, margins */
Sc = C; Sr = R;
break;
case 2: /* DECANM */
vt52mode = true;
- System.out.println("vt52 mode enabled");
+ //System.out.println("vt52 mode enabled");
break;
case 3: /* 132 columns*/
size = getSize();
break;
case 2: /* DECANM */
vt52mode = false;
- System.out.println("vt52 mode disabled");
+ //System.out.println("vt52 mode disabled");
break;
case 3: /* 80 columns*/
size = getSize();
break;
}
break;
+ case TSTATE_CSI_TICKS:
+ term_state = TSTATE_DATA;
+ switch (c) {
+ case 'p':
+ System.out.println("Conformance level: "+DCEvars[0]+" (unsupported),"+DCEvars[1]);
+ if (DCEvars[1]==1)
+ output8bit = false;
+ else
+ output8bit = true; /* 0 or 2 */
+ break;
+ default:
+ System.out.println("Unknown ESC [... \""+c);
+ break;
+ }
+ break;
case TSTATE_CSI_DOLLAR:
term_state = TSTATE_DATA;
switch (c) {
case TSTATE_CSI:
term_state = TSTATE_DATA;
switch (c) {
+ case '"':
+ term_state = TSTATE_CSI_TICKS;
+ break;
case '$':
term_state=TSTATE_CSI_DOLLAR;
break;
case 'n':
switch (DCEvars[0]){
case 5: /* malfunction? No malfunction. */
- write(((char)ESC)+"[0n",false);
+ writeSpecial(((char)ESC)+"[0n");
if(debug > 1)
System.out.println("ESC[5n");
break;
case 6:
// DO NOT offset R and C by 1! (checked against /usr/X11R6/bin/resize
- write(((char)ESC)+"["+R+";"+C+"R",false);
+ // FIXME check again.
+ // FIXME: but vttest thinks different???
+ writeSpecial(((char)ESC)+"["+R+";"+C+"R");
if(debug > 1)
System.out.println("ESC[6n");
break;