Mercurial > hg > xemacs-beta
annotate src/device-tty.c @ 5276:dd2976af8783
Add some missing #includes, termcap.c, hopefully fixing Adam Sjoegren's build.
2010-09-18 Aidan Kehoe <kehoea@parhasard.net>
* termcap.c:
Add a couple of missing includes here, which should fix builds
that use this file. (I have no access to such builds, but Mats'
buildbot shows output that indicates they fail at link time since
DEVICE_BAUD_RATE and IS_DIRECTORY_SEP are available.)
author | Aidan Kehoe <kehoea@parhasard.net> |
---|---|
date | Sat, 18 Sep 2010 15:03:54 +0100 |
parents | 6c6d78781d59 |
children | 5256fedd50e6 308d34e9f07d |
rev | line source |
---|---|
428 | 1 /* TTY device functions. |
2 Copyright (C) 1994, 1995 Board of Trustees, University of Illinois. | |
3 Copyright (C) 1994, 1995 Free Software Foundation, Inc. | |
5043 | 4 Copyright (C) 1996, 2010 Ben Wing. |
428 | 5 |
6 This file is part of XEmacs. | |
7 | |
8 XEmacs is free software; you can redistribute it and/or modify it | |
9 under the terms of the GNU General Public License as published by the | |
10 Free Software Foundation; either version 2, or (at your option) any | |
11 later version. | |
12 | |
13 XEmacs is distributed in the hope that it will be useful, but WITHOUT | |
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
16 for more details. | |
17 | |
18 You should have received a copy of the GNU General Public License | |
19 along with XEmacs; see the file COPYING. If not, write to | |
20 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, | |
21 Boston, MA 02111-1307, USA. */ | |
22 | |
23 /* Synched up with: Not in FSF. */ | |
24 | |
25 /* Authors: Ben Wing and Chuck Thompson. */ | |
26 | |
27 #include <config.h> | |
28 #include "lisp.h" | |
29 | |
872 | 30 #include "device-impl.h" |
428 | 31 #include "events.h" |
32 #include "faces.h" | |
33 #include "frame.h" | |
34 #include "lstream.h" | |
35 #include "redisplay.h" | |
36 #include "sysdep.h" | |
37 | |
872 | 38 #include "console-tty-impl.h" |
800 | 39 #include "console-stream.h" |
40 | |
558 | 41 #include "sysfile.h" |
428 | 42 #include "syssignal.h" /* for SIGWINCH */ |
43 | |
4477
e34711681f30
Don't determine whether to call general device-type code at startup,
Aidan Kehoe <kehoea@parhasard.net>
parents:
3092
diff
changeset
|
44 Lisp_Object Qmake_device_early_tty_entry_point; |
428 | 45 |
46 | |
3092 | 47 #ifdef NEW_GC |
48 static const struct memory_description tty_device_data_description_1 [] = { | |
49 { XD_END } | |
50 }; | |
51 | |
5118
e0db3c197671
merge up to latest default branch, doesn't compile yet
Ben Wing <ben@xemacs.org>
parents:
4477
diff
changeset
|
52 DEFINE_DUMPABLE_INTERNAL_LISP_OBJECT ("tty-device", tty_device, |
e0db3c197671
merge up to latest default branch, doesn't compile yet
Ben Wing <ben@xemacs.org>
parents:
4477
diff
changeset
|
53 0, tty_device_data_description_1, |
e0db3c197671
merge up to latest default branch, doesn't compile yet
Ben Wing <ben@xemacs.org>
parents:
4477
diff
changeset
|
54 Lisp_Tty_Device); |
3092 | 55 #endif /* NEW_GC */ |
56 | |
428 | 57 static void |
58 allocate_tty_device_struct (struct device *d) | |
59 { | |
3092 | 60 #ifdef NEW_GC |
5127
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
61 d->device_data = XTTY_DEVICE (ALLOC_NORMAL_LISP_OBJECT (tty_device)); |
3092 | 62 #else /* not NEW_GC */ |
428 | 63 d->device_data = xnew_and_zero (struct tty_device); |
3092 | 64 #endif /* not NEW_GC */ |
428 | 65 } |
66 | |
67 static void | |
2286 | 68 tty_init_device (struct device *d, Lisp_Object UNUSED (props)) |
428 | 69 { |
70 struct console *con = XCONSOLE (DEVICE_CONSOLE (d)); | |
71 Lisp_Object terminal_type = CONSOLE_TTY_DATA (con)->terminal_type; | |
72 | |
4477
e34711681f30
Don't determine whether to call general device-type code at startup,
Aidan Kehoe <kehoea@parhasard.net>
parents:
3092
diff
changeset
|
73 /* Run part of the elisp side of the TTY device initialization. |
e34711681f30
Don't determine whether to call general device-type code at startup,
Aidan Kehoe <kehoea@parhasard.net>
parents:
3092
diff
changeset
|
74 The post-init is run in the tty_finish_init_device() method. */ |
e34711681f30
Don't determine whether to call general device-type code at startup,
Aidan Kehoe <kehoea@parhasard.net>
parents:
3092
diff
changeset
|
75 call0 (Qmake_device_early_tty_entry_point); |
e34711681f30
Don't determine whether to call general device-type code at startup,
Aidan Kehoe <kehoea@parhasard.net>
parents:
3092
diff
changeset
|
76 |
428 | 77 DEVICE_INFD (d) = CONSOLE_TTY_DATA (con)->infd; |
78 DEVICE_OUTFD (d) = CONSOLE_TTY_DATA (con)->outfd; | |
79 | |
80 allocate_tty_device_struct (d); | |
81 init_baud_rate (d); | |
82 | |
83 switch (init_tty_for_redisplay (d, (char *) XSTRING_DATA (terminal_type))) | |
84 { | |
85 #if 0 | |
86 case TTY_UNABLE_OPEN_DATABASE: | |
87 suppress_early_error_handler_backtrace = 1; | |
563 | 88 signal_error (Qio_error, "Can't access terminal information database", Qunbound); |
428 | 89 break; |
90 #endif | |
91 case TTY_TYPE_UNDEFINED: | |
92 suppress_early_error_handler_backtrace = 1; | |
563 | 93 signal_error (Qio_error, "Terminal type undefined (or can't access database?)", |
94 terminal_type); | |
428 | 95 break; |
96 case TTY_TYPE_INSUFFICIENT: | |
97 suppress_early_error_handler_backtrace = 1; | |
563 | 98 signal_error (Qio_error, "Terminal type not powerful enough to run Emacs", |
99 terminal_type); | |
428 | 100 break; |
101 case TTY_SIZE_UNSPECIFIED: | |
102 suppress_early_error_handler_backtrace = 1; | |
563 | 103 signal_error (Qio_error, "Can't determine window size of terminal", Qunbound); |
428 | 104 break; |
105 case TTY_INIT_SUCCESS: | |
106 break; | |
107 default: | |
2500 | 108 ABORT (); |
428 | 109 } |
110 | |
111 init_one_device (d); | |
112 } | |
113 | |
3092 | 114 #ifndef NEW_GC |
428 | 115 static void |
116 free_tty_device_struct (struct device *d) | |
117 { | |
1726 | 118 if (d->device_data) |
5169
6c6d78781d59
cleanup of code related to xfree(), better KKCC backtrace capabilities, document XD_INLINE_LISP_OBJECT_BLOCK_PTR, fix some memory leaks, other code cleanup
Ben Wing <ben@xemacs.org>
parents:
5127
diff
changeset
|
119 { |
6c6d78781d59
cleanup of code related to xfree(), better KKCC backtrace capabilities, document XD_INLINE_LISP_OBJECT_BLOCK_PTR, fix some memory leaks, other code cleanup
Ben Wing <ben@xemacs.org>
parents:
5127
diff
changeset
|
120 xfree (d->device_data); |
6c6d78781d59
cleanup of code related to xfree(), better KKCC backtrace capabilities, document XD_INLINE_LISP_OBJECT_BLOCK_PTR, fix some memory leaks, other code cleanup
Ben Wing <ben@xemacs.org>
parents:
5127
diff
changeset
|
121 d->device_data = 0; |
6c6d78781d59
cleanup of code related to xfree(), better KKCC backtrace capabilities, document XD_INLINE_LISP_OBJECT_BLOCK_PTR, fix some memory leaks, other code cleanup
Ben Wing <ben@xemacs.org>
parents:
5127
diff
changeset
|
122 } |
428 | 123 } |
124 | |
125 static void | |
126 tty_delete_device (struct device *d) | |
127 { | |
128 free_tty_device_struct (d); | |
129 } | |
3092 | 130 #endif /* not NEW_GC */ |
428 | 131 |
132 #ifdef SIGWINCH | |
133 | |
134 static SIGTYPE | |
2286 | 135 tty_device_size_change_signal (int UNUSED (signo)) |
428 | 136 { |
137 int old_errno = errno; | |
138 asynch_device_change_pending++; | |
139 #ifdef HAVE_UNIXOID_EVENT_LOOP | |
140 signal_fake_event (); | |
141 #endif | |
142 EMACS_REESTABLISH_SIGNAL (SIGWINCH, tty_device_size_change_signal); | |
143 errno = old_errno; | |
144 SIGRETURN; | |
145 } | |
146 | |
147 /* frame_change_signal does nothing but set a flag that it was called. | |
148 When redisplay is called, it will notice that the flag is set and | |
149 call handle_pending_device_size_change to do the actual work. */ | |
150 static void | |
151 tty_asynch_device_change (void) | |
152 { | |
153 Lisp_Object devcons, concons; | |
154 | |
155 DEVICE_LOOP_NO_BREAK (devcons, concons) | |
156 { | |
157 int width, height; | |
158 Lisp_Object tail; | |
159 struct device *d = XDEVICE (XCAR (devcons)); | |
160 struct console *con = XCONSOLE (DEVICE_CONSOLE (d)); | |
161 | |
162 if (!DEVICE_TTY_P (d)) | |
163 continue; | |
164 | |
165 get_tty_device_size (d, &width, &height); | |
166 if (width > 0 && height > 0 | |
167 && (CONSOLE_TTY_DATA (con)->width != width | |
168 || CONSOLE_TTY_DATA (con)->height != height)) | |
169 { | |
170 CONSOLE_TTY_DATA (con)->width = width; | |
171 CONSOLE_TTY_DATA (con)->height = height; | |
172 | |
173 for (tail = DEVICE_FRAME_LIST (d); | |
174 !NILP (tail); | |
175 tail = XCDR (tail)) | |
176 { | |
177 struct frame *f = XFRAME (XCAR (tail)); | |
178 | |
179 /* We know the frame is tty because we made sure that the | |
180 device is tty. */ | |
5043 | 181 change_frame_size (f, width, height, 1); |
428 | 182 } |
183 } | |
184 } | |
185 } | |
186 | |
187 #endif /* SIGWINCH */ | |
188 | |
189 static Lisp_Object | |
190 tty_device_system_metrics (struct device *d, | |
191 enum device_metrics m) | |
192 { | |
193 struct console *con = XCONSOLE (DEVICE_CONSOLE (d)); | |
194 switch (m) | |
195 { | |
196 case DM_size_device: | |
197 return Fcons (make_int (CONSOLE_TTY_DATA (con)->width), | |
198 make_int (CONSOLE_TTY_DATA (con)->height)); | |
199 default: /* No such device metric property for TTY devices */ | |
200 return Qunbound; | |
201 } | |
202 } | |
203 | |
204 /************************************************************************/ | |
205 /* initialization */ | |
206 /************************************************************************/ | |
207 | |
208 void | |
209 syms_of_device_tty (void) | |
210 { | |
3092 | 211 #ifdef NEW_GC |
5118
e0db3c197671
merge up to latest default branch, doesn't compile yet
Ben Wing <ben@xemacs.org>
parents:
4477
diff
changeset
|
212 INIT_LISP_OBJECT (tty_device); |
3092 | 213 #endif /* NEW_GC */ |
214 | |
4477
e34711681f30
Don't determine whether to call general device-type code at startup,
Aidan Kehoe <kehoea@parhasard.net>
parents:
3092
diff
changeset
|
215 DEFSYMBOL (Qmake_device_early_tty_entry_point); |
428 | 216 } |
217 | |
218 void | |
219 console_type_create_device_tty (void) | |
220 { | |
221 /* device methods */ | |
222 CONSOLE_HAS_METHOD (tty, init_device); | |
3092 | 223 #ifndef NEW_GC |
428 | 224 CONSOLE_HAS_METHOD (tty, delete_device); |
3092 | 225 #endif /* not NEW_GC */ |
428 | 226 #ifdef SIGWINCH |
227 CONSOLE_HAS_METHOD (tty, asynch_device_change); | |
228 #endif /* SIGWINCH */ | |
229 CONSOLE_HAS_METHOD (tty, device_system_metrics); | |
230 } | |
231 | |
232 void | |
233 init_device_tty (void) | |
234 { | |
235 #ifdef SIGWINCH | |
236 if (initialized && !noninteractive) | |
613 | 237 EMACS_SIGNAL (SIGWINCH, tty_device_size_change_signal); |
428 | 238 #endif /* SIGWINCH */ |
239 } |