teken.h revision 187367
1249259Sdim/*-
2249259Sdim * Copyright (c) 2008-2009 Ed Schouten <ed@FreeBSD.org>
3249259Sdim * All rights reserved.
4249259Sdim *
5249259Sdim * Redistribution and use in source and binary forms, with or without
6249259Sdim * modification, are permitted provided that the following conditions
7249259Sdim * are met:
8249259Sdim * 1. Redistributions of source code must retain the above copyright
9249259Sdim *    notice, this list of conditions and the following disclaimer.
10249259Sdim * 2. Redistributions in binary form must reproduce the above copyright
11249259Sdim *    notice, this list of conditions and the following disclaimer in the
12249259Sdim *    documentation and/or other materials provided with the distribution.
13249259Sdim *
14249259Sdim * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15249259Sdim * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16249259Sdim * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17249259Sdim * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18249259Sdim * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19249259Sdim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20249259Sdim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21249259Sdim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22249259Sdim * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23249259Sdim * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24249259Sdim * SUCH DAMAGE.
25249259Sdim *
26249259Sdim * $FreeBSD: head/sys/dev/syscons/teken/teken.h 187367 2009-01-17 16:37:13Z ed $
27249259Sdim */
28249259Sdim
29249259Sdim#ifndef _TEKEN_H_
30249259Sdim#define	_TEKEN_H_
31249259Sdim
32249259Sdim/*
33249259Sdim * libteken: terminal emulation library.
34249259Sdim *
35249259Sdim * This library converts an UTF-8 stream of bytes to terminal drawing
36249259Sdim * commands.
37249259Sdim *
38249259Sdim * Configuration switches:
39249259Sdim * - TEKEN_UTF8: Enable/disable UTF-8 handling.
40249259Sdim * - TEKEN_XTERM: Enable xterm-style emulation, instead of cons25.
41249259Sdim */
42249259Sdim
43249259Sdim#if defined(__FreeBSD__) && defined(_KERNEL)
44249259Sdim#include "opt_teken.h"
45249259Sdim#endif /* __FreeBSD__ && _KERNEL */
46249259Sdim
47249259Sdim#ifdef TEKEN_UTF8
48249259Sdimtypedef uint32_t teken_char_t;
49249259Sdim#else /* !TEKEN_UTF8 */
50249259Sdimtypedef unsigned char teken_char_t;
51249259Sdim#endif /* TEKEN_UTF8 */
52249259Sdimtypedef unsigned short teken_unit_t;
53249259Sdimtypedef unsigned char teken_format_t;
54249259Sdim#define	TF_BOLD		0x01
55249259Sdim#define	TF_UNDERLINE	0x02
56249259Sdim#define	TF_BLINK	0x04
57249259Sdimtypedef unsigned char teken_color_t;
58249259Sdim#define	TC_BLACK	0
59249259Sdim#define	TC_RED		1
60249259Sdim#define	TC_GREEN	2
61249259Sdim#define	TC_BROWN	3
62249259Sdim#define	TC_BLUE		4
63249259Sdim#define	TC_MAGENTA	5
64249259Sdim#define	TC_CYAN		6
65249259Sdim#define	TC_WHITE	7
66249259Sdim#define	TC_NCOLORS	8
67249259Sdim
68249259Sdimtypedef struct {
69249259Sdim	teken_unit_t	tp_row;
70249259Sdim	teken_unit_t	tp_col;
71251662Sdim} teken_pos_t;
72251662Sdimtypedef struct {
73251662Sdim	teken_pos_t	tr_begin;
74251662Sdim	teken_pos_t	tr_end;
75251662Sdim} teken_rect_t;
76251662Sdimtypedef struct {
77251662Sdim	teken_format_t	ta_format;
78251662Sdim	teken_color_t	ta_fgcolor;
79251662Sdim	teken_color_t	ta_bgcolor;
80251662Sdim} teken_attr_t;
81251662Sdimtypedef struct {
82251662Sdim	teken_unit_t	ts_begin;
83249259Sdim	teken_unit_t	ts_end;
84249259Sdim} teken_span_t;
85249259Sdim
86249259Sdimtypedef struct __teken teken_t;
87249259Sdim
88249259Sdimtypedef void teken_state_t(teken_t *, teken_char_t);
89249259Sdim
90249259Sdim/*
91249259Sdim * Drawing routines supplied by the user.
92249259Sdim */
93249259Sdim
94249259Sdimtypedef void tf_bell_t(void *);
95249259Sdimtypedef void tf_cursor_t(void *, const teken_pos_t *);
96249259Sdimtypedef void tf_putchar_t(void *, const teken_pos_t *, teken_char_t,
97249259Sdim    const teken_attr_t *);
98249259Sdimtypedef void tf_fill_t(void *, const teken_rect_t *, teken_char_t,
99249259Sdim    const teken_attr_t *);
100249259Sdimtypedef void tf_copy_t(void *, const teken_rect_t *, const teken_pos_t *);
101249259Sdimtypedef void tf_param_t(void *, int, int);
102249259Sdim#define	TP_SHOWCURSOR	0
103249259Sdim#define	TP_CURSORKEYS	1
104249259Sdim#define	TP_KEYPADAPP	2
105249259Sdim#define	TP_AUTOREPEAT	3
106249259Sdim#define	TP_SWITCHVT	4
107249259Sdim#define	TP_132COLS	5
108249259Sdimtypedef void tf_respond_t(void *, const void *, size_t);
109249259Sdim
110249259Sdimtypedef struct {
111249259Sdim	tf_bell_t	*tf_bell;
112263508Sdim	tf_cursor_t	*tf_cursor;
113263508Sdim	tf_putchar_t	*tf_putchar;
114263508Sdim	tf_fill_t	*tf_fill;
115263508Sdim	tf_copy_t	*tf_copy;
116263508Sdim	tf_param_t	*tf_param;
117249259Sdim	tf_respond_t	*tf_respond;
118249259Sdim} teken_funcs_t;
119249259Sdim
120249259Sdim/*
121249259Sdim * Terminal state.
122249259Sdim */
123249259Sdim
124263508Sdimstruct __teken {
125249259Sdim	const teken_funcs_t *t_funcs;
126249259Sdim	void		*t_softc;
127249259Sdim
128249259Sdim	teken_state_t	*t_nextstate;
129249259Sdim	unsigned int	 t_stateflags;
130249259Sdim
131249259Sdim#define T_NUMSIZE	8
132249259Sdim	unsigned int	 t_nums[T_NUMSIZE];
133249259Sdim	unsigned int	 t_curnum;
134249259Sdim
135249259Sdim	teken_pos_t	 t_cursor;
136249259Sdim	teken_attr_t	 t_curattr;
137249259Sdim	teken_pos_t	 t_saved_cursor;
138249259Sdim	teken_attr_t	 t_saved_curattr;
139249259Sdim
140249259Sdim	teken_attr_t	 t_defattr;
141249259Sdim	teken_pos_t	 t_winsize;
142249259Sdim
143249259Sdim	/* For DECSTBM. */
144249259Sdim	teken_span_t	 t_scrollreg;
145249259Sdim	/* For DECOM. */
146249259Sdim	teken_span_t	 t_originreg;
147249259Sdim
148249259Sdim#define	T_NUMCOL	160
149249259Sdim	unsigned int	t_tabstops[T_NUMCOL / (sizeof(unsigned int) * 8)];
150249259Sdim
151249259Sdim#ifdef TEKEN_UTF8
152249259Sdim	unsigned int	t_utf8_left;
153249259Sdim	teken_char_t	t_utf8_partial;
154249259Sdim#endif /* TEKEN_UTF8 */
155249259Sdim};
156249259Sdim
157249259Sdim/* Initialize teken structure. */
158void	teken_init(teken_t *, const teken_funcs_t *, void *);
159
160/* Deliver character input. */
161void	teken_input(teken_t *, const void *, size_t);
162
163/* Set teken attributes. */
164void	teken_set_cursor(teken_t *, const teken_pos_t *);
165void	teken_set_defattr(teken_t *, const teken_attr_t *);
166void	teken_set_winsize(teken_t *, const teken_pos_t *);
167
168#endif /* !_TEKEN_H_ */
169