Reformatted.
[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 INCLUDED_console_tty_h_
33 #define INCLUDED_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   Lisp_Object instream, outstream;
45   Lisp_Object terminal_type;
46   Lisp_Object controlling_process;
47   char *term_entry_buffer;
48
49   /* Physical location of cursor on this console. */
50   int cursor_x;
51   int cursor_y;
52
53   /* The real location of the cursor.  The above physical location may
54      be ahead of where we really are. */
55   int real_cursor_x;
56   int real_cursor_y;
57
58   int final_cursor_x;
59   int final_cursor_y;
60
61   int height;
62   int width;
63
64   /* The count of frame number. */
65   int frame_count;
66
67   /* flags indicating presence, absence or value of various features */
68   struct
69   {
70     unsigned int must_write_spaces :1; /* terminal inserts nulls, not
71                                           spaces to fill whitespace on
72                                           screen */
73     unsigned int insert_mode_motion :1; /* cursor movement commands
74                                            work while in insert mode */
75     unsigned int standout_motion :1;    /* cursor movement is graceful
76                                            in standout or underline mode */
77     unsigned int memory_above_frame :1; /* display retained above screen */
78     unsigned int memory_below_frame :1; /* display retained below screen */
79     unsigned int meta_key :2;           /* 0 == mask off top bit;
80                                            1 == top bit is meta;
81                                            2 == top bit is useful as
82                                            character info */
83     unsigned int flow_control :1;       /* Nonzero means use ^S/^Q as
84                                            cretinous flow control.  */
85     unsigned int auto_margins :1;       /* Nonzero means terminal wraps when
86                                            writing to the last column */
87     int standout_width;                 /* # of spaces printed when
88                                            change to standout mode */
89     int underline_width;                /* # of spaces printed when
90                                            change to underline mode */
91   } flags;
92
93   /* cursor motion entries - each entry is commented with the terminfo
94      and the termcap entry */
95   struct
96   {
97     /* local cursor movement */
98     const char *up;                     /* cuu1, up */
99     const char *down;                   /* cud1, do */
100     const char *left;                   /* cub1, le */
101     const char *right;                  /* cuf1, nd */
102     const char *home;                   /* home, ho */
103     const char *low_left;               /* ll, ll */
104     const char *car_return;             /* cr, cr */
105
106     /* parameterized local cursor movement */
107     const char *multi_up;               /* cuu, UP */
108     const char *multi_down;             /* cud, DO */
109     const char *multi_left;             /* cub, LE */
110     const char *multi_right;            /* cuf, RI */
111
112     /* absolute cursor motion */
113     const char *abs;                    /* cup, cm */
114     const char *hor_abs;                /* hpa, ch */
115     const char *ver_abs;                /* vpa, cv */
116
117     /* scrolling */
118     const char *scroll_forw;            /* ind, sf */
119     const char *scroll_back;            /* ri, sr */
120     const char *multi_scroll_forw;      /* indn, SF */
121     const char *multi_scroll_back;      /* rin, SR */
122     const char *set_scroll_region;      /* csr, cs */
123   } cm;
124
125   /* screen editing entries - each entry is commented with the
126      terminfo and the termcap entry */
127   struct
128   {
129     /* adding to the screen */
130     const char *ins_line;               /* il1, al */
131     const char *multi_ins_line;         /* il, AL */
132     const char *repeat;                 /* rep, rp */
133     const char *begin_ins_mode;         /* smir, im */
134     const char *end_ins_mode;           /* rmir, ei */
135     const char *ins_char;               /* ich1, ic */
136     const char *multi_ins_char;         /* ich, IC */
137     const char *insert_pad;             /* ip, ip */
138
139     /* deleting from the screen */
140     const char *clr_frame;              /* clear, cl */
141     const char *clr_from_cursor;        /* ed, cd */
142     const char *clr_to_eol;             /* el, ce */
143     const char *del_line;               /* dl1, dl */
144     const char *multi_del_line;         /* dl, DL */
145     const char *del_char;               /* dch1, dc */
146     const char *multi_del_char;         /* dch, DC */
147     const char *begin_del_mode;         /* smdc, dm */
148     const char *end_del_mode;           /* rmdc, ed */
149     const char *erase_at_cursor;        /* ech, ec */
150   } se;
151
152   /* screen display entries - each entry is commented with the
153      terminfo and termcap entry */
154   struct
155   {
156     const char *begin_standout;         /* smso, so */
157     const char *end_standout;           /* rmso, se */
158     const char *begin_underline;        /* smul, us */
159     const char *end_underline;          /* rmul, ue */
160     const char *begin_alternate;        /* smacs, as */
161     const char *end_alternate;          /* rmacs, ae */
162
163     const char *turn_on_reverse;        /* rev, mr */
164     const char *turn_on_blinking;       /* blink, mb */
165     const char *turn_on_bold;           /* bold, md */
166     const char *turn_on_dim;            /* dim, mh */
167     const char *turn_off_attributes;    /* sgr0, me */
168
169     const char *visual_bell;            /* flash, vb */
170     const char *audio_bell;             /* bel, bl */
171
172     const char *cursor_visible;         /* cvvis, vs */
173     const char *cursor_normal;          /* cnorm, ve */
174     const char *init_motion;            /* smcup, ti */
175     const char *end_motion;             /* rmcup, te */
176     const char *keypad_on;              /* smkx, ks */
177     const char *keypad_off;             /* rmkx, ke */
178
179     const char *orig_pair;              /* op, op */
180
181     const char *disable_auto_margins;   /* rmam, RA */
182     const char *enable_auto_margins;    /* smam, SA */
183   } sd;
184
185   /* costs of various operations */
186   struct
187   {
188     int cm_up;
189     int cm_down;
190     int cm_left;
191     int cm_right;
192     int cm_home;
193     int cm_low_left;
194     int cm_car_return;
195     int cm_abs;
196     int cm_hor_abs;
197     int cm_ver_abs;
198   } cost;
199
200   /* The initial tty mode bits */
201   struct emacs_tty old_tty;
202
203   /* Is this TTY our controlling terminal? */
204   unsigned int controlling_terminal :1;
205   unsigned int is_stdio :1;
206 };
207
208 #define CONSOLE_TTY_DATA(c) CONSOLE_TYPE_DATA (c, tty)
209 #define CONSOLE_TTY_CURSOR_X(c) (CONSOLE_TTY_DATA (c)->cursor_x)
210 #define CONSOLE_TTY_CURSOR_Y(c) (CONSOLE_TTY_DATA (c)->cursor_y)
211 #define CONSOLE_TTY_REAL_CURSOR_X(c) (CONSOLE_TTY_DATA (c)->real_cursor_x)
212 #define CONSOLE_TTY_REAL_CURSOR_Y(c) (CONSOLE_TTY_DATA (c)->real_cursor_y)
213 #define CONSOLE_TTY_FINAL_CURSOR_X(c) (CONSOLE_TTY_DATA (c)->final_cursor_x)
214 #define CONSOLE_TTY_FINAL_CURSOR_Y(c) (CONSOLE_TTY_DATA (c)->final_cursor_y)
215
216 #define TTY_CM(c) (CONSOLE_TTY_DATA (c)->cm)
217 #define TTY_SE(c) (CONSOLE_TTY_DATA (c)->se)
218 #define TTY_SD(c) (CONSOLE_TTY_DATA (c)->sd)
219 #define TTY_FLAGS(c) (CONSOLE_TTY_DATA (c)->flags)
220 #define TTY_COST(c) (CONSOLE_TTY_DATA (c)->cost)
221
222 #define TTY_INC_CURSOR_X(c, n) do {                                     \
223   int TICX_n = (n);                                                     \
224   assert (CONSOLE_TTY_CURSOR_X (c) == CONSOLE_TTY_REAL_CURSOR_X (c));   \
225   CONSOLE_TTY_CURSOR_X (c) += TICX_n;                                   \
226   CONSOLE_TTY_REAL_CURSOR_X (c) += TICX_n;                              \
227 } while (0)
228
229 #define TTY_INC_CURSOR_Y(c, n) do {             \
230   int TICY_n = (n);                             \
231   CONSOLE_TTY_CURSOR_Y (c) += TICY_n;           \
232   CONSOLE_TTY_REAL_CURSOR_Y (c) += TICY_n;      \
233 } while (0)
234
235 struct tty_device
236 {
237 #ifdef HAVE_TERMIOS
238   speed_t ospeed;               /* Output speed (from sg_ospeed) */
239 #else
240   short ospeed;                 /* Output speed (from sg_ospeed) */
241 #endif
242 };
243
244 #define DEVICE_TTY_DATA(d) DEVICE_TYPE_DATA (d, tty)
245
246 /* termcap requires this to be global */
247 #ifndef HAVE_TERMIOS
248 extern short ospeed;            /* Output speed (from sg_ospeed) */
249 #endif
250
251 extern FILE *termscript;
252
253 EXFUN (Fconsole_tty_controlling_process, 1);
254
255 /******************     Prototypes from cm.c     *******************/
256
257 /* #### Verify that all of these are still needed. */
258
259 void cm_cost_init (struct console *c);
260 void cmputc (int c);
261 void cmgoto (struct frame *f, int row, int col);
262 extern struct console *cmputc_console;
263 void send_string_to_tty_console (struct console *c, unsigned char *str,
264                                  int len);
265
266
267 /***************     Prototypes from redisplay-tty.c     ****************/
268
269 enum term_init_status
270 {
271   TTY_UNABLE_OPEN_DATABASE,
272   TTY_TYPE_UNDEFINED,
273   TTY_TYPE_INSUFFICIENT,
274   TTY_SIZE_UNSPECIFIED,
275   TTY_INIT_SUCCESS
276 };
277
278 int init_tty_for_redisplay (struct device *d, char *terminal_type);
279 /* #### These should probably be methods. */
280 void set_tty_modes (struct console *c);
281 void reset_tty_modes (struct console *c);
282
283 /* Used in sysdep.c to properly clear and position the cursor when exiting. */
284 void tty_redisplay_shutdown (struct console *c);
285
286 /* called from console-stream.c */
287 Lisp_Object tty_semi_canonicalize_console_connection (Lisp_Object connection,
288                                                       Error_behavior errb);
289 Lisp_Object tty_canonicalize_console_connection (Lisp_Object connection,
290                                                  Error_behavior errb);
291 Lisp_Object tty_semi_canonicalize_device_connection (Lisp_Object connection,
292                                                      Error_behavior errb);
293 Lisp_Object tty_canonicalize_device_connection (Lisp_Object connection,
294                                                 Error_behavior errb);
295 struct console * tty_find_console_from_fd (int fd);
296
297 #endif /* INCLUDED_console_tty_h_ */