Contents in 1999-06-04-13 of release-21-2.
[chise/xemacs-chise.git.1] / src / console-tty.h
1 /* Define TTY specific console, device, and frame object for XEmacs.
2    Copyright (C) 1995 Board of Trustees, University of Illinois.
3    Copyright (C) 1996 Ben Wing.
4
5 This file is part of XEmacs.
6
7 XEmacs is free software; you can redistribute it and/or modify it
8 under the terms of the GNU General Public License as published by the
9 Free Software Foundation; either version 2, or (at your option) any
10 later version.
11
12 XEmacs is distributed in the hope that it will be useful, but WITHOUT
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15 for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with XEmacs; see the file COPYING.  If not, write to
19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA.  */
21
22 /* Synched up with: Not in FSF. */
23
24 /* Written by Chuck Thompson and Ben Wing. */
25
26 /* NOTE: Currently each TTY console can have only one device.
27    Therefore, all stuff for both input and output is lumped into
28    the console structure.  If it ever becomes meaningful to
29    have more than one device on a TTY console, the output stuff
30    will have to get separated out. */
31
32 #ifndef _XEMACS_CONSOLE_TTY_H_
33 #define _XEMACS_CONSOLE_TTY_H_
34
35 #include "console.h"
36 #include "syssignal.h" /* Always include before systty.h */
37 #include "systty.h"
38
39 DECLARE_CONSOLE_TYPE (tty);
40
41 struct tty_console
42 {
43   int infd, outfd;
44 #ifdef HAVE_GPM
45   int mouse_fd;
46 #endif
47   Lisp_Object instream, outstream;
48   Lisp_Object terminal_type;
49   Lisp_Object controlling_process;
50   char *term_entry_buffer;
51
52   /* Physical location of cursor on this console. */
53   int cursor_x;
54   int cursor_y;
55
56   /* The real location of the cursor.  The above physical location may
57      be ahead of where we really are. */
58   int real_cursor_x;
59   int real_cursor_y;
60
61   int final_cursor_x;
62   int final_cursor_y;
63
64   int height;
65   int width;
66
67   /* The count of frame number. */
68   int frame_count;
69
70   /* flags indicating presence, absence or value of various features */
71   struct
72   {
73     unsigned int must_write_spaces :1; /* terminal inserts nulls, not
74                                           spaces to fill whitespace on
75                                           screen */
76     unsigned int insert_mode_motion :1; /* cursor movement commands
77                                            work while in insert mode */
78     unsigned int standout_motion :1;    /* cursor movement is graceful
79                                            in standout or underline mode */
80     unsigned int memory_above_frame :1; /* display retained above screen */
81     unsigned int memory_below_frame :1; /* display retained below screen */
82     unsigned int meta_key :2;           /* 0 == mask off top bit;
83                                            1 == top bit is meta;
84                                            2 == top bit is useful as
85                                            character info */
86     unsigned int flow_control :1;       /* Nonzero means use ^S/^Q as
87                                            cretinous flow control.  */
88     int standout_width;                 /* # of spaces printed when
89                                            change to standout mode */
90     int underline_width;                /* # of spaces printed when
91                                            change to underline mode */
92   } flags;
93
94   /* cursor motion entries - each entry is commented with the terminfo
95      and the termcap entry */
96   struct
97   {
98     /* local cursor movement */
99     CONST char *up;                     /* cuu1, up */
100     CONST char *down;                   /* cud1, do */
101     CONST char *left;                   /* cub1, le */
102     CONST char *right;                  /* cuf1, nd */
103     CONST char *home;                   /* home, ho */
104     CONST char *low_left;               /* ll, ll */
105     CONST char *car_return;             /* cr, cr */
106
107     /* parameterized local cursor movement */
108     CONST char *multi_up;               /* cuu, UP */
109     CONST char *multi_down;             /* cud, DO */
110     CONST char *multi_left;             /* cub, LE */
111     CONST char *multi_right;            /* cuf, RI */
112
113     /* absolute cursor motion */
114     CONST char *abs;                    /* cup, cm */
115     CONST char *hor_abs;                /* hpa, ch */
116     CONST char *ver_abs;                /* vpa, cv */
117
118     /* scrolling */
119     CONST char *scroll_forw;            /* ind, sf */
120     CONST char *scroll_back;            /* ri, sr */
121     CONST char *multi_scroll_forw;      /* indn, SF */
122     CONST char *multi_scroll_back;      /* rin, SR */
123     CONST char *set_scroll_region;      /* csr, cs */
124   } cm;
125
126   /* screen editing entries - each entry is commented with the
127      terminfo and the termcap entry */
128   struct
129   {
130     /* adding to the screen */
131     CONST char *ins_line;               /* il1, al */
132     CONST char *multi_ins_line;         /* il, AL */
133     CONST char *repeat;                 /* rep, rp */
134     CONST char *begin_ins_mode;         /* smir, im */
135     CONST char *end_ins_mode;           /* rmir, ei */
136     CONST char *ins_char;               /* ich1, ic */
137     CONST char *multi_ins_char;         /* ich, IC */
138     CONST char *insert_pad;             /* ip, ip */
139
140     /* deleting from the screen */
141     CONST char *clr_frame;              /* clear, cl */
142     CONST char *clr_from_cursor;        /* ed, cd */
143     CONST char *clr_to_eol;             /* el, ce */
144     CONST char *del_line;               /* dl1, dl */
145     CONST char *multi_del_line;         /* dl, DL */
146     CONST char *del_char;               /* dch1, dc */
147     CONST char *multi_del_char;         /* dch, DC */
148     CONST char *begin_del_mode;         /* smdc, dm */
149     CONST char *end_del_mode;           /* rmdc, ed */
150     CONST char *erase_at_cursor;        /* ech, ec */
151   } se;
152
153   /* screen display entries - each entry is commented with the
154      terminfo and termcap entry */
155   struct
156   {
157     CONST char *begin_standout;         /* smso, so */
158     CONST char *end_standout;           /* rmso, se */
159     CONST char *begin_underline;        /* smul, us */
160     CONST char *end_underline;          /* rmul, ue */
161     CONST char *begin_alternate;        /* smacs, as */
162     CONST char *end_alternate;          /* rmacs, ae */
163
164     CONST char *turn_on_reverse;        /* rev, mr */
165     CONST char *turn_on_blinking;       /* blink, mb */
166     CONST char *turn_on_bold;           /* bold, md */
167     CONST char *turn_on_dim;            /* dim, mh */
168     CONST char *turn_off_attributes;    /* sgr0, me */
169
170     CONST char *visual_bell;            /* flash, vb */
171     CONST char *audio_bell;             /* bel, bl */
172
173     CONST char *cursor_visible;         /* cvvis, vs */
174     CONST char *cursor_normal;          /* cnorm, ve */
175     CONST char *init_motion;            /* smcup, ti */
176     CONST char *end_motion;             /* rmcup, te */
177     CONST char *keypad_on;              /* smkx, ks */
178     CONST char *keypad_off;             /* rmkx, ke */
179
180     CONST char *orig_pair;              /* op, op */
181   } sd;
182
183   /* costs of various operations */
184   struct
185   {
186     int cm_up;
187     int cm_down;
188     int cm_left;
189     int cm_right;
190     int cm_home;
191     int cm_low_left;
192     int cm_car_return;
193     int cm_abs;
194     int cm_hor_abs;
195     int cm_ver_abs;
196   } cost;
197
198   /* The initial tty mode bits */
199   struct emacs_tty old_tty;
200
201   /* Is this TTY our controlling terminal? */
202   unsigned int controlling_terminal :1;
203   unsigned int is_stdio :1;
204 };
205
206 #ifdef HAVE_GPM
207 #define CONSOLE_TTY_MOUSE_FD(c) (CONSOLE_TTY_DATA (c)->mouse_fd)
208 #endif
209 #define CONSOLE_TTY_DATA(c) CONSOLE_TYPE_DATA (c, tty)
210 #define CONSOLE_TTY_CURSOR_X(c) (CONSOLE_TTY_DATA (c)->cursor_x)
211 #define CONSOLE_TTY_CURSOR_Y(c) (CONSOLE_TTY_DATA (c)->cursor_y)
212 #define CONSOLE_TTY_REAL_CURSOR_X(c) (CONSOLE_TTY_DATA (c)->real_cursor_x)
213 #define CONSOLE_TTY_REAL_CURSOR_Y(c) (CONSOLE_TTY_DATA (c)->real_cursor_y)
214 #define CONSOLE_TTY_FINAL_CURSOR_X(c) (CONSOLE_TTY_DATA (c)->final_cursor_x)
215 #define CONSOLE_TTY_FINAL_CURSOR_Y(c) (CONSOLE_TTY_DATA (c)->final_cursor_y)
216
217 #define TTY_CM(c) (CONSOLE_TTY_DATA (c)->cm)
218 #define TTY_SE(c) (CONSOLE_TTY_DATA (c)->se)
219 #define TTY_SD(c) (CONSOLE_TTY_DATA (c)->sd)
220 #define TTY_FLAGS(c) (CONSOLE_TTY_DATA (c)->flags)
221 #define TTY_COST(c) (CONSOLE_TTY_DATA (c)->cost)
222
223 #define TTY_INC_CURSOR_X(c, n) do {                                     \
224   int TICX_n = (n);                                                     \
225   assert (CONSOLE_TTY_CURSOR_X (c) == CONSOLE_TTY_REAL_CURSOR_X (c));   \
226   CONSOLE_TTY_CURSOR_X (c) += TICX_n;                                   \
227   CONSOLE_TTY_REAL_CURSOR_X (c) += TICX_n;                              \
228 } while (0)
229
230 #define TTY_INC_CURSOR_Y(c, n) do {             \
231   int TICY_n = (n);                             \
232   CONSOLE_TTY_CURSOR_Y (c) += TICY_n;           \
233   CONSOLE_TTY_REAL_CURSOR_Y (c) += TICY_n;      \
234 } while (0)
235
236 struct tty_device
237 {
238 #ifdef HAVE_TERMIOS
239   speed_t ospeed;               /* Output speed (from sg_ospeed) */
240 #else
241   short ospeed;                 /* Output speed (from sg_ospeed) */
242 #endif
243 };
244
245 #define DEVICE_TTY_DATA(d) DEVICE_TYPE_DATA (d, tty)
246
247 /* termcap requires this to be global */
248 #ifndef HAVE_TERMIOS
249 extern short ospeed;            /* Output speed (from sg_ospeed) */
250 #endif
251
252 extern FILE *termscript;
253
254 EXFUN (Fconsole_tty_controlling_process, 1);
255
256 /******************     Prototypes from cm.c     *******************/
257
258 /* #### Verify that all of these are still needed. */
259
260 void cm_cost_init (struct console *c);
261 void cmputc (int c);
262 void cmgoto (struct frame *f, int row, int col);
263 extern struct console *cmputc_console;
264 void send_string_to_tty_console (struct console *c, unsigned char *str,
265                                  int len);
266
267
268 /***************     Prototypes from redisplay-tty.c     ****************/
269
270 enum term_init_status
271 {
272   TTY_UNABLE_OPEN_DATABASE,
273   TTY_TYPE_UNDEFINED,
274   TTY_TYPE_INSUFFICIENT,
275   TTY_SIZE_UNSPECIFIED,
276   TTY_INIT_SUCCESS
277 };
278
279 int init_tty_for_redisplay (struct device *d, char *terminal_type);
280 /* #### These should probably be methods. */
281 void set_tty_modes (struct console *c);
282 void reset_tty_modes (struct console *c);
283
284 /* Used in sysdep.c to properly clear and position the cursor when exiting. */
285 void tty_redisplay_shutdown (struct console *c);
286
287 /* called from console-stream.c */
288 Lisp_Object tty_semi_canonicalize_console_connection (Lisp_Object connection,
289                                                       Error_behavior errb);
290 Lisp_Object tty_canonicalize_console_connection (Lisp_Object connection,
291                                                  Error_behavior errb);
292 Lisp_Object tty_semi_canonicalize_device_connection (Lisp_Object connection,
293                                                      Error_behavior errb);
294 Lisp_Object tty_canonicalize_device_connection (Lisp_Object connection,
295                                                 Error_behavior errb);
296 struct console * tty_find_console_from_fd (int fd);
297
298 #endif /* _XEMACS_CONSOLE_TTY_H_ */