Mercurial > hg > xemacs-beta
annotate src/device-tty.c @ 5124:623d57b7fbe8 ben-lisp-object
separate regular and disksave finalization, print method fixes.
Create separate disksave method and make the finalize method only be for
actual object finalization, not disksave finalization.
Fix places where 0 was given in place of a printer -- print methods are
mandatory, and internal objects formerly without a print method now must
explicitly specify internal_object_printer().
Change the defn of CONSOLE_LIVE_P to avoid problems in some weird situations.
-------------------- ChangeLog entries follow: --------------------
src/ChangeLog addition:
2010-01-20 Ben Wing <ben@xemacs.org>
* alloc.c:
* alloc.c (very_old_free_lcrecord):
* alloc.c (disksave_object_finalization_1):
* alloc.c (make_lcrecord_list):
* alloc.c (alloc_managed_lcrecord):
* alloc.c (free_managed_lcrecord):
* alloc.c (sweep_lcrecords_1):
* buffer.c:
* bytecode.c:
* bytecode.c (Fcompiled_function_p):
* chartab.c:
* console-impl.h:
* console-impl.h (CONSOLE_TYPE_P):
* console.c:
* console.c (set_quit_events):
* data.c:
* data.c (Fmake_ephemeron):
* database.c:
* database.c (finalize_database):
* database.c (Fclose_database):
* device-msw.c:
* device-msw.c (finalize_devmode):
* device-msw.c (allocate_devmode):
* device.c:
* elhash.c:
* elhash.c (finalize_hash_table):
* eval.c:
* eval.c (bind_multiple_value_limits):
* event-stream.c:
* event-stream.c (finalize_command_builder):
* events.c:
* events.c (mark_event):
* extents.c:
* extents.c (finalize_extent_info):
* extents.c (uninit_buffer_extents):
* faces.c:
* file-coding.c:
* file-coding.c (finalize_coding_system):
* file-coding.h:
* file-coding.h (struct coding_system_methods):
* file-coding.h (struct detector):
* floatfns.c:
* floatfns.c (extract_float):
* fns.c:
* fns.c (Fidentity):
* font-mgr.c (finalize_fc_pattern):
* font-mgr.c (finalize_fc_config):
* frame.c:
* glyphs.c:
* glyphs.c (finalize_image_instance):
* glyphs.c (unmap_subwindow_instance_cache_mapper):
* gui.c:
* gui.c (gui_error):
* keymap.c:
* lisp.h (struct Lisp_Symbol):
* lrecord.h:
* lrecord.h (struct lrecord_implementation):
* lrecord.h (MC_ALLOC_CALL_FINALIZER):
* lrecord.h (MC_ALLOC_CALL_FINALIZER_FOR_DISKSAVE):
* lrecord.h (DEFINE_DUMPABLE_LISP_OBJECT):
* lrecord.h (DEFINE_DUMPABLE_GENERAL_LISP_OBJECT):
* lrecord.h (DEFINE_DUMPABLE_SIZABLE_LISP_OBJECT):
* lrecord.h (DEFINE_DUMPABLE_SIZABLE_GENERAL_LISP_OBJECT):
* lrecord.h (DEFINE_DUMPABLE_FROB_BLOCK_LISP_OBJECT):
* lrecord.h (DEFINE_DUMPABLE_FROB_BLOCK_GENERAL_LISP_OBJECT):
* lrecord.h (DEFINE_DUMPABLE_FROB_BLOCK_SIZABLE_LISP_OBJECT):
* lrecord.h (DEFINE_DUMPABLE_INTERNAL_LISP_OBJECT):
* lrecord.h (DEFINE_DUMPABLE_SIZABLE_INTERNAL_LISP_OBJECT):
* lrecord.h (DEFINE_NODUMP_LISP_OBJECT):
* lrecord.h (DEFINE_NODUMP_GENERAL_LISP_OBJECT):
* lrecord.h (DEFINE_NODUMP_SIZABLE_LISP_OBJECT):
* lrecord.h (DEFINE_NODUMP_SIZABLE_GENERAL_LISP_OBJECT):
* lrecord.h (DEFINE_NODUMP_FROB_BLOCK_LISP_OBJECT):
* lrecord.h (DEFINE_NODUMP_FROB_BLOCK_GENERAL_LISP_OBJECT):
* lrecord.h (DEFINE_NODUMP_FROB_BLOCK_SIZABLE_LISP_OBJECT):
* lrecord.h (DEFINE_NODUMP_INTERNAL_LISP_OBJECT):
* lrecord.h (DEFINE_NODUMP_SIZABLE_INTERNAL_LISP_OBJECT):
* lrecord.h (MAKE_LISP_OBJECT):
* lrecord.h (DEFINE_DUMPABLE_MODULE_LISP_OBJECT):
* lrecord.h (DEFINE_DUMPABLE_MODULE_GENERAL_LISP_OBJECT):
* lrecord.h (DEFINE_DUMPABLE_MODULE_SIZABLE_LISP_OBJECT):
* lrecord.h (DEFINE_DUMPABLE_MODULE_SIZABLE_GENERAL_LISP_OBJECT):
* lrecord.h (DEFINE_NODUMP_MODULE_LISP_OBJECT):
* lrecord.h (DEFINE_NODUMP_MODULE_GENERAL_LISP_OBJECT):
* lrecord.h (DEFINE_NODUMP_MODULE_SIZABLE_LISP_OBJECT):
* lrecord.h (DEFINE_NODUMP_MODULE_SIZABLE_GENERAL_LISP_OBJECT):
* lrecord.h (MAKE_MODULE_LISP_OBJECT):
* lstream.c:
* lstream.c (finalize_lstream):
* lstream.c (disksave_lstream):
* marker.c:
* marker.c (finalize_marker):
* mule-charset.c (make_charset):
* number.c:
* objects.c:
* objects.c (finalize_color_instance):
* objects.c (finalize_font_instance):
* opaque.c:
* opaque.c (make_opaque_ptr):
* process-nt.c:
* process-nt.c (nt_finalize_process_data):
* process-nt.c (nt_deactivate_process):
* process.c:
* process.c (finalize_process):
* procimpl.h (struct process_methods):
* scrollbar.c:
* scrollbar.c (free_scrollbar_instance):
* specifier.c (finalize_specifier):
* symbols.c:
* toolbar.c:
* toolbar.c (Ftoolbar_button_p):
* tooltalk.c:
* ui-gtk.c:
* ui-gtk.c (emacs_gtk_object_finalizer):
* ui-gtk.c (allocate_emacs_gtk_boxed_data):
* window.c:
* window.c (finalize_window):
* window.c (mark_window_as_deleted):
Separate out regular and disksave finalization. Instead of a
FOR_DISKSAVE argument to the finalizer, create a separate object
method `disksaver'. Make `finalizer' have only one argument.
Go through and separate out all finalize methods into finalize
and disksave. Delete lots of thereby redundant disksave checking.
Delete places that signal an error if we attempt to disksave --
all of these objects are non-dumpable and we will get an error
from pdump anyway if we attempt to dump them. After this is done,
only one object remains that has a disksave method -- lstream.
Change DEFINE_*_LISP_OBJECT_WITH_PROPS to DEFINE_*_GENERAL_LISP_OBJECT,
which is used for specifying either property methods or disksave
methods (or in the future, any other less-used methods).
Remove the for_disksave argument to finalize_process_data. Don't
provide a disksaver for processes because no one currently needs
it.
Clean up various places where objects didn't provide a print method.
It was made mandatory in previous changes, and all methods now
either provide their own print method or use internal_object_printer
or external_object_printer.
Change the definition of CONSOLE_LIVE_P to use the contype enum
rather than looking into the conmeths structure -- in some weird
situations with dead objects, the conmeths structure is NULL,
and printing such objects from debug_print() will crash if we try
to look into the conmeths structure.
| author | Ben Wing <ben@xemacs.org> |
|---|---|
| date | Wed, 20 Jan 2010 07:05:57 -0600 |
| parents | d1247f3cc363 |
| children | b5df3737028a |
| 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. | |
| 4 Copyright (C) 1996 Ben Wing. | |
| 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 |
|
5120
d1247f3cc363
latest work on lisp-object workspace;
Ben Wing <ben@xemacs.org>
parents:
5118
diff
changeset
|
61 d->device_data = XTTY_DEVICE (ALLOC_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) |
| 119 xfree (d->device_data, void *); | |
| 428 | 120 } |
| 121 | |
| 122 static void | |
| 123 tty_delete_device (struct device *d) | |
| 124 { | |
| 125 free_tty_device_struct (d); | |
| 126 } | |
| 3092 | 127 #endif /* not NEW_GC */ |
| 428 | 128 |
| 129 #ifdef SIGWINCH | |
| 130 | |
| 131 static SIGTYPE | |
| 2286 | 132 tty_device_size_change_signal (int UNUSED (signo)) |
| 428 | 133 { |
| 134 int old_errno = errno; | |
| 135 asynch_device_change_pending++; | |
| 136 #ifdef HAVE_UNIXOID_EVENT_LOOP | |
| 137 signal_fake_event (); | |
| 138 #endif | |
| 139 EMACS_REESTABLISH_SIGNAL (SIGWINCH, tty_device_size_change_signal); | |
| 140 errno = old_errno; | |
| 141 SIGRETURN; | |
| 142 } | |
| 143 | |
| 144 /* frame_change_signal does nothing but set a flag that it was called. | |
| 145 When redisplay is called, it will notice that the flag is set and | |
| 146 call handle_pending_device_size_change to do the actual work. */ | |
| 147 static void | |
| 148 tty_asynch_device_change (void) | |
| 149 { | |
| 150 Lisp_Object devcons, concons; | |
| 151 | |
| 152 DEVICE_LOOP_NO_BREAK (devcons, concons) | |
| 153 { | |
| 154 int width, height; | |
| 155 Lisp_Object tail; | |
| 156 struct device *d = XDEVICE (XCAR (devcons)); | |
| 157 struct console *con = XCONSOLE (DEVICE_CONSOLE (d)); | |
| 158 | |
| 159 if (!DEVICE_TTY_P (d)) | |
| 160 continue; | |
| 161 | |
| 162 get_tty_device_size (d, &width, &height); | |
| 163 if (width > 0 && height > 0 | |
| 164 && (CONSOLE_TTY_DATA (con)->width != width | |
| 165 || CONSOLE_TTY_DATA (con)->height != height)) | |
| 166 { | |
| 167 CONSOLE_TTY_DATA (con)->width = width; | |
| 168 CONSOLE_TTY_DATA (con)->height = height; | |
| 169 | |
| 170 for (tail = DEVICE_FRAME_LIST (d); | |
| 171 !NILP (tail); | |
| 172 tail = XCDR (tail)) | |
| 173 { | |
| 174 struct frame *f = XFRAME (XCAR (tail)); | |
| 175 | |
| 176 /* We know the frame is tty because we made sure that the | |
| 177 device is tty. */ | |
| 178 change_frame_size (f, height, width, 1); | |
| 179 } | |
| 180 } | |
| 181 } | |
| 182 } | |
| 183 | |
| 184 #endif /* SIGWINCH */ | |
| 185 | |
| 186 static Lisp_Object | |
| 187 tty_device_system_metrics (struct device *d, | |
| 188 enum device_metrics m) | |
| 189 { | |
| 190 struct console *con = XCONSOLE (DEVICE_CONSOLE (d)); | |
| 191 switch (m) | |
| 192 { | |
| 193 case DM_size_device: | |
| 194 return Fcons (make_int (CONSOLE_TTY_DATA (con)->width), | |
| 195 make_int (CONSOLE_TTY_DATA (con)->height)); | |
| 196 default: /* No such device metric property for TTY devices */ | |
| 197 return Qunbound; | |
| 198 } | |
| 199 } | |
| 200 | |
| 201 /************************************************************************/ | |
| 202 /* initialization */ | |
| 203 /************************************************************************/ | |
| 204 | |
| 205 void | |
| 206 syms_of_device_tty (void) | |
| 207 { | |
| 3092 | 208 #ifdef NEW_GC |
|
5118
e0db3c197671
merge up to latest default branch, doesn't compile yet
Ben Wing <ben@xemacs.org>
parents:
4477
diff
changeset
|
209 INIT_LISP_OBJECT (tty_device); |
| 3092 | 210 #endif /* NEW_GC */ |
| 211 | |
|
4477
e34711681f30
Don't determine whether to call general device-type code at startup,
Aidan Kehoe <kehoea@parhasard.net>
parents:
3092
diff
changeset
|
212 DEFSYMBOL (Qmake_device_early_tty_entry_point); |
| 428 | 213 } |
| 214 | |
| 215 void | |
| 216 console_type_create_device_tty (void) | |
| 217 { | |
| 218 /* device methods */ | |
| 219 CONSOLE_HAS_METHOD (tty, init_device); | |
| 3092 | 220 #ifndef NEW_GC |
| 428 | 221 CONSOLE_HAS_METHOD (tty, delete_device); |
| 3092 | 222 #endif /* not NEW_GC */ |
| 428 | 223 #ifdef SIGWINCH |
| 224 CONSOLE_HAS_METHOD (tty, asynch_device_change); | |
| 225 #endif /* SIGWINCH */ | |
| 226 CONSOLE_HAS_METHOD (tty, device_system_metrics); | |
| 227 } | |
| 228 | |
| 229 void | |
| 230 init_device_tty (void) | |
| 231 { | |
| 232 #ifdef SIGWINCH | |
| 233 if (initialized && !noninteractive) | |
| 613 | 234 EMACS_SIGNAL (SIGWINCH, tty_device_size_change_signal); |
| 428 | 235 #endif /* SIGWINCH */ |
| 236 } |
