1 /*
   2  * CDDL HEADER START
   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License (the "License").
   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 
  22 /*
  23  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
  24  * Use is subject to license terms.
  25  */
  26 /*      Copyright (c) 1990, 1991 UNIX System Laboratories, Inc. */
  27 
  28 /*      Copyright (c) 1984, 1986, 1987, 1988, 1989, 1990 AT&T       */
  29 /*        All Rights Reserved   */
  30 
  31 #ifndef _SYS_TEM_H
  32 #define _SYS_TEM_H
  33 
  34 #ifdef __cplusplus
  35 extern "C" {
  36 #endif
  37 
  38 #include <sys/types.h>
  39 #include <sys/visual_io.h>
  40 #include <sys/font.h>
  41 #include <sys/list.h>
  42 #include <sys/tem.h>
  43 #include <bootstrap.h>
  44 #include <stdbool.h>
  45 
  46 /*
  47  * Definitions for ANSI x3.64 terminal control language parser.
  48  * With UTF-8 support we use 32-bit value for Unicode codepoints.
  49  *
  50  * However, as we only need 21 bits for unicode char, we will use the
  51  * rest of the bits for attributes, so we can save memory and
  52  * have combined attribute+char in screen buffer. This will also allow us
  53  * to keep better track about attributes and apply other optimizations.
  54  *
  55  *  Bits  Meaning
  56  *  0-20  char
  57  * 21-31  attributes
  58  */
  59 
  60 typedef uint32_t tem_char_t;    /* 32bit char to support UTF-8 */
  61 #define TEM_ATTR_MASK           0x7FF
  62 #define TEM_CHAR(c)             ((c) & 0x1fffff)
  63 #define TEM_CHAR_ATTR(c)        (((c) >> 21) & TEM_ATTR_MASK)
  64 #define TEM_ATTR(c)             (((c) & TEM_ATTR_MASK) << 21)
  65 
  66 #define TEM_MAXPARAMS   5       /* maximum number of ANSI paramters */
  67 #define TEM_MAXTAB      40      /* maximum number of tab stops */
  68 #define TEM_MAXFKEY     30      /* max length of function key with <ESC>Q */
  69 #define MAX_TEM         2       /* max number of loadable terminal emulators */
  70 
  71 #define TEM_SCROLL_UP           0
  72 #define TEM_SCROLL_DOWN         1
  73 #define TEM_SHIFT_LEFT          0
  74 #define TEM_SHIFT_RIGHT         1
  75 
  76 /* Attributes 0-0x7ff */
  77 #define TEM_ATTR_NORMAL         0x0000
  78 #define TEM_ATTR_REVERSE        0x0001
  79 #define TEM_ATTR_BOLD           0x0002
  80 #define TEM_ATTR_BLINK          0x0004
  81 #define TEM_ATTR_UNDERLINE      0x0008
  82 #define TEM_ATTR_SCREEN_REVERSE 0x0010
  83 #define TEM_ATTR_BRIGHT_FG      0x0020
  84 #define TEM_ATTR_BRIGHT_BG      0x0040
  85 #define TEM_ATTR_TRANSPARENT    0x0080
  86 
  87 #define ANSI_COLOR_BLACK        0
  88 #define ANSI_COLOR_RED          1
  89 #define ANSI_COLOR_GREEN        2
  90 #define ANSI_COLOR_BROWN        3
  91 #define ANSI_COLOR_BLUE         4
  92 #define ANSI_COLOR_MAGENTA      5
  93 #define ANSI_COLOR_CYAN         6
  94 #define ANSI_COLOR_WHITE        7
  95 
  96 #define TEM_TEXT_WHITE          0
  97 #define TEM_TEXT_BLACK          1
  98 #define TEM_TEXT_BLACK24_RED    0x00
  99 #define TEM_TEXT_BLACK24_GREEN  0x00
 100 #define TEM_TEXT_BLACK24_BLUE   0x00
 101 #define TEM_TEXT_WHITE24_RED    0xff
 102 #define TEM_TEXT_WHITE24_GREEN  0xff
 103 #define TEM_TEXT_WHITE24_BLUE   0xff
 104 
 105 #define A_STATE_START                   0
 106 #define A_STATE_ESC                     1
 107 #define A_STATE_CSI                     2
 108 #define A_STATE_CSI_QMARK               3
 109 #define A_STATE_CSI_EQUAL               4
 110 
 111 /*
 112  * Default number of rows and columns
 113  */
 114 #define TEM_DEFAULT_ROWS        25
 115 #define TEM_DEFAULT_COLS        80
 116 
 117 /*
 118  * Default foreground/background color
 119  */
 120 
 121 #define DEFAULT_ANSI_FOREGROUND ANSI_COLOR_BLACK
 122 #define DEFAULT_ANSI_BACKGROUND ANSI_COLOR_WHITE
 123 
 124 
 125 #define BUF_LEN         160 /* Two lines of data can be processed at a time */
 126 
 127 typedef uint8_t text_color_t;
 128 typedef uint16_t text_attr_t;
 129 
 130 typedef struct tem_color {
 131         text_color_t    fg_color;
 132         text_color_t    bg_color;
 133         text_attr_t     a_flags;
 134 } tem_color_t;
 135 
 136 struct tem_pix_pos {
 137         screen_pos_t    x;
 138         screen_pos_t    y;
 139 };
 140 
 141 struct tem_char_pos {
 142         screen_pos_t    col;
 143         screen_pos_t    row;
 144 };
 145 
 146 struct tem_size {
 147         screen_size_t   width;
 148         screen_size_t   height;
 149 };
 150 
 151 typedef struct {
 152         uint8_t red[16];
 153         uint8_t green[16];
 154         uint8_t blue[16];
 155 } text_cmap_t;
 156 
 157 /* Combined color and 32bit tem char */
 158 typedef struct term_char {
 159         text_color_t    tc_fg_color;
 160         text_color_t    tc_bg_color;
 161         tem_char_t      tc_char;
 162 } term_char_t;
 163 
 164 /* Color translation tables. */
 165 extern const uint8_t dim_xlate[8];
 166 extern const uint8_t brt_xlate[8];
 167 extern const uint8_t solaris_color_to_pc_color[16];
 168 extern const text_cmap_t cmap4_to_24;
 169 
 170 /*
 171  * State structure for each virtual terminal emulator
 172  */
 173 struct tem_vt_state {
 174         uint8_t         tvs_fbmode;     /* framebuffer mode */
 175         text_attr_t     tvs_flags;      /* flags for this x3.64 terminal */
 176         int             tvs_state;      /* state in output esc seq processing */
 177         bool            tvs_gotparam;   /* does output esc seq have a param */
 178 
 179         int     tvs_curparam;   /* current param # of output esc seq */
 180         int     tvs_paramval;   /* value of current param */
 181         int     tvs_params[TEM_MAXPARAMS];  /* parameters of output esc seq */
 182         screen_pos_t    tvs_tabs[TEM_MAXTAB];   /* tab stops */
 183         int     tvs_ntabs;              /* number of tabs used */
 184         int     tvs_nscroll;            /* number of lines to scroll */
 185 
 186         struct tem_char_pos tvs_s_cursor;       /* start cursor position */
 187         struct tem_char_pos tvs_c_cursor;       /* current cursor position */
 188         struct tem_char_pos tvs_r_cursor;       /* remembered cursor position */
 189 
 190         term_char_t     *tvs_outbuf;    /* place to keep incomplete lines */
 191         int             tvs_outindex;   /* index into a_outbuf */
 192         void            *tvs_pix_data;  /* pointer to tmp bitmap area */
 193         int             tvs_pix_data_size;
 194         text_color_t    tvs_fg_color;
 195         text_color_t    tvs_bg_color;
 196         int             tvs_first_line; /* kernel console output begins */
 197 
 198         unsigned        tvs_utf8_left;          /* UTF-8 code points */
 199         tem_char_t      tvs_utf8_partial;       /* UTF-8 char being completed */
 200 
 201         bool            tvs_isactive;
 202         bool            tvs_initialized;        /* initialization flag */
 203 
 204         list_node_t     tvs_list_node;
 205 };
 206 
 207 typedef struct tem_callbacks {
 208         void (*tsc_display)(struct tem_vt_state *, term_char_t *, int,
 209             screen_pos_t, screen_pos_t);
 210         void (*tsc_copy)(struct tem_vt_state *,
 211             screen_pos_t, screen_pos_t, screen_pos_t, screen_pos_t,
 212             screen_pos_t, screen_pos_t);
 213         void (*tsc_cursor)(struct tem_vt_state *, short);
 214         void (*tsc_bit2pix)(struct tem_vt_state *, term_char_t);
 215         void (*tsc_cls)(struct tem_vt_state *, int, screen_pos_t, screen_pos_t);
 216 } tem_callbacks_t;
 217 
 218 typedef struct __tem_modechg_cb_arg *tem_modechg_cb_arg_t;
 219 typedef void (*tem_modechg_cb_t) (tem_modechg_cb_arg_t arg);
 220 typedef struct __tem_vt_state *tem_vt_state_t;
 221 
 222 /*
 223  * common term soft state structure shared by all virtual terminal emulators
 224  */
 225 typedef struct tem_state {
 226         struct console  *ts_hdl;        /* Framework handle for dev */
 227         screen_size_t   ts_linebytes;   /* Layered on bytes per scan line */
 228 
 229         int     ts_display_mode;        /* What mode we are in */
 230 
 231         struct tem_size ts_c_dimension; /* window dimensions in characters */
 232         struct tem_size ts_p_dimension; /* screen dimensions in pixels */
 233         struct tem_pix_pos ts_p_offset; /* pix offset to center the display */
 234 
 235         int     ts_pix_data_size;       /* size of bitmap data areas */
 236         int     ts_pdepth;              /* pixel depth */
 237         struct font     ts_font;        /* font table */
 238         bool    update_font;            /* flag the font change */
 239 
 240         tem_callbacks_t *ts_callbacks;  /* internal output functions */
 241 
 242         int     ts_initialized;         /* initialization flag */
 243 
 244         tem_modechg_cb_t        ts_modechg_cb;
 245         tem_modechg_cb_arg_t    ts_modechg_arg;
 246 
 247         color_map_fn_t  ts_color_map;
 248 
 249         tem_color_t     ts_init_color; /* initial color and attributes */
 250 
 251         struct tem_vt_state     *ts_active;
 252         list_t          ts_list;        /* chain of all tems */
 253 } tem_state_t;
 254 
 255 extern tem_state_t tems;
 256 /*
 257  * tems_* fuctions mean that they just operate on the common soft state
 258  * (tem_state_t), and tem_* functions mean that they operate on the
 259  * per-tem structure (tem_vt_state). All "safe" interfaces are in tem_safe.c.
 260  */
 261 int     tems_cls(struct vis_consclear *);
 262 void    tems_display(struct vis_consdisplay *);
 263 void    tems_copy(struct vis_conscopy *);
 264 void    tems_cursor(struct vis_conscursor *);
 265 
 266 int     tem_initialized(tem_vt_state_t);
 267 
 268 tem_vt_state_t tem_init(void);
 269 
 270 int     tem_info_init(struct console *);
 271 void    tem_write(tem_vt_state_t, uint8_t *, ssize_t);
 272 void    tem_get_size(uint16_t *, uint16_t *, uint16_t *, uint16_t *);
 273 void    tem_save_state(void);
 274 void    tem_register_modechg_cb(tem_modechg_cb_t, tem_modechg_cb_arg_t);
 275 void    tem_activate(tem_vt_state_t, boolean_t);
 276 void    tem_get_colors(tem_vt_state_t, text_color_t *, text_color_t *);
 277 
 278 #ifdef __cplusplus
 279 }
 280 #endif
 281 
 282 #endif /* _SYS_TEM_H */