Mercurial > hg > xemacs-beta
annotate src/console-tty-impl.h @ 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 | a9c41067dd88 |
| rev | line source |
|---|---|
| 872 | 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_impl_h_ | |
| 33 #define INCLUDED_console_tty_impl_h_ | |
| 34 | |
| 35 #include "console-impl.h" | |
| 36 #include "console-tty.h" | |
| 37 | |
| 38 DECLARE_CONSOLE_TYPE (tty); | |
| 39 | |
| 40 struct tty_console | |
| 41 { | |
| 3092 | 42 #ifdef NEW_GC |
|
5120
d1247f3cc363
latest work on lisp-object workspace;
Ben Wing <ben@xemacs.org>
parents:
5118
diff
changeset
|
43 LISP_OBJECT_HEADER header; |
| 3092 | 44 #endif /* NEW_GC */ |
| 872 | 45 int infd, outfd; |
| 46 Lisp_Object instream, outstream; | |
| 47 Lisp_Object terminal_type; | |
| 48 Lisp_Object controlling_process; | |
| 49 char *term_entry_buffer; | |
| 50 | |
| 51 /* Physical location of cursor on this console. */ | |
| 52 int cursor_x; | |
| 53 int cursor_y; | |
| 54 | |
| 55 /* The real location of the cursor. The above physical location may | |
| 56 be ahead of where we really are. */ | |
| 57 int real_cursor_x; | |
| 58 int real_cursor_y; | |
| 59 | |
| 60 int final_cursor_x; | |
| 61 int final_cursor_y; | |
| 62 | |
| 63 int height; | |
| 64 int width; | |
| 65 | |
| 66 /* The count of frame number. */ | |
| 67 int frame_count; | |
| 68 | |
| 69 /* flags indicating presence, absence or value of various features */ | |
| 70 struct | |
| 71 { | |
| 72 unsigned int must_write_spaces :1; /* terminal inserts nulls, not | |
| 73 spaces to fill whitespace on | |
| 74 screen */ | |
| 75 unsigned int insert_mode_motion :1; /* cursor movement commands | |
| 76 work while in insert mode */ | |
| 77 unsigned int standout_motion :1; /* cursor movement is graceful | |
| 78 in standout or underline mode */ | |
| 79 unsigned int memory_above_frame :1; /* display retained above screen */ | |
| 80 unsigned int memory_below_frame :1; /* display retained below screen */ | |
| 81 unsigned int meta_key :2; /* 0 == mask off top bit; | |
| 82 1 == top bit is meta; | |
| 83 2 == top bit is useful as | |
| 84 character info */ | |
| 85 unsigned int flow_control :1; /* Nonzero means use ^S/^Q as | |
| 86 cretinous flow control. */ | |
| 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 } sd; | |
| 181 | |
| 182 /* costs of various operations */ | |
| 183 struct | |
| 184 { | |
| 185 int cm_up; | |
| 186 int cm_down; | |
| 187 int cm_left; | |
| 188 int cm_right; | |
| 189 int cm_home; | |
| 190 int cm_low_left; | |
| 191 int cm_car_return; | |
| 192 int cm_abs; | |
| 193 int cm_hor_abs; | |
| 194 int cm_ver_abs; | |
| 195 } cost; | |
| 196 | |
| 197 /* The initial tty mode bits */ | |
| 198 struct emacs_tty old_tty; | |
| 199 | |
| 200 /* Is this TTY our controlling terminal? */ | |
| 201 unsigned int controlling_terminal :1; | |
| 202 unsigned int is_stdio :1; | |
| 3571 | 203 /* Do East Asian chars take up two columns? */ |
| 204 unsigned int multiple_width :1; | |
| 872 | 205 }; |
| 206 | |
| 3092 | 207 #ifdef NEW_GC |
| 208 typedef struct tty_console Lisp_Tty_Console; | |
| 209 | |
|
5118
e0db3c197671
merge up to latest default branch, doesn't compile yet
Ben Wing <ben@xemacs.org>
parents:
3571
diff
changeset
|
210 DECLARE_LISP_OBJECT (tty_console, Lisp_Tty_Console); |
| 3092 | 211 |
| 212 #define XTTY_CONSOLE(x) \ | |
| 213 XRECORD (x, tty_console, Lisp_Tty_Console) | |
| 214 #define wrap_tty_console(p) wrap_record (p, tty_console) | |
| 215 #define TTY_CONSOLE_P(x) RECORDP (x, tty_console) | |
| 216 #endif /* NEW_GC */ | |
| 217 | |
| 872 | 218 #define CONSOLE_TTY_DATA(c) CONSOLE_TYPE_DATA (c, tty) |
| 219 #define CONSOLE_TTY_CURSOR_X(c) (CONSOLE_TTY_DATA (c)->cursor_x) | |
| 220 #define CONSOLE_TTY_CURSOR_Y(c) (CONSOLE_TTY_DATA (c)->cursor_y) | |
| 221 #define CONSOLE_TTY_REAL_CURSOR_X(c) (CONSOLE_TTY_DATA (c)->real_cursor_x) | |
| 222 #define CONSOLE_TTY_REAL_CURSOR_Y(c) (CONSOLE_TTY_DATA (c)->real_cursor_y) | |
| 223 #define CONSOLE_TTY_FINAL_CURSOR_X(c) (CONSOLE_TTY_DATA (c)->final_cursor_x) | |
| 224 #define CONSOLE_TTY_FINAL_CURSOR_Y(c) (CONSOLE_TTY_DATA (c)->final_cursor_y) | |
| 225 | |
| 3571 | 226 /* In a more ideal world where available terminfo files actually included |
| 227 information on whether a given TTY supports double-width characters or | |
| 228 not, oh, and where Mule was not conditional, SUPPORTS_MULTIPLE_WIDTH | |
| 229 would be as console-specific as its syntax implies. | |
| 230 | |
| 231 In this world, this is overengineering more than it is anything. */ | |
| 232 #define CONSOLE_TTY_SUPPORTS_MULTIPLE_WIDTH(c) (1 != MAX_ICHAR_LEN) | |
| 233 #define CONSOLE_TTY_MULTIPLE_WIDTH(c) \ | |
| 234 (CONSOLE_TTY_SUPPORTS_MULTIPLE_WIDTH(c) ? \ | |
| 235 CONSOLE_TTY_DATA (c)->multiple_width : (0)) | |
| 236 | |
| 872 | 237 #define TTY_CM(c) (CONSOLE_TTY_DATA (c)->cm) |
| 238 #define TTY_SE(c) (CONSOLE_TTY_DATA (c)->se) | |
| 239 #define TTY_SD(c) (CONSOLE_TTY_DATA (c)->sd) | |
| 240 #define TTY_FLAGS(c) (CONSOLE_TTY_DATA (c)->flags) | |
| 241 #define TTY_COST(c) (CONSOLE_TTY_DATA (c)->cost) | |
| 242 | |
| 243 #define TTY_INC_CURSOR_X(c, n) do { \ | |
| 244 int TICX_n = (n); \ | |
| 245 assert (CONSOLE_TTY_CURSOR_X (c) == CONSOLE_TTY_REAL_CURSOR_X (c)); \ | |
| 246 CONSOLE_TTY_CURSOR_X (c) += TICX_n; \ | |
| 247 CONSOLE_TTY_REAL_CURSOR_X (c) += TICX_n; \ | |
| 248 } while (0) | |
| 249 | |
| 250 #define TTY_INC_CURSOR_Y(c, n) do { \ | |
| 251 int TICY_n = (n); \ | |
| 252 CONSOLE_TTY_CURSOR_Y (c) += TICY_n; \ | |
| 253 CONSOLE_TTY_REAL_CURSOR_Y (c) += TICY_n; \ | |
| 254 } while (0) | |
| 255 | |
| 256 struct tty_device | |
| 257 { | |
| 3092 | 258 #ifdef NEW_GC |
|
5120
d1247f3cc363
latest work on lisp-object workspace;
Ben Wing <ben@xemacs.org>
parents:
5118
diff
changeset
|
259 LISP_OBJECT_HEADER header; |
| 3092 | 260 #endif /* NEW_GC */ |
| 872 | 261 #ifdef HAVE_TERMIOS |
| 262 speed_t ospeed; /* Output speed (from sg_ospeed) */ | |
| 263 #else | |
| 264 short ospeed; /* Output speed (from sg_ospeed) */ | |
| 265 #endif | |
| 266 }; | |
| 267 | |
| 3092 | 268 #ifdef NEW_GC |
| 269 typedef struct tty_device Lisp_Tty_Device; | |
| 270 | |
|
5118
e0db3c197671
merge up to latest default branch, doesn't compile yet
Ben Wing <ben@xemacs.org>
parents:
3571
diff
changeset
|
271 DECLARE_LISP_OBJECT (tty_device, Lisp_Tty_Device); |
| 3092 | 272 |
| 273 #define XTTY_DEVICE(x) \ | |
| 274 XRECORD (x, tty_device, Lisp_Tty_Device) | |
| 275 #define wrap_tty_device(p) wrap_record (p, tty_device) | |
| 276 #define TTY_DEVICE_P(x) RECORDP (x, tty_device) | |
| 277 #endif /* NEW_GC */ | |
| 278 | |
| 872 | 279 #define DEVICE_TTY_DATA(d) DEVICE_TYPE_DATA (d, tty) |
| 280 | |
| 281 /* termcap requires this to be global */ | |
| 282 #ifndef HAVE_TERMIOS | |
| 283 extern short ospeed; /* Output speed (from sg_ospeed) */ | |
| 284 #endif | |
| 285 | |
| 286 #endif /* INCLUDED_console_tty_impl_h_ */ |
