Date: Mon, 15 Dec 2008 19:49:38 GMT From: Ed Schouten <ed@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 154718 for review Message-ID: <200812151949.mBFJncAs012486@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=154718 Change 154718 by ed@ed_flippo on 2008/12/15 19:49:15 Small improvements: - Add support for per-terminal default attributes. - Print kernel messages in a different color again. - Add new keyword to sequences file to mark commands whose arguments should be set to 1 whose value is 0. Affected files ... .. //depot/projects/mpsafetty/sys/dev/syscons/scterm-teken.c#18 edit .. //depot/projects/mpsafetty/sys/dev/syscons/teken/gensequences#2 edit .. //depot/projects/mpsafetty/sys/dev/syscons/teken/sequences#5 edit .. //depot/projects/mpsafetty/sys/dev/syscons/teken/teken.c#7 edit .. //depot/projects/mpsafetty/sys/dev/syscons/teken/teken.h#10 edit .. //depot/projects/mpsafetty/sys/dev/syscons/teken/teken_subr.h#12 edit Differences ... ==== //depot/projects/mpsafetty/sys/dev/syscons/scterm-teken.c#18 (text+ko) ==== @@ -48,10 +48,13 @@ #include <dev/syscons/teken/teken.h> +static void scteken_revattr(unsigned char, teken_attr_t *); + static sc_term_init_t scteken_init; static sc_term_term_t scteken_term; static sc_term_puts_t scteken_puts; static sc_term_ioctl_t scteken_ioctl; +static sc_term_default_attr_t scteken_default_attr; static sc_term_clear_t scteken_clear; static sc_term_input_t scteken_input; static void scteken_nop(void); @@ -75,7 +78,7 @@ scteken_puts, scteken_ioctl, (sc_term_reset_t *)scteken_nop, - (sc_term_default_attr_t *)scteken_nop, + scteken_default_attr, scteken_clear, (sc_term_notify_t *)scteken_nop, scteken_input, @@ -120,9 +123,15 @@ ts->ts_busy = 1; teken_init(&ts->ts_teken, &scteken_funcs, scp); + tp.tp_row = scp->ysize; tp.tp_col = scp->xsize; - teken_winsize(&ts->ts_teken, &tp); + teken_set_winsize(&ts->ts_teken, &tp); + + tp.tp_row = scp->cursor_pos / scp->xsize; + tp.tp_col = scp->cursor_pos % scp->xsize; + teken_set_cursor(&ts->ts_teken, &tp); + break; case SC_TE_WARM_INIT: /* XXX */ @@ -184,6 +193,16 @@ } static void +scteken_default_attr(scr_stat *scp, int color, int rev_color) +{ + teken_stat *ts = scp->ts; + teken_attr_t ta; + + scteken_revattr(color, &ta); + teken_set_defattr(&ts->ts_teken, &ta); +} + +static void scteken_clear(scr_stat *scp) { @@ -209,21 +228,61 @@ * libteken routines. */ -static const unsigned char fgcolors_normal[8] = { +static const unsigned char fgcolors_normal[TC_NCOLORS] = { FG_BLACK, FG_RED, FG_GREEN, FG_BROWN, FG_BLUE, FG_MAGENTA, FG_CYAN, FG_LIGHTGREY, }; -static const unsigned char fgcolors_bold[8] = { +static const unsigned char fgcolors_bold[TC_NCOLORS] = { FG_DARKGREY, FG_LIGHTRED, FG_LIGHTGREEN, FG_YELLOW, FG_LIGHTBLUE, FG_LIGHTMAGENTA, FG_LIGHTCYAN, FG_WHITE, }; -static const unsigned char bgcolors[8] = { +static const unsigned char bgcolors[TC_NCOLORS] = { BG_BLACK, BG_RED, BG_GREEN, BG_BROWN, BG_BLUE, BG_MAGENTA, BG_CYAN, BG_LIGHTGREY, }; +static void +scteken_revattr(unsigned char color, teken_attr_t *a) +{ + teken_color_t fg, bg; + + /* + * XXX: Reverse conversion of syscons to teken attributes. Not + * realiable. Maybe we should turn it into a 1:1 mapping one of + * these days? + */ + + a->ta_format = 0; + a->ta_fgcolor = TC_WHITE; + a->ta_bgcolor = TC_BLACK; + +#ifdef FG_BLINK + if (color & FG_BLINK) { + a->ta_format |= TF_BLINK; + color &= ~FG_BLINK; + } +#endif /* FG_BLINK */ + + for (fg = 0; fg < TC_NCOLORS; fg++) { + for (bg = 0; bg < TC_NCOLORS; bg++) { + if ((fgcolors_normal[fg] | bgcolors[bg]) == color) { + a->ta_fgcolor = fg; + a->ta_bgcolor = bg; + return; + } + + if ((fgcolors_bold[fg] | bgcolors[bg]) == color) { + a->ta_fgcolor = fg; + a->ta_bgcolor = bg; + a->ta_format |= TF_BOLD; + return; + } + } + } +} + static inline unsigned int scteken_attr(const teken_attr_t *a) { ==== //depot/projects/mpsafetty/sys/dev/syscons/teken/gensequences#2 (text+ko) ==== @@ -115,8 +115,12 @@ } else { printf "\t\t%s(t", l_cmd_c_name[c]; split(l_cmd_args[c], args, " "); - for (a = 1; args[a] != ""; a++) - printf ", t->t_curnum < %d ? %d : t->t_nums[%d]", a, args[a], (a - 1); + for (a = 1; args[a] != ""; a++) { + if (args[a] == "n") + printf ", (t->t_curnum < %d || t->t_nums[%d] == 0) ? 1 : t->t_nums[%d]", a, (a - 1), (a - 1); + else + printf ", t->t_curnum < %d ? %d : t->t_nums[%d]", a, args[a], (a - 1); + } print ");"; } print "\t\tbreak;"; ==== //depot/projects/mpsafetty/sys/dev/syscons/teken/sequences#5 (text+ko) ==== @@ -23,23 +23,31 @@ # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. -# Abbr Name Sequence Default args -CBT Cursor Backward Tabulation ^[ [ Z 1 -CHT Cursor Forward Tabulation ^[ [ I 1 -CNL Cursor Next Line ^[ [ E 1 -CPL Cursor Previous Line ^[ [ F 1 +# File format is as follows: +# Abbr Abbreviation of sequence name +# Name Sequence name (will be converted to C function name) +# Sequence Bytes that form the sequence +# Arguments Standard value of arguments passed to this sequence +# - `variable' means a variable number of arguments +# - `n' converts 0 to 1 + +# Abbr Name Sequence Arguments +CBT Cursor Backward Tabulation ^[ [ Z n +CHT Cursor Forward Tabulation ^[ [ I n +CNL Cursor Next Line ^[ [ E n +CPL Cursor Previous Line ^[ [ F n CPR Cursor Position Report ^[ [ n 0 -CUB Cursor Backward ^[ [ D 1 -CUD Cursor Down ^[ [ B 1 -CUD Cursor Down ^[ [ e 1 -CUF Cursor Forward ^[ [ C 1 -CUF Cursor Forward ^[ [ a 1 +CUB Cursor Backward ^[ [ D n +CUD Cursor Down ^[ [ B n +CUD Cursor Down ^[ [ e n +CUF Cursor Forward ^[ [ C n +CUF Cursor Forward ^[ [ a n CUP Cursor Position ^[ [ H 1 1 CUP Cursor Position ^[ [ f 1 1 -CUU Cursor Up ^[ [ A 1 +CUU Cursor Up ^[ [ A n DA1 Primary Device Attributes ^[ [ c 0 DA2 Secondary Device Attributes ^[ [ > c 0 -DC Delete character ^[ [ P 1 +DC Delete character ^[ [ P n DCS Device Control String ^[ P DECALN Alignment test ^[ # 8 DECDHL Double Height Double Width Line Top ^[ # 3 @@ -55,16 +63,16 @@ DECSM Set DEC mode ^[ [ ? h 0 DECSTBM Set top and bottom margins ^[ [ r 0 0 DECSWL Single Height Single Width Line ^[ # 5 -DL Delete line ^[ [ M 1 +DL Delete line ^[ [ M n DSR Device Status Report ^[ [ ? n 0 -ECH Erase character ^[ [ X 1 +ECH Erase character ^[ [ X n ED Erase display ^[ [ J 0 EL Erase line ^[ [ K 0 HPA Horizontal Position Absolute ^[ [ G 1 HPA Horizontal Position Absolute ^[ [ ` 1 HTS Horizontal Tab Set ^[ H -ICH Insert character ^[ [ @ 1 -IL Insert line ^[ [ L 1 +ICH Insert character ^[ [ @ n +IL Insert line ^[ [ L n IND Index ^[ D NEL Next line ^[ E RI Reverse index ^[ M @@ -80,11 +88,11 @@ SCS SCS ^[ ) 2 SCS SCS ^[ ) A SCS SCS ^[ ) B -SD Pan Up ^[ [ T 1 +SD Pan Up ^[ [ T n SGR Set Graphic Rendition ^[ [ m variable SM Set Mode ^[ [ h 0 ST String Terminator ^[ \\ -SU Pan Down ^[ [ S 1 +SU Pan Down ^[ [ S n TBC Tab Clear ^[ [ g 0 VPA Vertical Position Absolute ^[ [ d 1 ==== //depot/projects/mpsafetty/sys/dev/syscons/teken/teken.c#7 (text+ko) ==== @@ -74,12 +74,6 @@ static teken_state_t teken_state_init; -static const teken_attr_t teken_defattr = { - .ta_format = 0, - .ta_fgcolor = TC_WHITE, - .ta_bgcolor = TC_BLACK, -}; - /* * Wrappers for hooks. */ @@ -194,13 +188,16 @@ t->t_nextstate = teken_state_init; + t->t_defattr.ta_format = 0; + t->t_defattr.ta_fgcolor = TC_WHITE; + t->t_defattr.ta_bgcolor = TC_BLACK; teken_subr_do_reset(t); #ifdef TEKEN_UTF8 t->t_utf8_left = 0; #endif /* TEKEN_UTF8 */ - teken_winsize(t, &tp); + teken_set_winsize(t, &tp); } static void @@ -241,8 +238,11 @@ teken_assert(t->t_saved_cursor.tp_col < t->t_winsize.tp_col); teken_assert(t->t_scrollreg.ts_end <= t->t_winsize.tp_row); teken_assert(t->t_scrollreg.ts_begin < t->t_scrollreg.ts_end); - teken_assert(t->t_originreg.ts_end <= t->t_winsize.tp_row); - teken_assert(t->t_originreg.ts_begin < t->t_originreg.ts_end); + /* Origin region has to be window size or the same as scrollreg. */ + teken_assert((t->t_originreg.ts_begin == t->t_scrollreg.ts_begin && + t->t_originreg.ts_end == t->t_scrollreg.ts_end) || + (t->t_originreg.ts_begin == 0 && + t->t_originreg.ts_end == t->t_winsize.tp_row)); } static void @@ -294,23 +294,34 @@ } void -teken_winsize(teken_t *t, const teken_pos_t *p) +teken_set_cursor(teken_t *t, const teken_pos_t *p) +{ + + /* XXX: bounds checking with originreg! */ + teken_assert(p->tp_row < t->t_winsize.tp_row); + teken_assert(p->tp_col < t->t_winsize.tp_col); + + t->t_cursor = *p; +} + +void +teken_set_defattr(teken_t *t, const teken_attr_t *a) +{ + + t->t_curattr = t->t_saved_curattr = t->t_defattr = *a; +} + +void +teken_set_winsize(teken_t *t, const teken_pos_t *p) { - teken_rect_t tr; teken_assert(p->tp_col <= T_NUMCOL); t->t_winsize = *p; - /* XXX: discards active scroll region. */ + /* XXX: bounds checking with cursor/etc! */ t->t_scrollreg.ts_begin = 0; t->t_scrollreg.ts_end = t->t_winsize.tp_row; t->t_originreg = t->t_scrollreg; - - /* Blank screen. */ - tr.tr_begin.tp_row = 0; - tr.tr_begin.tp_col = 0; - tr.tr_end = t->t_winsize; - teken_funcs_fill(t, &tr, BLANK, &teken_defattr); } /* ==== //depot/projects/mpsafetty/sys/dev/syscons/teken/teken.h#10 (text+ko) ==== @@ -61,6 +61,7 @@ #define TC_MAGENTA 5 #define TC_CYAN 6 #define TC_WHITE 7 +#define TC_NCOLORS 8 typedef struct { teken_unit_t tp_row; @@ -117,6 +118,7 @@ /* * Terminal state. */ + struct __teken { const teken_funcs_t *t_funcs; void *t_softc; @@ -133,6 +135,7 @@ teken_pos_t t_saved_cursor; teken_attr_t t_saved_curattr; + teken_attr_t t_defattr; teken_pos_t t_winsize; /* For DECSTBM. */ @@ -149,8 +152,15 @@ #endif /* TEKEN_UTF8 */ }; +/* Initialize teken structure. */ void teken_init(teken_t *, const teken_funcs_t *, void *); + +/* Deliver character input. */ void teken_input(teken_t *, const void *, size_t); -void teken_winsize(teken_t *, const teken_pos_t *); + +/* Set teken attributes. */ +void teken_set_cursor(teken_t *, const teken_pos_t *); +void teken_set_defattr(teken_t *, const teken_attr_t *); +void teken_set_winsize(teken_t *, const teken_pos_t *); #endif /* !_TEKEN_H_ */ ==== //depot/projects/mpsafetty/sys/dev/syscons/teken/teken_subr.h#12 (text+ko) ==== @@ -183,7 +183,7 @@ tr.tr_begin.tp_row = 0; tr.tr_begin.tp_col = 0; tr.tr_end = t->t_winsize; - teken_funcs_fill(t, &tr, 'E', &teken_defattr); + teken_funcs_fill(t, &tr, 'E', &t->t_defattr); } static void @@ -219,8 +219,6 @@ teken_subr_cursor_backward(teken_t *t, unsigned int ncols) { - if (ncols == 0) - ncols = 1; if (ncols > t->t_cursor.tp_col) t->t_cursor.tp_col = 0; else @@ -233,9 +231,6 @@ teken_subr_cursor_backward_tabulation(teken_t *t, unsigned int ntabs) { - if (ntabs == 0) - ntabs = 1; - do { /* Stop when we've reached the beginning of the line. */ if (t->t_cursor.tp_col == 0) @@ -253,9 +248,6 @@ teken_subr_cursor_down(teken_t *t, unsigned int nrows) { - if (nrows == 0) - nrows = 1; - teken_assert(t->t_cursor.tp_row < t->t_scrollreg.ts_end); if (nrows >= t->t_scrollreg.ts_end - t->t_cursor.tp_row) t->t_cursor.tp_row = t->t_scrollreg.ts_end - 1; @@ -269,8 +261,6 @@ teken_subr_cursor_forward(teken_t *t, unsigned int ncols) { - if (ncols == 0) - ncols = 1; if (ncols >= t->t_winsize.tp_col - t->t_cursor.tp_col) t->t_cursor.tp_col = t->t_winsize.tp_col - 1; else @@ -283,9 +273,6 @@ teken_subr_cursor_forward_tabulation(teken_t *t, unsigned int ntabs) { - if (ntabs == 0) - ntabs = 1; - do { /* Stop when we've reached the end of the line. */ if (t->t_cursor.tp_col == t->t_winsize.tp_col - 1) @@ -343,9 +330,6 @@ teken_subr_cursor_up(teken_t *t, unsigned int nrows) { - if (nrows == 0) - nrows = 1; - if (nrows > ((int)t->t_cursor.tp_row - t->t_scrollreg.ts_begin)) t->t_cursor.tp_row = t->t_scrollreg.ts_begin; else @@ -359,9 +343,6 @@ { teken_rect_t tr; - if (ncols == 0) - ncols = 1; - tr.tr_begin.tp_row = t->t_cursor.tp_row; tr.tr_end.tp_row = t->t_cursor.tp_row + 1; tr.tr_end.tp_col = t->t_winsize.tp_col; @@ -385,9 +366,6 @@ { teken_rect_t tr; - if (nrows == 0) - nrows = 1; - tr.tr_begin.tp_col = 0; tr.tr_end.tp_row = t->t_scrollreg.ts_end; tr.tr_end.tp_col = t->t_winsize.tp_col; @@ -445,9 +423,6 @@ { teken_rect_t tr; - if (ncols == 0) - ncols = 1; - tr.tr_begin = t->t_cursor; tr.tr_end.tp_row = t->t_cursor.tp_row + 1; @@ -572,9 +547,6 @@ { teken_rect_t tr; - if (ncols == 0) - ncols = 1; - tr.tr_begin = t->t_cursor; tr.tr_end.tp_row = t->t_cursor.tp_row + 1; @@ -601,9 +573,6 @@ { teken_rect_t tr; - if (nrows == 0) - nrows = 1; - tr.tr_begin.tp_row = t->t_cursor.tp_row; tr.tr_begin.tp_col = 0; tr.tr_end.tp_col = t->t_winsize.tp_col; @@ -672,10 +641,6 @@ teken_subr_pan_down(teken_t *t, unsigned int nrows) { - if (nrows == 0) - nrows = 1; - - teken_subr_do_scroll(t, (int)nrows); } @@ -683,9 +648,6 @@ teken_subr_pan_up(teken_t *t, unsigned int nrows) { - if (nrows == 0) - nrows = 1; - teken_subr_do_scroll(t, -(int)nrows); } @@ -837,7 +799,7 @@ teken_subr_do_reset(teken_t *t) { - t->t_curattr = t->t_saved_curattr = teken_defattr; + t->t_curattr = t->t_saved_curattr = t->t_defattr; t->t_cursor.tp_row = t->t_cursor.tp_col = 0; t->t_saved_cursor = t->t_cursor; t->t_stateflags = TS_AUTOWRAP; @@ -975,7 +937,7 @@ /* No attributes means reset. */ if (ncmds == 0) { - t->t_curattr = teken_defattr; + t->t_curattr = t->t_defattr; return; } @@ -984,7 +946,7 @@ switch (n) { case 0: /* Reset. */ - t->t_curattr = teken_defattr; + t->t_curattr = t->t_defattr; break; case 1: /* Bold. */ t->t_curattr.ta_format |= TF_BOLD; @@ -1021,7 +983,7 @@ t->t_curattr.ta_fgcolor = n - 30; break; case 39: /* Set default foreground color. */ - t->t_curattr.ta_fgcolor = teken_defattr.ta_fgcolor; + t->t_curattr.ta_fgcolor = t->t_defattr.ta_fgcolor; break; case 40: /* Set background color: black */ case 41: /* Set background color: red */ @@ -1034,7 +996,7 @@ t->t_curattr.ta_bgcolor = n - 40; break; case 49: /* Set default background color. */ - t->t_curattr.ta_bgcolor = teken_defattr.ta_bgcolor; + t->t_curattr.ta_bgcolor = t->t_defattr.ta_bgcolor; break; default: teken_printf("unsupported attribute %u\n", n);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200812151949.mBFJncAs012486>