Develop and Download Open Source Software

Browse Subversion Repository

Diff of /trunk/teraterm/teraterm/vtterm.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 6160 by doda, Wed Nov 25 11:02:41 2015 UTC revision 6173 by doda, Mon Nov 30 09:30:33 2015 UTC
# Line 1437  void ParseEscape(BYTE b) /* b is the fin Line 1437  void ParseEscape(BYTE b) /* b is the fin
1437    
1438  void EscapeSequence(BYTE b)  void EscapeSequence(BYTE b)
1439  {  {
1440    if (b<=US)          if (b<=US)
1441      ParseControl(b);                  ParseControl(b);
1442    else if ((b>=0x20) && (b<=0x2F))          else if ((b>=0x20) && (b<=0x2F)) {
1443    {                  if (ICount<IntCharMax)
1444      if (ICount<IntCharMax) ICount++;                          ICount++;
1445      IntChar[ICount] = b;                  IntChar[ICount] = b;
1446    }          }
1447    else if ((b>=0x30) && (b<=0x7E))          else if ((b>=0x30) && (b<=0x7E))
1448      ParseEscape(b);                  ParseEscape(b);
1449    else if ((b>=0x80) && (b<=0x9F))          else if ((b>=0x80) && (b<=0x9F))
1450      ParseControl(b);                  ParseControl(b);
1451    else if (b>=0xA0) {          else if (b>=0xA0) {
1452      ParseMode=ModeFirst;                  ParseMode=ModeFirst;
1453      ParseFirst(b);                  ParseFirst(b);
1454    }          }
1455    
1456    JustAfterESC = FALSE;          JustAfterESC = FALSE;
1457  }  }
1458    
1459    void CSInsertCharacter()              // ICH  void CSInsertCharacter()                // ICH
1460    {  {
1461    // Insert space characters at cursor          // Insert space characters at cursor
1462      int Count;          int Count;
1463    
1464      BuffUpdateScroll();          BuffUpdateScroll();
1465      if (Param[1]<1) Param[1] = 1;          if (Param[1]<1) Param[1] = 1;
1466      Count = Param[1];          Count = Param[1];
1467      BuffInsertSpace(Count);          BuffInsertSpace(Count);
1468    }  }
1469    
1470  void CSCursorUp(BOOL AffectMargin)      // CUU / VPB  void CSCursorUp(BOOL AffectMargin)      // CUU / VPB
1471  {  {
# Line 1521  void CSScreenErase() Line 1521  void CSScreenErase()
1521  {  {
1522          BuffUpdateScroll();          BuffUpdateScroll();
1523          switch (Param[1]) {          switch (Param[1]) {
1524          case 0:            case 0:
1525                  // <ESC>[H(Cursor in left upper corner)によりカーソルが左上隅を指している場合、                  // <ESC>[H(Cursor in left upper corner)によりカーソルが左上隅を指している場合、
1526                  // <ESC>[Jは<ESC>[2Jと同じことなので、処理を分け、現行バッファをスクロールアウト                  // <ESC>[Jは<ESC>[2Jと同じことなので、処理を分け、現行バッファをスクロールアウト
1527                  // させるようにする。(2005.5.29 yutaka)                  // させるようにする。(2005.5.29 yutaka)
1528                  // コンフィグレーションで切り替えられるようにした。(2008.5.3 yutaka)                  // コンフィグレーションで切り替えられるようにした。(2008.5.3 yutaka)
1529                  if (ts.ScrollWindowClearScreen &&                  if (ts.ScrollWindowClearScreen &&
1530                          (CursorX == 0 && CursorY == 0)) {                          (CursorX == 0 && CursorY == 0)) {
1531                          //      Erase screen (scroll out)                          // Erase screen (scroll out)
1532                          BuffClearScreen();                          BuffClearScreen();
1533                          UpdateWindow(HVTWin);                          UpdateWindow(HVTWin);
1534    
1535                  } else {                  } else {
1536                          //      Erase characters from cursor to the end of screen                          // Erase characters from cursor to the end of screen
1537                          BuffEraseCurToEnd();                          BuffEraseCurToEnd();
1538                  }                  }
1539                  break;                  break;
1540    
1541          case 1:            case 1:
1542                  //      Erase characters from home to cursor                  // Erase characters from home to cursor
1543                  BuffEraseHomeToCur();                  BuffEraseHomeToCur();
1544                  break;                  break;
1545    
1546          case 2:            case 2:
1547                  //      Erase screen (scroll out)                  // Erase screen (scroll out)
1548                  BuffClearScreen();                  BuffClearScreen();
1549                  UpdateWindow(HVTWin);                  UpdateWindow(HVTWin);
1550                  if (ClearThenHome && !isCursorOnStatusLine) {                  if (ClearThenHome && !isCursorOnStatusLine) {
# Line 1563  void CSQSelScreenErase() Line 1563  void CSQSelScreenErase()
1563  {  {
1564          BuffUpdateScroll();          BuffUpdateScroll();
1565          switch (Param[1]) {          switch (Param[1]) {
1566          case 0:            case 0:
1567                  //      Erase characters from cursor to end                  // Erase characters from cursor to end
1568                  BuffSelectedEraseCurToEnd();                  BuffSelectedEraseCurToEnd();
1569                  break;                  break;
1570    
1571          case 1:            case 1:
1572                  //      Erase characters from home to cursor                  // Erase characters from home to cursor
1573                  BuffSelectedEraseHomeToCur();                  BuffSelectedEraseHomeToCur();
1574                  break;                  break;
1575    
1576          case 2:            case 2:
1577                  //      Erase entire screen                  // Erase entire screen
1578                  BuffSelectedEraseScreen();                  BuffSelectedEraseScreen();
1579                  break;                  break;
1580          }          }
1581  }  }
1582    
1583    void CSInsertLine()  void CSInsertLine()
1584    {  {
1585    // Insert lines at current position          // Insert lines at current position
1586      int Count, YEnd;          int Count, YEnd;
1587    
1588      if (CursorY < CursorTop) return;          if (CursorY < CursorTop)
1589      if (CursorY > CursorBottom) return;                  return;
1590      if (Param[1]<1) Param[1] = 1;          if (CursorY > CursorBottom)
1591      Count = Param[1];                  return;
1592            if (Param[1]<1)
1593      YEnd = CursorBottom;                  Param[1] = 1;
1594      if (CursorY > YEnd) YEnd = NumOfLines-1-StatusLine;  
1595      if (Count > YEnd+1 - CursorY) Count = YEnd+1 - CursorY;          Count = Param[1];
1596    
1597      BuffInsertLines(Count,YEnd);          YEnd = CursorBottom;
1598    }          if (CursorY > YEnd)
1599                    YEnd = NumOfLines-1-StatusLine;
1600    void CSLineErase()          if (Count > YEnd+1 - CursorY)
1601    {                  Count = YEnd+1 - CursorY;
1602      BuffUpdateScroll();  
1603      switch (Param[1]) {          BuffInsertLines(Count,YEnd);
1604        /* erase char from cursor to end of line */  }
1605        case 0:  
1606          BuffEraseCharsInLine(CursorX,NumOfColumns-CursorX);  void CSLineErase()
1607          break;  {
1608        /* erase char from start of line to cursor */          BuffUpdateScroll();
1609        case 1:          switch (Param[1]) {
1610          BuffEraseCharsInLine(0,CursorX+1);            case 0: /* erase char from cursor to end of line */
1611          break;                  BuffEraseCharsInLine(CursorX,NumOfColumns-CursorX);
1612        /* erase entire line */                  break;
1613        case 2:  
1614          BuffEraseCharsInLine(0,NumOfColumns);            case 1: /* erase char from start of line to cursor */
1615          break;                  BuffEraseCharsInLine(0,CursorX+1);
1616      }                  break;
1617    }  
1618              case 2: /* erase entire line */
1619    void CSQSelLineErase()                  BuffEraseCharsInLine(0,NumOfColumns);
1620    {                  break;
1621      BuffUpdateScroll();          }
1622      switch (Param[1]) {  }
1623        /* erase char from cursor to end of line */  
1624        case 0:  void CSQSelLineErase()
1625          BuffSelectedEraseCharsInLine(CursorX,NumOfColumns-CursorX);  {
1626          break;          BuffUpdateScroll();
1627        /* erase char from start of line to cursor */          switch (Param[1]) {
1628        case 1:            case 0: /* erase char from cursor to end of line */
1629          BuffSelectedEraseCharsInLine(0,CursorX+1);                  BuffSelectedEraseCharsInLine(CursorX,NumOfColumns-CursorX);
1630          break;                  break;
1631        /* erase entire line */  
1632        case 2:            case 1: /* erase char from start of line to cursor */
1633          BuffSelectedEraseCharsInLine(0,NumOfColumns);                  BuffSelectedEraseCharsInLine(0,CursorX+1);
1634          break;                  break;
1635      }  
1636    }            case 2: /* erase entire line */
1637                    BuffSelectedEraseCharsInLine(0,NumOfColumns);
1638    void CSDeleteNLines()                  break;
1639    // Delete lines from current line          }
1640    {  }
1641      int Count, YEnd;  
1642    void CSDeleteNLines()
1643      if (CursorY < CursorTop) return;  // Delete lines from current line
1644      if (CursorY > CursorBottom) return;  {
1645      Count = Param[1];          int Count, YEnd;
1646      if (Count<1) Count = 1;  
1647            if (CursorY < CursorTop)
1648      YEnd = CursorBottom;                  return;
1649      if (CursorY > YEnd) YEnd = NumOfLines-1-StatusLine;          if (CursorY > CursorBottom)
1650      if (Count > YEnd+1-CursorY) Count = YEnd+1-CursorY;                  return;
1651      BuffDeleteLines(Count,YEnd);          Count = Param[1];
1652    }          if (Count<1) Count = 1;
1653    
1654    void CSDeleteCharacter()              // DCH          YEnd = CursorBottom;
1655    {          if (CursorY > YEnd)
1656    // Delete characters in current line from cursor                  YEnd = NumOfLines-1-StatusLine;
1657            if (Count > YEnd+1-CursorY)
1658      if (Param[1]<1) Param[1] = 1;                  Count = YEnd+1-CursorY;
1659      BuffUpdateScroll();          BuffDeleteLines(Count,YEnd);
1660      BuffDeleteChars(Param[1]);  }
1661    }  
1662    void CSDeleteCharacter()        // DCH
1663    void CSEraseCharacter()               // ECH  {
1664    {  // Delete characters in current line from cursor
1665      if (Param[1]<1) Param[1] = 1;  
1666      BuffUpdateScroll();          if (Param[1]<1) Param[1] = 1;
1667      BuffEraseChars(Param[1]);          BuffUpdateScroll();
1668    }          BuffDeleteChars(Param[1]);
1669    }
1670    void CSScrollUp()  
1671    {  void CSEraseCharacter()         // ECH
1672      if (Param[1]<1) Param[1] = 1;  {
1673      BuffUpdateScroll();          if (Param[1]<1) Param[1] = 1;
1674      BuffRegionScrollUpNLines(Param[1]);          BuffUpdateScroll();
1675    }          BuffEraseChars(Param[1]);
1676    }
1677    void CSScrollDown()  
1678    {  void CSScrollUp()
1679      if (Param[1]<1) Param[1] = 1;  {
1680      BuffUpdateScroll();          if (Param[1]<1) Param[1] = 1;
1681      BuffRegionScrollDownNLines(Param[1]);          BuffUpdateScroll();
1682    }          BuffRegionScrollUpNLines(Param[1]);
1683    }
1684    void CSForwardTab()  
1685    {  void CSScrollDown()
1686      if (Param[1]<1) Param[1] = 1;  {
1687      CursorForwardTab(Param[1], AutoWrapMode);          if (Param[1]<1) Param[1] = 1;
1688    }          BuffUpdateScroll();
1689            BuffRegionScrollDownNLines(Param[1]);
1690    void CSBackwardTab()  }
1691    {  
1692      if (Param[1]<1) Param[1] = 1;  void CSForwardTab()
1693      CursorBackwardTab(Param[1]);  {
1694    }          if (Param[1]<1) Param[1] = 1;
1695            CursorForwardTab(Param[1], AutoWrapMode);
1696    }
1697    
1698    void CSBackwardTab()
1699    {
1700            if (Param[1]<1) Param[1] = 1;
1701            CursorBackwardTab(Param[1]);
1702    }
1703    
1704  void CSMoveToColumnN()          // CHA / HPA  void CSMoveToColumnN()          // CHA / HPA
1705  {  {
# Line 1751  void CSCursorLeft(BOOL AffectMargin)   // Line 1759  void CSCursorLeft(BOOL AffectMargin)   //
1759          MoveCursor(NewX, CursorY);          MoveCursor(NewX, CursorY);
1760  }  }
1761    
1762    void CSMoveToLineN()                  // VPA  void CSMoveToLineN()                    // VPA
1763    {  {
1764      if (Param[1]<1) Param[1] = 1;          if (Param[1]<1) Param[1] = 1;
1765      if (RelativeOrgMode)          if (RelativeOrgMode) {
1766      {                  if (CursorTop+Param[1]-1 > CursorBottom)
1767        if (CursorTop+Param[1]-1 > CursorBottom)                          MoveCursor(CursorX,CursorBottom);
1768          MoveCursor(CursorX,CursorBottom);                  else
1769        else                          MoveCursor(CursorX,CursorTop+Param[1]-1);
1770          MoveCursor(CursorX,CursorTop+Param[1]-1);          }
1771      }          else {
1772      else {                  if (Param[1] > NumOfLines-StatusLine)
1773        if (Param[1] > NumOfLines-StatusLine)                          MoveCursor(CursorX,NumOfLines-1-StatusLine);
1774          MoveCursor(CursorX,NumOfLines-1-StatusLine);                  else
1775        else                          MoveCursor(CursorX,Param[1]-1);
1776          MoveCursor(CursorX,Param[1]-1);          }
1777      }  }
   }  
1778    
1779  void CSMoveToXY()               // CUP / HVP  void CSMoveToXY()               // CUP / HVP
1780  {  {
# Line 1806  void CSMoveToXY()              // CUP / HVP Line 1813  void CSMoveToXY()              // CUP / HVP
1813          MoveCursor(NewX, NewY);          MoveCursor(NewX, NewY);
1814  }  }
1815    
1816    void CSDeleteTabStop()  void CSDeleteTabStop()
1817    {  {
1818      ClearTabStop(Param[1]);          ClearTabStop(Param[1]);
1819    }  }
1820    
1821    void CS_h_Mode()              // SM  void CS_h_Mode()                // SM
1822    {  {
1823      switch (Param[1]) {          switch (Param[1]) {
1824        case 2:   // KAM            case 2:       // KAM
1825          KeybEnabled = FALSE; break;                  KeybEnabled = FALSE; break;
1826        case 4:   // IRM            case 4:       // IRM
1827          InsertMode = TRUE; break;                  InsertMode = TRUE; break;
1828        case 12:  // SRM            case 12:      // SRM
1829          ts.LocalEcho = 0;                  ts.LocalEcho = 0;
1830          if (cv.Ready && cv.TelFlag && (ts.TelEcho>0))                  if (cv.Ready && cv.TelFlag && (ts.TelEcho>0))
1831            TelChangeEcho();                          TelChangeEcho();
1832          break;                  break;
1833        case 20:  // LF/NL            case 20:      // LF/NL
1834          LFMode = TRUE;                  LFMode = TRUE;
1835          ts.CRSend = IdCRLF;                  ts.CRSend = IdCRLF;
1836          cv.CRSend = IdCRLF;                  cv.CRSend = IdCRLF;
1837          break;                  break;
1838        case 33:  // WYSTCURM            case 33:      // WYSTCURM
1839          if (ts.WindowFlag & WF_CURSORCHANGE) {                  if (ts.WindowFlag & WF_CURSORCHANGE) {
1840            ts.NonblinkingCursor = TRUE;                          ts.NonblinkingCursor = TRUE;
1841            ChangeCaret();                          ChangeCaret();
1842          }                  }
1843          break;                  break;
1844        case 34:  // WYULCURM            case 34:      // WYULCURM
1845          if (ts.WindowFlag & WF_CURSORCHANGE) {                  if (ts.WindowFlag & WF_CURSORCHANGE) {
1846            ts.CursorShape = IdHCur;                          ts.CursorShape = IdHCur;
1847            ChangeCaret();                          ChangeCaret();
1848          }                  }
1849          break;                  break;
     }  
   }  
   
   void CS_i_Mode()              // MC  
   {  
     switch (Param[1]) {  
       /* print screen */  
         //  PrintEX --  TRUE: print screen  
         //              FALSE: scroll region  
       case 0:  
         if (ts.TermFlag&TF_PRINTERCTRL) {  
           BuffPrint(! PrintEX);  
         }  
         break;  
       /* printer controller mode off */  
       case 4: break; /* See PrnParseCS() */  
       /* printer controller mode on */  
       case 5:  
         if (ts.TermFlag&TF_PRINTERCTRL) {  
           if (! AutoPrintMode)  
             OpenPrnFile();  
           DirectPrn = (ts.PrnDev[0]!=0);  
           PrinterMode = TRUE;  
         }  
         break;  
     }  
   }  
   
   void CS_l_Mode()              // RM  
   {  
     switch (Param[1]) {  
       case 2:   // KAM  
         KeybEnabled = TRUE; break;  
       case 4:   // IRM  
         InsertMode = FALSE; break;  
       case 12:  // SRM  
         ts.LocalEcho = 1;  
         if (cv.Ready && cv.TelFlag && (ts.TelEcho>0))  
           TelChangeEcho();  
         break;  
       case 20:  // LF/NL  
         LFMode = FALSE;  
         ts.CRSend = IdCR;  
         cv.CRSend = IdCR;  
         break;  
       case 33:  // WYSTCURM  
         if (ts.WindowFlag & WF_CURSORCHANGE) {  
           ts.NonblinkingCursor = FALSE;  
           ChangeCaret();  
         }  
         break;  
       case 34:  // WYULCURM  
         if (ts.WindowFlag & WF_CURSORCHANGE) {  
           ts.CursorShape = IdBlkCur;  
           ChangeCaret();  
         }  
         break;  
     }  
   }  
   
   void CS_n_Mode()              // DSR  
   {  
     char Report[16];  
     int X, Y, len;  
   
     switch (Param[1]) {  
       case 5:  
         /* Device Status Report -> Ready */  
         SendCSIstr("0n", 0);  
         break;  
       case 6:  
         /* Cursor Position Report */  
         if (isCursorOnStatusLine) {  
           X = CursorX + 1;  
           Y = 1;  
1850          }          }
1851          else if (RelativeOrgMode) {  }
1852            X = CursorX - CursorLeftM + 1;  
1853            Y = CursorY - CursorTop + 1;  void CS_i_Mode()                // MC
1854    {
1855            switch (Param[1]) {
1856              /* print screen */
1857              //  PrintEX -- TRUE: print screen
1858              //             FALSE: scroll region
1859              case 0:
1860                    if (ts.TermFlag&TF_PRINTERCTRL) {
1861                            BuffPrint(! PrintEX);
1862                    }
1863                    break;
1864              /* printer controller mode off */
1865              case 4: break; /* See PrnParseCS() */
1866              /* printer controller mode on */
1867              case 5:
1868                    if (ts.TermFlag&TF_PRINTERCTRL) {
1869                            if (! AutoPrintMode)
1870                                    OpenPrnFile();
1871                            DirectPrn = (ts.PrnDev[0]!=0);
1872                            PrinterMode = TRUE;
1873                    }
1874                    break;
1875          }          }
1876          else {  }
1877            X = CursorX + 1;  
1878            Y = CursorY+1;  void CS_l_Mode()                // RM
1879    {
1880            switch (Param[1]) {
1881              case 2:       // KAM
1882                    KeybEnabled = TRUE; break;
1883              case 4:       // IRM
1884                    InsertMode = FALSE; break;
1885              case 12:      // SRM
1886                    ts.LocalEcho = 1;
1887                    if (cv.Ready && cv.TelFlag && (ts.TelEcho>0))
1888                            TelChangeEcho();
1889                    break;
1890              case 20:      // LF/NL
1891                    LFMode = FALSE;
1892                    ts.CRSend = IdCR;
1893                    cv.CRSend = IdCR;
1894                    break;
1895              case 33:      // WYSTCURM
1896                    if (ts.WindowFlag & WF_CURSORCHANGE) {
1897                            ts.NonblinkingCursor = FALSE;
1898                            ChangeCaret();
1899                    }
1900                    break;
1901              case 34:      // WYULCURM
1902                    if (ts.WindowFlag & WF_CURSORCHANGE) {
1903                            ts.CursorShape = IdBlkCur;
1904                            ChangeCaret();
1905                    }
1906                    break;
1907          }          }
1908          len = _snprintf_s_l(Report, sizeof(Report), _TRUNCATE, "%u;%uR", CLocale, Y, X);  }
1909          SendCSIstr(Report, len);  
1910          break;  void CS_n_Mode()                // DSR
1911      }  {
1912    }          char Report[16];
1913            int X, Y, len;
1914    
1915            switch (Param[1]) {
1916              case 5:
1917                    /* Device Status Report -> Ready */
1918                    SendCSIstr("0n", 0);
1919                    break;
1920              case 6:
1921                    /* Cursor Position Report */
1922                    if (isCursorOnStatusLine) {
1923                            X = CursorX + 1;
1924                            Y = 1;
1925                    }
1926                    else if (RelativeOrgMode) {
1927                            X = CursorX - CursorLeftM + 1;
1928                            Y = CursorY - CursorTop + 1;
1929                    }
1930                    else {
1931                            X = CursorX + 1;
1932                            Y = CursorY+1;
1933                    }
1934                    len = _snprintf_s_l(Report, sizeof(Report), _TRUNCATE, "%u;%uR", CLocale, Y, X);
1935                    SendCSIstr(Report, len);
1936                    break;
1937            }
1938    }
1939    
1940  void ParseSGRParams(PCharAttr attr, PCharAttr mask, int start)  void ParseSGRParams(PCharAttr attr, PCharAttr mask, int start)
1941  {  {
# Line 1939  void ParseSGRParams(PCharAttr attr, PCha Line 1946  void ParseSGRParams(PCharAttr attr, PCha
1946                  mask = &dummy;                  mask = &dummy;
1947          }          }
1948    
1949          for (i=start ; i<=NParam ; i++)          for (i=start ; i<=NParam ; i++) {
         {  
1950                  P = Param[i];                  P = Param[i];
1951                  switch (P) {                  switch (P) {
1952                  case   0:       /* Clear all */                    case   0:     /* Clear all */
1953                          attr->Attr = DefCharAttr.Attr;                          attr->Attr = DefCharAttr.Attr;
1954                          attr->Attr2 = DefCharAttr.Attr2 | (attr->Attr2&Attr2Protect);                          attr->Attr2 = DefCharAttr.Attr2 | (attr->Attr2&Attr2Protect);
1955                          attr->Fore = DefCharAttr.Fore;                          attr->Fore = DefCharAttr.Fore;
# Line 1952  void ParseSGRParams(PCharAttr attr, PCha Line 1958  void ParseSGRParams(PCharAttr attr, PCha
1958                          mask->Attr2 = Attr2ColorMask;                          mask->Attr2 = Attr2ColorMask;
1959                          break;                          break;
1960    
1961                  case   1:       /* Bold */                    case   1:     /* Bold */
1962                          attr->Attr |= AttrBold;                          attr->Attr |= AttrBold;
1963                          mask->Attr |= AttrBold;                          mask->Attr |= AttrBold;
1964                          break;                          break;
1965    
1966                  case   4:       /* Under line */                    case   4:     /* Under line */
1967                          attr->Attr |= AttrUnder;                          attr->Attr |= AttrUnder;
1968                          mask->Attr |= AttrUnder;                          mask->Attr |= AttrUnder;
1969                          break;                          break;
1970    
1971                  case   5:       /* Blink */                    case   5:     /* Blink */
1972                          attr->Attr |= AttrBlink;                          attr->Attr |= AttrBlink;
1973                          mask->Attr |= AttrBlink;                          mask->Attr |= AttrBlink;
1974                          break;                          break;
1975    
1976                  case   7:       /* Reverse */                    case   7:     /* Reverse */
1977                          attr->Attr |= AttrReverse;                          attr->Attr |= AttrReverse;
1978                          mask->Attr |= AttrReverse;                          mask->Attr |= AttrReverse;
1979                          break;                          break;
1980    
1981                  case  22:       /* Bold off */                    case  22:     /* Bold off */
1982                          attr->Attr &= ~ AttrBold;                          attr->Attr &= ~ AttrBold;
1983                          mask->Attr |= AttrBold;                          mask->Attr |= AttrBold;
1984                          break;                          break;
1985    
1986                  case  24:       /* Under line off */                    case  24:     /* Under line off */
1987                          attr->Attr &= ~ AttrUnder;                          attr->Attr &= ~ AttrUnder;
1988                          mask->Attr |= AttrUnder;                          mask->Attr |= AttrUnder;
1989                          break;                          break;
1990    
1991                  case  25:       /* Blink off */                    case  25:     /* Blink off */
1992                          attr->Attr &= ~ AttrBlink;                          attr->Attr &= ~ AttrBlink;
1993                          mask->Attr |= AttrBlink;                          mask->Attr |= AttrBlink;
1994                          break;                          break;
1995    
1996                  case  27:       /* Reverse off */                    case  27:     /* Reverse off */
1997                          attr->Attr &= ~ AttrReverse;                          attr->Attr &= ~ AttrReverse;
1998                          mask->Attr |= AttrReverse;                          mask->Attr |= AttrReverse;
1999                          break;                          break;
2000    
2001                  case  30:                    case  30:
2002                  case  31:                    case  31:
2003                  case  32:                    case  32:
2004                  case  33:                    case  33:
2005                  case  34:                    case  34:
2006                  case  35:                    case  35:
2007                  case  36:                    case  36:
2008                  case  37:       /* text color */                    case  37:     /* text color */
2009                          attr->Attr2 |= Attr2Fore;                          attr->Attr2 |= Attr2Fore;
2010                          mask->Attr2 |= Attr2Fore;                          mask->Attr2 |= Attr2Fore;
2011                          attr->Fore = P - 30;                          attr->Fore = P - 30;
2012                          break;                          break;
2013    
2014                  case  38:       /* text color (256color mode) */                    case  38:     /* text color (256color mode) */
2015                          if (ts.ColorFlag & CF_XTERM256) {                          if (ts.ColorFlag & CF_XTERM256) {
2016                                  /*                                  /*
2017                                   * Change foreground color. accept following formats.                                   * Change foreground color. accept following formats.
# Line 2031  void ParseSGRParams(PCharAttr attr, PCha Line 2037  void ParseSGRParams(PCharAttr attr, PCha
2037                                          }                                          }
2038                                  }                                  }
2039                                  switch (P) {                                  switch (P) {
2040                                  case 2:                                    case 2:
2041                                          r = g = b = 0;                                          r = g = b = 0;
2042                                          if (NSParam[i] > 0) {                                          if (NSParam[i] > 0) {
2043                                                  if (j < NSParam[i]) {                                                  if (j < NSParam[i]) {
# Line 2060  void ParseSGRParams(PCharAttr attr, PCha Line 2066  void ParseSGRParams(PCharAttr attr, PCha
2066                                                  color = DispFindClosestColor(r, g, b);                                                  color = DispFindClosestColor(r, g, b);
2067                                          }                                          }
2068                                          break;                                          break;
2069                                  case 5:                                    case 5:
2070                                          if (NSParam[i] > 0) {                                          if (NSParam[i] > 0) {
2071                                                  if (j < NSParam[i]) {                                                  if (j < NSParam[i]) {
2072                                                          color = SubParam[i][++j];                                                          color = SubParam[i][++j];
# Line 2079  void ParseSGRParams(PCharAttr attr, PCha Line 2085  void ParseSGRParams(PCharAttr attr, PCha
2085                          }                          }
2086                          break;                          break;
2087    
2088                  case  39:       /* Reset text color */                    case  39:     /* Reset text color */
2089                          attr->Attr2 &= ~ Attr2Fore;                          attr->Attr2 &= ~ Attr2Fore;
2090                          mask->Attr2 |= Attr2Fore;                          mask->Attr2 |= Attr2Fore;
2091                          attr->Fore = AttrDefaultFG;                          attr->Fore = AttrDefaultFG;
2092                          break;                          break;
2093    
2094                  case  40:                    case  40:
2095                  case  41:                    case  41:
2096                  case  42:                    case  42:
2097                  case  43:                    case  43:
2098                  case  44:                    case  44:
2099                  case  45:                    case  45:
2100                  case  46:                    case  46:
2101                  case  47:       /* Back color */                    case  47:     /* Back color */
2102                          attr->Attr2 |= Attr2Back;                          attr->Attr2 |= Attr2Back;
2103                          mask->Attr2 |= Attr2Back;                          mask->Attr2 |= Attr2Back;
2104                          attr->Back = P - 40;                          attr->Back = P - 40;
2105                          break;                          break;
2106    
2107                  case  48:       /* Back color (256color mode) */                    case  48:     /* Back color (256color mode) */
2108                          if (ts.ColorFlag & CF_XTERM256) {                          if (ts.ColorFlag & CF_XTERM256) {
2109                                  color = -1;                                  color = -1;
2110                                  j = 0;                                  j = 0;
# Line 2113  void ParseSGRParams(PCharAttr attr, PCha Line 2119  void ParseSGRParams(PCharAttr attr, PCha
2119                                          }                                          }
2120                                  }                                  }
2121                                  switch (P) {                                  switch (P) {
2122                                  case 2:                                    case 2:
2123                                          r = g = b = 0;                                          r = g = b = 0;
2124                                          if (NSParam[i] > 0) {                                          if (NSParam[i] > 0) {
2125                                                  if (j < NSParam[i]) {                                                  if (j < NSParam[i]) {
# Line 2142  void ParseSGRParams(PCharAttr attr, PCha Line 2148  void ParseSGRParams(PCharAttr attr, PCha
2148                                                  color = DispFindClosestColor(r, g, b);                                                  color = DispFindClosestColor(r, g, b);
2149                                          }                                          }
2150                                          break;                                          break;
2151                                  case 5:                                    case 5:
2152                                          if (NSParam[i] > 0) {                                          if (NSParam[i] > 0) {
2153                                                  if (j < NSParam[i]) {                                                  if (j < NSParam[i]) {
2154                                                          color = SubParam[i][++j];                                                          color = SubParam[i][++j];
# Line 2161  void ParseSGRParams(PCharAttr attr, PCha Line 2167  void ParseSGRParams(PCharAttr attr, PCha
2167                          }                          }
2168                          break;                          break;
2169    
2170                  case  49:       /* Reset back color */                    case  49:     /* Reset back color */
2171                          attr->Attr2 &= ~ Attr2Back;                          attr->Attr2 &= ~ Attr2Back;
2172                          mask->Attr2 |= Attr2Back;                          mask->Attr2 |= Attr2Back;
2173                          attr->Back = AttrDefaultBG;                          attr->Back = AttrDefaultBG;
2174                          break;                          break;
2175    
2176                  case 90:                    case 90:
2177                  case 91:                    case 91:
2178                  case 92:                    case 92:
2179                  case 93:                    case 93:
2180                  case 94:                    case 94:
2181                  case 95:                    case 95:
2182                  case 96:                    case 96:
2183                  case 97:        /* aixterm style text color */                    case 97:      /* aixterm style text color */
2184                          if (ts.ColorFlag & CF_AIXTERM16) {                          if (ts.ColorFlag & CF_AIXTERM16) {
2185                                  attr->Attr2 |= Attr2Fore;                                  attr->Attr2 |= Attr2Fore;
2186                                  mask->Attr2 |= Attr2Fore;                                  mask->Attr2 |= Attr2Fore;
# Line 2182  void ParseSGRParams(PCharAttr attr, PCha Line 2188  void ParseSGRParams(PCharAttr attr, PCha
2188                          }                          }
2189                          break;                          break;
2190    
2191                  case 100:                    case 100:
2192                          if (! (ts.ColorFlag & CF_AIXTERM16)) {                          if (! (ts.ColorFlag & CF_AIXTERM16)) {
2193                                  /* Reset text and back color */                                  /* Reset text and back color */
2194                                  attr->Attr2 &= ~ (Attr2Fore | Attr2Back);                                  attr->Attr2 &= ~ (Attr2Fore | Attr2Back);
# Line 2193  void ParseSGRParams(PCharAttr attr, PCha Line 2199  void ParseSGRParams(PCharAttr attr, PCha
2199                          }                          }
2200                          /* fall through to aixterm style back color */                          /* fall through to aixterm style back color */
2201    
2202                  case 101:                    case 101:
2203                  case 102:                    case 102:
2204                  case 103:                    case 103:
2205                  case 104:                    case 104:
2206                  case 105:                    case 105:
2207                  case 106:                    case 106:
2208                  case 107:       /* aixterm style back color */                    case 107:     /* aixterm style back color */
2209                          if (ts.ColorFlag & CF_AIXTERM16) {                          if (ts.ColorFlag & CF_AIXTERM16) {
2210                                  attr->Attr2 |= Attr2Back;                                  attr->Attr2 |= Attr2Back;
2211                                  mask->Attr2 |= Attr2Back;                                  mask->Attr2 |= Attr2Back;
# Line 2217  void CSSetAttr()               // SGR Line 2223  void CSSetAttr()               // SGR
2223          BuffSetCurCharAttr(CharAttr);          BuffSetCurCharAttr(CharAttr);
2224  }  }
2225    
2226    void CSSetScrollRegion()      // DECSTBM  void CSSetScrollRegion()        // DECSTBM
2227    {  {
2228      if (isCursorOnStatusLine) {          if (isCursorOnStatusLine) {
2229        MoveCursor(0,CursorY);                  MoveCursor(0,CursorY);
2230        return;                  return;
2231      }          }
2232      if (Param[1]<1) Param[1] =1;          if (Param[1]<1) Param[1] =1;
2233      if ((NParam < 2) | (Param[2]<1))          if ((NParam < 2) | (Param[2]<1))
2234        Param[2] = NumOfLines-StatusLine;                  Param[2] = NumOfLines-StatusLine;
2235      Param[1]--;          Param[1]--;
2236      Param[2]--;          Param[2]--;
2237      if (Param[1] > NumOfLines-1-StatusLine)          if (Param[1] > NumOfLines-1-StatusLine)
2238        Param[1] = NumOfLines-1-StatusLine;                  Param[1] = NumOfLines-1-StatusLine;
2239      if (Param[2] > NumOfLines-1-StatusLine)          if (Param[2] > NumOfLines-1-StatusLine)
2240        Param[2] = NumOfLines-1-StatusLine;                  Param[2] = NumOfLines-1-StatusLine;
2241      if (Param[1] >= Param[2]) return;          if (Param[1] >= Param[2]) return;
2242      CursorTop = Param[1];          CursorTop = Param[1];
2243      CursorBottom = Param[2];          CursorBottom = Param[2];
2244      if (RelativeOrgMode) MoveCursor(0,CursorTop);          if (RelativeOrgMode) MoveCursor(0,CursorTop);
2245                      else MoveCursor(0,0);                          else MoveCursor(0,0);
2246    }  }
2247    
2248  void CSSetLRScrollRegion()      // DECSLRM  void CSSetLRScrollRegion()      // DECSLRM
2249  {  {
# Line 2269  void CSSetLRScrollRegion()     // DECSLRM Line 2275  void CSSetLRScrollRegion()     // DECSLRM
2275                  MoveCursor(0, 0);                  MoveCursor(0, 0);
2276  }  }
2277    
2278    void CSSunSequence() /* Sun terminal private sequences */  void CSSunSequence() /* Sun terminal private sequences */
2279    {  {
2280      int x, y, len;          int x, y, len;
2281      char Report[TitleBuffSize*2+10];          char Report[TitleBuffSize*2+10];
2282      PTStack t;          PTStack t;
   
     switch (Param[1]) {  
       case 1: // De-iconify window  
         if (ts.WindowFlag & WF_WINDOWCHANGE)  
           DispShowWindow(WINDOW_RESTORE);  
         break;  
       case 2: // Iconify window  
         if (ts.WindowFlag & WF_WINDOWCHANGE)  
           DispShowWindow(WINDOW_MINIMIZE);  
         break;  
       case 3: // set window position  
         if (ts.WindowFlag & WF_WINDOWCHANGE) {  
           if (NParam < 2) Param[2] = 0;  
           if (NParam < 3) Param[3] = 0;  
           DispMoveWindow(Param[2], Param[3]);  
         }  
         break;  
       case 4: // set window size  
         if (ts.WindowFlag & WF_WINDOWCHANGE) {  
           if (NParam < 2) Param[2] = 0;  
           if (NParam < 3) Param[3] = 0;  
           DispResizeWin(Param[3], Param[2]);  
         }  
         break;  
       case 5: // Raise window  
         if (ts.WindowFlag & WF_WINDOWCHANGE)  
           DispShowWindow(WINDOW_RAISE);  
         break;  
       case 6: // Lower window  
         if (ts.WindowFlag & WF_WINDOWCHANGE)  
           DispShowWindow(WINDOW_LOWER);  
         break;  
       case 7: // Refresh window  
         if (ts.WindowFlag & WF_WINDOWCHANGE)  
           DispShowWindow(WINDOW_REFRESH);  
         break;  
       case 8: /* set terminal size */  
         if (ts.WindowFlag & WF_WINDOWCHANGE) {  
           if ((Param[2]<=1) || (NParam<2)) Param[2] = 24;  
           if ((Param[3]<=1) || (NParam<3)) Param[3] = 80;  
           ChangeTerminalSize(Param[3],Param[2]);  
         }  
         break;  
       case 9: // Maximize/Restore window  
         if (ts.WindowFlag & WF_WINDOWCHANGE) {  
           if (NParam < 2 || Param[2] == 0) {  
             DispShowWindow(WINDOW_RESTORE);  
           }  
           else if (Param[2] == 1) {  
             DispShowWindow(WINDOW_MAXIMIZE);  
           }  
         }  
         break;  
       case 11: // Report window state  
         if (ts.WindowFlag & WF_WINDOWREPORT) {  
           len = _snprintf_s_l(Report, sizeof(Report), _TRUNCATE, "%dt", CLocale, DispWindowIconified()?2:1);  
           SendCSIstr(Report, len);  
         }  
         break;  
       case 13: // Report window position  
         if (ts.WindowFlag & WF_WINDOWREPORT) {  
           DispGetWindowPos(&x, &y);  
           len = _snprintf_s_l(Report, sizeof(Report), _TRUNCATE, "3;%u;%ut", CLocale, (unsigned int)x, (unsigned int)y);  
           SendCSIstr(Report, len);  
         }  
         break;  
       case 14: /* get window size */  
         if (ts.WindowFlag & WF_WINDOWREPORT) {  
           DispGetWindowSize(&x, &y);  
           len = _snprintf_s_l(Report, sizeof(Report), _TRUNCATE, "4;%d;%dt", CLocale, y, x);  
           SendCSIstr(Report, len);  
         }  
         break;  
       case 18: /* get terminal size */  
         if (ts.WindowFlag & WF_WINDOWREPORT) {  
           len = _snprintf_s_l(Report, sizeof(Report), _TRUNCATE, "8;%u;%ut", CLocale,  
                               NumOfLines-StatusLine, NumOfColumns);  
           SendCSIstr(Report, len);  
         }  
         break;  
       case 19: // Report display size (character)  
         if (ts.WindowFlag & WF_WINDOWREPORT) {  
           DispGetRootWinSize(&x, &y);  
           len = _snprintf_s_l(Report, sizeof(Report), _TRUNCATE, "9;%d;%dt", CLocale, y, x);  
           SendCSIstr(Report, len);  
         }  
         break;  
       case 20: // Report icon label  
         switch (ts.WindowFlag & WF_TITLEREPORT) {  
           case IdTitleReportIgnore:  
             // nothing to do  
             break;  
           case IdTitleReportAccept:  
             switch (ts.AcceptTitleChangeRequest) {  
               case IdTitleChangeRequestOff:  
                 len = _snprintf_s_l(Report, sizeof(Report), _TRUNCATE, "L%s", CLocale, ts.Title);  
                 break;  
               case IdTitleChangeRequestAhead:  
                 len = _snprintf_s_l(Report, sizeof(Report), _TRUNCATE, "L%s %s", CLocale, cv.TitleRemote, ts.Title);  
                 break;  
               case IdTitleChangeRequestLast:  
                 len = _snprintf_s_l(Report, sizeof(Report), _TRUNCATE, "L%s %s", CLocale, ts.Title, cv.TitleRemote);  
                 break;  
               default:  
                 if (cv.TitleRemote[0] == 0) {  
                   len = _snprintf_s_l(Report, sizeof(Report), _TRUNCATE, "L%s", CLocale, ts.Title);  
                 }  
                 else {  
                   len = _snprintf_s_l(Report, sizeof(Report), _TRUNCATE, "L%s", CLocale, cv.TitleRemote);  
                 }  
             }  
             SendOSCstr(Report, len, ST);  
             break;  
           default: // IdTitleReportEmpty:  
             SendOSCstr("L", 0, ST);  
             break;  
         }  
         break;  
       case 21: // Report window title  
         switch (ts.WindowFlag & WF_TITLEREPORT) {  
           case IdTitleReportIgnore:  
             // nothing to do  
             break;  
           case IdTitleReportAccept:  
             switch (ts.AcceptTitleChangeRequest) {  
               case IdTitleChangeRequestOff:  
                 len = _snprintf_s_l(Report, sizeof(Report), _TRUNCATE, "l%s", CLocale, ts.Title);  
                 break;  
               case IdTitleChangeRequestAhead:  
                 len = _snprintf_s_l(Report, sizeof(Report), _TRUNCATE, "l%s %s", CLocale, cv.TitleRemote, ts.Title);  
                 break;  
               case IdTitleChangeRequestLast:  
                 len = _snprintf_s_l(Report, sizeof(Report), _TRUNCATE, "l%s %s", CLocale, ts.Title, cv.TitleRemote);  
                 break;  
               default:  
                 if (cv.TitleRemote[0] == 0) {  
                   len = _snprintf_s_l(Report, sizeof(Report), _TRUNCATE, "l%s", CLocale, ts.Title);  
                 }  
                 else {  
                   len = _snprintf_s_l(Report, sizeof(Report), _TRUNCATE, "l%s", CLocale, cv.TitleRemote);  
                 }  
             }  
             SendOSCstr(Report, len, ST);  
             break;  
           default: // IdTitleReportEmpty:  
             SendOSCstr("l", 0, ST);  
             break;  
         }  
         break;  
     case 22: // Push Title  
       if (NParam < 2) {  
         Param[2] = 0;  
       }  
       switch (Param[2]) {  
       case 0:  
       case 1:  
       case 2:  
         if (ts.AcceptTitleChangeRequest && (t=malloc(sizeof(TStack))) != NULL) {  
           if ((t->title = _strdup(cv.TitleRemote)) != NULL) {  
             t->next = TitleStack;  
             TitleStack = t;  
           }  
           else {  
             free(t);  
           }  
         }  
         break;  
       }  
       break;  
     case 23: // Pop Title  
       if (NParam < 2) {  
         Param[2] = 0;  
       }  
       switch (Param[2]) {  
       case 0:  
       case 1:  
       case 2:  
         if (ts.AcceptTitleChangeRequest && TitleStack != NULL) {  
           t = TitleStack;  
           TitleStack = t->next;  
           strncpy_s(cv.TitleRemote, sizeof(cv.TitleRemote), t->title, _TRUNCATE);  
           ChangeTitle();  
           free(t->title);  
           free(t);  
         }  
         break;  
       }  
     }  
   }  
   
   void CSLT(BYTE b)  
   {  
     switch (b) {  
       case 'r':  
         if (CanUseIME()) {  
           SetIMEOpenStatus(IMEstat);  
         }  
         break;  
   
       case 's':  
         if (CanUseIME()) {  
           IMEstat = GetIMEOpenStatus();  
         }  
         break;  
   
       case 't':  
         if (CanUseIME()) {  
           SetIMEOpenStatus(Param[1] == 1);  
         }  
         break;  
     }  
   }  
   
   void CSEQ(BYTE b)  
   {  
     char Report[16];  
     int len;  
   
     switch (b) {  
       case 'c': /* Tertiary terminal report (Tertiary DA) */  
         if (Param[1] < 1) {  
           len = _snprintf_s_l(Report, sizeof(Report), _TRUNCATE, "!|%8s", CLocale, ts.TerminalUID);  
           SendDCSstr(Report, len);  
         }  
         break;  
     }  
   }  
   
   void CSGT(BYTE b)  
   {  
     switch (b) {  
       case 'c': /* second terminal report (Secondary DA) */  
         if (Param[1] < 1) {  
           SendCSIstr(">32;278;0c", 0); /* VT382(>32) + xterm rev 278 */  
         }  
         break;  
       case 'J': // IO-8256 terminal  
         if (Param[1]==3) {  
           if (Param[2] < 1 || NParam < 2) Param[2] = 1;  
           if (Param[3] < 1 || NParam < 3) Param[3] = 1;  
           if (Param[4] < 1 || NParam < 4) Param[4] = NumOfLines-StatusLine;  
           if (Param[5] < 1 || NParam < 5) Param[5] = NumOfColumns;  
           BuffEraseBox(Param[3]-1, Param[2]-1, Param[5]-1, Param[4]-1);  
         }  
         break;  
       case 'K': // IO-8256 terminal  
         switch (Param[1]) {  
           case 3:  
             if (Param[2] < 1 || NParam < 2) Param[2] = 1;  
             if (Param[3] < 1 || NParam < 3) Param[3] = 1;  
             BuffEraseCharsInLine(Param[2]-1, Param[3]-Param[2]+1);  
             break;  
           case 5:  
             if (NParam < 2) Param[2] = 0;  
             if (NParam < 3) Param[3] = 0;  
             switch (Param[2]) {  
               case 3:  
               case 4:  
               case 5:  
               case 6: // Draw Line  
                 BuffDrawLine(CharAttr, Param[2], Param[3]);  
                 break;  
   
               case 12: // Text color  
                 if ((Param[3]>=0) && (Param[3]<=7)) {  
                   switch (Param[3]) {  
                     case 3: CharAttr.Fore = IdBlue; break;  
                     case 4: CharAttr.Fore = IdCyan; break;  
                     case 5: CharAttr.Fore = IdYellow; break;  
                     case 6: CharAttr.Fore = IdMagenta; break;  
                     default: CharAttr.Fore = Param[3]; break;  
                   }  
                   CharAttr.Attr2 |= Attr2Fore;  
                   BuffSetCurCharAttr(CharAttr);  
                 }  
                 break;  
             }  
             break;  
         }  
         break;  
     }  
   }  
   
     void CSQExchangeColor()             // DECSCNM / Visual Bell  
     {  
       COLORREF ColorRef;  
   
       BuffUpdateScroll();  
   
       if (ts.ColorFlag & CF_REVERSECOLOR) {  
         ColorRef = ts.VTColor[0];  
         ts.VTColor[0] = ts.VTReverseColor[0];  
         ts.VTReverseColor[0] = ColorRef;  
         ColorRef = ts.VTColor[1];  
         ts.VTColor[1] = ts.VTReverseColor[1];  
         ts.VTReverseColor[1] = ColorRef;  
       }  
       else {  
         ColorRef = ts.VTColor[0];  
         ts.VTColor[0] = ts.VTColor[1];  
         ts.VTColor[1] = ColorRef;  
       }  
   
       ColorRef = ts.VTBoldColor[0];  
       ts.VTBoldColor[0] = ts.VTBoldColor[1];  
       ts.VTBoldColor[1] = ColorRef;  
   
       ColorRef = ts.VTBlinkColor[0];  
       ts.VTBlinkColor[0] = ts.VTBlinkColor[1];  
       ts.VTBlinkColor[1] = ColorRef;  
   
       ColorRef = ts.URLColor[0];  
       ts.URLColor[0] = ts.URLColor[1];  
       ts.URLColor[1] = ColorRef;  
2283    
2284        ts.ColorFlag ^= CF_REVERSEVIDEO;          switch (Param[1]) {
2285              case 1: // De-iconify window
2286                    if (ts.WindowFlag & WF_WINDOWCHANGE)
2287                            DispShowWindow(WINDOW_RESTORE);
2288                    break;
2289              case 2: // Iconify window
2290                    if (ts.WindowFlag & WF_WINDOWCHANGE)
2291                            DispShowWindow(WINDOW_MINIMIZE);
2292                    break;
2293              case 3: // set window position
2294                    if (ts.WindowFlag & WF_WINDOWCHANGE) {
2295                            if (NParam < 2) Param[2] = 0;
2296                            if (NParam < 3) Param[3] = 0;
2297                            DispMoveWindow(Param[2], Param[3]);
2298                    }
2299                    break;
2300              case 4: // set window size
2301                    if (ts.WindowFlag & WF_WINDOWCHANGE) {
2302                            if (NParam < 2) Param[2] = 0;
2303                            if (NParam < 3) Param[3] = 0;
2304                            DispResizeWin(Param[3], Param[2]);
2305                    }
2306                    break;
2307              case 5: // Raise window
2308                    if (ts.WindowFlag & WF_WINDOWCHANGE)
2309                            DispShowWindow(WINDOW_RAISE);
2310                    break;
2311              case 6: // Lower window
2312                    if (ts.WindowFlag & WF_WINDOWCHANGE)
2313                            DispShowWindow(WINDOW_LOWER);
2314                    break;
2315              case 7: // Refresh window
2316                    if (ts.WindowFlag & WF_WINDOWCHANGE)
2317                            DispShowWindow(WINDOW_REFRESH);
2318                    break;
2319              case 8: /* set terminal size */
2320                    if (ts.WindowFlag & WF_WINDOWCHANGE) {
2321                            if ((Param[2]<=1) || (NParam<2)) Param[2] = 24;
2322                            if ((Param[3]<=1) || (NParam<3)) Param[3] = 80;
2323                            ChangeTerminalSize(Param[3],Param[2]);
2324                    }
2325                    break;
2326              case 9: // Maximize/Restore window
2327                    if (ts.WindowFlag & WF_WINDOWCHANGE) {
2328                            if (NParam < 2 || Param[2] == 0) {
2329                                    DispShowWindow(WINDOW_RESTORE);
2330                            }
2331                            else if (Param[2] == 1) {
2332                                    DispShowWindow(WINDOW_MAXIMIZE);
2333                            }
2334                    }
2335                    break;
2336              case 11: // Report window state
2337                    if (ts.WindowFlag & WF_WINDOWREPORT) {
2338                            len = _snprintf_s_l(Report, sizeof(Report), _TRUNCATE, "%dt", CLocale, DispWindowIconified()?2:1);
2339                            SendCSIstr(Report, len);
2340                    }
2341                    break;
2342              case 13: // Report window position
2343                    if (ts.WindowFlag & WF_WINDOWREPORT) {
2344                            DispGetWindowPos(&x, &y);
2345                            len = _snprintf_s_l(Report, sizeof(Report), _TRUNCATE, "3;%u;%ut", CLocale, (unsigned int)x, (unsigned int)y);
2346                            SendCSIstr(Report, len);
2347                    }
2348                    break;
2349              case 14: /* get window size */
2350                    if (ts.WindowFlag & WF_WINDOWREPORT) {
2351                            DispGetWindowSize(&x, &y);
2352                            len = _snprintf_s_l(Report, sizeof(Report), _TRUNCATE, "4;%d;%dt", CLocale, y, x);
2353                            SendCSIstr(Report, len);
2354                    }
2355                    break;
2356              case 18: /* get terminal size */
2357                    if (ts.WindowFlag & WF_WINDOWREPORT) {
2358                            len = _snprintf_s_l(Report, sizeof(Report), _TRUNCATE, "8;%u;%ut", CLocale,
2359                                                NumOfLines-StatusLine, NumOfColumns);
2360                            SendCSIstr(Report, len);
2361                    }
2362                    break;
2363              case 19: // Report display size (character)
2364                    if (ts.WindowFlag & WF_WINDOWREPORT) {
2365                            DispGetRootWinSize(&x, &y);
2366                            len = _snprintf_s_l(Report, sizeof(Report), _TRUNCATE, "9;%d;%dt", CLocale, y, x);
2367                            SendCSIstr(Report, len);
2368                    }
2369                    break;
2370              case 20: // Report icon label
2371                    switch (ts.WindowFlag & WF_TITLEREPORT) {
2372                      case IdTitleReportIgnore:
2373                            // nothing to do
2374                            break;
2375                      case IdTitleReportAccept:
2376                            switch (ts.AcceptTitleChangeRequest) {
2377                              case IdTitleChangeRequestOff:
2378                                    len = _snprintf_s_l(Report, sizeof(Report), _TRUNCATE, "L%s", CLocale, ts.Title);
2379                                    break;
2380                              case IdTitleChangeRequestAhead:
2381                                    len = _snprintf_s_l(Report, sizeof(Report), _TRUNCATE, "L%s %s", CLocale, cv.TitleRemote, ts.Title);
2382                                    break;
2383                              case IdTitleChangeRequestLast:
2384                                    len = _snprintf_s_l(Report, sizeof(Report), _TRUNCATE, "L%s %s", CLocale, ts.Title, cv.TitleRemote);
2385                                    break;
2386                              default:
2387                                    if (cv.TitleRemote[0] == 0) {
2388                                            len = _snprintf_s_l(Report, sizeof(Report), _TRUNCATE, "L%s", CLocale, ts.Title);
2389                                    }
2390                                    else {
2391                                            len = _snprintf_s_l(Report, sizeof(Report), _TRUNCATE, "L%s", CLocale, cv.TitleRemote);
2392                                    }
2393                            }
2394                            SendOSCstr(Report, len, ST);
2395                            break;
2396                      default: // IdTitleReportEmpty:
2397                            SendOSCstr("L", 0, ST);
2398                            break;
2399                    }
2400                    break;
2401              case 21: // Report window title
2402                    switch (ts.WindowFlag & WF_TITLEREPORT) {
2403                      case IdTitleReportIgnore:
2404                            // nothing to do
2405                            break;
2406                      case IdTitleReportAccept:
2407                            switch (ts.AcceptTitleChangeRequest) {
2408                              case IdTitleChangeRequestOff:
2409                                    len = _snprintf_s_l(Report, sizeof(Report), _TRUNCATE, "l%s", CLocale, ts.Title);
2410                                    break;
2411                              case IdTitleChangeRequestAhead:
2412                                    len = _snprintf_s_l(Report, sizeof(Report), _TRUNCATE, "l%s %s", CLocale, cv.TitleRemote, ts.Title);
2413                                    break;
2414                              case IdTitleChangeRequestLast:
2415                                    len = _snprintf_s_l(Report, sizeof(Report), _TRUNCATE, "l%s %s", CLocale, ts.Title, cv.TitleRemote);
2416                                    break;
2417                              default:
2418                                    if (cv.TitleRemote[0] == 0) {
2419                                            len = _snprintf_s_l(Report, sizeof(Report), _TRUNCATE, "l%s", CLocale, ts.Title);
2420                                    }
2421                                    else {
2422                                            len = _snprintf_s_l(Report, sizeof(Report), _TRUNCATE, "l%s", CLocale, cv.TitleRemote);
2423                                    }
2424                            }
2425                            SendOSCstr(Report, len, ST);
2426                            break;
2427                      default: // IdTitleReportEmpty:
2428                            SendOSCstr("l", 0, ST);
2429                            break;
2430                    }
2431                    break;
2432              case 22: // Push Title
2433                    if (NParam < 2) {
2434                            Param[2] = 0;
2435                    }
2436                    switch (Param[2]) {
2437                      case 0:
2438                      case 1:
2439                      case 2:
2440                            if (ts.AcceptTitleChangeRequest && (t=malloc(sizeof(TStack))) != NULL) {
2441                                    if ((t->title = _strdup(cv.TitleRemote)) != NULL) {
2442                                            t->next = TitleStack;
2443                                            TitleStack = t;
2444                                    }
2445                                    else {
2446                                            free(t);
2447                                    }
2448                            }
2449                            break;
2450                    }
2451                    break;
2452              case 23: // Pop Title
2453                    if (NParam < 2) {
2454                            Param[2] = 0;
2455                    }
2456                    switch (Param[2]) {
2457                      case 0:
2458                      case 1:
2459                      case 2:
2460                            if (ts.AcceptTitleChangeRequest && TitleStack != NULL) {
2461                                    t = TitleStack;
2462                                    TitleStack = t->next;
2463                                    strncpy_s(cv.TitleRemote, sizeof(cv.TitleRemote), t->title, _TRUNCATE);
2464                                    ChangeTitle();
2465                                    free(t->title);
2466                                    free(t);
2467                            }
2468                            break;
2469                    }
2470            }
2471    }
2472    
2473    void CSLT(BYTE b)
2474    {
2475            switch (b) {
2476              case 'r':
2477                    if (CanUseIME()) {
2478                            SetIMEOpenStatus(IMEstat);
2479                    }
2480                    break;
2481    
2482              case 's':
2483                    if (CanUseIME()) {
2484                            IMEstat = GetIMEOpenStatus();
2485                    }
2486                    break;
2487    
2488              case 't':
2489                    if (CanUseIME()) {
2490                            SetIMEOpenStatus(Param[1] == 1);
2491                    }
2492                    break;
2493            }
2494    }
2495    
2496    void CSEQ(BYTE b)
2497    {
2498            char Report[16];
2499            int len;
2500    
2501            switch (b) {
2502              case 'c': /* Tertiary terminal report (Tertiary DA) */
2503                    if (Param[1] < 1) {
2504                            len = _snprintf_s_l(Report, sizeof(Report), _TRUNCATE, "!|%8s", CLocale, ts.TerminalUID);
2505                            SendDCSstr(Report, len);
2506                    }
2507                    break;
2508            }
2509    }
2510    
2511    void CSGT(BYTE b)
2512    {
2513            switch (b) {
2514              case 'c': /* second terminal report (Secondary DA) */
2515                    if (Param[1] < 1) {
2516                            SendCSIstr(">32;278;0c", 0); /* VT382(>32) + xterm rev 278 */
2517                    }
2518                    break;
2519              case 'J': // IO-8256 terminal
2520                    if (Param[1]==3) {
2521                            if (Param[2] < 1 || NParam < 2) Param[2] = 1;
2522                            if (Param[3] < 1 || NParam < 3) Param[3] = 1;
2523                            if (Param[4] < 1 || NParam < 4) Param[4] = NumOfLines-StatusLine;
2524                            if (Param[5] < 1 || NParam < 5) Param[5] = NumOfColumns;
2525                            BuffEraseBox(Param[3]-1, Param[2]-1, Param[5]-1, Param[4]-1);
2526                    }
2527                    break;
2528              case 'K': // IO-8256 terminal
2529                    switch (Param[1]) {
2530                      case 3:
2531                            if (Param[2] < 1 || NParam < 2) Param[2] = 1;
2532                            if (Param[3] < 1 || NParam < 3) Param[3] = 1;
2533                            BuffEraseCharsInLine(Param[2]-1, Param[3]-Param[2]+1);
2534                            break;
2535                      case 5:
2536                            if (NParam < 2) Param[2] = 0;
2537                            if (NParam < 3) Param[3] = 0;
2538                            switch (Param[2]) {
2539                              case 3:
2540                              case 4:
2541                              case 5:
2542                              case 6: // Draw Line
2543                                    BuffDrawLine(CharAttr, Param[2], Param[3]);
2544                                    break;
2545    
2546                              case 12: // Text color
2547                                    if ((Param[3]>=0) && (Param[3]<=7)) {
2548                                            switch (Param[3]) {
2549                                              case 3: CharAttr.Fore = IdBlue; break;
2550                                              case 4: CharAttr.Fore = IdCyan; break;
2551                                              case 5: CharAttr.Fore = IdYellow; break;
2552                                              case 6: CharAttr.Fore = IdMagenta; break;
2553                                              default: CharAttr.Fore = Param[3]; break;
2554                                            }
2555                                            CharAttr.Attr2 |= Attr2Fore;
2556                                            BuffSetCurCharAttr(CharAttr);
2557                                    }
2558                                    break;
2559                            }
2560                            break;
2561                    }
2562                    break;
2563            }
2564    }
2565    
2566    void CSQExchangeColor()         // DECSCNM / Visual Bell
2567    {
2568            COLORREF ColorRef;
2569    
2570            BuffUpdateScroll();
2571    
2572            if (ts.ColorFlag & CF_REVERSECOLOR) {
2573                    ColorRef = ts.VTColor[0];
2574                    ts.VTColor[0] = ts.VTReverseColor[0];
2575                    ts.VTReverseColor[0] = ColorRef;
2576                    ColorRef = ts.VTColor[1];
2577                    ts.VTColor[1] = ts.VTReverseColor[1];
2578                    ts.VTReverseColor[1] = ColorRef;
2579            }
2580            else {
2581                    ColorRef = ts.VTColor[0];
2582                    ts.VTColor[0] = ts.VTColor[1];
2583                    ts.VTColor[1] = ColorRef;
2584            }
2585    
2586            ColorRef = ts.VTBoldColor[0];
2587            ts.VTBoldColor[0] = ts.VTBoldColor[1];
2588            ts.VTBoldColor[1] = ColorRef;
2589    
2590            ColorRef = ts.VTBlinkColor[0];
2591            ts.VTBlinkColor[0] = ts.VTBlinkColor[1];
2592            ts.VTBlinkColor[1] = ColorRef;
2593    
2594            ColorRef = ts.URLColor[0];
2595            ts.URLColor[0] = ts.URLColor[1];
2596            ts.URLColor[1] = ColorRef;
2597    
2598            ts.ColorFlag ^= CF_REVERSEVIDEO;
2599    
2600  #ifdef ALPHABLEND_TYPE2  #ifdef ALPHABLEND_TYPE2
2601        BGExchangeColor();          BGExchangeColor();
2602  #endif  #endif
2603        DispChangeBackground();          DispChangeBackground();
2604        UpdateWindow(HVTWin);          UpdateWindow(HVTWin);
2605      }  }
2606    
2607      void CSQChangeColumnMode(int width)         // DECCOLM  void CSQChangeColumnMode(int width)             // DECCOLM
2608      {  {
2609        ChangeTerminalSize(width, NumOfLines-StatusLine);          ChangeTerminalSize(width, NumOfLines-StatusLine);
2610        if ((ts.TermFlag & TF_CLEARONRESIZE) == 0) {          if ((ts.TermFlag & TF_CLEARONRESIZE) == 0) {
2611          MoveCursor(0, 0);                  MoveCursor(0, 0);
2612          BuffClearScreen();                  BuffClearScreen();
2613          UpdateWindow(HVTWin);                  UpdateWindow(HVTWin);
       }  
     }  
   
     void CSQ_h_Mode() // DECSET  
     {  
       int i;  
   
       for (i = 1 ; i<=NParam ; i++)  
         switch (Param[i]) {  
           case 1: AppliCursorMode = TRUE; break;                // DECCKM  
           case 3: CSQChangeColumnMode(132); break;              // DECCOLM  
           case 5: /* Reverse Video (DECSCNM) */  
             if (!(ts.ColorFlag & CF_REVERSEVIDEO))  
               CSQExchangeColor(); /* Exchange text/back color */  
             break;  
           case 6: // DECOM  
             if (isCursorOnStatusLine)  
               MoveCursor(0,CursorY);  
             else {  
               RelativeOrgMode = TRUE;  
               MoveCursor(0,CursorTop);  
             }  
             break;  
           case 7: AutoWrapMode = TRUE; break;           // DECAWM  
           case 8: AutoRepeatMode = TRUE; break;         // DECARM  
           case 9: /* X10 Mouse Tracking */  
             if (ts.MouseEventTracking)  
               MouseReportMode = IdMouseTrackX10;  
             break;  
           case 12: /* att610 cursor blinking */  
             if (ts.WindowFlag & WF_CURSORCHANGE) {  
               ts.NonblinkingCursor = FALSE;  
               ChangeCaret();  
             }  
             break;  
           case 19: PrintEX = TRUE; break;               // DECPEX  
           case 25: DispEnableCaret(TRUE); break;        // cursor on (DECTCEM)  
           case 38: // DECTEK  
             if (ts.AutoWinSwitch>0)  
               ChangeEmu = IdTEK; /* Enter TEK Mode */  
             break;  
           case 47: // Alternate Screen Buffer  
             if ((ts.TermFlag & TF_ALTSCR) && !AltScr) {  
               BuffSaveScreen();  
               AltScr = TRUE;  
             }  
             break;  
           case 59:  
             if (ts.Language==IdJapanese)  
             { /* kanji terminal */  
               Gn[0] = IdASCII;  
               Gn[1] = IdKatakana;  
               Gn[2] = IdKatakana;  
               Gn[3] = IdKanji;  
               Glr[0] = 0;  
               if ((ts.KanjiCode==IdJIS) &&  
                   (ts.JIS7Katakana==0))  
                 Glr[1] = 2;  // 8-bit katakana  
               else  
                 Glr[1] = 3;  
             }  
             break;  
           case 66: AppliKeyMode = TRUE; break;          // DECNKM  
           case 67: ts.BSKey = IdBS; break;              // DECBKM  
           case 69: LRMarginMode = TRUE; break;          // DECLRMM (DECVSSM)  
           case 1000: // Mouse Tracking  
             if (ts.MouseEventTracking)  
               MouseReportMode = IdMouseTrackVT200;  
             break;  
           case 1001: // Hilite Mouse Tracking  
             if (ts.MouseEventTracking)  
               MouseReportMode = IdMouseTrackVT200Hl;  
             break;  
           case 1002: // Button-Event Mouse Tracking  
             if (ts.MouseEventTracking)  
               MouseReportMode = IdMouseTrackBtnEvent;  
             break;  
           case 1003: // Any-Event Mouse Tracking  
             if (ts.MouseEventTracking)  
               MouseReportMode = IdMouseTrackAllEvent;  
             break;  
           case 1004: // Focus Report  
             if (ts.MouseEventTracking)  
               FocusReportMode = TRUE;  
             break;  
           case 1005: // Extended Mouse Tracking (UTF-8)  
             if (ts.MouseEventTracking)  
               MouseReportExtMode = IdMouseTrackExtUTF8;  
             break;  
           case 1006: // Extended Mouse Tracking (SGR)  
             if (ts.MouseEventTracking)  
               MouseReportExtMode = IdMouseTrackExtSGR;  
             break;  
           case 1015: // Extended Mouse Tracking (rxvt-unicode)  
             if (ts.MouseEventTracking)  
               MouseReportExtMode = IdMouseTrackExtURXVT;  
             break;  
           case 1047: // Alternate Screen Buffer  
             if ((ts.TermFlag & TF_ALTSCR) && !AltScr) {  
               BuffSaveScreen();  
               AltScr = TRUE;  
             }  
             break;  
           case 1048: // Save Cursor Position (Alternate Screen Buffer)  
             if (ts.TermFlag & TF_ALTSCR) {  
               SaveCursor();  
             }  
             break;  
           case 1049: // Alternate Screen Buffer  
             if ((ts.TermFlag & TF_ALTSCR) && !AltScr) {  
               SaveCursor();  
               BuffSaveScreen();  
               BuffClearScreen();  
               AltScr = TRUE;  
             }  
             break;  
           case 2004: // Bracketed Paste Mode  
             BracketedPaste = TRUE;  
             break;  
           case 7727: // mintty Application Escape Mode  
             AppliEscapeMode = 1;  
             break;  
           case 7786: // Wheel to Cursor translation  
             if (ts.TranslateWheelToCursor) {  
               AcceptWheelToCursor = TRUE;  
             }  
             break;  
           case 8200: // ClearThenHome  
             ClearThenHome = TRUE;  
             break;  
           case 14001: // NetTerm mouse mode  
             if (ts.MouseEventTracking)  
               MouseReportMode = IdMouseTrackNetTerm;  
             break;  
           case 14002: // test Application Escape Mode 2  
           case 14003: // test Application Escape Mode 3  
           case 14004: // test Application Escape Mode 4  
             AppliEscapeMode = Param[i] - 14000;  
             break;  
         }  
     }  
   
     void CSQ_i_Mode()           // DECMC  
     {  
       switch (Param[1]) {  
         case 1:  
           if (ts.TermFlag&TF_PRINTERCTRL) {  
             OpenPrnFile();  
             BuffDumpCurrentLine(LF);  
             if (! AutoPrintMode)  
               ClosePrnFile();  
           }  
           break;  
         /* auto print mode off */  
         case 4:  
           if (AutoPrintMode)  
           {  
             ClosePrnFile();  
             AutoPrintMode = FALSE;  
           }  
           break;  
         /* auto print mode on */  
         case 5:  
           if (ts.TermFlag&TF_PRINTERCTRL) {  
             if (! AutoPrintMode)  
             {  
               OpenPrnFile();  
               AutoPrintMode = TRUE;  
             }  
           }  
           break;  
       }  
     }  
   
     void CSQ_l_Mode()           // DECRST  
     {  
       int i;  
   
       for (i = 1 ; i <= NParam ; i++)  
         switch (Param[i]) {  
           case 1: AppliCursorMode = FALSE; break;               // DECCKM  
           case 3: CSQChangeColumnMode(80); break;               // DECCOLM  
           case 5: /* Normal Video (DECSCNM) */  
             if (ts.ColorFlag & CF_REVERSEVIDEO)  
               CSQExchangeColor(); /* Exchange text/back color */  
             break;  
           case 6: // DECOM  
             if (isCursorOnStatusLine)  
               MoveCursor(0,CursorY);  
             else {  
               RelativeOrgMode = FALSE;  
               MoveCursor(0,0);  
             }  
             break;  
           case 7: AutoWrapMode = FALSE; break;          // DECAWM  
           case 8: AutoRepeatMode = FALSE; break;        // DECARM  
           case 9: MouseReportMode = IdMouseTrackNone; break; /* X10 Mouse Tracking */  
           case 12: /* att610 cursor blinking */  
             if (ts.WindowFlag & WF_CURSORCHANGE) {  
               ts.NonblinkingCursor = TRUE;  
               ChangeCaret();  
             }  
             break;  
           case 19: PrintEX = FALSE; break;              // DECPEX  
           case 25: DispEnableCaret(FALSE); break;       // cursor off (DECTCEM)  
           case 47: // Alternate Screen Buffer  
             if ((ts.TermFlag & TF_ALTSCR) && AltScr) {  
               BuffRestoreScreen();  
               AltScr = FALSE;  
             }  
             break;  
           case 59:  
             if (ts.Language==IdJapanese)  
             { /* katakana terminal */  
               Gn[0] = IdASCII;  
               Gn[1] = IdKatakana;  
               Gn[2] = IdKatakana;  
               Gn[3] = IdKanji;  
               Glr[0] = 0;  
               if ((ts.KanjiCode==IdJIS) &&  
                   (ts.JIS7Katakana==0))  
                 Glr[1] = 2;  // 8-bit katakana  
               else  
                 Glr[1] = 3;  
             }  
             break;  
           case 66: AppliKeyMode = FALSE; break;         // DECNKM  
           case 67: ts.BSKey = IdDEL; break;             // DECBKM  
           case 69: // DECLRMM (DECVSSM)  
             LRMarginMode = FALSE;  
             CursorLeftM = 0;  
             CursorRightM = NumOfColumns - 1;  
             break;  
           case 1000: // Mouse Tracking  
           case 1001: // Hilite Mouse Tracking  
           case 1002: // Button-Event Mouse Tracking  
           case 1003: // Any-Event Mouse Tracking  
             MouseReportMode = IdMouseTrackNone;  
             break;  
           case 1004: // Focus Report  
             FocusReportMode = FALSE;  
             break;  
           case 1005: // Extended Mouse Tracking (UTF-8)  
           case 1006: // Extended Mouse Tracking (SGR)  
           case 1015: // Extended Mouse Tracking (rxvt-unicode)  
               MouseReportExtMode = IdMouseTrackExtNone;  
             break;  
           case 1047: // Alternate Screen Buffer  
             if ((ts.TermFlag & TF_ALTSCR) && AltScr) {  
               BuffClearScreen();  
               BuffRestoreScreen();  
               AltScr = FALSE;  
             }  
             break;  
           case 1048: // Save Cursor Position (Alternate Screen Buffer)  
             if (ts.TermFlag & TF_ALTSCR) {  
               RestoreCursor();  
             }  
             break;  
           case 1049: // Alternate Screen Buffer  
             if ((ts.TermFlag & TF_ALTSCR) && AltScr) {  
               BuffClearScreen();  
               BuffRestoreScreen();  
               AltScr = FALSE;  
               RestoreCursor();  
             }  
             break;  
           case 2004: // Bracketed Paste Mode  
             BracketedPaste = FALSE;  
             break;  
           case 7727: // mintty Application Escape Mode  
             AppliEscapeMode = 0;  
             break;  
           case 7786: // Wheel to Cursor translation  
             AcceptWheelToCursor = FALSE;  
             break;  
           case 8200: // ClearThenHome  
             ClearThenHome = FALSE;  
             break;  
           case 14001: // NetTerm mouse mode  
             MouseReportMode = IdMouseTrackNone;  
             break;  
           case 14002: // test Application Escape Mode 2  
           case 14003: // test Application Escape Mode 3  
           case 14004: // test Application Escape Mode 4  
             AppliEscapeMode = 0;  
             break;  
         }  
     }  
   
     void CSQ_n_Mode()           // DECDSR  
     {  
       switch (Param[1]) {  
         case 53:  
         case 55:  
           /* Locator Device Status Report -> Ready */  
           SendCSIstr("?50n", 0);  
           break;  
       }  
     }  
   
   void CSQuest(BYTE b)  
   {  
     switch (b) {  
       case 'J': CSQSelScreenErase(); break;     // DECSED  
       case 'K': CSQSelLineErase(); break;       // DECSEL  
       case 'h': CSQ_h_Mode(); break;            // DECSET  
       case 'i': CSQ_i_Mode(); break;            // DECMC  
       case 'l': CSQ_l_Mode(); break;            // DECRST  
       case 'n': CSQ_n_Mode(); break;            // DECDSR  
     }  
   }  
   
   void SoftReset()  
   // called by software-reset escape sequence handler  
   {  
     UpdateStr();  
     AutoRepeatMode = TRUE;  
     DispEnableCaret(TRUE); // cursor on  
     InsertMode = FALSE;  
     RelativeOrgMode = FALSE;  
     AppliKeyMode = FALSE;  
     AppliCursorMode = FALSE;  
     AppliEscapeMode = FALSE;  
     AcceptWheelToCursor = ts.TranslateWheelToCursor;  
     if (isCursorOnStatusLine)  
       MoveToMainScreen();  
     CursorTop = 0;  
     CursorBottom = NumOfLines-1-StatusLine;  
     CursorLeftM = 0;  
     CursorRightM = NumOfColumns - 1;  
     ResetCharSet();  
   
     /* Attribute */  
     CharAttr = DefCharAttr;  
     Special = FALSE;  
     BuffSetCurCharAttr(CharAttr);  
   
     // status buffers  
     ResetCurSBuffer();  
   
     // Saved IME status  
     IMEstat = FALSE;  
   }  
   
   void CSExc(BYTE b)  
   {  
     switch (b) {  
       case 'p':  
         /* Software reset */  
         SoftReset();  
         break;  
     }  
   }  
   
   void CSDouble(BYTE b)  
   {  
     switch (b) {  
       case 'p': // DECSCL  
         /* Select terminal mode (software reset) */  
         SoftReset();  
         if (NParam > 0) {  
           ChangeTerminalID();  
           if (Param[1] >= 61 && Param[1] <= 65) {  
             if (VTlevel > Param[1] - 60) {  
               VTlevel = Param[1] - 60;  
             }  
           }  
           else {  
             VTlevel = 1;  
           }  
   
           if (VTlevel < 2 || (NParam > 1 && Param[2] == 1))  
             Send8BitMode = FALSE;  
           else  
             Send8BitMode = TRUE;  
2614          }          }
2615          break;  }
2616    
2617    void CSQ_h_Mode() // DECSET
2618    {
2619            int i;
2620    
2621        case 'q': // DECSCA          for (i = 1 ; i<=NParam ; i++) {
2622                    switch (Param[i]) {
2623                      case 1: AppliCursorMode = TRUE; break;                // DECCKM
2624                      case 3: CSQChangeColumnMode(132); break;              // DECCOLM
2625                      case 5: /* Reverse Video (DECSCNM) */
2626                            if (!(ts.ColorFlag & CF_REVERSEVIDEO))
2627                                    CSQExchangeColor(); /* Exchange text/back color */
2628                            break;
2629                      case 6: // DECOM
2630                            if (isCursorOnStatusLine)
2631                                    MoveCursor(0,CursorY);
2632                            else {
2633                                    RelativeOrgMode = TRUE;
2634                                    MoveCursor(0,CursorTop);
2635                            }
2636                            break;
2637                      case 7: AutoWrapMode = TRUE; break;           // DECAWM
2638                      case 8: AutoRepeatMode = TRUE; break;         // DECARM
2639                      case 9: /* X10 Mouse Tracking */
2640                            if (ts.MouseEventTracking)
2641                                    MouseReportMode = IdMouseTrackX10;
2642                            break;
2643                      case 12: /* att610 cursor blinking */
2644                            if (ts.WindowFlag & WF_CURSORCHANGE) {
2645                                    ts.NonblinkingCursor = FALSE;
2646                                    ChangeCaret();
2647                            }
2648                            break;
2649                      case 19: PrintEX = TRUE; break;               // DECPEX
2650                      case 25: DispEnableCaret(TRUE); break;        // cursor on (DECTCEM)
2651                      case 38: // DECTEK
2652                            if (ts.AutoWinSwitch>0)
2653                                    ChangeEmu = IdTEK; /* Enter TEK Mode */
2654                            break;
2655                      case 47: // Alternate Screen Buffer
2656                            if ((ts.TermFlag & TF_ALTSCR) && !AltScr) {
2657                                    BuffSaveScreen();
2658                                    AltScr = TRUE;
2659                            }
2660                            break;
2661                      case 59:
2662                            if (ts.Language==IdJapanese) {
2663                                    /* kanji terminal */
2664                                    Gn[0] = IdASCII;
2665                                    Gn[1] = IdKatakana;
2666                                    Gn[2] = IdKatakana;
2667                                    Gn[3] = IdKanji;
2668                                    Glr[0] = 0;
2669                                    if ((ts.KanjiCode==IdJIS) &&
2670                                        (ts.JIS7Katakana==0))
2671                                            Glr[1] = 2;  // 8-bit katakana
2672                                    else
2673                                            Glr[1] = 3;
2674                            }
2675                            break;
2676                      case 66: AppliKeyMode = TRUE; break;          // DECNKM
2677                      case 67: ts.BSKey = IdBS; break;              // DECBKM
2678                      case 69: LRMarginMode = TRUE; break;          // DECLRMM (DECVSSM)
2679                      case 1000: // Mouse Tracking
2680                            if (ts.MouseEventTracking)
2681                                    MouseReportMode = IdMouseTrackVT200;
2682                            break;
2683                      case 1001: // Hilite Mouse Tracking
2684                            if (ts.MouseEventTracking)
2685                                    MouseReportMode = IdMouseTrackVT200Hl;
2686                            break;
2687                      case 1002: // Button-Event Mouse Tracking
2688                            if (ts.MouseEventTracking)
2689                                    MouseReportMode = IdMouseTrackBtnEvent;
2690                            break;
2691                      case 1003: // Any-Event Mouse Tracking
2692                            if (ts.MouseEventTracking)
2693                                    MouseReportMode = IdMouseTrackAllEvent;
2694                            break;
2695                      case 1004: // Focus Report
2696                            if (ts.MouseEventTracking)
2697                                    FocusReportMode = TRUE;
2698                            break;
2699                      case 1005: // Extended Mouse Tracking (UTF-8)
2700                            if (ts.MouseEventTracking)
2701                                    MouseReportExtMode = IdMouseTrackExtUTF8;
2702                            break;
2703                      case 1006: // Extended Mouse Tracking (SGR)
2704                            if (ts.MouseEventTracking)
2705                                    MouseReportExtMode = IdMouseTrackExtSGR;
2706                            break;
2707                      case 1015: // Extended Mouse Tracking (rxvt-unicode)
2708                            if (ts.MouseEventTracking)
2709                                    MouseReportExtMode = IdMouseTrackExtURXVT;
2710                            break;
2711                      case 1047: // Alternate Screen Buffer
2712                            if ((ts.TermFlag & TF_ALTSCR) && !AltScr) {
2713                                    BuffSaveScreen();
2714                                    AltScr = TRUE;
2715                            }
2716                            break;
2717                      case 1048: // Save Cursor Position (Alternate Screen Buffer)
2718                            if (ts.TermFlag & TF_ALTSCR) {
2719                                    SaveCursor();
2720                            }
2721                            break;
2722                      case 1049: // Alternate Screen Buffer
2723                            if ((ts.TermFlag & TF_ALTSCR) && !AltScr) {
2724                                    SaveCursor();
2725                                    BuffSaveScreen();
2726                                    BuffClearScreen();
2727                                    AltScr = TRUE;
2728                            }
2729                            break;
2730                      case 2004: // Bracketed Paste Mode
2731                            BracketedPaste = TRUE;
2732                            break;
2733                      case 7727: // mintty Application Escape Mode
2734                            AppliEscapeMode = 1;
2735                            break;
2736                      case 7786: // Wheel to Cursor translation
2737                            if (ts.TranslateWheelToCursor) {
2738                                    AcceptWheelToCursor = TRUE;
2739                            }
2740                            break;
2741                      case 8200: // ClearThenHome
2742                            ClearThenHome = TRUE;
2743                            break;
2744                      case 14001: // NetTerm mouse mode
2745                            if (ts.MouseEventTracking)
2746                                    MouseReportMode = IdMouseTrackNetTerm;
2747                            break;
2748                      case 14002: // test Application Escape Mode 2
2749                      case 14003: // test Application Escape Mode 3
2750                      case 14004: // test Application Escape Mode 4
2751                            AppliEscapeMode = Param[i] - 14000;
2752                            break;
2753                    }
2754            }
2755    }
2756    
2757    void CSQ_i_Mode()               // DECMC
2758    {
2759          switch (Param[1]) {          switch (Param[1]) {
           case 0:  
           case 2:  
             CharAttr.Attr2 &= ~Attr2Protect;  
             BuffSetCurCharAttr(CharAttr);  
             break;  
2760            case 1:            case 1:
2761              CharAttr.Attr2 |= Attr2Protect;                  if (ts.TermFlag&TF_PRINTERCTRL) {
2762              BuffSetCurCharAttr(CharAttr);                          OpenPrnFile();
2763              break;                          BuffDumpCurrentLine(LF);
2764            default:                          if (! AutoPrintMode)
2765              /* nothing to do */                                  ClosePrnFile();
2766              break;                  }
2767                    break;
2768              /* auto print mode off */
2769              case 4:
2770                    if (AutoPrintMode) {
2771                            ClosePrnFile();
2772                            AutoPrintMode = FALSE;
2773                    }
2774                    break;
2775              /* auto print mode on */
2776              case 5:
2777                    if (ts.TermFlag&TF_PRINTERCTRL) {
2778                            if (! AutoPrintMode) {
2779                                    OpenPrnFile();
2780                                    AutoPrintMode = TRUE;
2781                            }
2782                    }
2783                    break;
2784          }          }
2785          break;  }
2786      }  
2787    }  void CSQ_l_Mode()               // DECRST
2788    {
2789    void CSDolRequestMode()          int i;
2790    {  
2791      char buff[256];          for (i = 1 ; i <= NParam ; i++) {
2792      char *pp;                  switch (Param[i]) {
2793      int len, resp = 0;                    case 1: AppliCursorMode = FALSE; break;       // DECCKM
2794                      case 3: CSQChangeColumnMode(80); break;       // DECCOLM
2795      if (NParam == 0)                    case 5: /* Normal Video (DECSCNM) */
2796        Param[1] = 0;                          if (ts.ColorFlag & CF_REVERSEVIDEO)
2797                                    CSQExchangeColor(); /* Exchange text/back color */
2798      switch (Prv) {                          break;
2799        case 0: /* ANSI Mode */                    case 6: // DECOM
2800          resp = 4;                          if (isCursorOnStatusLine)
2801          pp = "";                                  MoveCursor(0,CursorY);
2802          switch (Param[1]) {                          else {
2803            case 2:       // KAM                                  RelativeOrgMode = FALSE;
2804              if (KeybEnabled)                                  MoveCursor(0,0);
2805                resp = 2;                          }
2806              else                          break;
2807                resp = 1;                    case 7: AutoWrapMode = FALSE; break;          // DECAWM
2808              break;                    case 8: AutoRepeatMode = FALSE; break;        // DECARM
2809            case 4:       // IRM                    case 9: MouseReportMode = IdMouseTrackNone; break; /* X10 Mouse Tracking */
2810              if (InsertMode)                    case 12: /* att610 cursor blinking */
2811                resp = 1;                          if (ts.WindowFlag & WF_CURSORCHANGE) {
2812              else                                  ts.NonblinkingCursor = TRUE;
2813                resp = 2;                                  ChangeCaret();
2814              break;                          }
2815            case 12:      // SRM                          break;
2816              if (ts.LocalEcho)                    case 19: PrintEX = FALSE; break;              // DECPEX
2817                resp = 2;                    case 25: DispEnableCaret(FALSE); break;       // cursor off (DECTCEM)
2818              else                    case 47: // Alternate Screen Buffer
2819                resp = 1;                          if ((ts.TermFlag & TF_ALTSCR) && AltScr) {
2820              break;                                  BuffRestoreScreen();
2821            case 20:      // LNM                                  AltScr = FALSE;
2822              if (LFMode)                          }
2823                resp = 1;                          break;
2824              else                    case 59:
2825                resp = 2;                          if (ts.Language==IdJapanese) {
2826              break;                                  /* katakana terminal */
2827            case 33:      // WYSTCURM                                  Gn[0] = IdASCII;
2828              if (ts.NonblinkingCursor)                                  Gn[1] = IdKatakana;
2829                resp = 1;                                  Gn[2] = IdKatakana;
2830              else                                  Gn[3] = IdKanji;
2831                resp = 2;                                  Glr[0] = 0;
2832              if ((ts.WindowFlag & WF_CURSORCHANGE) == 0)                                  if ((ts.KanjiCode==IdJIS) &&
2833                resp += 2;                                      (ts.JIS7Katakana==0))
2834              break;                                          Glr[1] = 2;     // 8-bit katakana
2835            case 34:      // WYULCURM                                  else
2836              if (ts.CursorShape == IdHCur)                                          Glr[1] = 3;
2837                resp = 1;                          }
2838              else                          break;
2839                resp = 2;                    case 66: AppliKeyMode = FALSE; break;         // DECNKM
2840              if ((ts.WindowFlag & WF_CURSORCHANGE) == 0)                    case 67: ts.BSKey = IdDEL; break;             // DECBKM
2841                resp += 2;                    case 69: // DECLRMM (DECVSSM)
2842              break;                          LRMarginMode = FALSE;
2843                            CursorLeftM = 0;
2844                            CursorRightM = NumOfColumns - 1;
2845                            break;
2846                      case 1000: // Mouse Tracking
2847                      case 1001: // Hilite Mouse Tracking
2848                      case 1002: // Button-Event Mouse Tracking
2849                      case 1003: // Any-Event Mouse Tracking
2850                            MouseReportMode = IdMouseTrackNone;
2851                            break;
2852                      case 1004: // Focus Report
2853                            FocusReportMode = FALSE;
2854                            break;
2855                      case 1005: // Extended Mouse Tracking (UTF-8)
2856                      case 1006: // Extended Mouse Tracking (SGR)
2857                      case 1015: // Extended Mouse Tracking (rxvt-unicode)
2858                            MouseReportExtMode = IdMouseTrackExtNone;
2859                            break;
2860                      case 1047: // Alternate Screen Buffer
2861                            if ((ts.TermFlag & TF_ALTSCR) && AltScr) {
2862                                    BuffClearScreen();
2863                                    BuffRestoreScreen();
2864                                    AltScr = FALSE;
2865                            }
2866                            break;
2867                      case 1048: // Save Cursor Position (Alternate Screen Buffer)
2868                            if (ts.TermFlag & TF_ALTSCR) {
2869                                    RestoreCursor();
2870                            }
2871                            break;
2872                      case 1049: // Alternate Screen Buffer
2873                            if ((ts.TermFlag & TF_ALTSCR) && AltScr) {
2874                                    BuffClearScreen();
2875                                    BuffRestoreScreen();
2876                                    AltScr = FALSE;
2877                                    RestoreCursor();
2878                            }
2879                            break;
2880                      case 2004: // Bracketed Paste Mode
2881                            BracketedPaste = FALSE;
2882                            break;
2883                      case 7727: // mintty Application Escape Mode
2884                            AppliEscapeMode = 0;
2885                            break;
2886                      case 7786: // Wheel to Cursor translation
2887                            AcceptWheelToCursor = FALSE;
2888                            break;
2889                      case 8200: // ClearThenHome
2890                            ClearThenHome = FALSE;
2891                            break;
2892                      case 14001: // NetTerm mouse mode
2893                            MouseReportMode = IdMouseTrackNone;
2894                            break;
2895                      case 14002: // test Application Escape Mode 2
2896                      case 14003: // test Application Escape Mode 3
2897                      case 14004: // test Application Escape Mode 4
2898                            AppliEscapeMode = 0;
2899                            break;
2900                    }
2901          }          }
2902          break;  }
2903    
2904        case '?': /* DEC Mode */  void CSQ_n_Mode()               // DECDSR
2905          pp = "?";  {
2906          switch (Param[1]) {          switch (Param[1]) {
2907            case 1:       // DECCKM            case 53:
2908              if (AppliCursorMode)            case 55:
2909                resp = 1;                  /* Locator Device Status Report -> Ready */
2910              else                  SendCSIstr("?50n", 0);
2911                resp = 2;                  break;
             break;  
           case 3:       // DECCOLM  
             if (NumOfColumns == 132)  
               resp = 1;  
             else  
               resp = 2;  
             break;  
           case 5:       // DECSCNM  
             if (ts.ColorFlag & CF_REVERSEVIDEO)  
               resp = 1;  
             else  
               resp = 2;  
             break;  
           case 6:       // DECOM  
             if (RelativeOrgMode)  
               resp = 1;  
             else  
               resp = 2;  
             break;  
           case 7:       // DECAWM  
             if (AutoWrapMode)  
               resp = 1;  
             else  
               resp = 2;  
             break;  
           case 8:       // DECARM  
             if (AutoRepeatMode)  
               resp = 1;  
             else  
               resp = 2;  
             break;  
           case 9:       // XT_MSE_X10 -- X10 Mouse Tracking  
             if (!ts.MouseEventTracking)  
               resp = 4;  
             else if (MouseReportMode == IdMouseTrackX10)  
               resp = 1;  
             else  
               resp = 2;  
             break;  
           case 12:      // XT_CBLINK -- att610 cursor blinking  
             if (ts.NonblinkingCursor)  
               resp = 2;  
             else  
               resp = 1;  
             if ((ts.WindowFlag & WF_CURSORCHANGE) == 0)  
               resp += 2;  
             break;  
           case 19:      // DECPEX  
             if (PrintEX)  
               resp = 1;  
             else  
               resp = 2;  
             break;  
           case 25:      // DECTCEM  
             if (IsCaretEnabled())  
               resp = 1;  
             else  
               resp = 2;  
             break;  
           case 38:      // DECTEK  
             resp = 4;  
             break;  
           case 47:      // XT_ALTSCRN -- Alternate Screen / (DECGRPM)  
             if ((ts.TermFlag & TF_ALTSCR) == 0)  
               resp = 4;  
             else if (AltScr)  
               resp = 1;  
             else  
               resp = 2;  
             break;  
           case 59:      // DECKKDM  
             if (ts.Language!=IdJapanese)  
               resp = 0;  
             else if ((ts.KanjiCode == IdJIS) && (!ts.JIS7Katakana))  
               resp = 4;  
             else  
               resp = 3;  
             break;  
           case 66:      // DECNKM  
             if (AppliKeyMode)  
               resp = 1;  
             else  
               resp = 2;  
             break;  
           case 67:      // DECBKM  
             if (ts.BSKey==IdBS)  
               resp = 1;  
             else  
               resp = 2;  
             break;  
           case  1000:   // XT_MSE_X11  
             if (!ts.MouseEventTracking)  
               resp = 4;  
             else if (MouseReportMode == IdMouseTrackVT200)  
               resp = 1;  
             else  
               resp = 2;  
             break;  
           case 1001:    // XT_MSE_HL  
 #if 0  
             if (!ts.MouseEventTracking)  
               resp = 4;  
             else if (MouseReportMode == IdMouseTrackVT200Hl)  
               resp = 1;  
             else  
               resp = 2;  
 #else  
             resp = 4;  
 #endif  
             break;  
           case 1002:    // XT_MSE_BTN  
             if (!ts.MouseEventTracking)  
               resp = 4;  
             else if (MouseReportMode == IdMouseTrackBtnEvent)  
               resp = 1;  
             else  
               resp = 2;  
             break;  
           case 1003:    // XT_MSE_ANY  
             if (!ts.MouseEventTracking)  
               resp = 4;  
             else if (MouseReportMode == IdMouseTrackAllEvent)  
               resp = 1;  
             else  
               resp = 2;  
             break;  
           case 1004:    // XT_MSE_WIN  
             if (!ts.MouseEventTracking)  
               resp = 4;  
             else if (FocusReportMode)  
               resp = 1;  
             else  
               resp = 2;  
             break;  
           case 1005:    // XT_MSE_UTF  
             if (!ts.MouseEventTracking)  
               resp = 4;  
             else if (MouseReportExtMode == IdMouseTrackExtUTF8)  
               resp = 1;  
             else  
               resp = 2;  
             break;  
           case 1006:    // XT_MSE_SGR  
             if (!ts.MouseEventTracking)  
               resp = 4;  
             else if (MouseReportExtMode == IdMouseTrackExtSGR)  
               resp = 1;  
             else  
               resp = 2;  
             break;  
           case 1015:    // urxvt-style extended mouse tracking  
             if (!ts.MouseEventTracking)  
               resp = 4;  
             else if (MouseReportExtMode == IdMouseTrackExtURXVT)  
               resp = 1;  
             else  
               resp = 2;  
             break;  
           case 1047:    // XT_ALTS_47  
             if ((ts.TermFlag & TF_ALTSCR) == 0)  
               resp = 4;  
             else if (AltScr)  
               resp = 1;  
             else  
               resp = 2;  
             break;  
           case 1048:  
             if ((ts.TermFlag & TF_ALTSCR) == 0)  
               resp = 4;  
             else  
               resp = 1;  
             break;  
           case 1049:    // XT_EXTSCRN  
             if ((ts.TermFlag & TF_ALTSCR) == 0)  
               resp = 4;  
             else if (AltScr)  
               resp = 1;  
             else  
               resp = 2;  
             break;  
           case 2004:    // RL_BRACKET  
             if (BracketedPaste)  
               resp = 1;  
             else  
               resp = 2;  
             break;  
           case 7727:    // MinTTY Application Escape Mode  
             if (AppliEscapeMode == 1)  
               resp = 1;  
             else  
               resp = 2;  
             break;  
           case 7786:    // MinTTY Mousewheel reporting  
             if (!ts.TranslateWheelToCursor)  
               resp = 4;  
             else if (AcceptWheelToCursor)  
               resp = 1;  
             else  
               resp = 2;  
             break;  
           case 8200:    // ClearThenHome  
             if (ClearThenHome)  
               resp = 1;  
             else  
               resp = 2;  
             break;  
           case 14001:   // NetTerm Mouse Reporting (TT)  
             if (!ts.MouseEventTracking)  
               resp = 4;  
             else if (MouseReportMode == IdMouseTrackNetTerm)  
               resp = 1;  
             else  
               resp = 2;  
             break;  
           case 14002:   // test Application Escape Mode 2  
           case 14003:   // test Application Escape Mode 3  
           case 14004:   // test Application Escape Mode 4  
             if (AppliEscapeMode == Param[1] - 14000)  
               resp = 1;  
             else  
               resp = 2;  
             break;  
         }  
         break;  
     }  
   
     len = _snprintf_s(buff, sizeof(buff), _TRUNCATE, "%s%d;%d$y", pp, Param[1], resp);  
     SendCSIstr(buff, len);  
   }  
   
   void CSDol(BYTE b)  
   {  
     TCharAttr attr, mask;  
     attr = DefCharAttr;  
     mask = DefCharAttr;  
   
     switch (b) {  
       case 'p': // DECRQM  
         CSDolRequestMode();  
         break;  
       case 'r': // DECCARA  
       case 't': // DECRARA  
         if (Param[1] < 1 || NParam < 1) Param[1] = 1;  
         if (Param[2] < 1 || NParam < 2) Param[2] = 1;  
         if (Param[3] < 1 || NParam < 3) Param[3] = NumOfLines-StatusLine;  
         if (Param[4] < 1 || NParam < 4) Param[4] = NumOfColumns;  
         if (Param[1] <= Param[3] && Param[2] <= Param[4]) {  
           if (RelativeOrgMode) {  
             Param[1] += CursorTop;  
             if (Param[1] > CursorBottom) {  
               Param[1] = CursorBottom + 1;  
             }  
             Param[3] += CursorTop;  
             if (Param[3] > CursorBottom) {  
               Param[3] = CursorBottom + 1;  
             }  
           }  
         }  
         ParseSGRParams(&attr, &mask, 5);  
         if (b == 'r') { // DECCARA  
           attr.Attr &= AttrSgrMask;  
           mask.Attr &= AttrSgrMask;  
           attr.Attr2 &= Attr2ColorMask;  
           mask.Attr2 &= Attr2ColorMask;  
           BuffChangeAttrBox(Param[2]-1, Param[1]-1, Param[4]-1, Param[3]-1, &attr, &mask);  
         }  
         else { // DECRARA  
           attr.Attr &= AttrSgrMask;  
           BuffChangeAttrBox(Param[2]-1, Param[1]-1, Param[4]-1, Param[3]-1, &attr, NULL);  
         }  
         break;  
       case 'v': // DECCRA  
         if (Param[1] < 1 || NParam < 1) Param[1] = 1;  
         if (Param[2] < 1 || NParam < 2) Param[2] = 1;  
         if (Param[3] < 1 || NParam < 3) Param[3] = NumOfLines-StatusLine;  
         if (Param[4] < 1 || NParam < 4) Param[4] = NumOfColumns;  
         if (Param[5] < 1 || NParam < 5) Param[5] = 1;  
         if (Param[6] < 1 || NParam < 6) Param[6] = 1;  
         if (Param[7] < 1 || NParam < 7) Param[7] = 1;  
         if (Param[8] < 1 || NParam < 8) Param[8] = 1;  
         if (Param[1] <= Param[3] && Param[2] <= Param[4]) {  
           if (RelativeOrgMode) {  
             Param[1] += CursorTop;  
             if (Param[1] > CursorBottom) {  
               Param[1] = CursorBottom + 1;  
             }  
             Param[3] += CursorTop;  
             if (Param[3] > CursorBottom) {  
               Param[3] = CursorBottom + 1;  
             }  
             Param[6] += CursorTop;  
             if (Param[6] > CursorBottom) {  
               Param[6] = CursorBottom + 1;  
             }  
             if (Param[6] + Param[3] - Param[1] > CursorBottom) {  
               Param[3] = Param[1] + CursorBottom - Param[6] + 1;  
             }  
           }  
           BuffCopyBox(Param[2], Param[1], Param[4], Param[3], Param[5], Param[7], Param[6], Param[8]);  
         }  
         break;  
       case 'x': // DECFRA  
         if (NParam < 1 || Param[1] < 32 || (Param[1] > 127 && Param[1] < 160) || Param[1] > 255) {  
           return;  
         }  
         if (Param[2] < 1 || NParam < 2) Param[2] = 1;  
         if (Param[3] < 1 || NParam < 3) Param[3] = 1;  
         if (Param[4] < 1 || NParam < 4) Param[4] = NumOfLines-StatusLine;  
         if (Param[5] < 1 || NParam < 5) Param[5] = NumOfColumns;  
         if (Param[2] > Param[4] || Param[3] > Param[5]) {  
           return;  
2912          }          }
2913          if (RelativeOrgMode) {  }
2914            Param[2] += CursorTop;  
2915            if (Param[2] > CursorBottom) {  void CSQuest(BYTE b)
2916              Param[2] = CursorBottom + 1;  {
2917            }          switch (b) {
2918            Param[4] += CursorTop;            case 'J': CSQSelScreenErase(); break; // DECSED
2919            if (Param[4] > CursorBottom) {            case 'K': CSQSelLineErase(); break;   // DECSEL
2920              Param[4] = CursorBottom + 1;            case 'h': CSQ_h_Mode(); break;        // DECSET
2921            }            case 'i': CSQ_i_Mode(); break;        // DECMC
2922          }            case 'l': CSQ_l_Mode(); break;        // DECRST
2923          BuffFillBox(Param[1], Param[3]-1, Param[2]-1, Param[5]-1, Param[4]-1);            case 'n': CSQ_n_Mode(); break;        // DECDSR
         break;  
   
       case 'z': // DECERA  
       case '{': // DECSERA  
         if (Param[1] < 1 || NParam < 1) Param[1]=1;  
         if (Param[2] < 1 || NParam < 2) Param[2]=1;  
         if (Param[3] < 1 || NParam < 3) Param[3]=NumOfLines-StatusLine;  
         if (Param[4] < 1 || NParam < 4) Param[4]=NumOfColumns;  
         if (RelativeOrgMode) {  
           Param[1] += CursorTop;  
           if (Param[1] > CursorBottom) {  
             Param[1] = CursorBottom + 1;  
           }  
           Param[3] += CursorTop;  
           if (Param[3] > CursorBottom) {  
             Param[3] = CursorBottom + 1;  
           }  
2924          }          }
2925          if (b == 'z') {  }
2926            BuffEraseBox(Param[2]-1, Param[1]-1, Param[4]-1, Param[3]-1);  
2927    void SoftReset()
2928    // called by software-reset escape sequence handler
2929    {
2930            UpdateStr();
2931            AutoRepeatMode = TRUE;
2932            DispEnableCaret(TRUE); // cursor on
2933            InsertMode = FALSE;
2934            RelativeOrgMode = FALSE;
2935            AppliKeyMode = FALSE;
2936            AppliCursorMode = FALSE;
2937            AppliEscapeMode = FALSE;
2938            AcceptWheelToCursor = ts.TranslateWheelToCursor;
2939            if (isCursorOnStatusLine)
2940                    MoveToMainScreen();
2941            CursorTop = 0;
2942            CursorBottom = NumOfLines-1-StatusLine;
2943            CursorLeftM = 0;
2944            CursorRightM = NumOfColumns - 1;
2945            ResetCharSet();
2946    
2947            /* Attribute */
2948            CharAttr = DefCharAttr;
2949            Special = FALSE;
2950            BuffSetCurCharAttr(CharAttr);
2951    
2952            // status buffers
2953            ResetCurSBuffer();
2954    
2955            // Saved IME status
2956            IMEstat = FALSE;
2957    }
2958    
2959    void CSExc(BYTE b)
2960    {
2961            switch (b) {
2962              case 'p':
2963                    /* Software reset */
2964                    SoftReset();
2965                    break;
2966          }          }
2967          else {  }
2968            BuffSelectiveEraseBox(Param[2]-1, Param[1]-1, Param[4]-1, Param[3]-1);  
2969    void CSDouble(BYTE b)
2970    {
2971            switch (b) {
2972              case 'p': // DECSCL
2973                    /* Select terminal mode (software reset) */
2974                    SoftReset();
2975                    if (NParam > 0) {
2976                            ChangeTerminalID();
2977                            if (Param[1] >= 61 && Param[1] <= 65) {
2978                                    if (VTlevel > Param[1] - 60) {
2979                                            VTlevel = Param[1] - 60;
2980                                    }
2981                            }
2982                            else {
2983                                    VTlevel = 1;
2984                            }
2985    
2986                            if (VTlevel < 2 || (NParam > 1 && Param[2] == 1))
2987                                    Send8BitMode = FALSE;
2988                            else
2989                                    Send8BitMode = TRUE;
2990                    }
2991                    break;
2992    
2993              case 'q': // DECSCA
2994                    switch (Param[1]) {
2995                      case 0:
2996                      case 2:
2997                            CharAttr.Attr2 &= ~Attr2Protect;
2998                            BuffSetCurCharAttr(CharAttr);
2999                            break;
3000                      case 1:
3001                            CharAttr.Attr2 |= Attr2Protect;
3002                            BuffSetCurCharAttr(CharAttr);
3003                            break;
3004                      default:
3005                            /* nothing to do */
3006                            break;
3007                    }
3008                    break;
3009          }          }
3010          break;  }
3011    
3012        case '}': // DECSASD  void CSDolRequestMode()
3013          if ((ts.TermFlag & TF_ENABLESLINE)==0) return;  {
3014          if (StatusLine==0) return;          char buff[256];
3015          if ((Param[1]<1) && (CursorY==NumOfLines-1))          char *pp;
3016            MoveToMainScreen();          int len, resp = 0;
3017          else if ((Param[1]==1) && (CursorY<NumOfLines-1))  
3018            MoveToStatusLine();          if (NParam == 0)
3019          break;                  Param[1] = 0;
3020        case '~': // DECSSDT  
3021          if ((ts.TermFlag & TF_ENABLESLINE)==0) return;          switch (Prv) {
3022          if (Param[1]<=1)            case 0: /* ANSI Mode */
3023            HideStatusLine();                  resp = 4;
3024          else if ((StatusLine==0) && (Param[1]==2))                  pp = "";
3025            ShowStatusLine(1); // show                  switch (Param[1]) {
3026          break;                    case 2:       // KAM
3027      }                          if (KeybEnabled)
3028    }                                  resp = 2;
3029                            else
3030    void CSQDol(BYTE b)                                  resp = 1;
3031    {                          break;
3032      switch (b) {                    case 4:       // IRM
3033        case 'p':                          if (InsertMode)
3034          CSDolRequestMode();                                  resp = 1;
3035          break;                          else
3036      }                                  resp = 2;
3037    }                          break;
3038                      case 12:      // SRM
3039    void CSQuote(BYTE b)                          if (ts.LocalEcho)
3040    {                                  resp = 2;
3041      int i, x, y;                          else
3042      switch (b) {                                  resp = 1;
3043        case 'w': // Enable Filter Rectangle (DECEFR)                          break;
3044          if (MouseReportMode == IdMouseTrackDECELR) {                    case 20:      // LNM
3045            if (DecLocatorFlag & DecLocatorPixel) {                          if (LFMode)
3046              x = LastX + 1;                                  resp = 1;
3047              y = LastY + 1;                          else
3048            }                                  resp = 2;
3049            else {                          break;
3050              DispConvWinToScreen(LastX, LastY, &x, &y, NULL);                    case 33:      // WYSTCURM
3051              x++;                          if (ts.NonblinkingCursor)
3052              y++;                                  resp = 1;
3053            }                          else
3054            FilterTop    = (NParam<1 || Param[1]<1)? y : Param[1];                                  resp = 2;
3055            FilterLeft   = (NParam<2 || Param[2]<1)? x : Param[2];                          if ((ts.WindowFlag & WF_CURSORCHANGE) == 0)
3056            FilterBottom = (NParam<3 || Param[3]<1)? y : Param[3];                                  resp += 2;
3057            FilterRight  = (NParam<4 || Param[4]<1)? x : Param[4];                          break;
3058            if (FilterTop > FilterBottom) {                    case 34:      // WYULCURM
3059              i = FilterTop; FilterTop = FilterBottom; FilterBottom = i;                          if (ts.CursorShape == IdHCur)
3060            }                                  resp = 1;
3061            if (FilterLeft > FilterRight) {                          else
3062              i = FilterLeft; FilterLeft = FilterRight; FilterRight = i;                                  resp = 2;
3063            }                          if ((ts.WindowFlag & WF_CURSORCHANGE) == 0)
3064            DecLocatorFlag |= DecLocatorFiltered;                                  resp += 2;
3065            DecLocatorReport(IdMouseEventMove, 0);                          break;
3066                    }
3067                    break;
3068    
3069              case '?': /* DEC Mode */
3070                    pp = "?";
3071                    switch (Param[1]) {
3072                      case 1:       // DECCKM
3073                            if (AppliCursorMode)
3074                                    resp = 1;
3075                            else
3076                                    resp = 2;
3077                            break;
3078                      case 3:       // DECCOLM
3079                            if (NumOfColumns == 132)
3080                                    resp = 1;
3081                            else
3082                                    resp = 2;
3083                            break;
3084                      case 5:       // DECSCNM
3085                            if (ts.ColorFlag & CF_REVERSEVIDEO)
3086                                    resp = 1;
3087                            else
3088                                    resp = 2;
3089                            break;
3090                      case 6:       // DECOM
3091                            if (RelativeOrgMode)
3092                                    resp = 1;
3093                            else
3094                                    resp = 2;
3095                            break;
3096                      case 7:       // DECAWM
3097                            if (AutoWrapMode)
3098                                    resp = 1;
3099                            else
3100                                    resp = 2;
3101                            break;
3102                      case 8:       // DECARM
3103                            if (AutoRepeatMode)
3104                                    resp = 1;
3105                            else
3106                                    resp = 2;
3107                            break;
3108                      case 9:       // XT_MSE_X10 -- X10 Mouse Tracking
3109                            if (!ts.MouseEventTracking)
3110                                    resp = 4;
3111                            else if (MouseReportMode == IdMouseTrackX10)
3112                                    resp = 1;
3113                            else
3114                                    resp = 2;
3115                            break;
3116                      case 12:      // XT_CBLINK -- att610 cursor blinking
3117                            if (ts.NonblinkingCursor)
3118                                    resp = 2;
3119                            else
3120                                    resp = 1;
3121                            if ((ts.WindowFlag & WF_CURSORCHANGE) == 0)
3122                                    resp += 2;
3123                            break;
3124                      case 19:      // DECPEX
3125                            if (PrintEX)
3126                                    resp = 1;
3127                            else
3128                                    resp = 2;
3129                            break;
3130                      case 25:      // DECTCEM
3131                            if (IsCaretEnabled())
3132                                    resp = 1;
3133                            else
3134                                    resp = 2;
3135                            break;
3136                      case 38:      // DECTEK
3137                            resp = 4;
3138                            break;
3139                      case 47:      // XT_ALTSCRN -- Alternate Screen / (DECGRPM)
3140                            if ((ts.TermFlag & TF_ALTSCR) == 0)
3141                                    resp = 4;
3142                            else if (AltScr)
3143                                    resp = 1;
3144                            else
3145                                    resp = 2;
3146                            break;
3147                      case 59:      // DECKKDM
3148                            if (ts.Language!=IdJapanese)
3149                                    resp = 0;
3150                            else if ((ts.KanjiCode == IdJIS) && (!ts.JIS7Katakana))
3151                                    resp = 4;
3152                            else
3153                                    resp = 3;
3154                            break;
3155                      case 66:      // DECNKM
3156                            if (AppliKeyMode)
3157                                    resp = 1;
3158                            else
3159                                    resp = 2;
3160                            break;
3161                      case 67:      // DECBKM
3162                            if (ts.BSKey==IdBS)
3163                                    resp = 1;
3164                            else
3165                                    resp = 2;
3166                            break;
3167                      case  1000:   // XT_MSE_X11
3168                            if (!ts.MouseEventTracking)
3169                                    resp = 4;
3170                            else if (MouseReportMode == IdMouseTrackVT200)
3171                                    resp = 1;
3172                            else
3173                                    resp = 2;
3174                            break;
3175                      case 1001:    // XT_MSE_HL
3176    #if 0
3177                            if (!ts.MouseEventTracking)
3178                                    resp = 4;
3179                            else if (MouseReportMode == IdMouseTrackVT200Hl)
3180                                    resp = 1;
3181                            else
3182                                    resp = 2;
3183    #else
3184                            resp = 4;
3185    #endif
3186                            break;
3187                      case 1002:    // XT_MSE_BTN
3188                            if (!ts.MouseEventTracking)
3189                                    resp = 4;
3190                            else if (MouseReportMode == IdMouseTrackBtnEvent)
3191                                    resp = 1;
3192                            else
3193                                    resp = 2;
3194                            break;
3195                      case 1003:    // XT_MSE_ANY
3196                            if (!ts.MouseEventTracking)
3197                                    resp = 4;
3198                            else if (MouseReportMode == IdMouseTrackAllEvent)
3199                                    resp = 1;
3200                            else
3201                                    resp = 2;
3202                            break;
3203                      case 1004:    // XT_MSE_WIN
3204                            if (!ts.MouseEventTracking)
3205                                    resp = 4;
3206                            else if (FocusReportMode)
3207                                    resp = 1;
3208                            else
3209                                    resp = 2;
3210                            break;
3211                      case 1005:    // XT_MSE_UTF
3212                            if (!ts.MouseEventTracking)
3213                                    resp = 4;
3214                            else if (MouseReportExtMode == IdMouseTrackExtUTF8)
3215                                    resp = 1;
3216                            else
3217                                    resp = 2;
3218                            break;
3219                      case 1006:    // XT_MSE_SGR
3220                            if (!ts.MouseEventTracking)
3221                                    resp = 4;
3222                            else if (MouseReportExtMode == IdMouseTrackExtSGR)
3223                                    resp = 1;
3224                            else
3225                                    resp = 2;
3226                            break;
3227                      case 1015:    // urxvt-style extended mouse tracking
3228                            if (!ts.MouseEventTracking)
3229                                    resp = 4;
3230                            else if (MouseReportExtMode == IdMouseTrackExtURXVT)
3231                                    resp = 1;
3232                            else
3233                                    resp = 2;
3234                            break;
3235                      case 1047:    // XT_ALTS_47
3236                            if ((ts.TermFlag & TF_ALTSCR) == 0)
3237                                    resp = 4;
3238                            else if (AltScr)
3239                                    resp = 1;
3240                            else
3241                                    resp = 2;
3242                            break;
3243                      case 1048:
3244                            if ((ts.TermFlag & TF_ALTSCR) == 0)
3245                                    resp = 4;
3246                            else
3247                                    resp = 1;
3248                            break;
3249                      case 1049:    // XT_EXTSCRN
3250                            if ((ts.TermFlag & TF_ALTSCR) == 0)
3251                                    resp = 4;
3252                            else if (AltScr)
3253                                    resp = 1;
3254                            else
3255                                    resp = 2;
3256                            break;
3257                      case 2004:    // RL_BRACKET
3258                            if (BracketedPaste)
3259                                    resp = 1;
3260                            else
3261                                    resp = 2;
3262                            break;
3263                      case 7727:    // MinTTY Application Escape Mode
3264                            if (AppliEscapeMode == 1)
3265                                    resp = 1;
3266                            else
3267                                    resp = 2;
3268                            break;
3269                      case 7786:    // MinTTY Mousewheel reporting
3270                            if (!ts.TranslateWheelToCursor)
3271                                    resp = 4;
3272                            else if (AcceptWheelToCursor)
3273                                    resp = 1;
3274                            else
3275                                    resp = 2;
3276                            break;
3277                      case 8200:    // ClearThenHome
3278                            if (ClearThenHome)
3279                                    resp = 1;
3280                            else
3281                                    resp = 2;
3282                            break;
3283                      case 14001:   // NetTerm Mouse Reporting (TT)
3284                            if (!ts.MouseEventTracking)
3285                                    resp = 4;
3286                            else if (MouseReportMode == IdMouseTrackNetTerm)
3287                                    resp = 1;
3288                            else
3289                                    resp = 2;
3290                            break;
3291                      case 14002:   // test Application Escape Mode 2
3292                      case 14003:   // test Application Escape Mode 3
3293                      case 14004:   // test Application Escape Mode 4
3294                            if (AppliEscapeMode == Param[1] - 14000)
3295                                    resp = 1;
3296                            else
3297                                    resp = 2;
3298                            break;
3299                    }
3300                    break;
3301          }          }
         break;  
3302    
3303        case 'z': // Enable DEC Locator reporting (DECELR)          len = _snprintf_s(buff, sizeof(buff), _TRUNCATE, "%s%d;%d$y", pp, Param[1], resp);
3304          switch (Param[1]) {          SendCSIstr(buff, len);
3305          case 0:  }
3306            if (MouseReportMode == IdMouseTrackDECELR) {  
3307              MouseReportMode = IdMouseTrackNone;  void CSDol(BYTE b)
3308            }  {
3309            break;          TCharAttr attr, mask;
3310          case 1:          attr = DefCharAttr;
3311            if (ts.MouseEventTracking) {          mask = DefCharAttr;
3312              MouseReportMode = IdMouseTrackDECELR;  
3313              DecLocatorFlag &= ~DecLocatorOneShot;          switch (b) {
3314            }            case 'p': // DECRQM
3315            break;                  CSDolRequestMode();
3316          case 2:                  break;
3317            if (ts.MouseEventTracking) {            case 'r': // DECCARA
3318              MouseReportMode = IdMouseTrackDECELR;            case 't': // DECRARA
3319              DecLocatorFlag |= DecLocatorOneShot;                  if (Param[1] < 1 || NParam < 1) Param[1] = 1;
3320            }                  if (Param[2] < 1 || NParam < 2) Param[2] = 1;
3321            break;                  if (Param[3] < 1 || NParam < 3) Param[3] = NumOfLines-StatusLine;
3322                    if (Param[4] < 1 || NParam < 4) Param[4] = NumOfColumns;
3323                    if (Param[1] <= Param[3] && Param[2] <= Param[4]) {
3324                            if (RelativeOrgMode) {
3325                                    Param[1] += CursorTop;
3326                                    if (Param[1] > CursorBottom) {
3327                                            Param[1] = CursorBottom + 1;
3328                                    }
3329                                    Param[3] += CursorTop;
3330                                    if (Param[3] > CursorBottom) {
3331                                            Param[3] = CursorBottom + 1;
3332                                    }
3333                            }
3334                    }
3335                    ParseSGRParams(&attr, &mask, 5);
3336                    if (b == 'r') { // DECCARA
3337                            attr.Attr &= AttrSgrMask;
3338                            mask.Attr &= AttrSgrMask;
3339                            attr.Attr2 &= Attr2ColorMask;
3340                            mask.Attr2 &= Attr2ColorMask;
3341                            BuffChangeAttrBox(Param[2]-1, Param[1]-1, Param[4]-1, Param[3]-1, &attr, &mask);
3342                    }
3343                    else { // DECRARA
3344                            attr.Attr &= AttrSgrMask;
3345                            BuffChangeAttrBox(Param[2]-1, Param[1]-1, Param[4]-1, Param[3]-1, &attr, NULL);
3346                    }
3347                    break;
3348              case 'v': // DECCRA
3349                    if (Param[1] < 1 || NParam < 1) Param[1] = 1;
3350                    if (Param[2] < 1 || NParam < 2) Param[2] = 1;
3351                    if (Param[3] < 1 || NParam < 3) Param[3] = NumOfLines-StatusLine;
3352                    if (Param[4] < 1 || NParam < 4) Param[4] = NumOfColumns;
3353                    if (Param[5] < 1 || NParam < 5) Param[5] = 1;
3354                    if (Param[6] < 1 || NParam < 6) Param[6] = 1;
3355                    if (Param[7] < 1 || NParam < 7) Param[7] = 1;
3356                    if (Param[8] < 1 || NParam < 8) Param[8] = 1;
3357                    if (Param[1] <= Param[3] && Param[2] <= Param[4]) {
3358                            if (RelativeOrgMode) {
3359                                    Param[1] += CursorTop;
3360                                    if (Param[1] > CursorBottom) {
3361                                            Param[1] = CursorBottom + 1;
3362                                    }
3363                                    Param[3] += CursorTop;
3364                                    if (Param[3] > CursorBottom) {
3365                                            Param[3] = CursorBottom + 1;
3366                                    }
3367                                    Param[6] += CursorTop;
3368                                    if (Param[6] > CursorBottom) {
3369                                            Param[6] = CursorBottom + 1;
3370                                    }
3371                                    if (Param[6] + Param[3] - Param[1] > CursorBottom) {
3372                                            Param[3] = Param[1] + CursorBottom - Param[6] + 1;
3373                                    }
3374                            }
3375                            BuffCopyBox(Param[2], Param[1], Param[4], Param[3], Param[5], Param[7], Param[6], Param[8]);
3376                    }
3377                    break;
3378              case 'x': // DECFRA
3379                    if (NParam < 1 || Param[1] < 32 || (Param[1] > 127 && Param[1] < 160) || Param[1] > 255) {
3380                            return;
3381                    }
3382                    if (Param[2] < 1 || NParam < 2) Param[2] = 1;
3383                    if (Param[3] < 1 || NParam < 3) Param[3] = 1;
3384                    if (Param[4] < 1 || NParam < 4) Param[4] = NumOfLines-StatusLine;
3385                    if (Param[5] < 1 || NParam < 5) Param[5] = NumOfColumns;
3386                    if (Param[2] > Param[4] || Param[3] > Param[5]) {
3387                            return;
3388                    }
3389                    if (RelativeOrgMode) {
3390                            Param[2] += CursorTop;
3391                            if (Param[2] > CursorBottom) {
3392                                    Param[2] = CursorBottom + 1;
3393                            }
3394                            Param[4] += CursorTop;
3395                            if (Param[4] > CursorBottom) {
3396                                    Param[4] = CursorBottom + 1;
3397                            }
3398                    }
3399                    BuffFillBox(Param[1], Param[3]-1, Param[2]-1, Param[5]-1, Param[4]-1);
3400                    break;
3401    
3402              case 'z': // DECERA
3403              case '{': // DECSERA
3404                    if (Param[1] < 1 || NParam < 1) Param[1]=1;
3405                    if (Param[2] < 1 || NParam < 2) Param[2]=1;
3406                    if (Param[3] < 1 || NParam < 3) Param[3]=NumOfLines-StatusLine;
3407                    if (Param[4] < 1 || NParam < 4) Param[4]=NumOfColumns;
3408                    if (RelativeOrgMode) {
3409                            Param[1] += CursorTop;
3410                            if (Param[1] > CursorBottom) {
3411                                    Param[1] = CursorBottom + 1;
3412                            }
3413                            Param[3] += CursorTop;
3414                            if (Param[3] > CursorBottom) {
3415                                    Param[3] = CursorBottom + 1;
3416                            }
3417                    }
3418                    if (b == 'z') {
3419                            BuffEraseBox(Param[2]-1, Param[1]-1, Param[4]-1, Param[3]-1);
3420                    }
3421                    else {
3422                            BuffSelectiveEraseBox(Param[2]-1, Param[1]-1, Param[4]-1, Param[3]-1);
3423                    }
3424                    break;
3425    
3426              case '}': // DECSASD
3427                    if ((ts.TermFlag & TF_ENABLESLINE)==0)
3428                            return;
3429                    if (StatusLine==0)
3430                            return;
3431                    if ((Param[1]<1) && (CursorY==NumOfLines-1))
3432                            MoveToMainScreen();
3433                    else if ((Param[1]==1) && (CursorY<NumOfLines-1))
3434                            MoveToStatusLine();
3435                    break;
3436              case '~': // DECSSDT
3437                    if ((ts.TermFlag & TF_ENABLESLINE)==0)
3438                            return;
3439                    if (Param[1]<=1)
3440                            HideStatusLine();
3441                    else if ((StatusLine==0) && (Param[1]==2))
3442                            ShowStatusLine(1); // show
3443                    break;
3444          }          }
3445          if (NParam > 1 && Param[2] == 1) {  }
3446            DecLocatorFlag |= DecLocatorPixel;  
3447    void CSQDol(BYTE b)
3448    {
3449            switch (b) {
3450              case 'p':
3451                    CSDolRequestMode();
3452                    break;
3453          }          }
3454          else {  }
3455            DecLocatorFlag &= ~DecLocatorPixel;  
3456    void CSQuote(BYTE b)
3457    {
3458            int i, x, y;
3459            switch (b) {
3460              case 'w': // Enable Filter Rectangle (DECEFR)
3461                    if (MouseReportMode == IdMouseTrackDECELR) {
3462                            if (DecLocatorFlag & DecLocatorPixel) {
3463                                    x = LastX + 1;
3464                                    y = LastY + 1;
3465                            }
3466                            else {
3467                                    DispConvWinToScreen(LastX, LastY, &x, &y, NULL);
3468                                    x++;
3469                                    y++;
3470                            }
3471                            FilterTop    = (NParam<1 || Param[1]<1)? y : Param[1];
3472                            FilterLeft   = (NParam<2 || Param[2]<1)? x : Param[2];
3473                            FilterBottom = (NParam<3 || Param[3]<1)? y : Param[3];
3474                            FilterRight  = (NParam<4 || Param[4]<1)? x : Param[4];
3475                            if (FilterTop > FilterBottom) {
3476                                    i = FilterTop; FilterTop = FilterBottom; FilterBottom = i;
3477                            }
3478                            if (FilterLeft > FilterRight) {
3479                                    i = FilterLeft; FilterLeft = FilterRight; FilterRight = i;
3480                            }
3481                            DecLocatorFlag |= DecLocatorFiltered;
3482                            DecLocatorReport(IdMouseEventMove, 0);
3483                    }
3484                    break;
3485    
3486              case 'z': // Enable DEC Locator reporting (DECELR)
3487                    switch (Param[1]) {
3488                      case 0:
3489                            if (MouseReportMode == IdMouseTrackDECELR) {
3490                                    MouseReportMode = IdMouseTrackNone;
3491                            }
3492                            break;
3493                      case 1:
3494                            if (ts.MouseEventTracking) {
3495                                    MouseReportMode = IdMouseTrackDECELR;
3496                                    DecLocatorFlag &= ~DecLocatorOneShot;
3497                            }
3498                            break;
3499                      case 2:
3500                            if (ts.MouseEventTracking) {
3501                                    MouseReportMode = IdMouseTrackDECELR;
3502                                    DecLocatorFlag |= DecLocatorOneShot;
3503                            }
3504                            break;
3505                    }
3506                    if (NParam > 1 && Param[2] == 1) {
3507                            DecLocatorFlag |= DecLocatorPixel;
3508                    }
3509                    else {
3510                            DecLocatorFlag &= ~DecLocatorPixel;
3511                    }
3512                    break;
3513    
3514              case '{': // Select Locator Events (DECSLE)
3515                    for (i=1; i<=NParam; i++) {
3516                            switch (Param[i]) {
3517                              case 0:
3518                                    DecLocatorFlag &= ~(DecLocatorButtonUp | DecLocatorButtonDown | DecLocatorFiltered);
3519                                    break;
3520                              case 1:
3521                                    DecLocatorFlag |= DecLocatorButtonDown;
3522                                    break;
3523                              case 2:
3524                                    DecLocatorFlag &= ~DecLocatorButtonDown;
3525                                    break;
3526                              case 3:
3527                                    DecLocatorFlag |= DecLocatorButtonUp;
3528                                    break;
3529                              case 4:
3530                                    DecLocatorFlag &= ~DecLocatorButtonUp;
3531                                    break;
3532                            }
3533                    }
3534                    break;
3535    
3536              case '|': // Request Locator Position (DECRQLP)
3537                    DecLocatorReport(IdMouseEventCurStat, 0);
3538                    break;
3539          }          }
3540          break;  }
3541    
3542        case '{': // Select Locator Events (DECSLE)  void CSSpace(BYTE b) {
3543          for (i=1; i<=NParam; i++) {          switch (b) {
3544            switch (Param[i]) {            case 'q': // DECSCUSR
3545            case 0:                  if (ts.WindowFlag & WF_CURSORCHANGE) {
3546              DecLocatorFlag &= ~(DecLocatorButtonUp | DecLocatorButtonDown | DecLocatorFiltered);                          if (NParam > 0) {
3547              break;                                  switch (Param[1]) {
3548            case 1:                                    case 0:
3549              DecLocatorFlag |= DecLocatorButtonDown;                                    case 1:
3550              break;                                          ts.CursorShape = IdBlkCur;
3551            case 2:                                          ts.NonblinkingCursor = FALSE;
3552              DecLocatorFlag &= ~DecLocatorButtonDown;                                          break;
3553              break;                                    case 2:
3554            case 3:                                          ts.CursorShape = IdBlkCur;
3555              DecLocatorFlag |= DecLocatorButtonUp;                                          ts.NonblinkingCursor = TRUE;
3556              break;                                          break;
3557            case 4:                                    case 3:
3558              DecLocatorFlag &= ~DecLocatorButtonUp;                                          ts.CursorShape = IdHCur;
3559              break;                                          ts.NonblinkingCursor = FALSE;
3560            }                                          break;
3561          }                                    case 4:
3562          break;                                          ts.CursorShape = IdHCur;
3563                                            ts.NonblinkingCursor = TRUE;
3564        case '|': // Request Locator Position (DECRQLP)                                          break;
3565          DecLocatorReport(IdMouseEventCurStat, 0);                                    case 5:
3566          break;                                          ts.CursorShape = IdVCur;
3567      }                                          ts.NonblinkingCursor = FALSE;
3568    }                                          break;
3569                                      case 6:
3570    void CSSpace(BYTE b) {                                          ts.CursorShape = IdVCur;
3571      switch (b) {                                          ts.NonblinkingCursor = TRUE;
3572        case 'q': // DECSCUSR                                          break;
3573          if (ts.WindowFlag & WF_CURSORCHANGE) {                                    default:
3574            if (NParam > 0) {                                          return;
3575              switch (Param[1]) {                                  }
3576                case 0:                                  ChangeCaret();
3577                case 1:                          }
3578                  ts.CursorShape = IdBlkCur;                  }
3579                  ts.NonblinkingCursor = FALSE;                  break;
3580                  break;          }
3581                case 2:  }
                 ts.CursorShape = IdBlkCur;  
                 ts.NonblinkingCursor = TRUE;  
                 break;  
               case 3:  
                 ts.CursorShape = IdHCur;  
                 ts.NonblinkingCursor = FALSE;  
                 break;  
               case 4:  
                 ts.CursorShape = IdHCur;  
                 ts.NonblinkingCursor = TRUE;  
                 break;  
               case 5:  
                 ts.CursorShape = IdVCur;  
                 ts.NonblinkingCursor = FALSE;  
                 break;  
               case 6:  
                 ts.CursorShape = IdVCur;  
                 ts.NonblinkingCursor = TRUE;  
                 break;  
               default:  
                 return;  
             }  
             ChangeCaret();  
           }  
         }  
         break;  
     }  
   }  
3582    
3583  void PrnParseCS(BYTE b) // printer mode  void PrnParseCS(BYTE b) // printer mode
3584  {  {
3585    ParseMode = ModeFirst;          ParseMode = ModeFirst;
3586    switch (ICount) {          switch (ICount) {
3587      /* no intermediate char */            /* no intermediate char */
3588      case 0:            case 0:
3589        switch (Prv) {                  switch (Prv) {
3590          /* no private parameter */                  /* no private parameter */
3591          case 0:                    case 0:
3592            switch (b) {                          switch (b) {
3593              case 'i':                            case 'i':
3594                if (Param[1]==4)                                  if (Param[1]==4) {
3595                {                                          PrinterMode = FALSE;
3596                  PrinterMode = FALSE;                                          // clear prn buff
3597                  // clear prn buff                                          WriteToPrnFile(0,FALSE);
3598                  WriteToPrnFile(0,FALSE);                                          if (! AutoPrintMode)
3599                  if (! AutoPrintMode)                                                  ClosePrnFile();
3600                    ClosePrnFile();                                          return;
3601                  return;                                  }
3602                }                                  break;
3603                break;                          } /* of case Prv=0 */
3604            } /* of case Prv=0 */                          break;
3605            break;                  }
3606        }                  break;
3607        break;            /* one intermediate char */
3608      /* one intermediate char */            case 1: break;
3609      case 1: break;          } /* of case Icount */
   } /* of case Icount */  
3610    
3611    WriteToPrnFile(b,TRUE);          WriteToPrnFile(b,TRUE);
3612  }  }
3613    
3614  void ParseCS(BYTE b) /* b is the final char */  void ParseCS(BYTE b) /* b is the final char */
# Line 3805  void RequestStatusString(unsigned char * Line 3813  void RequestStatusString(unsigned char *
3813          int tmp = 0;          int tmp = 0;
3814    
3815          switch (StrBuff[0]) {          switch (StrBuff[0]) {
3816          case ' ':            case ' ':
3817                  switch (StrBuff[1]) {                  switch (StrBuff[1]) {
3818                  case 'q': // DECSCUSR                    case 'q': // DECSCUSR
3819                          switch (ts.CursorShape) {                          switch (ts.CursorShape) {
3820                          case IdBlkCur:                            case IdBlkCur:
3821                                  tmp = 1;                                  tmp = 1;
3822                                  break;                                  break;
3823                          case IdHCur:                            case IdHCur:
3824                                  tmp = 3;                                  tmp = 3;
3825                                  break;                                  break;
3826                          case IdVCur:                            case IdVCur:
3827                                  tmp = 5;                                  tmp = 5;
3828                                  break;                                  break;
3829                          default:                            default:
3830                                  tmp = 1;                                  tmp = 1;
3831                          }                          }
3832                          if (ts.NonblinkingCursor) {                          if (ts.NonblinkingCursor) {
# Line 3827  void RequestStatusString(unsigned char * Line 3835  void RequestStatusString(unsigned char *
3835                          len = _snprintf_s_l(RepStr, sizeof(RepStr), _TRUNCATE, "0$r%d q", CLocale, tmp);                          len = _snprintf_s_l(RepStr, sizeof(RepStr), _TRUNCATE, "0$r%d q", CLocale, tmp);
3836                  }                  }
3837                  break;                  break;
3838          case '"':            case '"':
3839                  switch (StrBuff[1]) {                  switch (StrBuff[1]) {
3840                  case 'p': // DECSCL                    case 'p': // DECSCL
3841                          if (VTlevel > 1 && Send8BitMode) {                          if (VTlevel > 1 && Send8BitMode) {
3842                                  len = _snprintf_s_l(RepStr, sizeof(RepStr), _TRUNCATE, "0$r6%d;0\"p", CLocale, VTlevel);                                  len = _snprintf_s_l(RepStr, sizeof(RepStr), _TRUNCATE, "0$r6%d;0\"p", CLocale, VTlevel);
3843                          }                          }
# Line 3838  void RequestStatusString(unsigned char * Line 3846  void RequestStatusString(unsigned char *
3846                          }                          }
3847                          break;                          break;
3848    
3849                  case 'q': // DECSCA                    case 'q': // DECSCA
3850                          if (CharAttr.Attr2 & Attr2Protect) {                          if (CharAttr.Attr2 & Attr2Protect) {
3851                                  len = _snprintf_s_l(RepStr, sizeof(RepStr), _TRUNCATE, "0$r1\"q", CLocale);                                  len = _snprintf_s_l(RepStr, sizeof(RepStr), _TRUNCATE, "0$r1\"q", CLocale);
3852                          }                          }
# Line 3848  void RequestStatusString(unsigned char * Line 3856  void RequestStatusString(unsigned char *
3856                          break;                          break;
3857                  }                  }
3858                  break;                  break;
3859          case 'm':       // SGR            case 'm':     // SGR
3860                  if (StrBuff[1] == 0) {                  if (StrBuff[1] == 0) {
3861                          len = _snprintf_s_l(RepStr, sizeof(RepStr), _TRUNCATE, "0$r0", CLocale);                          len = _snprintf_s_l(RepStr, sizeof(RepStr), _TRUNCATE, "0$r0", CLocale);
3862                          if (CharAttr.Attr & AttrBold) {                          if (CharAttr.Attr & AttrBold) {
# Line 3914  void RequestStatusString(unsigned char * Line 3922  void RequestStatusString(unsigned char *
3922                          RepStr[len] = 0;                          RepStr[len] = 0;
3923                  }                  }
3924                  break;                  break;
3925          case 'r':       // DECSTBM            case 'r':     // DECSTBM
3926                  if (StrBuff[1] == 0) {                  if (StrBuff[1] == 0) {
3927                          len = _snprintf_s_l(RepStr, sizeof(RepStr), _TRUNCATE, "0$r%d;%dr", CLocale, CursorTop+1, CursorBottom+1);                          len = _snprintf_s_l(RepStr, sizeof(RepStr), _TRUNCATE, "0$r%d;%dr", CLocale, CursorTop+1, CursorBottom+1);
3928                  }                  }
3929                  break;                  break;
3930          case 's':       // DECSLRM            case 's':     // DECSLRM
3931                  if (StrBuff[1] == 0) {                  if (StrBuff[1] == 0) {
3932                          len = _snprintf_s_l(RepStr, sizeof(RepStr), _TRUNCATE, "0$r%d;%ds", CLocale, CursorLeftM+1, CursorRightM+1);                          len = _snprintf_s_l(RepStr, sizeof(RepStr), _TRUNCATE, "0$r%d;%ds", CLocale, CursorLeftM+1, CursorRightM+1);
3933                  }                  }
# Line 4090  void RequestTermcapString(unsigned char Line 4098  void RequestTermcapString(unsigned char
4098    
4099  void ParseDCS(BYTE Cmd, unsigned char *StrBuff, int len) {  void ParseDCS(BYTE Cmd, unsigned char *StrBuff, int len) {
4100          switch (ICount) {          switch (ICount) {
4101          case 0:            case 0:
4102                  break;                  break;
4103          case 1:            case 1:
4104                  switch (IntChar[1]) {                  switch (IntChar[1]) {
4105                  case '!':                    case '!':
4106                          if (Cmd == '{') { // DECSTUI                          if (Cmd == '{') { // DECSTUI
4107                                  if (! (ts.TermFlag & TF_LOCKTUID)) {                                  if (! (ts.TermFlag & TF_LOCKTUID)) {
4108                                          int i;                                          int i;
# Line 4109  void ParseDCS(BYTE Cmd, unsigned char *S Line 4117  void ParseDCS(BYTE Cmd, unsigned char *S
4117                                  }                                  }
4118                          }                          }
4119                          break;                          break;
4120                  case '$':                    case '$':
4121                          if (Cmd == 'q')  { // DECRQSS                          if (Cmd == 'q')  { // DECRQSS
4122                                  RequestStatusString(StrBuff, len);                                  RequestStatusString(StrBuff, len);
4123                          }                          }
4124                          break;                          break;
4125                  case '+':                    case '+':
4126                          if (Cmd == 'q') { // Request termcap/terminfo string (xterm)                          if (Cmd == 'q') { // Request termcap/terminfo string (xterm)
4127                                  RequestTermcapString(StrBuff, len);                                  RequestTermcapString(StrBuff, len);
4128                          }                          }
4129                          break;                          break;
4130                  default:                    default:
4131                          break;                          break;
4132                  }                  }
4133                  break;                  break;
4134          default:            default:
4135                  break;                  break;
4136          }          }
4137  }  }
# Line 4163  void DeviceControl(BYTE b) Line 4171  void DeviceControl(BYTE b)
4171          utf8_stat = CheckUTF8Seq(b, utf8_stat);          utf8_stat = CheckUTF8Seq(b, utf8_stat);
4172    
4173          switch (DcsParseMode) {          switch (DcsParseMode) {
4174          case ModeDcsFirst:            case ModeDcsFirst:
4175                  if (b<=US) {                  if (b<=US) {
4176                          ParseControl(b);                          ParseControl(b);
4177                  }                  }
# Line 4199  void DeviceControl(BYTE b) Line 4207  void DeviceControl(BYTE b)
4207                  }                  }
4208                  break;                  break;
4209    
4210          case ModeDcsString:            case ModeDcsString:
4211                  if (b <= US && b != HT && b != CR) {                  if (b <= US && b != HT && b != CR) {
4212                          ESCFlag = FALSE;                          ESCFlag = FALSE;
4213                          ParseMode = ModeFirst;                          ParseMode = ModeFirst;
# Line 4353  unsigned int XtColor2TTColor(int mode, u Line 4361  unsigned int XtColor2TTColor(int mode, u
4361          unsigned int colornum = CS_UNSPEC;          unsigned int colornum = CS_UNSPEC;
4362    
4363          switch ((mode>=100) ? mode-100 : mode) {          switch ((mode>=100) ? mode-100 : mode) {
4364          case 4:            case 4:
4365                  switch (xt_color) {                  switch (xt_color) {
4366                  case 256:                    case 256:
4367                          colornum = CS_VT_BOLDFG;                          colornum = CS_VT_BOLDFG;
4368                          break;                          break;
4369                  case 257:                    case 257:
4370                          // Underline -- not supported.                          // Underline -- not supported.
4371                          // colornum = CS_VT_UNDERFG;                          // colornum = CS_VT_UNDERFG;
4372                          break;                          break;
4373                  case 258:                    case 258:
4374                          colornum = CS_VT_BLINKFG;                          colornum = CS_VT_BLINKFG;
4375                          break;                          break;
4376                  case 259:                    case 259:
4377                          colornum = CS_VT_REVERSEBG;                          colornum = CS_VT_REVERSEBG;
4378                          break;                          break;
4379                  case CS_UNSPEC:                    case CS_UNSPEC:
4380                          if (mode == 104) {                          if (mode == 104) {
4381                                  colornum = CS_ANSICOLOR_ALL;                                  colornum = CS_ANSICOLOR_ALL;
4382                          }                          }
4383                          break;                          break;
4384                  default:                    default:
4385                          if (xt_color <= 255) {                          if (xt_color <= 255) {
4386                                  colornum = xt_color;                                  colornum = xt_color;
4387                          }                          }
4388                  }                  }
4389                  break;                  break;
4390          case 5:            case 5:
4391                  switch (xt_color) {                  switch (xt_color) {
4392                  case 0:                    case 0:
4393                          colornum = CS_VT_BOLDFG;                          colornum = CS_VT_BOLDFG;
4394                          break;                          break;
4395                  case 1:                    case 1:
4396                          // Underline -- not supported.                          // Underline -- not supported.
4397                          // colornum = CS_VT_UNDERFG;                          // colornum = CS_VT_UNDERFG;
4398                          break;                          break;
4399                  case 2:                    case 2:
4400                          colornum = CS_VT_BLINKFG;                          colornum = CS_VT_BLINKFG;
4401                          break;                          break;
4402                  case 3:                    case 3:
4403                          colornum = CS_VT_REVERSEBG;                          colornum = CS_VT_REVERSEBG;
4404                          break;                          break;
4405                  case CS_UNSPEC:                    case CS_UNSPEC:
4406                          if (mode == 105) {                          if (mode == 105) {
4407                                  colornum = CS_SP_ALL;                                  colornum = CS_SP_ALL;
4408                          }                          }
4409                          break;                          break;
4410                  }                  }
4411                  break;                  break;
4412          case 10:            case 10:
4413                  colornum = CS_VT_NORMALFG;                  colornum = CS_VT_NORMALFG;
4414                  break;                  break;
4415          case 11:            case 11:
4416                  colornum = CS_VT_NORMALBG;                  colornum = CS_VT_NORMALBG;
4417                  break;                  break;
4418          case 15:            case 15:
4419                  colornum = CS_TEK_FG;                  colornum = CS_TEK_FG;
4420                  break;                  break;
4421          case 16:            case 16:
4422                  colornum = CS_TEK_BG;                  colornum = CS_TEK_BG;
4423                  break;                  break;
4424          }          }
# Line 4555  void XSequence(BYTE b) Line 4563  void XSequence(BYTE b)
4563                          }                          }
4564                  }                  }
4565                  switch (Param[1]) {                  switch (Param[1]) {
4566                  case 0: /* Change window title and icon name */                    case 0: /* Change window title and icon name */
4567                  case 1: /* Change icon name */                    case 1: /* Change icon name */
4568                  case 2: /* Change window title */                    case 2: /* Change window title */
4569                          if (StrBuff && ts.AcceptTitleChangeRequest) {                          if (StrBuff && ts.AcceptTitleChangeRequest) {
4570                                  strncpy_s(cv.TitleRemote, sizeof(cv.TitleRemote), StrBuff, _TRUNCATE);                                  strncpy_s(cv.TitleRemote, sizeof(cv.TitleRemote), StrBuff, _TRUNCATE);
4571                                  // (2006.6.15 maya) タイトルに渡す文字列をSJISに変換                                  // (2006.6.15 maya) タイトルに渡す文字列をSJISに変換
# Line 4565  void XSequence(BYTE b) Line 4573  void XSequence(BYTE b)
4573                                  ChangeTitle();                                  ChangeTitle();
4574                          }                          }
4575                          break;                          break;
4576                  case 4: /* Change/Query color palette */                    case 4: /* Change/Query color palette */
4577                  case 5: /* Change/Query special color */                    case 5: /* Change/Query special color */
4578                          if (StrBuff) {                          if (StrBuff) {
4579                                  color_num = 0;                                  color_num = 0;
4580                                  color_spec = NULL;                                  color_spec = NULL;
# Line 4596  void XSequence(BYTE b) Line 4604  void XSequence(BYTE b)
4604                                  }                                  }
4605                          }                          }
4606                          break;                          break;
4607                  case 10: /* Change/Query VT-Window foreground color */                    case 10: /* Change/Query VT-Window foreground color */
4608                  case 11: /* Change/Query VT-Window background color */                    case 11: /* Change/Query VT-Window background color */
4609                  case 12: /* Change/Query VT-Window cursor color */                    case 12: /* Change/Query VT-Window cursor color */
4610                  case 13: /* Change/Query mouse cursor foreground color */                    case 13: /* Change/Query mouse cursor foreground co