From 1ba039397ea6b16f71350eb06f27b033f4ccaf3d Mon Sep 17 00:00:00 2001
From: Ziusudra <ziusudra@gmail.com>
Date: Sat, 15 Dec 2012 21:16:49 -0700
Subject: [PATCH 4/9] Added comments documenting terminfo/termcap capabilities
- No functional change intended
- Mainly focused on termcap, so may be missing a few terminfo capabilities
---
src/apps/terminal/TermParse.cpp | 263 +++++++++++++++++++++++++++------------
1 file changed, 181 insertions(+), 82 deletions(-)
diff --git a/src/apps/terminal/TermParse.cpp b/src/apps/terminal/TermParse.cpp
index 8b48806..9f02d54 100644
a
|
b
|
TermParse::EscParse()
|
478 | 478 | break; |
479 | 479 | |
480 | 480 | case CASE_PRINT_GRA: |
481 | | /* "Special characters and line drawing" enabled by \E(0 */ |
| 481 | // Special characters and line drawing |
| 482 | // terminfo smacs=\E(0, rmacs=\E(B, acsc=aajjkk... |
| 483 | // termcap as=\E(0:ae=\E(B:ac=aajjkk... |
| 484 | // acsc/ac should include each letter we have a case for |
482 | 485 | switch (c) { |
483 | 486 | case 'a': // ACS_CKBOARD |
484 | 487 | fBuffer->InsertChar("\xE2\x96\x92",3,fAttr); |
… |
… |
TermParse::EscParse()
|
526 | 529 | break; |
527 | 530 | |
528 | 531 | case CASE_CR: |
| 532 | // terminfo cr=^M, nel=^J |
| 533 | // termcap cr=^M:nw=^J |
529 | 534 | fBuffer->InsertCR(fAttr); |
530 | 535 | break; |
531 | 536 | |
… |
… |
TermParse::EscParse()
|
578 | 583 | break; |
579 | 584 | |
580 | 585 | case CASE_MBCS: |
581 | | /* ESC $ */ |
| 586 | // ESC $ |
582 | 587 | parsestate = gMbcsTable; |
583 | 588 | break; |
584 | 589 | |
585 | 590 | case CASE_GSETS: |
586 | | /* ESC $ ? */ |
| 591 | // ESC $ ? |
587 | 592 | parsestate = gCS96GroundTable; |
588 | 593 | // cs96 = 1; |
589 | 594 | break; |
590 | 595 | |
| 596 | //case CASE_GSETS: |
| 597 | // screen->gsets[scstype] = GSET(c) | cs96; |
| 598 | // parsestate = groundtable; |
| 599 | // break; |
| 600 | |
591 | 601 | case CASE_SCS_STATE: |
592 | 602 | { |
593 | 603 | char page = _NextParseChar(); |
… |
… |
TermParse::EscParse()
|
614 | 624 | } |
615 | 625 | |
616 | 626 | case CASE_GROUND_STATE: |
617 | | /* exit ignore mode */ |
| 627 | // exit ignore mode |
618 | 628 | parsestate = groundtable; |
619 | 629 | break; |
620 | 630 | |
621 | 631 | case CASE_BELL: |
| 632 | // terminfo bel=^G |
| 633 | // termcap bl=^G |
622 | 634 | beep(); |
623 | 635 | break; |
624 | 636 | |
… |
… |
TermParse::EscParse()
|
627 | 639 | break; |
628 | 640 | |
629 | 641 | case CASE_TAB: |
| 642 | // terminfo ht=^I |
| 643 | // termcap ta=^I |
630 | 644 | fBuffer->InsertTab(fAttr); |
631 | 645 | break; |
632 | 646 | |
633 | 647 | case CASE_ESC: |
634 | | /* escape */ |
| 648 | // escape |
635 | 649 | parsestate = gEscTable; |
636 | 650 | break; |
637 | 651 | |
638 | 652 | case CASE_IGNORE_STATE: |
639 | | /* Ies: ignore anything else */ |
| 653 | // Ies: ignore anything else |
640 | 654 | parsestate = gIgnoreTable; |
641 | 655 | break; |
642 | 656 | |
643 | 657 | case CASE_IGNORE_ESC: |
644 | | /* Ign: escape */ |
| 658 | // Ign: escape |
645 | 659 | parsestate = gIesTable; |
646 | 660 | break; |
647 | 661 | |
648 | 662 | case CASE_IGNORE: |
649 | | /* Ignore character */ |
| 663 | // Ignore character |
650 | 664 | break; |
651 | 665 | |
652 | 666 | case CASE_SI: |
653 | | /* shift in (to G1 charset) */ |
| 667 | // shift in (to G1 charset) |
654 | 668 | if (shifted_in == false) { |
655 | 669 | int* tmp = alternateParseTable; |
656 | 670 | alternateParseTable = parsestate; |
… |
… |
TermParse::EscParse()
|
659 | 673 | break; |
660 | 674 | |
661 | 675 | case CASE_SO: |
662 | | /* shift out (to G0 charset) */ |
| 676 | // shift out (to G0 charset) |
663 | 677 | if (shifted_in == true) { |
664 | 678 | int* tmp = alternateParseTable; |
665 | 679 | alternateParseTable = parsestate; |
… |
… |
TermParse::EscParse()
|
667 | 681 | } |
668 | 682 | break; |
669 | 683 | |
670 | | case CASE_SCR_STATE: // ESC # |
671 | | /* enter scr state */ |
| 684 | case CASE_SCR_STATE: |
| 685 | // enter scr state: ESC # |
672 | 686 | parsestate = gScrTable; |
673 | 687 | break; |
674 | 688 | |
675 | 689 | case CASE_ESC_IGNORE: |
676 | | /* unknown escape sequence */ |
| 690 | // unknown escape sequence |
677 | 691 | parsestate = gEscIgnoreTable; |
678 | 692 | break; |
679 | 693 | |
680 | | case CASE_ESC_DIGIT: // ESC [ number |
681 | | /* digit in csi or dec mode */ |
| 694 | case CASE_ESC_DIGIT: |
| 695 | // digit in csi or dec mode: ESC [ number |
682 | 696 | if ((row = param[nparam - 1]) == DEFAULT) |
683 | 697 | row = 0; |
684 | 698 | param[nparam - 1] = 10 * row + (c - '0'); |
685 | 699 | break; |
686 | 700 | |
687 | | case CASE_ESC_SEMI: // ESC ; |
688 | | /* semicolon in csi or dec mode */ |
| 701 | case CASE_ESC_SEMI: |
| 702 | // semicolon in csi or dec mode: ESC ; |
689 | 703 | if (nparam < NPARAM) |
690 | 704 | param[nparam++] = DEFAULT; |
691 | 705 | break; |
692 | 706 | |
693 | 707 | case CASE_DEC_STATE: |
694 | | /* enter dec mode */ |
| 708 | // Enter dec mode: ESC [ ? |
695 | 709 | parsestate = gDecTable; |
696 | 710 | break; |
697 | 711 | |
698 | | case CASE_ICH: // ESC [@ insert charactor |
699 | | /* ICH */ |
| 712 | case CASE_ICH: |
| 713 | // terminfo ich1=\E[@, ich=\E[%p1%d@ |
| 714 | // termcap ic=\E[@:IC=\E[%d@ |
| 715 | // do not claim, im/ei (CASE_SET/RST) are prefered |
700 | 716 | if ((row = param[0]) < 1) |
701 | 717 | row = 1; |
702 | 718 | fBuffer->InsertSpace(row); |
703 | 719 | parsestate = groundtable; |
704 | 720 | break; |
705 | 721 | |
706 | | case CASE_CUU: // ESC [A cursor up, up arrow key. |
707 | | /* CUU */ |
| 722 | case CASE_CUU: |
| 723 | // terminfo cuu1=\E[A, cuu=\E[%p1%dA |
| 724 | // termcap up=\E[A:UP=\E[%dA |
708 | 725 | if ((row = param[0]) < 1) |
709 | 726 | row = 1; |
710 | 727 | fBuffer->MoveCursorUp(row); |
711 | 728 | parsestate = groundtable; |
712 | 729 | break; |
713 | 730 | |
714 | | case CASE_CUD: // ESC [B cursor down, down arrow key. |
715 | | /* CUD */ |
| 731 | case CASE_CUD: |
| 732 | // terminfo cud1=^K, cud=\E[%p1%dB |
| 733 | // termcap do=^K:DO=\E[%dB |
716 | 734 | if ((row = param[0]) < 1) |
717 | 735 | row = 1; |
718 | 736 | fBuffer->MoveCursorDown(row); |
719 | 737 | parsestate = groundtable; |
720 | 738 | break; |
721 | 739 | |
722 | | case CASE_CUF: // ESC [C cursor forword |
723 | | /* CUF */ |
| 740 | case CASE_CUF: |
| 741 | // terminfo cuf1=\E[C, cuf=\E[%p1%dC |
| 742 | // termcap nd=\E[C:RI=\E[%dC |
724 | 743 | if ((row = param[0]) < 1) |
725 | 744 | row = 1; |
726 | 745 | fBuffer->MoveCursorRight(row); |
727 | 746 | parsestate = groundtable; |
728 | 747 | break; |
729 | 748 | |
730 | | case CASE_CUB: // ESC [D cursor backword |
731 | | /* CUB */ |
| 749 | case CASE_CUB: |
| 750 | // terminfo cub1=^H, cub=\E[%p1%dD |
| 751 | // termcap le=^H:LE=\E[%dD |
732 | 752 | if ((row = param[0]) < 1) |
733 | 753 | row = 1; |
734 | 754 | fBuffer->MoveCursorLeft(row); |
735 | 755 | parsestate = groundtable; |
736 | 756 | break; |
737 | 757 | |
738 | | case CASE_CUP: // ESC [...H move cursor |
739 | | /* CUP | HVP */ |
| 758 | case CASE_CUP: |
| 759 | // terminfo home=\E[H, cup=\E[%i%p1%d;%p2%dH |
| 760 | // termcap ho=\E[H:cm=\E[%i%d;%dH |
740 | 761 | if ((row = param[0]) < 1) |
741 | 762 | row = 1; |
742 | 763 | if (nparam < 2 || (column = param[1]) < 1) |
… |
… |
TermParse::EscParse()
|
746 | 767 | parsestate = groundtable; |
747 | 768 | break; |
748 | 769 | |
749 | | case CASE_ED: // ESC [ ...J clear screen |
750 | | /* ED */ |
| 770 | case CASE_ED: |
751 | 771 | switch (param[0]) { |
752 | 772 | case DEFAULT: |
753 | 773 | case 0: |
| 774 | // terminfo ed=\E[J |
| 775 | // termcap cd=\E[J |
754 | 776 | fBuffer->EraseBelow(); |
755 | 777 | break; |
756 | 778 | |
… |
… |
TermParse::EscParse()
|
759 | 781 | break; |
760 | 782 | |
761 | 783 | case 2: |
| 784 | // terminfo clear=\E[H\E[2J |
| 785 | // termcap cl=\E[H\E[2J |
762 | 786 | fBuffer->EraseAll(); |
763 | 787 | break; |
764 | 788 | } |
765 | 789 | parsestate = groundtable; |
766 | 790 | break; |
767 | 791 | |
768 | | case CASE_EL: // ESC [ ...K delete line |
769 | | /* EL */ |
| 792 | case CASE_EL: |
770 | 793 | switch (param[0]) { |
771 | 794 | case DEFAULT: |
772 | 795 | case 0: |
| 796 | // clear to end of line |
| 797 | // terminfo el=\E[K |
| 798 | // termcap ce=\E[K |
773 | 799 | fBuffer->DeleteColumns(); |
774 | 800 | break; |
775 | 801 | |
776 | 802 | case 1: |
| 803 | // clear to begin of line |
| 804 | // terminfo el1=\E[1K |
| 805 | // termcap cb=\E[1K |
777 | 806 | fBuffer->EraseCharsFrom(0, fBuffer->Cursor().x + 1); |
778 | 807 | break; |
779 | 808 | |
… |
… |
TermParse::EscParse()
|
785 | 814 | break; |
786 | 815 | |
787 | 816 | case CASE_IL: |
788 | | /* IL */ |
| 817 | // terminfo il1=\E[L, il=\E[%p1%dL |
| 818 | // termcap al=\E[L:AL=\E[%dL |
789 | 819 | if ((row = param[0]) < 1) |
790 | 820 | row = 1; |
791 | 821 | fBuffer->InsertLines(row); |
… |
… |
TermParse::EscParse()
|
793 | 823 | break; |
794 | 824 | |
795 | 825 | case CASE_DL: |
796 | | /* DL */ |
| 826 | // terminfo dl1=\E[M, dl=\E[%p1%dM |
| 827 | // termcap dl=\E[M:DL=\E[%dM |
797 | 828 | if ((row = param[0]) < 1) |
798 | 829 | row = 1; |
799 | 830 | fBuffer->DeleteLines(row); |
… |
… |
TermParse::EscParse()
|
801 | 832 | break; |
802 | 833 | |
803 | 834 | case CASE_DCH: |
804 | | /* DCH */ |
| 835 | // terminfo dch1=\E[P, dch=\E[%p1%dP |
| 836 | // termcap dc=\E[P:DC=\E[%dP |
805 | 837 | if ((row = param[0]) < 1) |
806 | 838 | row = 1; |
807 | 839 | fBuffer->DeleteChars(row); |
… |
… |
TermParse::EscParse()
|
809 | 841 | break; |
810 | 842 | |
811 | 843 | case CASE_SET: |
812 | | /* SET */ |
| 844 | // terminfo smir=\E[4h |
| 845 | // termcap im=\E[4h |
813 | 846 | if (param[0] == 4) |
814 | 847 | fBuffer->SetInsertMode(MODE_INSERT); |
815 | 848 | parsestate = groundtable; |
816 | 849 | break; |
817 | 850 | |
818 | 851 | case CASE_RST: |
819 | | /* RST */ |
| 852 | // terminfo rmir=\E[4l |
| 853 | // termcap ei=\E[4l |
820 | 854 | if (param[0] == 4) |
821 | 855 | fBuffer->SetInsertMode(MODE_OVER); |
822 | 856 | parsestate = groundtable; |
… |
… |
TermParse::EscParse()
|
824 | 858 | |
825 | 859 | case CASE_SGR: |
826 | 860 | { |
827 | | /* SGR */ |
| 861 | // Select graphic rendition: ESC [ ... m |
828 | 862 | for (row = 0; row < nparam; ++row) { |
829 | 863 | switch (param[row]) { |
830 | 864 | case DEFAULT: |
831 | | case 0: /* Reset attribute */ |
| 865 | case 0: // Reset attribute |
| 866 | // terminfo sgr0=\E[0m |
| 867 | // termcap me=\E[0m |
832 | 868 | fAttr = FORECOLORED(7); |
833 | 869 | break; |
834 | 870 | |
835 | | case 1: /* Bold */ |
836 | | case 5: |
| 871 | case 1: // Bold |
| 872 | // terminfo bold=\E[1m |
| 873 | // termcap md=\E[1m |
| 874 | case 5: // Blink |
837 | 875 | fAttr |= BOLD; |
838 | 876 | break; |
839 | 877 | |
840 | | case 4: /* Underline */ |
| 878 | case 4: // Underline |
| 879 | // terminfo smul=\E[4m |
| 880 | // termcap us=\E[4m |
841 | 881 | fAttr |= UNDERLINE; |
842 | 882 | break; |
843 | 883 | |
844 | | case 7: /* Inverse */ |
| 884 | case 7: // Inverse |
| 885 | // terminfo smso=\E[7m |
| 886 | // termcap so=\E[7m |
845 | 887 | fAttr |= INVERSE; |
846 | 888 | break; |
847 | 889 | |
848 | | case 22: /* Not Bold */ |
| 890 | case 22: // Not Bold |
849 | 891 | fAttr &= ~BOLD; |
850 | 892 | break; |
851 | 893 | |
852 | | case 24: /* Not Underline */ |
| 894 | case 24: // Not Underline |
| 895 | // terminfo rmul=\E[24m |
| 896 | // termcap ue=\E[24m |
853 | 897 | fAttr &= ~UNDERLINE; |
854 | 898 | break; |
855 | 899 | |
856 | | case 27: /* Not Inverse */ |
| 900 | case 27: // Not Inverse |
| 901 | // terminfo rmso=\E[27m |
| 902 | // termcap se=\E[27m |
857 | 903 | fAttr &= ~INVERSE; |
858 | 904 | break; |
859 | 905 | |
… |
… |
TermParse::EscParse()
|
872 | 918 | |
873 | 919 | case 38: |
874 | 920 | { |
| 921 | // terminfo setaf=\E[38;5;%p1%dm |
| 922 | // termcap AF=\E[38;5;%dm |
875 | 923 | if (nparam != 3 || param[1] != 5) |
876 | 924 | break; |
877 | 925 | fAttr &= ~FORECOLOR; |
… |
… |
TermParse::EscParse()
|
884 | 932 | } |
885 | 933 | |
886 | 934 | case 39: |
| 935 | // terminfo op=\E[39;49m |
| 936 | // termcap op=\E[39;49m |
887 | 937 | fAttr &= ~FORESET; |
888 | 938 | break; |
889 | 939 | |
… |
… |
TermParse::EscParse()
|
902 | 952 | |
903 | 953 | case 48: |
904 | 954 | { |
| 955 | // terminfo setab=\E[48;5;%p1%dm |
| 956 | // termcap AB=\E[48;5;%dm |
905 | 957 | if (nparam != 3 || param[1] != 5) |
906 | 958 | break; |
907 | 959 | fAttr &= ~BACKCOLOR; |
… |
… |
TermParse::EscParse()
|
925 | 977 | case CASE_CPR: |
926 | 978 | // Q & D hack by Y.Hayakawa 21-JUL-99 |
927 | 979 | // (hida@sawada.riec.tohoku.ac.jp) |
| 980 | // ESC [ %d n |
928 | 981 | _DeviceStatusReport(param[0]); |
929 | 982 | parsestate = groundtable; |
930 | 983 | break; |
931 | 984 | |
932 | 985 | case CASE_DA1: |
933 | | // DA - report device attributes |
| 986 | // Report device attributes: ESC Z or ESC [ c |
| 987 | // terminfo u9=\E[c |
| 988 | // termcap u9=\E[c |
934 | 989 | if (param[0] < 1) { |
935 | 990 | // claim to be a VT102 |
936 | 991 | write(fFd, "\033[?6c", 5); |
… |
… |
TermParse::EscParse()
|
939 | 994 | break; |
940 | 995 | |
941 | 996 | case CASE_DECSTBM: |
942 | | /* DECSTBM - set scrolling region */ |
| 997 | // Set scrolling region |
| 998 | // terminfo csr=\E[%i%p1%d;%p2%dr |
| 999 | // termcap cs=\E[%i%d;%dr |
943 | 1000 | if ((top = param[0]) < 1) |
944 | 1001 | top = 1; |
945 | 1002 | |
… |
… |
TermParse::EscParse()
|
958 | 1015 | break; |
959 | 1016 | |
960 | 1017 | case CASE_DECREQTPARM: |
961 | | // DEXREQTPARM - request terminal parameters |
| 1018 | // Request terminal parameters: ESC [ %d x |
962 | 1019 | _DecReqTermParms(param[0]); |
963 | 1020 | parsestate = groundtable; |
964 | 1021 | break; |
965 | 1022 | |
966 | 1023 | case CASE_DECSET: |
967 | | /* DECSET */ |
| 1024 | // DEC Private Mode Reset: ESC [ ? %d h |
968 | 1025 | for (int i = 0; i < nparam; i++) |
969 | 1026 | _DecPrivateModeSet(param[i]); |
970 | 1027 | parsestate = groundtable; |
971 | 1028 | break; |
972 | 1029 | |
973 | 1030 | case CASE_DECRST: |
974 | | /* DECRST */ |
| 1031 | // DEC Private Mode Reset: ESC [ ? %d l |
975 | 1032 | for (int i = 0; i < nparam; i++) |
976 | 1033 | _DecPrivateModeReset(param[i]); |
977 | 1034 | parsestate = groundtable; |
978 | 1035 | break; |
979 | 1036 | |
980 | 1037 | case CASE_DECALN: |
981 | | /* DECALN */ |
| 1038 | // DEC screen alignment test: ESC # 8 |
982 | 1039 | fBuffer->FillScreen(UTF8Char('E'), 1, 0); |
983 | 1040 | parsestate = groundtable; |
984 | 1041 | break; |
985 | 1042 | |
986 | | //case CASE_GSETS: |
987 | | // screen->gsets[scstype] = GSET(c) | cs96; |
988 | | // parsestate = groundtable; |
989 | | // break; |
990 | | |
991 | 1043 | case CASE_DECSC: |
992 | | /* DECSC */ |
| 1044 | // Save current cursor state |
| 1045 | // terminfo sc=\E7 |
| 1046 | // termcap sc=\E7 |
993 | 1047 | _DecSaveCursor(); |
994 | 1048 | parsestate = groundtable; |
995 | 1049 | break; |
996 | 1050 | |
997 | 1051 | case CASE_DECRC: |
998 | | /* DECRC */ |
| 1052 | // Restore saved cursor state |
| 1053 | // terminfo rc=\E8 |
| 1054 | // termcap rc=\E8 |
999 | 1055 | _DecRestoreCursor(); |
1000 | 1056 | parsestate = groundtable; |
1001 | 1057 | break; |
1002 | 1058 | |
1003 | 1059 | case CASE_HTS: |
1004 | | /* HTS */ |
| 1060 | // Set tab stop at current column |
| 1061 | // terminfo hts=\EH |
| 1062 | // termcap st=\EH |
1005 | 1063 | fBuffer->SetTabStop(fBuffer->Cursor().x); |
1006 | 1064 | parsestate = groundtable; |
1007 | 1065 | break; |
1008 | 1066 | |
1009 | 1067 | case CASE_TBC: |
1010 | | /* TBC */ |
| 1068 | // Clear all tab stops |
| 1069 | // terminfo tbc=\E[3g |
| 1070 | // termcap ct=\E[3g |
1011 | 1071 | if (param[0] < 1) |
1012 | 1072 | fBuffer->ClearTabStop(fBuffer->Cursor().x); |
1013 | 1073 | else if (param[0] == 3) |
… |
… |
TermParse::EscParse()
|
1016 | 1076 | break; |
1017 | 1077 | |
1018 | 1078 | case CASE_RI: |
1019 | | /* RI */ |
| 1079 | // Reverse linefeed: ESC M |
1020 | 1080 | fBuffer->InsertRI(); |
1021 | 1081 | parsestate = groundtable; |
1022 | 1082 | break; |
1023 | 1083 | |
1024 | 1084 | case CASE_SS2: |
1025 | | /* SS2 */ |
| 1085 | // Single shift 2. (Select G2 character set for the next |
| 1086 | // character only.): ESC N |
1026 | 1087 | curess = c; |
1027 | 1088 | parsestate = groundtable; |
1028 | 1089 | break; |
1029 | 1090 | |
1030 | 1091 | case CASE_SS3: |
1031 | | /* SS3 */ |
| 1092 | // Single shift 3. (Select G3 character set for the next |
| 1093 | // character only.): ESC O |
1032 | 1094 | curess = c; |
1033 | 1095 | parsestate = groundtable; |
1034 | 1096 | break; |
1035 | 1097 | |
1036 | 1098 | case CASE_CSI_STATE: |
1037 | | /* enter csi state */ |
| 1099 | // Enter CSI state: ESC [ |
1038 | 1100 | nparam = 1; |
1039 | 1101 | param[0] = DEFAULT; |
1040 | 1102 | parsestate = gCsiTable; |
… |
… |
TermParse::EscParse()
|
1042 | 1104 | |
1043 | 1105 | case CASE_OSC: |
1044 | 1106 | { |
1045 | | /* Operating System Command: ESC ] */ |
| 1107 | // Operating System Command: ESC ] |
1046 | 1108 | char string[512]; |
1047 | 1109 | uint32 len = 0; |
1048 | 1110 | uchar mode_char = _NextParseChar(); |
… |
… |
TermParse::EscParse()
|
1074 | 1136 | break; |
1075 | 1137 | } |
1076 | 1138 | |
1077 | | case CASE_RIS: // ESC c ... Reset terminal. |
| 1139 | case CASE_RIS: |
| 1140 | // Reset terminal |
| 1141 | // terminfo rs1=\Ec |
| 1142 | // termcap r1=\Ec |
1078 | 1143 | break; |
1079 | 1144 | |
1080 | 1145 | case CASE_LS2: |
1081 | | /* LS2 */ |
| 1146 | // Invoke the G2 character set: ESC n |
1082 | 1147 | //screen->curgl = 2; |
1083 | 1148 | parsestate = groundtable; |
1084 | 1149 | break; |
1085 | 1150 | |
1086 | 1151 | case CASE_LS3: |
1087 | | /* LS3 */ |
| 1152 | // Invoke the G3 character set: ESC o |
1088 | 1153 | //screen->curgl = 3; |
1089 | 1154 | parsestate = groundtable; |
1090 | 1155 | break; |
1091 | 1156 | |
1092 | 1157 | case CASE_LS3R: |
1093 | | /* LS3R */ |
| 1158 | // Invoke the G3 character set as GR: ESC | |
1094 | 1159 | //screen->curgr = 3; |
1095 | 1160 | parsestate = groundtable; |
1096 | 1161 | break; |
1097 | 1162 | |
1098 | 1163 | case CASE_LS2R: |
1099 | | /* LS2R */ |
| 1164 | // Invoke the G2 character set as GR: ESC } |
1100 | 1165 | //screen->curgr = 2; |
1101 | 1166 | parsestate = groundtable; |
1102 | 1167 | break; |
1103 | 1168 | |
1104 | 1169 | case CASE_LS1R: |
1105 | | /* LS1R */ |
| 1170 | // Invoke the G1 character set as GR: ESC ~ |
1106 | 1171 | //screen->curgr = 1; |
1107 | 1172 | parsestate = groundtable; |
1108 | 1173 | break; |
1109 | 1174 | |
1110 | | case CASE_VPA: // ESC [...d move cursor absolute vertical |
1111 | | /* VPA (CV) */ |
| 1175 | case CASE_VPA: |
| 1176 | // Move cursor absolute vertical |
| 1177 | // terminfo vpa=\E[%i%p1%dd |
| 1178 | // termcap cv=\E[%i%dd |
1112 | 1179 | if ((row = param[0]) < 1) |
1113 | 1180 | row = 1; |
1114 | 1181 | |
… |
… |
TermParse::EscParse()
|
1117 | 1184 | parsestate = groundtable; |
1118 | 1185 | break; |
1119 | 1186 | |
1120 | | case CASE_HPA: // ESC [...G move cursor absolute horizontal |
1121 | | /* HPA (CH) */ |
| 1187 | case CASE_HPA: |
| 1188 | // Move cursor absolute horizontal |
| 1189 | // terminfo hpa=\E[%i%p1%dG |
| 1190 | // termcap ch=\E[%i%dG |
1122 | 1191 | if ((column = param[0]) < 1) |
1123 | 1192 | column = 1; |
1124 | 1193 | |
… |
… |
TermParse::EscParse()
|
1127 | 1196 | parsestate = groundtable; |
1128 | 1197 | break; |
1129 | 1198 | |
1130 | | case CASE_SU: // scroll screen up |
| 1199 | case CASE_SU: |
| 1200 | // Scroll screen up (forward) |
| 1201 | // terminfo ind=\E[S, indn=\E[%p1%dS |
| 1202 | // termcap sf=\E[S:SF=\E[%dS |
1131 | 1203 | if ((row = param[0]) < 1) |
1132 | 1204 | row = 1; |
1133 | 1205 | fBuffer->ScrollBy(row); |
1134 | 1206 | parsestate = groundtable; |
1135 | 1207 | break; |
1136 | 1208 | |
1137 | | case CASE_SD: // scroll screen down |
| 1209 | case CASE_SD: |
| 1210 | // Scroll screen down (back) |
| 1211 | // terminfo ri=\E[T, rin=\E[%p1%dT |
| 1212 | // termcap sr=\E[T:SR=\E[%dT |
1138 | 1213 | if ((row = param[0]) < 1) |
1139 | 1214 | row = 1; |
1140 | 1215 | fBuffer->ScrollBy(-row); |
1141 | 1216 | parsestate = groundtable; |
1142 | 1217 | break; |
1143 | 1218 | |
1144 | | |
1145 | | case CASE_ECH: // erase characters |
| 1219 | case CASE_ECH: |
| 1220 | // Erase characters |
| 1221 | // terminfo ech=\E[%p1%dX |
| 1222 | // termcap ec=\E[%dX |
1146 | 1223 | if ((column = param[0]) < 1) |
1147 | 1224 | column = 1; |
1148 | 1225 | fBuffer->EraseChars(column); |
… |
… |
TermParse::_DeviceStatusReport(int n)
|
1248 | 1325 | } |
1249 | 1326 | case 6: |
1250 | 1327 | // Cursor position report requested |
| 1328 | // terminfo u7=\E[6n |
| 1329 | // termcap u7=\E[6n |
1251 | 1330 | len = sprintf(sbuf, "\033[%" B_PRId32 ";%" B_PRId32 "R", |
1252 | 1331 | fBuffer->Cursor().y + 1, |
1253 | 1332 | fBuffer->Cursor().x + 1); |
… |
… |
TermParse::_DecPrivateModeSet(int value)
|
1290 | 1369 | case 1: |
1291 | 1370 | // Application Cursor Keys (whatever that means). |
1292 | 1371 | // Not supported yet. |
| 1372 | // terminfo smkx=\E[?1h |
| 1373 | // termcap ks=\E[?1h ? many also do \E= ? |
1293 | 1374 | break; |
1294 | 1375 | case 5: |
1295 | 1376 | // Reverse Video (inverses colors for the complete screen |
1296 | 1377 | // -- when followed by normal video, that's shortly flashes the |
1297 | 1378 | // screen). |
1298 | 1379 | // Not supported yet. |
| 1380 | // terminfo flash=\E[?5h\E[?5l |
| 1381 | // termcap vb=\E[?5h\E[?5l |
1299 | 1382 | break; |
1300 | 1383 | case 6: |
1301 | 1384 | // Set Origin Mode. |
… |
… |
TermParse::_DecPrivateModeSet(int value)
|
1308 | 1391 | case 12: |
1309 | 1392 | // Start Blinking Cursor. |
1310 | 1393 | // Not supported yet. |
| 1394 | // terminfo cvvis=\E[?12;25h |
| 1395 | // termcap vs=\E[?12;25h |
1311 | 1396 | break; |
1312 | 1397 | case 25: |
1313 | 1398 | // Show Cursor. |
1314 | 1399 | // Not supported yet. |
| 1400 | // terminfo cnorm=\E[?12l\E[?25h |
| 1401 | // termcap ve=\E[?12l\E[?25h |
1315 | 1402 | break; |
1316 | 1403 | case 47: |
1317 | 1404 | // Use Alternate Screen Buffer. |
… |
… |
TermParse::_DecPrivateModeSet(int value)
|
1333 | 1420 | case 1034: |
1334 | 1421 | // TODO: Interprete "meta" key, sets eighth bit. |
1335 | 1422 | // Not supported yet. |
| 1423 | // terminfo smm=\E[?1034h |
| 1424 | // termcap mm=\E[?1034h |
1336 | 1425 | break; |
1337 | 1426 | case 1036: |
1338 | 1427 | // TODO: Send ESC when Meta modifies a key |
… |
… |
TermParse::_DecPrivateModeSet(int value)
|
1345 | 1434 | case 1049: |
1346 | 1435 | // Save cursor as in DECSC and use Alternate Screen Buffer, clearing |
1347 | 1436 | // it first. |
| 1437 | // terminfo smcup=\E[?1049h |
| 1438 | // termcap ti=\E[?1049h |
1348 | 1439 | _DecSaveCursor(); |
1349 | 1440 | fBuffer->UseAlternateScreenBuffer(true); |
1350 | 1441 | break; |
… |
… |
TermParse::_DecPrivateModeReset(int value)
|
1359 | 1450 | case 1: |
1360 | 1451 | // Normal Cursor Keys (whatever that means). |
1361 | 1452 | // Not supported yet. |
| 1453 | // terminfo rmkx=\E[?1l |
| 1454 | // termcap ke=\E[?1l ? many also do \E> ? |
1362 | 1455 | break; |
1363 | 1456 | case 3: |
1364 | 1457 | // 80 Column Mode. |
… |
… |
TermParse::_DecPrivateModeReset(int value)
|
1387 | 1480 | case 25: |
1388 | 1481 | // Hide Cursor |
1389 | 1482 | // Not supported yet. |
| 1483 | // terminfo civis=\E[?25l |
| 1484 | // termcap vi=\E[?25l |
1390 | 1485 | break; |
1391 | 1486 | case 47: |
1392 | 1487 | // Use Normal Screen Buffer. |
… |
… |
TermParse::_DecPrivateModeReset(int value)
|
1408 | 1503 | case 1034: |
1409 | 1504 | // Don't interprete "meta" key. |
1410 | 1505 | // Not supported yet. |
| 1506 | // terminfo rmm=\E[?1034l |
| 1507 | // termcap mo=\E[?1034l |
1411 | 1508 | break; |
1412 | 1509 | case 1036: |
1413 | 1510 | // TODO: Don't send ESC when Meta modifies a key |
… |
… |
TermParse::_DecPrivateModeReset(int value)
|
1419 | 1516 | break; |
1420 | 1517 | case 1049: |
1421 | 1518 | // Use Normal Screen Buffer and restore cursor as in DECRC. |
| 1519 | // terminfo rmcup=\E[?1049l |
| 1520 | // termcap te=\E[?1049l |
1422 | 1521 | fBuffer->UseNormalScreenBuffer(); |
1423 | 1522 | _DecRestoreCursor(); |
1424 | 1523 | break; |