static int blinker; /* When blinking is the cursor on ? */
static int tblinker; /* When the blinking text is on */
static int blink_is_real; /* Actually blink blinking text */
+static int term_echoing; /* Does terminal want local echo? */
+static int term_editing; /* Does terminal want local edit? */
static unsigned long cset_attr[2];
rvideo = 0;
cursor_on = 1;
save_attr = curr_attr = ATTR_DEFAULT;
+ term_editing = term_echoing = FALSE;
+ ldisc_send(NULL, 0); /* cause ldisc to notice changes */
app_cursor_keys = cfg.app_cursor;
app_keypad_keys = cfg.app_keypad;
use_bce = cfg.bce;
case 8: /* auto key repeat */
repeat_off = !state;
break;
+ case 10: /* set local edit mode */
+ term_editing = state;
+ ldisc_send(NULL, 0); /* cause ldisc to notice changes */
+ break;
case 25: /* enable/disable cursor */
compatibility2(OTHER,VT220);
cursor_on = state;
insert = state;
break;
case 12: /* set echo mode */
- /*
- * This may be very good in smcup and rmcup (or smkx & rmkx) if you
- * have a long RTT and the telnet client/daemon doesn't understand
- * linemode.
- *
- * DONT send TS_RECHO/TS_LECHO; the telnet daemon tries to fix the
- * tty and _really_ confuses some programs.
- */
- compatibility2(OTHER,VT220);
- ldisc = (state? &ldisc_simple : &ldisc_term);
+ term_echoing = !state;
+ ldisc_send(NULL, 0); /* cause ldisc to notice changes */
break;
case 20: /* Return sends ... */
cr_lf_return = state;
*
* An xterm returns "xterm" (5 characters)
*/
- compatibility(OTHER);
- ldisc->send ("PuTTY", 5);
+ compatibility(ANSIMIN);
+ {
+ char abuf[256], *s, *d;
+ int state=0;
+ for(s=cfg.answerback, d=abuf; *s; s++) {
+ if (state)
+ {
+ if (*s >= 'a' && *s <= 'z')
+ *d++ = (*s - ('a'-1));
+ else if ((*s >='@' && *s<='_') ||
+ *s == '?' || (*s&0x80))
+ *d++ = ('@'^*s);
+ else if (*s == '~')
+ *d++ = '^';
+ state = 0;
+ }
+ else if (*s == '^') {
+ state = 1;
+ }
+ else
+ *d++ = xlat_kbd2tty((unsigned char)*s);
+ }
+ ldisc_send (abuf, d-abuf);
+ }
break;
case '\007':
beep_count++;
break;
case 'Z': /* terminal type query */
compatibility(VT100);
- ldisc->send (id_string, strlen(id_string));
+ ldisc_send (id_string, strlen(id_string));
break;
case 'c': /* restore power-on settings */
compatibility(VT100);
case 'c': /* terminal type query */
compatibility(VT100);
/* This is the response for a VT102 */
- ldisc->send (id_string, strlen(id_string));
+ ldisc_send (id_string, strlen(id_string));
break;
case 'n': /* cursor position query */
if (esc_args[0] == 6) {
char buf[32];
sprintf (buf, "\033[%d;%dR", curs_y + 1, curs_x + 1);
- ldisc->send (buf, strlen(buf));
+ ldisc_send (buf, strlen(buf));
}
else if (esc_args[0] == 5) {
- ldisc->send ("\033[0n", 4);
+ ldisc_send ("\033[0n", 4);
}
break;
case 'h': /* toggle modes to high */
if (i == 0 || i == 1) {
strcpy (buf, "\033[2;1;1;112;112;1;0x");
buf[2] += i;
- ldisc->send (buf, 20);
+ ldisc_send (buf, 20);
}
}
break;
termstate = VT52_Y1;
break;
case 'Z':
- ldisc->send ("\033/Z", 3);
+ ldisc_send ("\033/Z", 3);
break;
case '=':
app_keypad_keys = TRUE;
*/
void term_blink(int flg) {
-static long last_blink = 0;
-static long last_tblink = 0;
+ static long last_blink = 0;
+ static long last_tblink = 0;
long now, blink_diff;
now = GetTickCount();
blink_diff = now-last_blink;
- /* Make sure the cursor blinks no more than 2Hz */
- if (blink_diff>=0 && blink_diff<450)
+ /* Make sure the cursor blinks no faster than GetCaretBlinkTime() */
+ if (blink_diff>=0 && blink_diff<(long)GetCaretBlinkTime())
return;
last_blink = now;
}
while (top < nlpos && top < bottom)
{
-#if 0
- /* VT Specials -> ISO8859-1 */
- static const char poorman2[] =
+ int ch = (*top & CHAR_MASK);
+ int set = (*top & CSET_MASK);
+
+ /* VT Specials -> ISO8859-1 for Cut&Paste */
+ static const unsigned char poorman2[] =
"* # HTFFCRLF\xB0 \xB1 NLVT+ + + + + - - - - - + + + + | <=>=PI!=\xA3 \xB7 ";
-#endif
- int ch = (*top & CHAR_MASK);
+ if (set && !cfg.rawcnp) {
+ if (set == ATTR_LINEDRW && ch >= 0x60 && ch < 0x7F) {
+ int x;
+ if ((x = poorman2[2*(ch-0x60)+1]) == ' ')
+ x = 0;
+ ch = (x<<8) + poorman2[2*(ch-0x60)];
+ }
+ }
-#if 0
- if ((*top & ATTR_LINEDRW) && ch >= 0x60 && ch < 0x7F) {
- int x;
- *wbptr++ = poorman2[2*(ch-0x60)];
- if ( (x = poorman2[2*(ch-0x60)+1]) != ' ')
- *wbptr++ = x;
- } else
-#endif
-#if 0
- if ((*top & ATTR_GBCHR) && ch == '#')
- *wbptr++ = (unsigned char) 0xA3;
- else
-#endif
- if ( wblen == buflen )
- {
- workbuf = srealloc(workbuf, buflen += 100);
- wbptr = workbuf + wblen;
+ while(ch != 0) {
+ if (cfg.rawcnp || !!(ch&0xE0)) {
+ if ( wblen == buflen )
+ {
+ workbuf = srealloc(workbuf, buflen += 100);
+ wbptr = workbuf + wblen;
+ }
+ wblen++;
+ *wbptr++ = (unsigned char) ch;
+ }
+ ch>>=8;
}
- wblen++;
- *wbptr++ = (unsigned char) ch;
top++;
}
if (nl) {
/* Assume a small paste will be OK in one go. */
if (paste_len<256) {
- ldisc->send (paste_buffer, paste_len);
+ ldisc_send (paste_buffer, paste_len);
if (paste_buffer) sfree(paste_buffer);
paste_buffer = 0;
paste_pos = paste_hold = paste_len = 0;
if (paste_buffer[paste_pos + n++] == '\r')
break;
}
- ldisc->send (paste_buffer+paste_pos, n);
+ ldisc_send (paste_buffer+paste_pos, n);
paste_pos += n;
if (paste_pos < paste_len) {
term_update();
}
+int term_ldisc(int option) {
+ if (option == LD_ECHO) return term_echoing;
+ if (option == LD_EDIT) return term_editing;
+ return FALSE;
+}
+
/*
* from_backend(), to get data from the backend for the terminal.
*/