From 77ad96c0133d9ffc0a5ac3710e8eb85ba39a68c2 Mon Sep 17 00:00:00 2001 From: Rene Gollent Date: Sun, 27 Sep 2009 23:30:17 +0000 Subject: [PATCH] Patch by Joshua R. Elsasser: Implements DA, reporting that the terminal is a VT102. Implements DEXREQTPARM, reporting the same parameters that xterm does. Fixes DSR 6 to actually report the position of the cursor. Resolves ticket #4659. Thanks! git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@33327 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/apps/terminal/TermParse.cpp | 41 +++++++++++++++++++++++++++++++-- src/apps/terminal/TermParse.h | 1 + src/apps/terminal/VTPrsTbl.c | 4 ++-- 3 files changed, 42 insertions(+), 4 deletions(-) diff --git a/src/apps/terminal/TermParse.cpp b/src/apps/terminal/TermParse.cpp index 6c8bde0e92..2c5dcb28be 100644 --- a/src/apps/terminal/TermParse.cpp +++ b/src/apps/terminal/TermParse.cpp @@ -778,6 +778,14 @@ TermParse::EscParse() parsestate = groundtable; break; + case CASE_DA1: + // DA - report device attributes + if (param[0] < 1) + // claim to be a VT102 + write(fFd, "\033[?6c", 5); + parsestate = groundtable; + break; + case CASE_DECSTBM: /* DECSTBM - set scrolling region */ @@ -799,6 +807,8 @@ TermParse::EscParse() break; case CASE_DECREQTPARM: + // DEXREQTPARM - request terminal parameters + _DecReqTermParms(param[0]); parsestate = groundtable; break; @@ -1079,13 +1089,17 @@ TermParse::_DeviceStatusReport(int n) switch (n) { case 5: { + // Device status report requested + // reply with "no malfunction detected" const char* toWrite = "\033[0n"; write(fFd, toWrite, strlen(toWrite)); break ; } case 6: - len = sprintf(sbuf, "\033[%ld;%ldR", fBuffer->Height(), - fBuffer->Width()) ; + // Cursor position report requested + len = sprintf(sbuf, "\033[%ld;%ldR", + fBuffer->Cursor().y + 1, + fBuffer->Cursor().x + 1); write(fFd, sbuf, len); break ; default: @@ -1094,6 +1108,29 @@ TermParse::_DeviceStatusReport(int n) } +void +TermParse::_DecReqTermParms(int value) +{ + // Terminal parameters report: + // type (2 or 3); + // no parity (1); + // 8 bits per character (1); + // transmit speed 38400bps (128); + // receive speed 38400bps (128); + // bit rate multiplier 16 (1); + // no flags (0) + char parms[] = "\033[?;1;1;128;128;1;0x"; + + if (value < 1) + parms[2] = '2'; + else if (value == 1) + parms[2] = '3'; + else + return; + + write(fFd, parms, strlen(parms)); +} + void TermParse::_DecPrivateModeSet(int value) { diff --git a/src/apps/terminal/TermParse.h b/src/apps/terminal/TermParse.h index 85fa2ad168..a4bd40ec71 100644 --- a/src/apps/terminal/TermParse.h +++ b/src/apps/terminal/TermParse.h @@ -76,6 +76,7 @@ private: status_t _ReadParserBuffer(); void _DeviceStatusReport(int n); + void _DecReqTermParms(int value); void _DecPrivateModeSet(int value); void _DecPrivateModeReset(int value); void _DecSaveCursor(); diff --git a/src/apps/terminal/VTPrsTbl.c b/src/apps/terminal/VTPrsTbl.c index 6ba0a0bdf1..1d9040370a 100644 --- a/src/apps/terminal/VTPrsTbl.c +++ b/src/apps/terminal/VTPrsTbl.c @@ -1135,7 +1135,7 @@ CASE_GROUND_STATE, CASE_GROUND_STATE, CASE_GROUND_STATE, CASE_GROUND_STATE, -CASE_GROUND_STATE, +CASE_DA1, /* d e f g */ CASE_VPA, CASE_GROUND_STATE, @@ -2135,7 +2135,7 @@ CASE_GROUND_STATE, /* X Y Z [ */ CASE_GROUND_STATE, CASE_GROUND_STATE, -CASE_GROUND_STATE, +CASE_DA1, CASE_CSI_STATE, /* \ ] ^ _ */ CASE_GROUND_STATE,