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