teken_subr.h (197115) | teken_subr.h (197117) |
---|---|
1/*- 2 * Copyright (c) 2008-2009 Ed Schouten <ed@FreeBSD.org> 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 9 unchanged lines hidden (view full) --- 18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24 * SUCH DAMAGE. 25 * | 1/*- 2 * Copyright (c) 2008-2009 Ed Schouten <ed@FreeBSD.org> 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 9 unchanged lines hidden (view full) --- 18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24 * SUCH DAMAGE. 25 * |
26 * $FreeBSD: head/sys/teken/teken_subr.h 197115 2009-09-12 10:34:34Z ed $ | 26 * $FreeBSD: head/sys/teken/teken_subr.h 197117 2009-09-12 12:44:21Z ed $ |
27 */ 28 29static void teken_subr_cursor_up(teken_t *, unsigned int); 30static void teken_subr_erase_line(teken_t *, unsigned int); 31static void teken_subr_regular_character(teken_t *, teken_char_t); 32static void teken_subr_reset_to_initial_state(teken_t *); 33static void teken_subr_save_cursor(teken_t *); 34 --- 162 unchanged lines hidden (view full) --- 197 tr.tr_end = t->t_winsize; 198 teken_funcs_fill(t, &tr, 'E', &t->t_defattr); 199} 200 201static void 202teken_subr_backspace(teken_t *t) 203{ 204 | 27 */ 28 29static void teken_subr_cursor_up(teken_t *, unsigned int); 30static void teken_subr_erase_line(teken_t *, unsigned int); 31static void teken_subr_regular_character(teken_t *, teken_char_t); 32static void teken_subr_reset_to_initial_state(teken_t *); 33static void teken_subr_save_cursor(teken_t *); 34 --- 162 unchanged lines hidden (view full) --- 197 tr.tr_end = t->t_winsize; 198 teken_funcs_fill(t, &tr, 'E', &t->t_defattr); 199} 200 201static void 202teken_subr_backspace(teken_t *t) 203{ 204 |
205#ifdef TEKEN_XTERM 206 if (t->t_cursor.tp_col == 0) 207 return; 208 209 t->t_cursor.tp_col--; 210 t->t_stateflags &= ~TS_WRAPPED; 211#else /* !TEKEN_XTERM */ 212 if (t->t_cursor.tp_col == 0) { 213 if (t->t_cursor.tp_row == t->t_originreg.ts_begin) 214 return; 215 t->t_cursor.tp_row--; 216 t->t_cursor.tp_col = t->t_winsize.tp_col - 1; | 205 if (t->t_stateflags & TS_CONS25) { 206 if (t->t_cursor.tp_col == 0) { 207 if (t->t_cursor.tp_row == t->t_originreg.ts_begin) 208 return; 209 t->t_cursor.tp_row--; 210 t->t_cursor.tp_col = t->t_winsize.tp_col - 1; 211 } else { 212 t->t_cursor.tp_col--; 213 } |
217 } else { | 214 } else { |
215 if (t->t_cursor.tp_col == 0) 216 return; 217 |
|
218 t->t_cursor.tp_col--; | 218 t->t_cursor.tp_col--; |
219 t->t_stateflags &= ~TS_WRAPPED; |
|
219 } | 220 } |
220#endif /* TEKEN_XTERM */ | |
221 222 teken_funcs_cursor(t); 223} 224 225static void 226teken_subr_bell(teken_t *t) 227{ 228 --- 354 unchanged lines hidden (view full) --- 583 584 t->t_stateflags &= ~TS_WRAPPED; 585 teken_funcs_cursor(t); 586} 587 588static void 589teken_subr_horizontal_tab(teken_t *t) 590{ | 221 222 teken_funcs_cursor(t); 223} 224 225static void 226teken_subr_bell(teken_t *t) 227{ 228 --- 354 unchanged lines hidden (view full) --- 583 584 t->t_stateflags &= ~TS_WRAPPED; 585 teken_funcs_cursor(t); 586} 587 588static void 589teken_subr_horizontal_tab(teken_t *t) 590{ |
591#ifdef TEKEN_XTERM 592 teken_rect_t tr; | |
593 | 591 |
594 tr.tr_begin = t->t_cursor; 595 teken_subr_cursor_forward_tabulation(t, 1); 596 tr.tr_end.tp_row = tr.tr_begin.tp_row + 1; 597 tr.tr_end.tp_col = t->t_cursor.tp_col; | 592 if (t->t_stateflags & TS_CONS25) { 593 teken_subr_cursor_forward_tabulation(t, 1); 594 } else { 595 teken_rect_t tr; |
598 | 596 |
599 /* Blank region that we skipped. */ 600 if (tr.tr_end.tp_col > tr.tr_begin.tp_col) 601 teken_funcs_fill(t, &tr, BLANK, &t->t_curattr); 602#else /* !TEKEN_XTERM */ | 597 tr.tr_begin = t->t_cursor; 598 teken_subr_cursor_forward_tabulation(t, 1); 599 tr.tr_end.tp_row = tr.tr_begin.tp_row + 1; 600 tr.tr_end.tp_col = t->t_cursor.tp_col; |
603 | 601 |
604 teken_subr_cursor_forward_tabulation(t, 1); 605#endif /* TEKEN_XTERM */ | 602 /* Blank region that we skipped. */ 603 if (tr.tr_end.tp_col > tr.tr_begin.tp_col) 604 teken_funcs_fill(t, &tr, BLANK, &t->t_curattr); 605 } |
606} 607 608static void 609teken_subr_horizontal_tab_set(teken_t *t) 610{ 611 612 teken_tab_set(t, t->t_cursor.tp_col); 613} --- 91 unchanged lines hidden (view full) --- 705 706 t->t_stateflags &= ~TS_WRAPPED; 707 teken_funcs_cursor(t); 708} 709 710static void 711teken_subr_newpage(teken_t *t) 712{ | 606} 607 608static void 609teken_subr_horizontal_tab_set(teken_t *t) 610{ 611 612 teken_tab_set(t, t->t_cursor.tp_col); 613} --- 91 unchanged lines hidden (view full) --- 705 706 t->t_stateflags &= ~TS_WRAPPED; 707 teken_funcs_cursor(t); 708} 709 710static void 711teken_subr_newpage(teken_t *t) 712{ |
713#ifdef TEKEN_XTERM | |
714 | 713 |
715 teken_subr_newline(t); 716#else /* !TEKEN_XTERM */ 717 teken_rect_t tr; | 714 if (t->t_stateflags & TS_CONS25) { 715 teken_rect_t tr; |
718 | 716 |
719 tr.tr_begin.tp_row = tr.tr_begin.tp_col = 0; 720 tr.tr_end = t->t_winsize; 721 teken_funcs_fill(t, &tr, BLANK, &t->t_curattr); | 717 tr.tr_begin.tp_row = tr.tr_begin.tp_col = 0; 718 tr.tr_end = t->t_winsize; 719 teken_funcs_fill(t, &tr, BLANK, &t->t_curattr); |
722 | 720 |
723 t->t_cursor.tp_row = t->t_cursor.tp_col = 0; 724 teken_funcs_cursor(t); 725#endif /* TEKEN_XTERM */ | 721 t->t_cursor.tp_row = t->t_cursor.tp_col = 0; 722 teken_funcs_cursor(t); 723 } else { 724 teken_subr_newline(t); 725 } |
726} 727 728static void 729teken_subr_next_line(teken_t *t) 730{ 731 732 t->t_cursor.tp_col = 0; 733 teken_subr_newline(t); --- 40 unchanged lines hidden (view full) --- 774 ctr.tr_begin = *tp; 775 ctr.tr_end.tp_row = tp->tp_row + 1; 776 ctr.tr_end.tp_col = t->t_winsize.tp_col - width; 777 ctp.tp_row = tp->tp_row; 778 ctp.tp_col = tp->tp_col + width; 779 teken_funcs_copy(t, &ctr, &ctp); 780 } 781 | 726} 727 728static void 729teken_subr_next_line(teken_t *t) 730{ 731 732 t->t_cursor.tp_col = 0; 733 teken_subr_newline(t); --- 40 unchanged lines hidden (view full) --- 774 ctr.tr_begin = *tp; 775 ctr.tr_end.tp_row = tp->tp_row + 1; 776 ctr.tr_end.tp_col = t->t_winsize.tp_col - width; 777 ctp.tp_row = tp->tp_row; 778 ctp.tp_col = tp->tp_col + width; 779 teken_funcs_copy(t, &ctr, &ctp); 780 } 781 |
782 if (width == 2 && tp->tp_col + 1 < t->t_winsize.tp_col) { 783 teken_pos_t tp2; 784 785 /* 786 * Store a space behind double width characters before 787 * actually printing them. This prevents artifacts when 788 * the consumer doesn't render it using double width 789 * glyphs. 790 */ 791 tp2.tp_row = tp->tp_row; 792 tp2.tp_col = tp->tp_col + 1; 793 teken_funcs_putchar(t, &tp2, BLANK, &t->t_curattr); 794 } 795 |
|
782 teken_funcs_putchar(t, tp, c, &t->t_curattr); 783} 784 785static void 786teken_subr_regular_character(teken_t *t, teken_char_t c) 787{ 788 int width; 789 | 796 teken_funcs_putchar(t, tp, c, &t->t_curattr); 797} 798 799static void 800teken_subr_regular_character(teken_t *t, teken_char_t c) 801{ 802 int width; 803 |
790 if (t->t_utf8_left == -1) { 791#ifdef TEKEN_XTERM 792 if (c <= 0x1B) | 804 if (t->t_stateflags & TS_8BIT) { 805 if (!(t->t_stateflags & TS_CONS25) && c <= 0x1B) |
793 return; | 806 return; |
794#endif /* TEKEN_XTERM */ | |
795 width = 1; 796 } else { 797 c = teken_scs_process(t, c); 798 width = teken_wcwidth(c); 799 /* XXX: Don't process zero-width characters yet. */ 800 if (width <= 0) 801 return; 802 } 803 | 807 width = 1; 808 } else { 809 c = teken_scs_process(t, c); 810 width = teken_wcwidth(c); 811 /* XXX: Don't process zero-width characters yet. */ 812 if (width <= 0) 813 return; 814 } 815 |
804#ifdef TEKEN_XTERM 805 if (t->t_cursor.tp_col == t->t_winsize.tp_col - 1 && | 816 if (t->t_stateflags & TS_CONS25) { 817 teken_subr_do_putchar(t, &t->t_cursor, c, width); 818 t->t_cursor.tp_col += width; 819 820 if (t->t_cursor.tp_col >= t->t_winsize.tp_col) { 821 if (t->t_cursor.tp_row == t->t_scrollreg.ts_end - 1) { 822 /* Perform scrolling. */ 823 teken_subr_do_scroll(t, 1); 824 } else { 825 /* No scrolling needed. */ 826 if (t->t_cursor.tp_row < 827 t->t_winsize.tp_row - 1) 828 t->t_cursor.tp_row++; 829 } 830 t->t_cursor.tp_col = 0; 831 } 832 } else if (t->t_cursor.tp_col == t->t_winsize.tp_col - 1 && |
806 (t->t_stateflags & (TS_WRAPPED|TS_AUTOWRAP)) == 807 (TS_WRAPPED|TS_AUTOWRAP)) { 808 teken_pos_t tp; 809 810 /* Perform line wrapping. */ 811 812 if (t->t_cursor.tp_row == t->t_scrollreg.ts_end - 1) { 813 /* Perform scrolling. */ --- 27 unchanged lines hidden (view full) --- 841 842 if (t->t_cursor.tp_col >= t->t_winsize.tp_col) { 843 t->t_stateflags |= TS_WRAPPED; 844 t->t_cursor.tp_col = t->t_winsize.tp_col - 1; 845 } else { 846 t->t_stateflags &= ~TS_WRAPPED; 847 } 848 } | 833 (t->t_stateflags & (TS_WRAPPED|TS_AUTOWRAP)) == 834 (TS_WRAPPED|TS_AUTOWRAP)) { 835 teken_pos_t tp; 836 837 /* Perform line wrapping. */ 838 839 if (t->t_cursor.tp_row == t->t_scrollreg.ts_end - 1) { 840 /* Perform scrolling. */ --- 27 unchanged lines hidden (view full) --- 868 869 if (t->t_cursor.tp_col >= t->t_winsize.tp_col) { 870 t->t_stateflags |= TS_WRAPPED; 871 t->t_cursor.tp_col = t->t_winsize.tp_col - 1; 872 } else { 873 t->t_stateflags &= ~TS_WRAPPED; 874 } 875 } |
849#else /* !TEKEN_XTERM */ 850 teken_subr_do_putchar(t, &t->t_cursor, c, width); 851 t->t_cursor.tp_col += width; | |
852 | 876 |
853 if (t->t_cursor.tp_col >= t->t_winsize.tp_col) { 854 if (t->t_cursor.tp_row == t->t_scrollreg.ts_end - 1) { 855 /* Perform scrolling. */ 856 teken_subr_do_scroll(t, 1); 857 } else { 858 /* No scrolling needed. */ 859 if (t->t_cursor.tp_row < t->t_winsize.tp_row - 1) 860 t->t_cursor.tp_row++; 861 } 862 t->t_cursor.tp_col = 0; 863 } 864#endif /* TEKEN_XTERM */ 865 | |
866 teken_funcs_cursor(t); 867} 868 869static void 870teken_subr_reset_dec_mode(teken_t *t, unsigned int cmd) 871{ 872 873 switch (cmd) { --- 58 unchanged lines hidden (view full) --- 932teken_subr_do_reset(teken_t *t) 933{ 934 935 t->t_curattr = t->t_defattr; 936 t->t_cursor.tp_row = t->t_cursor.tp_col = 0; 937 t->t_scrollreg.ts_begin = 0; 938 t->t_scrollreg.ts_end = t->t_winsize.tp_row; 939 t->t_originreg = t->t_scrollreg; | 877 teken_funcs_cursor(t); 878} 879 880static void 881teken_subr_reset_dec_mode(teken_t *t, unsigned int cmd) 882{ 883 884 switch (cmd) { --- 58 unchanged lines hidden (view full) --- 943teken_subr_do_reset(teken_t *t) 944{ 945 946 t->t_curattr = t->t_defattr; 947 t->t_cursor.tp_row = t->t_cursor.tp_col = 0; 948 t->t_scrollreg.ts_begin = 0; 949 t->t_scrollreg.ts_end = t->t_winsize.tp_row; 950 t->t_originreg = t->t_scrollreg; |
940 t->t_stateflags = TS_AUTOWRAP; | 951 t->t_stateflags &= TS_8BIT|TS_CONS25; 952 t->t_stateflags |= TS_AUTOWRAP; |
941 942 teken_scs_set(t, 0, teken_scs_us_ascii); 943 teken_scs_set(t, 1, teken_scs_us_ascii); 944 teken_scs_switch(t, 0); 945 946 teken_subr_save_cursor(t); 947 teken_tab_default(t); 948} --- 271 unchanged lines hidden --- | 953 954 teken_scs_set(t, 0, teken_scs_us_ascii); 955 teken_scs_set(t, 1, teken_scs_us_ascii); 956 teken_scs_switch(t, 0); 957 958 teken_subr_save_cursor(t); 959 teken_tab_default(t); 960} --- 271 unchanged lines hidden --- |