Mercurial > hg > xemacs-beta
annotate src/device-tty.c @ 5264:0d43872986b6
Change (apply 'nconc (mapcar ...)) to (mapcan ...); warn about first form.
lisp/ChangeLog addition:
2010-09-16 Aidan Kehoe <kehoea@parhasard.net>
* byte-optimize.el (byte-optimize-apply): Transform (apply 'nconc
(mapcar ...)) to (mapcan ...); warn about use of the first idiom.
* update-elc.el (do-autoload-commands):
* packages.el (packages-find-package-library-path):
* frame.el (frame-list):
* extents.el (extent-descendants):
* etags.el (buffer-tag-table-files):
* dumped-lisp.el (preloaded-file-list):
* device.el (device-list):
* bytecomp-runtime.el (proclaim-inline, proclaim-notinline)
Use #'mapcan, not (apply #'nconc (mapcar ...) in all these files.
* bytecomp-runtime.el (eval-when-compile, eval-and-compile):
In passing, mention that these macros also evaluate the body when
interpreted.
| author | Aidan Kehoe <kehoea@parhasard.net> |
|---|---|
| date | Thu, 16 Sep 2010 13:51:49 +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 } |
