Mercurial > hg > xemacs-beta
annotate src/frame-impl.h @ 2720:6fa9919a9a0b
[xemacs-hg @ 2005-04-08 23:10:01 by crestani]
ChangeLog addition:
2005-04-01 Marcus Crestani <crestani@xemacs.org>
The new allocator.
New configure flag: `MC_ALLOC':
* configure.ac (XE_COMPLEX_ARG_ENABLE): Add `--enable-mc-alloc' as
a new configure flag.
* configure.in (AC_INIT_PARSE_ARGS): Add `--mc-alloc' as a new
configure flag.
* configure.usage: Add description for `mc-alloc'.
DUMP_IN_EXEC:
* Makefile.in.in: Condition the installation of a separate dump
file on !DUMP_ON_EXEC.
* configure.ac (XE_COMPLEX_ARG_ENABLE): Add
`--enable-dump-in-exec' as a new configure flag.
* configure.ac: DUMP_IN_EXEC is define as default for PDUMP but
not default for MC_ALLOC.
* configure.in (AC_INIT_PARSE_ARGS): Add `--dump-in-exec' as a
new configure flag.
* configure.in: DUMP_IN_EXEC is define as default for PDUMP but
not default for MC_ALLOC.
* configure.usage: Add description for `dump-in-exec'.
lib-src/ChangeLog addition:
2005-04-01 Marcus Crestani <crestani@xemacs.org>
The new allocator.
DUMP_IN_EXEC:
* Makefile.in.in: Only compile insert-data-in-exec if
DUMP_IN_EXEC is defined.
lisp/ChangeLog addition:
2005-04-01 Marcus Crestani <crestani@xemacs.org>
The new allocator.
MEMORY_USAGE_STATS
* diagnose.el: Add new lisp function to pretty print statistics
about the new allocator.
* diagnose.el (show-mc-alloc-memory-usage): New.
modules/ChangeLog addition:
2005-04-01 Marcus Crestani <crestani@xemacs.org>
The new allocator.
Remove Lcrecords:
* postgresql/postgresql.c (allocate_pgconn): Allocate with new
allocator.
* postgresql/postgresql.c (allocate_pgresult): Allocate PGresult
with new allocator.
* postgresql/postgresql.h (struct Lisp_PGconn): Add
lrecord_header.
* postgresql/postgresql.h (struct Lisp_PGresult): Add
lrecord_header.
* ldap/eldap.c (allocate_ldap): Allocate with new allocator.
* ldap/eldap.h (struct Lisp_LDAP): Add lrecord_header.
nt/ChangeLog addition:
2005-04-01 Marcus Crestani <crestani@xemacs.org>
The new allocator.
New configure flag: `MC_ALLOC':
* config.inc.samp: Add new flag `MC_ALLOC'.
* xemacs.mak: Add flag and configuration output for `MC_ALLOC'.
New files:
* xemacs.dsp: Add source files mc-alloc.c and mc-alloc.h.
* xemacs.mak: Add new object file mc-alloc.obj to dependencies.
src/ChangeLog addition:
2005-04-01 Marcus Crestani <crestani@xemacs.org>
The new allocator.
New configure flag: `MC_ALLOC':
* config.h.in: Add new flag `MC_ALLOC'.
New files:
* Makefile.in.in: Add new object file mc-alloc.o.
* depend: Add new files to dependencies.
* mc-alloc.c: New.
* mc-alloc.h: New.
Running the new allocator from XEmacs:
* alloc.c (deadbeef_memory): Moved to mc-alloc.c.
* emacs.c (main_1): Initialize the new allocator and add
syms_of_mc_alloc.
* symsinit.h: Add syms_of_mc_alloc.
New lrecord allocation and free functions:
* alloc.c (alloc_lrecord): New. Allocates an lrecord, includes
type checking and initializing of the lrecord_header.
* alloc.c (noseeum_alloc_lrecord): Same as above, but increments
the NOSEEUM cons counter.
* alloc.c (free_lrecord): New. Calls the finalizer and frees the
lrecord.
* lrecord.h: Add lrecord allocation prototypes and comments.
Remove old lrecord FROB block allocation:
* alloc.c (allocate_lisp_storage): Former function to expand
heap. Not needed anymore, remove.
* alloc.c: Completely remove `Fixed-size type macros'
* alloc.c (release_breathing_space): Remove.
* alloc.c (memory_full): Remove release_breathing_space.
* alloc.c (refill_memory_reserve): Remove.
* alloc.c (TYPE_ALLOC_SIZE): Remove.
* alloc.c (DECLARE_FIXED_TYPE_ALLOC): Remove.
* alloc.c (ALLOCATE_FIXED_TYPE_FROM_BLOCK): Remove.
* alloc.c (ALLOCATE_FIXED_TYPE_1): Remove.
* alloc.c (ALLOCATE_FIXED_TYPE): Remove.
* alloc.c (NOSEEUM_ALLOCATE_FIXED_TYPE): Remove.
* alloc.c (struct Lisp_Free): Remove.
* alloc.c (LRECORD_FREE_P): Remove.
* alloc.c (MARK_LRECORD_AS_FREE): Remove.
* alloc.c (MARK_LRECORD_AS_NOT_FREE): Remove.
* alloc.c (PUT_FIXED_TYPE_ON_FREE_LIST): Remove.
* alloc.c (FREE_FIXED_TYPE): Remove.
* alloc.c (FREE_FIXED_TYPE_WHEN_NOT_IN_GC): Remove.
Allocate old lrecords with new allocator:
* alloc.c: DECLARE_FIXED_TYPE_ALLOC removed for all lrecords
defined in alloc.c.
* alloc.c (Fcons): Allocate with new allocator.
* alloc.c (noseeum_cons): Allocate with new allocator.
* alloc.c (make_float): Allocate with new allocator.
* alloc.c (make_bignum): Allocate with new allocator.
* alloc.c (make_bignum_bg): Allocate with new allocator.
* alloc.c (make_ratio): Allocate with new allocator.
* alloc.c (make_ratio_bg): Allocate with new allocator.
* alloc.c (make_ratio_rt): Allocate with new allocator.
* alloc.c (make_bigfloat): Allocate with new allocator.
* alloc.c (make_bigfloat_bf): Allocate with new allocator.
* alloc.c (make_compiled_function): Allocate with new allocator.
* alloc.c (Fmake_symbol): Allocate with new allocator.
* alloc.c (allocate_extent): Allocate with new allocator.
* alloc.c (allocate_event): Allocate with new allocator.
* alloc.c (make_key_data): Allocate with new allocator.
* alloc.c (make_button_data): Allocate with new allocator.
* alloc.c (make_motion_data): Allocate with new allocator.
* alloc.c (make_process_data): Allocate with new allocator.
* alloc.c (make_timeout_data): Allocate with new allocator.
* alloc.c (make_magic_data): Allocate with new allocator.
* alloc.c (make_magic_eval_data): Allocate with new allocator.
* alloc.c (make_eval_data): Allocate with new allocator.
* alloc.c (make_misc_user_data): Allocate with new allocator.
* alloc.c (Fmake_marker): Allocate with new allocator.
* alloc.c (noseeum_make_marker): Allocate with new allocator.
* alloc.c (make_uninit_string): Allocate with new allocator.
* alloc.c (resize_string): Allocate with new allocator.
* alloc.c (make_string_nocopy): Allocate with new allocator.
Garbage Collection:
* alloc.c (GC_CHECK_NOT_FREE): Remove obsolete assertions.
* alloc.c (SWEEP_FIXED_TYPE_BLOCK): Remove.
* alloc.c (SWEEP_FIXED_TYPE_BLOCK_1): Remove.
* alloc.c (sweep_conses): Remove.
* alloc.c (free_cons): Use new allocator to free.
* alloc.c (sweep_compiled_functions): Remove.
* alloc.c (sweep_floats): Remove.
* alloc.c (sweep_bignums): Remove.
* alloc.c (sweep_ratios): Remove.
* alloc.c (sweep_bigfloats): Remove.
* alloc.c (sweep_symbols): Remove.
* alloc.c (sweep_extents): Remove.
* alloc.c (sweep_events): Remove.
* alloc.c (sweep_key_data): Remove.
* alloc.c (free_key_data): Use new allocator to free.
* alloc.c (sweep_button_data): Remove.
* alloc.c (free_button_data): Use new allocator to free.
* alloc.c (sweep_motion_data): Remove.
* alloc.c (free_motion_data): Use new allocator to free.
* alloc.c (sweep_process_data): Remove.
* alloc.c (free_process_data): Use new allocator to free.
* alloc.c (sweep_timeout_data): Remove.
* alloc.c (free_timeout_data): Use new allocator to free.
* alloc.c (sweep_magic_data): Remove.
* alloc.c (free_magic_data): Use new allocator to free.
* alloc.c (sweep_magic_eval_data): Remove.
* alloc.c (free_magic_eval_data): Use new allocator to free.
* alloc.c (sweep_eval_data): Remove.
* alloc.c (free_eval_data): Use new allocator to free.
* alloc.c (sweep_misc_user_data): Remove.
* alloc.c (free_misc_user_data): Use new allocator to free.
* alloc.c (sweep_markers): Remove.
* alloc.c (free_marker): Use new allocator to free.
* alloc.c (garbage_collect_1): Remove release_breathing_space.
* alloc.c (gc_sweep): Remove all the old lcrecord and lrecord
related stuff. Sweeping now works like this: compact string
chars, finalize, sweep.
* alloc.c (common_init_alloc_early): Remove old lrecord
initializations, remove breathing_space.
* emacs.c (Fdump_emacs): Remove release_breathing_space.
* lisp.h: Remove prototype for release_breathing_space.
* lisp.h: Adjust the special cons mark makros.
Lrecord Finalizer:
* alloc.c: Add finalizer to lrecord definition.
* alloc.c (finalize_string): Add finalizer for string.
* bytecode.c: Add finalizer to lrecord definition.
* bytecode.c (finalize_compiled_function): Add finalizer for
compiled function.
* marker.c: Add finalizer to lrecord definition.
* marker.c (finalize_marker): Add finalizer for marker.
These changes build the interface to mc-alloc:
* lrecord.h (MC_ALLOC_CALL_FINALIZER): Tell mc-alloc how to
finalize lrecords.
* lrecord.h (MC_ALLOC_CALL_FINALIZER_FOR_DISKSAVE): Tell
mc-alloc how to finalize for disksave.
Unify lrecords and lcrecords:
* lisp.h (struct Lisp_String): Adjust string union hack to
new lrecord header.
* lrecord.h: Adjust comments.
* lrecord.h (struct lrecord_header): The new lrecord header
includes type, lisp-readonly, free, and uid.
* lrecord.h (set_lheader_implementation): Adjust to new
lrecord_header.
* lrecord.h (struct lrecord_implementation): The field basic_p
for indication of an old lrecord is not needed anymore, remove.
* lrecord.h (MAKE_LRECORD_IMPLEMENTATION): Remove basic_p.
* lrecord.h (MAKE_EXTERNAL_LRECORD_IMPLEMENTATION): Remove
basic_p.
* lrecord.h (copy_sized_lrecord): Remove distinction between
old lrecords and lcrecords.
* lrecord.h (copy_lrecord): Remove distinction between old
lrecords and lcrecords.
* lrecord.h (zero_sized_lrecord): Remove distinction between
old lrecords and lcrecords.
* lrecord.h (zero_lrecord): Remove distinction between old
lrecords and lcrecords.
Remove lcrecords and lcrecord lists:
* alloc.c (basic_alloc_lcrecord): Not needed anymore, remove.
* alloc.c (very_old_free_lcrecord): Not needed anymore, remove.
* alloc.c (copy_lisp_object): No more distinction between
lrecords and lcrecords.
* alloc.c (all_lcrecords): Not needed anymore, remove.
* alloc.c (make_vector_internal): Allocate as lrecord.
* alloc.c (make_bit_vector_internal): Allocate as lrecord.
* alloc.c: Completely remove `lcrecord lists'.
* alloc.c (free_description): Remove.
* alloc.c (lcrecord_list_description): Remove.
* alloc.c (mark_lcrecord_list): Remove.
* alloc.c (make_lcrecord_list): Remove.
* alloc.c (alloc_managed_lcrecord): Remove.
* alloc.c (free_managed_lcrecord): Remove.
* alloc.c (alloc_automanaged_lcrecord): Remove.
* alloc.c (free_lcrecord): Remove.
* alloc.c (lcrecord_stats): Remove.
* alloc.c (tick_lcrecord_stats): Remove.
* alloc.c (disksave_object_finalization_1): Add call to
mc_finalize_for_disksave. Remove the lcrecord way to visit all
objects.
* alloc.c (kkcc_marking): Remove XD_FLAG_FREE_LISP_OBJECT
* alloc.c (sweep_lcrecords_1): Remove.
* alloc.c (common_init_alloc_early): Remove everything related
to lcrecords, remove old lrecord initializations,
* alloc.c (init_lcrecord_lists): Not needed anymore, remove.
* alloc.c (reinit_alloc_early): Remove everything related to
lcrecords.
* alloc.c (init_alloc_once_early): Remove everything related to
lcrecords.
* buffer.c (allocate_buffer): Allocate as lrecord.
* buffer.c (nuke_all_buffer_slots): Use lrecord functions.
* buffer.c (common_init_complex_vars_of_buffer): Allocate as
lrecord.
* buffer.h (struct buffer): Add lrecord_header.
* casetab.c (allocate_case_table): Allocate as lrecord.
* casetab.h (struct Lisp_Case_Table): Add lrecord_header.
* charset.h (struct Lisp_Charset): Add lrecord_header.
* chartab.c (fill_char_table): Use lrecord functions.
* chartab.c (Fmake_char_table): Allocate as lrecord.
* chartab.c (make_char_table_entry): Allocate as lrecord.
* chartab.c (copy_char_table_entry): Allocate as lrecord.
* chartab.c (Fcopy_char_table): Allocate as lrecord.
* chartab.c (put_char_table): Use lrecord functions.
* chartab.h (struct Lisp_Char_Table_Entry): Add lrecord_header.
* chartab.h (struct Lisp_Char_Table): Add lrecord_header.
* console-impl.h (struct console): Add lrecord_header.
* console-msw-impl.h (struct Lisp_Devmode): Add lrecord_header.
* console-msw-impl.h (struct mswindows_dialog_id): Add
lrecord_header.
* console.c (allocate_console): Allocate as lrecord.
* console.c (nuke_all_console_slots): Use lrecord functions.
* console.c (common_init_complex_vars_of_console): Allocate as
lrecord.
* data.c (make_weak_list): Allocate as lrecord.
* data.c (make_weak_box): Allocate as lrecord.
* data.c (make_ephemeron): Allocate as lrecord.
* database.c (struct Lisp_Database): Add lrecord_header.
* database.c (allocate_database): Allocate as lrecord.
* device-impl.h (struct device): Add lrecord_header.
* device-msw.c (allocate_devmode): Allocate as lrecord.
* device.c (nuke_all_device_slots): Use lrecord functions.
* device.c (allocate_device): Allocate as lrecord.
* dialog-msw.c (handle_question_dialog_box): Allocate as lrecord.
* elhash.c (struct Lisp_Hash_Table): Add lrecord_header.
* elhash.c (make_general_lisp_hash_table): Allocate as lrecord.
* elhash.c (Fcopy_hash_table): Allocate as lrecord.
* event-stream.c: Lcrecord lists Vcommand_builder_free_list and
Vtimeout_free_list are no longer needed. Remove.
* event-stream.c (allocate_command_builder): Allocate as lrecord.
* event-stream.c (free_command_builder): Use lrecord functions.
* event-stream.c (event_stream_generate_wakeup): Allocate as
lrecord.
* event-stream.c (event_stream_resignal_wakeup): Use lrecord
functions.
* event-stream.c (event_stream_disable_wakeup): Use lrecord
functions.
* event-stream.c (reinit_vars_of_event_stream): Lcrecord lists
remove.
* events.h (struct Lisp_Timeout): Add lrecord_header.
* events.h (struct command_builder): Add lrecord_header.
* extents-impl.h (struct extent_auxiliary): Add lrecord_header.
* extents-impl.h (struct extent_info): Add lrecord_header.
* extents.c (allocate_extent_auxiliary): Allocate as lrecord.
* extents.c (allocate_extent_info): Allocate as lrecord.
* extents.c (copy_extent): Allocate as lrecord.
* faces.c (allocate_face): Allocate as lrecord.
* faces.h (struct Lisp_Face): Add lrecord_header.
* file-coding.c (allocate_coding_system): Allocate as lrecord.
* file-coding.c (Fcopy_coding_system): Allocate as lrecord.
* file-coding.h (struct Lisp_Coding_System): Add lrecord_header.
* fns.c (Ffillarray): Allocate as lrecord.
* frame-impl.h (struct frame): Add lrecord_header.
* frame.c (nuke_all_frame_slots): Use lrecord functions.
* frame.c (allocate_frame_core): Allocate as lrecord.
* glyphs.c (allocate_image_instance): Allocate as lrecord.
* glyphs.c (Fcolorize_image_instance): Allocate as lrecord.
* glyphs.c (allocate_glyph): Allocate as lrecord.
* glyphs.h (struct Lisp_Image_Instance): Add lrecord_header.
* glyphs.h (struct Lisp_Glyph): Add lrecord_header.
* gui.c (allocate_gui_item): Allocate as lrecord.
* gui.h (struct Lisp_Gui_Item): Add lrecord_header.
* keymap.c (struct Lisp_Keymap): Add lrecord_header.
* keymap.c (make_keymap): Allocate as lrecord.
* lisp.h (struct Lisp_Vector): Add lrecord_header.
* lisp.h (struct Lisp_Bit_Vector): Add lrecord_header.
* lisp.h (struct weak_box): Add lrecord_header.
* lisp.h (struct ephemeron): Add lrecord_header.
* lisp.h (struct weak_list): Add lrecord_header.
* lrecord.h (struct lcrecord_header): Not used, remove.
* lrecord.h (struct free_lcrecord_header): Not used, remove.
* lrecord.h (struct lcrecord_list): Not needed anymore, remove.
* lrecord.h (lcrecord_list): Not needed anymore, remove.
* lrecord.h: (enum data_description_entry_flags): Remove
XD_FLAG_FREE_LISP_OBJECT.
* lstream.c: Lrecord list Vlstream_free_list remove.
* lstream.c (Lstream_new): Allocate as lrecord.
* lstream.c (Lstream_delete): Use lrecod functions.
* lstream.c (reinit_vars_of_lstream): Vlstream_free_list
initialization remove.
* lstream.h (struct lstream): Add lrecord_header.
* emacs.c (main_1): Remove lstream initialization.
* mule-charset.c (make_charset): Allocate as lrecord.
* objects-impl.h (struct Lisp_Color_Instance): Add
lrecord_header.
* objects-impl.h (struct Lisp_Font_Instance): Add lrecord_header.
* objects.c (Fmake_color_instance): Allocate as lrecord.
* objects.c (Fmake_font_instance): Allocate as lrecord.
* objects.c (reinit_vars_of_objects): Allocate as lrecord.
* opaque.c: Lcreord list Vopaque_ptr_list remove.
* opaque.c (make_opaque): Allocate as lrecord.
* opaque.c (make_opaque_ptr): Allocate as lrecord.
* opaque.c (free_opaque_ptr): Use lrecord functions.
* opaque.c (reinit_opaque_early):
* opaque.c (init_opaque_once_early): Vopaque_ptr_list
initialization remove.
* opaque.h (Lisp_Opaque): Add lrecord_header.
* opaque.h (Lisp_Opaque_Ptr): Add lrecord_header.
* emacs.c (main_1): Remove opaque variable initialization.
* print.c (default_object_printer): Use new lrecord_header.
* print.c (print_internal): Use new lrecord_header.
* print.c (debug_p4): Use new lrecord_header.
* process.c (make_process_internal): Allocate as lrecord.
* procimpl.h (struct Lisp_Process): Add lrecord_header.
* rangetab.c (Fmake_range_table): Allocate as lrecord.
* rangetab.c (Fcopy_range_table): Allocate as lrecord.
* rangetab.h (struct Lisp_Range_Table): Add lrecord_header.
* scrollbar.c (create_scrollbar_instance): Allocate as lrecord.
* scrollbar.h (struct scrollbar_instance): Add lrecord_header.
* specifier.c (make_specifier_internal): Allocate as lrecord.
* specifier.h (struct Lisp_Specifier): Add lrecord_header.
* symbols.c:
* symbols.c (Fmake_variable_buffer_local): Allocate as lrecord.
* symbols.c (Fdontusethis_set_symbol_value_handler): Allocate
as lrecord.
* symbols.c (Fdefvaralias): Allocate as lrecord.
* symeval.h (struct symbol_value_magic): Add lrecord_header.
* toolbar.c (update_toolbar_button): Allocate as lrecord.
* toolbar.h (struct toolbar_button): Add lrecord_header.
* tooltalk.c (struct Lisp_Tooltalk_Message): Add lrecord_header.
* tooltalk.c (make_tooltalk_message): Allocate as lrecord.
* tooltalk.c (struct Lisp_Tooltalk_Pattern): Add lrecord_header.
* tooltalk.c (make_tooltalk_pattern): Allocate as lrecord.
* ui-gtk.c (allocate_ffi_data): Allocate as lrecord.
* ui-gtk.c (allocate_emacs_gtk_object_data): Allocate as lrecord.
* ui-gtk.c (allocate_emacs_gtk_boxed_data): Allocate as lrecord.
* ui-gtk.h (structs): Add lrecord_header.
* window-impl.h (struct window): Add lrecord_header.
* window-impl.h (struct window_mirror): Add lrecord_header.
* window.c (allocate_window): Allocate as lrecord.
* window.c (new_window_mirror): Allocate as lrecord.
* window.c (make_dummy_parent): Allocate as lrecord.
MEMORY_USAGE_STATS
* alloc.c (fixed_type_block_overhead): Not used anymore, remove.
* buffer.c (compute_buffer_usage): Get storage size from new
allocator.
* marker.c (compute_buffer_marker_usage): Get storage size from
new allocator.
* mule-charset.c (compute_charset_usage): Get storage size from
new allocator.
* scrollbar-gtk.c (gtk_compute_scrollbar_instance_usage): Get
storage size from new allocator.
* scrollbar-msw.c (mswindows_compute_scrollbar_instance_usage):
Get storage size from new allocator.
* scrollbar-x.c (x_compute_scrollbar_instance_usage): Get
storage size from new allocator.
* scrollbar.c (compute_scrollbar_instance_usage): Get storage
size from new allocator.
* unicode.c (compute_from_unicode_table_size_1): Get storage
size from new allocator.
* unicode.c (compute_to_unicode_table_size_1): Get storage size
from new allocator.
* window.c (compute_window_mirror_usage): Get storage size from
new allocator.
* window.c (compute_window_usage): Get storage size from new
allocator.
MC_ALLOC_TYPE_STATS:
* alloc.c (alloc_lrecord): Bump lrecord count.
* alloc.c (noseeum_alloc_lrecord): Bump lrecord count.
* alloc.c (struct lrecord_stats): Storage for counts.
* alloc.c (init_lrecord_stats): Zero statistics.
* alloc.c (inc_lrecord_stats): Increase the statistic.
* alloc.c (dec_lrecord_stats): Decrease the statistic.
* alloc.c (gc_plist_hack): Used to print the information.
* alloc.c (Fgarbage_collect): Return the collected information.
* mc-alloc.c (remove_cell): Decrease lrecord count.
* mc-alloc.h: Set flag MC_ALLOC_TYPE_STATS.
* emacs.c (main_1): Init lrecord statistics.
* lrecord.h: Add prototypes for *_lrecord_stats.
Strings:
* alloc.c (Fmake_string): Initialize ascii_begin to zero.
* alloc.c (gc_count_num_short_string_in_use): Remove.
* alloc.c (gc_count_string_total_size): Remove.
* alloc.c (gc_count_short_string_total_size): Remove.
* alloc.c (debug_string_purity): Remove.
* alloc.c (debug_string_purity_print): Remove.
* alloc.c (sweep_strings): Remove.
Remove static C-readonly Lisp objects:
* alloc.c (c_readonly): Not needed anymore, remove.
* alloc.c (GC_CHECK_LHEADER_INVARIANTS): Remove some obsolete
lheader invariants assertions.
* buffer.c (DEFVAR_BUFFER_LOCAL_1): Allocate dynamically.
* console.c (DEFVAR_CONSOLE_LOCAL_1): Allocate dynamically.
* gpmevent.c: Indirection via MC_ALLOC_Freceive_gpm_event.
* gpmevent.c (Fgpm_enable): Allocate dynamically.
* gpmevent.c (syms_of_gpmevent): Allocate dynamically.
* lisp.h (C_READONLY): Not needed anymore, remove.
* lisp.h (DEFUN): Allocate dynamically.
* lrecord.h (C_READONLY_RECORD_HEADER_P): Not needed anymore,
remove.
* lrecord.h (SET_C_READONLY_RECORD_HEADER): Not needed anymore,
remove.
* symbols.c (guts_of_unbound_marker):
* symeval.h (defsubr): Allocate dynamically.
* symeval.h (DEFSUBR_MACRO): Allocate dynamically.
* symeval.h (DEFVAR_ SYMVAL_FWD): Allocate dynamically.
* tests.c (TESTS_DEFSUBR): Allocate dynamically.
Definition of mcpro:
* lisp.h: Add mcpro prototypes.
* alloc.c (common_init_alloc_early): Add initialization for
mcpros.
* alloc.c (mcpro_description_1): New.
* alloc.c (mcpro_description): New.
* alloc.c (mcpros_description_1): New.
* alloc.c (mcpros_description): New.
* alloc.c (mcpro_one_name_description_1): New.
* alloc.c (mcpro_one_name_description): New.
* alloc.c (mcpro_names_description_1): New.
* alloc.c (mcpro_names_description): New.
* alloc.c (mcpros): New.
* alloc.c (mcpro_names): New.
* alloc.c (mcpro_1): New.
* alloc.c (mc_pro): New.
* alloc.c (garbage_collect_1): Add mcpros to root set.
Usage of mcpro:
* alloc.c (make_string_nocopy): Add string to root set.
* symbols.c (init_symbols_once_early): Add Qunbound to root set.
Changes to the Portable Dumper:
* alloc.c (FREE_OR_REALLOC_BEGIN): Since dumped objects can be
freed with the new allocator, remove assertion for !DUMPEDP.
* dumper.c: Adjust comments, increase PDUMP_HASHSIZE.
* dumper.c (pdump_make_hash): Shift address only 2 bytes, to
avoid collisions.
* dumper.c (pdump_objects_unmark): No more mark bits within
the object, remove.
* dumper.c (mc_addr_elt): New. Element data structure for mc
hash table.
* dumper.c (pdump_mc_hash): New hash table: `lookup table'.
* dumper.c (pdump_get_mc_addr): New. Lookup for hash table.
* dumper.c (pdump_get_indirect_mc_addr): New. Lookup for
convertibles.
* dumper.c (pdump_put_mc_addr): New. Putter for hash table.
* dumper.c (pdump_dump_mc_data): New. Writes the table for
relocation at load time to the dump file.
* dumper.c (pdump_scan_lisp_objects_by_alignment): New.
Visits all dumped Lisp objects.
* dumper.c (pdump_scan_non_lisp_objects_by_alignment): New.
Visits all other dumped objects.
* dumper.c (pdump_reloc_one_mc): New. Updates all pointers
of an object by using the hash table pdump_mc_hash.
* dumper.c (pdump_reloc_one): Replaced by pdump_reloc_one_mc.
* dumper.c (pdump): Change the structure of the dump file, add
the mc post dump relocation table to dump file.
* dumper.c (pdump_load_finish): Hand all dumped objects to the
new allocator and use the mc post dump relocation table for
relocating the dumped objects at dump file load time, free not
longer used data structures.
* dumper.c (pdump_load): Free the dump file.
* dumper.h: Remove pdump_objects_unmark.
* lrecord.h (DUMPEDP): Dumped objects can be freed, remove.
DUMP_IN_EXEC:
* Makefile.in.in: Linking for and with dump in executable only if
DUMP_IN_EXEC is defined.
* config.h.in: Add new flag `DUMP_IN_EXEC'
* emacs.c: Condition dump-data.h on DUMP_IN_EXEC.
* emacs.c (main_1): Flag `-si' only works if dump image is
written into executable.
Miscellanious
* lrecord.h (enum lrecord_type): Added numbers to all types,
very handy for debugging.
* xemacs.def.in.in: Add mc-alloc functions to make them visible
to the modules.
author | crestani |
---|---|
date | Fri, 08 Apr 2005 23:11:35 +0000 |
parents | e22b0213b713 |
children | 1e7cc382eb16 |
rev | line source |
---|---|
872 | 1 /* Define frame-object for XEmacs. |
2 Copyright (C) 1988, 1992, 1993, 1994 Free Software Foundation, Inc. | |
3 Copyright (C) 1995 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: FSF 19.30. */ | |
23 | |
24 #ifndef INCLUDED_frame_impl_h_ | |
25 #define INCLUDED_frame_impl_h_ | |
26 | |
27 #include "console-impl.h" /* for error_check_frame_type */ | |
28 #include "frame.h" | |
29 | |
30 #define FRAME_TYPE_NAME(f) ((f)->framemeths->name) | |
31 #define FRAME_TYPE(f) ((f)->framemeths->symbol) | |
32 | |
33 /******** Accessing / calling a frame method *********/ | |
34 | |
35 #define HAS_FRAMEMETH_P(f, m) HAS_CONTYPE_METH_P ((f)->framemeths, m) | |
36 #define FRAMEMETH(f, m, args) CONTYPE_METH ((f)->framemeths, m, args) | |
37 #define MAYBE_FRAMEMETH(f, m, args) \ | |
38 MAYBE_CONTYPE_METH ((f)->framemeths, m, args) | |
39 #define FRAMEMETH_OR_GIVEN(f, m, args, given) \ | |
40 CONTYPE_METH_OR_GIVEN((f)->framemeths, m, args, given) | |
41 | |
42 struct frame | |
43 { | |
2720 | 44 #ifdef MC_ALLOC |
45 struct lrecord_header header; | |
46 #else /* MC_ALLOC */ | |
872 | 47 struct lcrecord_header header; |
2720 | 48 #endif /* MC_ALLOC */ |
872 | 49 |
50 /* Methods for this frame's console. This can also be retrieved | |
51 through frame->device->console, but it's faster this way. */ | |
52 struct console_methods *framemeths; | |
53 | |
1204 | 54 /* Duplicates framemeths->symbol. See comment in struct console. */ |
55 enum console_variant frametype; | |
56 | |
872 | 57 /* Size of text only area of this frame, excluding scrollbars, |
58 toolbars and end of line glyphs. The size can be in characters | |
59 or pixels, depending on units in which window system resizes | |
60 its windows */ | |
61 int height, width; | |
62 | |
63 /* New height and width for pending size change, in the same units | |
64 as above. 0 if no change pending. */ | |
65 int new_height, new_width; | |
66 | |
67 /* Size of text-only are of the frame, in default font characters. | |
68 This may be inaccurate due to rounding error */ | |
69 int char_height, char_width; | |
70 | |
71 /* Size of the whole frame, including scrollbars, toolbars and end | |
72 of line glyphs, in pixels */ | |
73 int pixheight, pixwidth; | |
74 | |
75 #ifdef HAVE_TTY | |
76 /* The count of frame number. This applies to TTY frames only. */ | |
77 int order_count; | |
78 #endif | |
79 | |
80 /* Current page number for a printer frame. */ | |
81 int page_number; | |
82 | |
83 /* Width of the internal border. This is a line of background color | |
84 just inside the window's border. It is normally only non-zero on | |
85 X frames, but we put it here to avoid introducing window system | |
86 dependencies. */ | |
87 int internal_border_width; | |
88 | |
89 int modiff; | |
90 | |
91 struct expose_ignore *subwindow_exposures; | |
92 struct expose_ignore *subwindow_exposures_tail; | |
93 | |
94 #ifdef HAVE_SCROLLBARS | |
95 /* frame-local scrollbar information. See scrollbar.c. */ | |
96 int scrollbar_y_offset; | |
97 | |
98 /* cache of created scrollbars */ | |
99 struct scrollbar_instance *sb_vcache; | |
100 struct scrollbar_instance *sb_hcache; | |
101 #endif | |
102 | |
103 #ifdef HAVE_TOOLBARS | |
104 /* Size of toolbars as seen by redisplay. This is used to determine | |
105 whether to re-layout windows by a call to change_frame_size early | |
106 in redisplay_frame. */ | |
107 int current_toolbar_size[4]; | |
108 #endif | |
109 | |
110 /* Size of gutters as seen by redisplay. This is used to determine | |
111 whether to re-layout windows by a call to change_frame_size early | |
112 in redisplay_frame. */ | |
113 int current_gutter_bounds[4]; | |
114 | |
115 /* Dynamic arrays of display lines for gutters */ | |
116 display_line_dynarr *current_display_lines[4]; | |
117 display_line_dynarr *desired_display_lines[4]; | |
118 | |
1204 | 119 /* A structure of auxiliary data specific to the device type. For |
120 example, struct x_frame is for X window frames; defined in | |
121 console-x-impl.h. */ | |
872 | 122 void *frame_data; |
123 | |
124 #define FRAME_SLOT_DECLARATION | |
1204 | 125 #define MARKED_SLOT(x) Lisp_Object x; |
872 | 126 #include "frameslots.h" |
127 | |
128 /* Nonzero if frame is currently displayed. | |
129 Mutually exclusive with iconified | |
130 JV: This now a tristate flag: | |
131 Value : Emacs meaning :f-v-p : X meaning | |
132 0 : not displayed : nil : unmapped | |
133 >0 : user can access it,needs repainting : t : mapped and visible | |
134 <0 : user can access it,needs no repainting : hidden :mapped and invisible | |
135 where f-v-p is the return value of frame-visible-p */ | |
136 int visible; | |
137 | |
138 /* one-bit flags: */ | |
139 | |
140 /* Is focusing onto this frame disabled? (Modal dialog boxes) */ | |
141 unsigned int disabled :1; | |
142 | |
143 /* Are we finished initializing? */ | |
144 unsigned int init_finished :1; | |
145 | |
146 /* Is frame marked for deletion? This is used in XSetErrorHandler(). */ | |
147 unsigned int being_deleted :1; | |
148 | |
149 /* Nonzero if last attempt at redisplay on this frame was preempted. */ | |
150 unsigned int display_preempted :1; | |
151 | |
152 /* Nonzero if window is currently iconified. | |
153 This and visible are mutually exclusive. */ | |
154 unsigned int iconified :1; | |
155 | |
156 /* Nonzero if this frame should be cleared and then redrawn. | |
157 Setting this will also effectively set frame_changed. */ | |
158 unsigned int clear :1; | |
159 | |
160 /* True if frame actually has a minibuffer window on it. | |
161 0 if using a minibuffer window that isn't on this frame. */ | |
162 unsigned int has_minibuffer :1; | |
163 | |
164 /* True if frame's root window can't be split. */ | |
165 unsigned int no_split :1; | |
166 | |
167 unsigned int top_toolbar_was_visible :1; | |
168 unsigned int bottom_toolbar_was_visible :1; | |
169 unsigned int left_toolbar_was_visible :1; | |
170 unsigned int right_toolbar_was_visible :1; | |
171 /* gutter visibility */ | |
172 unsigned int top_gutter_was_visible :1; | |
173 unsigned int bottom_gutter_was_visible :1; | |
174 unsigned int left_gutter_was_visible :1; | |
175 unsigned int right_gutter_was_visible :1; | |
176 | |
177 /* redisplay flags */ | |
178 unsigned int buffers_changed :1; | |
179 unsigned int clip_changed :1; | |
180 unsigned int extents_changed :1; | |
181 unsigned int faces_changed :1; | |
182 unsigned int frame_changed :1; | |
905 | 183 unsigned int frame_layout_changed :1; /* The layout of frame |
184 elements has changed. */ | |
872 | 185 unsigned int subwindows_changed :1; |
186 unsigned int subwindows_state_changed :1; | |
187 unsigned int glyphs_changed :1; | |
188 unsigned int icon_changed :1; | |
189 unsigned int menubar_changed :1; | |
190 unsigned int modeline_changed :1; | |
191 unsigned int point_changed :1; | |
192 unsigned int size_changed :1; | |
193 unsigned int toolbar_changed :1; | |
194 unsigned int gutter_changed :1; | |
195 unsigned int windows_changed :1; | |
196 unsigned int windows_structure_changed :1; | |
197 unsigned int window_face_cache_reset :1; /* used by expose handler */ | |
198 unsigned int echo_area_garbaged :1; /* used by Fredisplay_echo_area */ | |
199 unsigned int size_slipped :1; | |
200 | |
201 unsigned int size_change_pending :1; | |
202 unsigned int mirror_dirty :1; | |
203 | |
204 /* flag indicating if any window on this frame is displaying a subwindow */ | |
205 unsigned int subwindows_being_displayed :1; | |
206 }; | |
207 | |
208 /* Redefine basic properties more efficiently */ | |
209 | |
210 #undef FRAME_LIVE_P | |
211 #define FRAME_LIVE_P(f) (!EQ (FRAME_TYPE (f), Qdead)) | |
212 #undef FRAME_DEVICE | |
213 #define FRAME_DEVICE(f) ((f)->device) | |
214 | |
215 #define FRAME_TYPE_P(f, type) EQ (FRAME_TYPE (f), Q##type) | |
216 | |
217 #ifdef ERROR_CHECK_TYPES | |
218 DECLARE_INLINE_HEADER ( | |
219 struct frame * | |
220 error_check_frame_type (struct frame * f, Lisp_Object sym) | |
221 ) | |
222 { | |
223 assert (EQ (FRAME_TYPE (f), sym)); | |
224 return f; | |
225 } | |
226 # define FRAME_TYPE_DATA(f, type) \ | |
227 ((struct type##_frame *) error_check_frame_type (f, Q##type)->frame_data) | |
228 #else | |
229 # define FRAME_TYPE_DATA(f, type) \ | |
230 ((struct type##_frame *) (f)->frame_data) | |
231 #endif | |
232 | |
233 #define CHECK_FRAME_TYPE(x, type) \ | |
234 do { \ | |
235 CHECK_FRAME (x); \ | |
236 if (!FRAME_TYPE_P (XFRAME (x), type)) \ | |
237 dead_wrong_type_argument \ | |
238 (type##_console_methods->predicate_symbol, x); \ | |
239 } while (0) | |
240 #define CONCHECK_FRAME_TYPE(x, type) \ | |
241 do { \ | |
242 CONCHECK_FRAME (x); \ | |
243 if (!FRAME_TYPE_P (XFRAME (x), type)) \ | |
244 x = wrong_type_argument \ | |
245 (type##_console_methods->predicate_symbol, x); \ | |
246 } while (0) | |
247 | |
248 #define FRAME_DISPLAY_P(frm) \ | |
249 (DEVICE_DISPLAY_P (XDEVICE (FRAME_DEVICE (frm)))) | |
250 | |
251 #define CHECK_DISPLAY_FRAME(frm) \ | |
252 do { \ | |
253 CHECK_FRAME (frm); \ | |
254 CHECK_LIVE_FRAME (frm); \ | |
255 CHECK_DISPLAY_DEVICE (FRAME_DEVICE (XFRAME (frm))); \ | |
256 } while (0) | |
257 | |
258 #define CONCHECK_DISPLAY_FRAME(frm) \ | |
259 do { \ | |
260 CONCHECK_FRAME (frm); \ | |
261 CONCHECK_LIVE_FRAME (frm); \ | |
262 CONCHECK_DISPLAY_DEVICE (FRAME_DEVICE (XFRAME (frm))); \ | |
263 } while (0) | |
264 | |
265 #define FRAME_PRINTER_P(frm) \ | |
266 (DEVICE_PRINTER_P (XDEVICE (FRAME_DEVICE (frm)))) | |
267 | |
268 #define CHECK_PRINTER_FRAME(frm) \ | |
269 do { \ | |
270 CHECK_FRAME (frm); \ | |
271 CHECK_LIVE_FRAME (frm); \ | |
272 CHECK_PRINTER_DEVICE (FRAME_DEVICE (XFRAME (frm))); \ | |
273 } while (0) | |
274 | |
275 #define CONCHECK_PRINTER_FRAME(frm) \ | |
276 do { \ | |
277 CONCHECK_FRAME (frm); \ | |
278 CONCHECK_LIVE_FRAME (frm); \ | |
279 CONCHECK_PRINTER_DEVICE (FRAME_DEVICE (XFRAME (frm))); \ | |
280 } while (0) | |
281 | |
282 /* #### These should be in the frame-*.h files but there are | |
283 too many places where the abstraction is broken. Need to | |
284 fix. */ | |
285 | |
286 #define FRAME_X_P(frm) CONSOLE_TYPESYM_X_P (FRAME_TYPE (frm)) | |
287 #define CHECK_X_FRAME(z) CHECK_FRAME_TYPE (z, x) | |
288 #define CONCHECK_X_FRAME(z) CONCHECK_FRAME_TYPE (z, x) | |
289 | |
290 #define FRAME_GTK_P(frm) CONSOLE_TYPESYM_GTK_P (FRAME_TYPE (frm)) | |
291 #define CHECK_GTK_FRAME(z) CHECK_FRAME_TYPE (z, gtk) | |
292 #define CONCHECK_GTK_FRAME(z) CONCHECK_FRAME_TYPE (z, gtk) | |
293 | |
294 #define FRAME_TTY_P(frm) CONSOLE_TYPESYM_TTY_P (FRAME_TYPE (frm)) | |
295 #define CHECK_TTY_FRAME(z) CHECK_FRAME_TYPE (z, tty) | |
296 #define CONCHECK_TTY_FRAME(z) CONCHECK_FRAME_TYPE (z, tty) | |
297 | |
298 #define FRAME_STREAM_P(frm) CONSOLE_TYPESYM_STREAM_P (FRAME_TYPE (frm)) | |
299 #define CHECK_STREAM_FRAME(z) CHECK_FRAME_TYPE (z, stream) | |
300 #define CONCHECK_STREAM_FRAME(z) CONCHECK_FRAME_TYPE (z, stream) | |
301 | |
302 #define FRAME_WIN_P(frm) CONSOLE_TYPESYM_WIN_P (FRAME_TYPE (frm)) | |
303 | |
304 extern int frame_changed; | |
305 | |
306 #define MARK_FRAME_FACES_CHANGED(f) do { \ | |
307 struct frame *mffc_f = (f); \ | |
308 mffc_f->faces_changed = 1; \ | |
309 mffc_f->modiff++; \ | |
310 if (!NILP (mffc_f->device)) \ | |
311 { \ | |
312 struct device *mffc_d = XDEVICE (mffc_f->device); \ | |
313 MARK_DEVICE_FACES_CHANGED (mffc_d); \ | |
314 } \ | |
315 else \ | |
316 faces_changed = 1; \ | |
317 } while (0) | |
318 | |
319 #define MARK_FRAME_GLYPHS_CHANGED(f) do { \ | |
320 struct frame *mfgc_f = (f); \ | |
321 mfgc_f->glyphs_changed = 1; \ | |
322 mfgc_f->modiff++; \ | |
323 if (!NILP (mfgc_f->device)) \ | |
324 { \ | |
325 struct device *mfgc_d = XDEVICE (mfgc_f->device); \ | |
326 MARK_DEVICE_GLYPHS_CHANGED (mfgc_d); \ | |
327 } \ | |
328 else \ | |
329 glyphs_changed = 1; \ | |
330 } while (0) | |
331 | |
332 #define MARK_FRAME_SUBWINDOWS_CHANGED(f) do { \ | |
333 struct frame *mfgc_f = (f); \ | |
334 mfgc_f->subwindows_changed = 1; \ | |
335 mfgc_f->modiff++; \ | |
336 if (!NILP (mfgc_f->device)) \ | |
337 { \ | |
338 struct device *mfgc_d = XDEVICE (mfgc_f->device); \ | |
339 MARK_DEVICE_SUBWINDOWS_CHANGED (mfgc_d); \ | |
340 } \ | |
341 else \ | |
342 subwindows_changed = 1; \ | |
343 } while (0) | |
344 | |
345 #define MARK_FRAME_SUBWINDOWS_STATE_CHANGED(f) do { \ | |
346 struct frame *mfgc_f = (f); \ | |
347 mfgc_f->subwindows_state_changed = 1; \ | |
348 mfgc_f->modiff++; \ | |
349 if (!NILP (mfgc_f->device)) \ | |
350 { \ | |
351 struct device *mfgc_d = XDEVICE (mfgc_f->device); \ | |
352 MARK_DEVICE_SUBWINDOWS_STATE_CHANGED (mfgc_d); \ | |
353 } \ | |
354 else \ | |
355 subwindows_state_changed = 1; \ | |
356 } while (0) | |
357 | |
358 #define MARK_FRAME_TOOLBARS_CHANGED(f) do { \ | |
359 struct frame *mftc_f = (f); \ | |
360 mftc_f->toolbar_changed = 1; \ | |
361 mftc_f->modiff++; \ | |
362 if (!NILP (mftc_f->device)) \ | |
363 { \ | |
364 struct device *mftc_d = XDEVICE (mftc_f->device); \ | |
365 MARK_DEVICE_TOOLBARS_CHANGED (mftc_d); \ | |
366 } \ | |
367 else \ | |
368 toolbar_changed = 1; \ | |
369 } while (0) | |
370 | |
371 #define MARK_FRAME_GUTTERS_CHANGED(f) do { \ | |
372 struct frame *mftc_f = (f); \ | |
373 mftc_f->gutter_changed = 1; \ | |
374 mftc_f->modiff++; \ | |
375 if (!NILP (mftc_f->device)) \ | |
376 { \ | |
377 struct device *mftc_d = XDEVICE (mftc_f->device); \ | |
378 MARK_DEVICE_GUTTERS_CHANGED (mftc_d); \ | |
379 } \ | |
380 else \ | |
381 gutter_changed = 1; \ | |
382 } while (0) | |
383 | |
384 #define MARK_FRAME_SIZE_CHANGED(f) do { \ | |
385 struct frame *mfsc_f = (f); \ | |
386 mfsc_f->size_changed = 1; \ | |
387 mfsc_f->size_change_pending = 1; \ | |
388 mfsc_f->modiff++; \ | |
389 if (!NILP (mfsc_f->device)) \ | |
390 { \ | |
391 struct device *mfsc_d = XDEVICE (mfsc_f->device); \ | |
392 MARK_DEVICE_SIZE_CHANGED (mfsc_d); \ | |
393 } \ | |
394 else \ | |
395 size_changed = 1; \ | |
396 } while (0) | |
397 | |
398 #define MARK_FRAME_CHANGED(f) do { \ | |
399 struct frame *mfc_f = (f); \ | |
400 mfc_f->frame_changed = 1; \ | |
401 mfc_f->modiff++; \ | |
402 if (!NILP (mfc_f->device)) \ | |
403 { \ | |
404 struct device *mfc_d = XDEVICE (mfc_f->device); \ | |
405 MARK_DEVICE_FRAME_CHANGED (mfc_d); \ | |
406 } \ | |
407 else \ | |
408 frame_changed = 1; \ | |
409 } while (0) | |
410 | |
905 | 411 #define MARK_FRAME_LAYOUT_CHANGED(f) do { \ |
412 struct frame *mfc_f = (f); \ | |
413 mfc_f->frame_layout_changed = 1; \ | |
414 mfc_f->modiff++; \ | |
415 if (!NILP (mfc_f->device)) \ | |
416 { \ | |
417 struct device *mfc_d = XDEVICE (mfc_f->device); \ | |
418 MARK_DEVICE_FRAME_LAYOUT_CHANGED (mfc_d); \ | |
419 } \ | |
420 else \ | |
421 frame_layout_changed = 1; \ | |
422 } while (0) | |
423 | |
872 | 424 #define MARK_FRAME_WINDOWS_CHANGED(f) do { \ |
425 struct frame *mfwc_f = (f); \ | |
426 mfwc_f->windows_changed = 1; \ | |
427 mfwc_f->modiff++; \ | |
428 if (!NILP (mfwc_f->device)) \ | |
429 { \ | |
430 struct device *mfwc_d = XDEVICE (mfwc_f->device); \ | |
431 MARK_DEVICE_WINDOWS_CHANGED (mfwc_d); \ | |
432 } \ | |
433 else \ | |
434 windows_changed = 1; \ | |
435 } while (0) | |
436 | |
437 #define MARK_FRAME_WINDOWS_STRUCTURE_CHANGED(f) do { \ | |
438 struct frame *fwsc_f = (f); \ | |
439 fwsc_f->windows_structure_changed = 1; \ | |
440 fwsc_f->modiff++; \ | |
441 if (!NILP (fwsc_f->device)) \ | |
442 { \ | |
443 struct device *fwsc_d = XDEVICE (fwsc_f->device); \ | |
444 MARK_DEVICE_WINDOWS_STRUCTURE_CHANGED (fwsc_d); \ | |
445 } \ | |
446 else \ | |
447 windows_structure_changed = 1; \ | |
448 invalidate_vertical_divider_cache_in_frame (fwsc_f); \ | |
449 } while (0) | |
450 | |
451 #define MARK_FRAME_SIZE_SLIPPED(f) do { \ | |
452 struct frame *fwsc_f = (f); \ | |
453 fwsc_f->size_slipped = 1; \ | |
454 fwsc_f->modiff++; \ | |
455 if (!NILP (fwsc_f->device)) \ | |
456 { \ | |
457 struct device *fwsc_d = XDEVICE (fwsc_f->device); \ | |
458 MARK_DEVICE_FRAME_CHANGED (fwsc_d); \ | |
459 } \ | |
460 else \ | |
461 frame_changed = 1; \ | |
462 } while (0) | |
463 | |
464 #define CLEAR_FRAME_SIZE_SLIPPED(f) do { \ | |
465 struct frame *fwsc_f = (f); \ | |
466 fwsc_f->size_slipped = 0; \ | |
467 } while (0) | |
468 | |
469 #define SET_FRAME_CLEAR(f) MARK_FRAME_CHANGED (f); (f)->clear = 1 | |
470 | |
471 #define FRAME_MINIBUF_ONLY_P(f) \ | |
472 EQ (FRAME_ROOT_WINDOW (f), FRAME_MINIBUF_WINDOW (f)) | |
473 #define FRAME_HAS_MINIBUF_P(f) ((f)->has_minibuffer) | |
474 #define FRAME_HEIGHT(f) ((f)->height) | |
475 #define FRAME_WIDTH(f) ((f)->width) | |
476 #define FRAME_CHARHEIGHT(f) ((f)->char_height) | |
477 #define FRAME_CHARWIDTH(f) ((f)->char_width) | |
478 #define FRAME_PIXHEIGHT(f) ((f)->pixheight) | |
479 #define FRAME_PIXWIDTH(f) ((f)->pixwidth) | |
480 #define FRAME_PAGENUMBER(f) ((f)->page_number + 0) | |
481 #define FRAME_SET_PAGENUMBER(f,x) (f)->page_number = (x); | |
482 #ifdef HAVE_SCROLLBARS | |
483 #define FRAME_SCROLLBAR_WIDTH(f) \ | |
484 (NILP ((f)->vertical_scrollbar_visible_p) ? \ | |
485 0 : XINT ((f)->scrollbar_width)) | |
486 #define FRAME_SCROLLBAR_HEIGHT(f) \ | |
487 (NILP ((f)->horizontal_scrollbar_visible_p) ? \ | |
488 0 : XINT ((f)->scrollbar_height)) | |
489 #else | |
490 #define FRAME_SCROLLBAR_WIDTH(f) 0 | |
491 #define FRAME_SCROLLBAR_HEIGHT(f) 0 | |
492 #endif | |
493 | |
494 #define FRAME_NEW_HEIGHT(f) ((f)->new_height) | |
495 #define FRAME_NEW_WIDTH(f) ((f)->new_width) | |
496 #define FRAME_CURSOR_X(f) ((f)->cursor_x) | |
497 #define FRAME_CURSOR_Y(f) ((f)->cursor_y) | |
498 #define FRAME_VISIBLE_P(f) ((f)->visible) | |
499 #define FRAME_REPAINT_P(f) ((f)->visible>0) | |
500 #define FRAME_NO_SPLIT_P(f) ((f)->no_split) | |
501 #define FRAME_ICONIFIED_P(f) ((f)->iconified) | |
502 #define FRAME_FOCUS_FRAME(f) ((f)->focus_frame) | |
503 #define FRAME_MINIBUF_WINDOW(f) ((f)->minibuffer_window) | |
504 #define FRAME_ROOT_WINDOW(f) ((f)->root_window) | |
505 /* Catch people attempting to set this. */ | |
506 #define FRAME_SELECTED_WINDOW(f) NON_LVALUE ((f)->selected_window) | |
507 #define FRAME_SELECTED_XWINDOW(f) XWINDOW (FRAME_SELECTED_WINDOW (f)) | |
508 #define FRAME_LAST_NONMINIBUF_WINDOW(f) \ | |
509 NON_LVALUE ((f)->last_nonminibuf_window) | |
510 #define FRAME_SB_VCACHE(f) ((f)->sb_vcache) | |
511 #define FRAME_SB_HCACHE(f) ((f)->sb_hcache) | |
512 #define FRAME_SUBWINDOW_CACHE(f) ((f)->subwindow_instance_cache) | |
513 | |
514 #if 0 /* FSFmacs */ | |
515 | |
516 #define FRAME_VISIBLE_P(f) ((f)->visible != 0) | |
517 #define FRAME_SET_VISIBLE(f,p) \ | |
518 ((f)->async_visible = (p), FRAME_SAMPLE_VISIBILITY (f)) | |
519 | |
520 /* Emacs's redisplay code could become confused if a frame's | |
521 visibility changes at arbitrary times. For example, if a frame is | |
522 visible while the desired glyphs are being built, but becomes | |
523 invisible before they are updated, then some rows of the | |
524 desired_glyphs will be left marked as enabled after redisplay is | |
525 complete, which should never happen. The next time the frame | |
526 becomes visible, redisplay will probably barf. | |
527 | |
528 Currently, there are no similar situations involving iconified, but | |
529 the principle is the same. | |
530 | |
531 So instead of having asynchronous input handlers directly set and | |
532 clear the frame's visibility and iconification flags, they just set | |
533 the async_visible and async_iconified flags; the redisplay code | |
534 calls the FRAME_SAMPLE_VISIBILITY macro before doing any redisplay, | |
535 which sets visible and iconified from their asynchronous | |
536 counterparts. | |
537 | |
538 Synchronous code must use the FRAME_SET_VISIBLE macro. | |
539 | |
540 Also, if a frame used to be invisible, but has just become visible, | |
541 it must be marked as garbaged, since redisplay hasn't been keeping | |
542 up its contents. */ | |
543 #define FRAME_SAMPLE_VISIBILITY(f) \ | |
544 (((f)->async_visible && ! (f)->visible) ? SET_FRAME_GARBAGED (f) : 0, \ | |
545 (f)->visible = (f)->async_visible, \ | |
546 (f)->iconified = (f)->async_iconified) | |
547 | |
548 #endif /* FSFmacs */ | |
549 | |
550 #define FRAME_BORDER_WIDTH(f) ((f)->internal_border_width) | |
551 #define FRAME_BORDER_HEIGHT(f) ((f)->internal_border_width) | |
552 | |
553 /* This returns the frame-local value; that tells you what you should | |
554 use when computing the frame size. It is *not* the actual toolbar | |
555 size because that depends on the selected window. Use the macros | |
556 below for that. | |
557 */ | |
558 | |
559 #ifdef HAVE_TOOLBARS | |
560 #define FRAME_RAW_THEORETICAL_TOOLBAR_VISIBLE(f, pos) \ | |
561 (!NILP((f)->toolbar_buttons[pos]) && !NILP ((f)->toolbar_visible_p[pos])) | |
562 #define FRAME_RAW_THEORETICAL_TOOLBAR_SIZE(f, pos) \ | |
563 (!NILP ((f)->toolbar_buttons[pos]) && INTP((f)->toolbar_size[pos]) ? \ | |
564 (XINT ((f)->toolbar_size[pos])) : 0) | |
565 #define FRAME_RAW_THEORETICAL_TOOLBAR_BORDER_WIDTH(f, pos) \ | |
566 (!NILP ((f)->toolbar_buttons[pos]) && INTP((f)->toolbar_border_width[pos]) ? \ | |
567 (XINT ((f)->toolbar_border_width[pos])) : 0) | |
568 #else | |
569 #define FRAME_RAW_THEORETICAL_TOOLBAR_VISIBLE(f, pos) 0 | |
570 #define FRAME_RAW_THEORETICAL_TOOLBAR_SIZE(f, pos) 0 | |
571 #define FRAME_RAW_THEORETICAL_TOOLBAR_BORDER_WIDTH(f, pos) 0 | |
572 #endif | |
573 | |
574 #define FRAME_THEORETICAL_TOOLBAR_SIZE(f, pos) \ | |
575 (FRAME_RAW_THEORETICAL_TOOLBAR_VISIBLE (f, pos) \ | |
576 ? FRAME_RAW_THEORETICAL_TOOLBAR_SIZE (f, pos) \ | |
577 : 0) | |
578 | |
579 #define FRAME_THEORETICAL_TOP_TOOLBAR_HEIGHT(f) \ | |
580 FRAME_THEORETICAL_TOOLBAR_SIZE (f, TOP_TOOLBAR) | |
581 #define FRAME_THEORETICAL_BOTTOM_TOOLBAR_HEIGHT(f) \ | |
582 FRAME_THEORETICAL_TOOLBAR_SIZE (f, BOTTOM_TOOLBAR) | |
583 #define FRAME_THEORETICAL_LEFT_TOOLBAR_WIDTH(f) \ | |
584 FRAME_THEORETICAL_TOOLBAR_SIZE (f, LEFT_TOOLBAR) | |
585 #define FRAME_THEORETICAL_RIGHT_TOOLBAR_WIDTH(f) \ | |
586 FRAME_THEORETICAL_TOOLBAR_SIZE (f, RIGHT_TOOLBAR) | |
587 | |
588 #define FRAME_THEORETICAL_TOOLBAR_BORDER_WIDTH(f, pos) \ | |
589 (FRAME_RAW_THEORETICAL_TOOLBAR_VISIBLE (f, pos) \ | |
590 ? FRAME_RAW_THEORETICAL_TOOLBAR_BORDER_WIDTH (f, pos) \ | |
591 : 0) | |
592 | |
593 #define FRAME_THEORETICAL_TOP_TOOLBAR_BORDER_WIDTH(f) \ | |
594 FRAME_THEORETICAL_TOOLBAR_BORDER_WIDTH (f, TOP_TOOLBAR) | |
595 #define FRAME_THEORETICAL_BOTTOM_TOOLBAR_BORDER_WIDTH(f) \ | |
596 FRAME_THEORETICAL_TOOLBAR_BORDER_WIDTH (f, BOTTOM_TOOLBAR) | |
597 #define FRAME_THEORETICAL_LEFT_TOOLBAR_BORDER_WIDTH(f) \ | |
598 FRAME_THEORETICAL_TOOLBAR_BORDER_WIDTH (f, LEFT_TOOLBAR) | |
599 #define FRAME_THEORETICAL_RIGHT_TOOLBAR_BORDER_WIDTH(f) \ | |
600 FRAME_THEORETICAL_TOOLBAR_BORDER_WIDTH (f, RIGHT_TOOLBAR) | |
601 | |
602 /* This returns the window-local value rather than the frame-local value; | |
603 that tells you about what's actually visible rather than what should | |
604 be used when computing the frame size. */ | |
605 | |
606 #ifdef HAVE_TOOLBARS | |
607 #define FRAME_RAW_REAL_TOOLBAR_VISIBLE(f, pos) \ | |
608 (HAS_FRAMEMETH_P (f, initialize_frame_toolbars) \ | |
609 && !NILP (XWINDOW (FRAME_LAST_NONMINIBUF_WINDOW (f))->toolbar_visible_p[pos])) | |
610 #define FRAME_RAW_REAL_TOOLBAR_BORDER_WIDTH(f, pos) \ | |
611 ((INTP (XWINDOW \ | |
612 (FRAME_LAST_NONMINIBUF_WINDOW (f))->toolbar_border_width[pos])) ? \ | |
613 (XINT (XWINDOW \ | |
614 (FRAME_LAST_NONMINIBUF_WINDOW (f))->toolbar_border_width[pos])) \ | |
615 : 0) | |
616 #define FRAME_RAW_REAL_TOOLBAR_SIZE(f, pos) \ | |
617 ((INTP (XWINDOW \ | |
618 (FRAME_LAST_NONMINIBUF_WINDOW (f))->toolbar_size[pos])) ? \ | |
619 (XINT (XWINDOW \ | |
620 (FRAME_LAST_NONMINIBUF_WINDOW (f))->toolbar_size[pos])) : 0) | |
621 #define FRAME_REAL_TOOLBAR(f, pos) \ | |
622 (XWINDOW (FRAME_LAST_NONMINIBUF_WINDOW (f))->toolbar[pos]) | |
623 #else | |
624 #define FRAME_RAW_REAL_TOOLBAR_VISIBLE(f, pos) 0 | |
625 #define FRAME_RAW_REAL_TOOLBAR_BORDER_WIDTH(f, pos) 0 | |
626 #define FRAME_RAW_REAL_TOOLBAR_SIZE(f, pos) 0 | |
627 #define FRAME_REAL_TOOLBAR(f, pos) Qnil | |
628 #endif | |
629 | |
630 /* Note to Chuck | |
631 Note to Chuck | |
632 Note to Chuck: | |
633 | |
634 The former definitions of FRAME_REAL_FOO_TOOLBAR_VISIBLE | |
635 looked at the toolbar data to see what was there. The | |
636 current ones look at the current values of the specifiers. | |
637 This is a semantic change; the former definition returned | |
638 what was *actually* there right at the moment, while the | |
639 current one returns what *ought* to be there once redisplay | |
640 has run to completion. I think this new definition is more | |
641 correct in almost all circumstances and is much less likely | |
642 to lead to strange race conditions. I'm not completely | |
643 sure that there aren't some places in the redisplay code | |
644 that use these macros and expect the former semantics, so | |
645 if you encounter some odd toolbar behavior, you might want | |
646 to look into this. --ben */ | |
647 | |
648 #define FRAME_REAL_TOOLBAR_VISIBLE(f, pos) \ | |
649 ((!NILP (FRAME_REAL_TOOLBAR (f, pos)) \ | |
650 && FRAME_RAW_REAL_TOOLBAR_SIZE (f, pos) > 0) \ | |
651 ? FRAME_RAW_REAL_TOOLBAR_VISIBLE (f, pos) \ | |
652 : 0) | |
653 #define FRAME_REAL_TOOLBAR_SIZE(f, pos) \ | |
654 ((!NILP (FRAME_REAL_TOOLBAR (f, pos)) \ | |
655 && FRAME_RAW_REAL_TOOLBAR_VISIBLE (f, pos)) \ | |
656 ? FRAME_RAW_REAL_TOOLBAR_SIZE (f, pos) \ | |
657 : 0) | |
658 #define FRAME_REAL_TOOLBAR_BORDER_WIDTH(f, pos) \ | |
659 ((!NILP (FRAME_REAL_TOOLBAR (f, pos)) \ | |
660 && FRAME_RAW_REAL_TOOLBAR_VISIBLE (f, pos)) \ | |
661 ? FRAME_RAW_REAL_TOOLBAR_BORDER_WIDTH (f, pos) \ | |
662 : 0) | |
663 | |
664 #define FRAME_REAL_TOP_TOOLBAR_HEIGHT(f) \ | |
665 FRAME_REAL_TOOLBAR_SIZE (f, TOP_TOOLBAR) | |
666 #define FRAME_REAL_BOTTOM_TOOLBAR_HEIGHT(f) \ | |
667 FRAME_REAL_TOOLBAR_SIZE (f, BOTTOM_TOOLBAR) | |
668 #define FRAME_REAL_LEFT_TOOLBAR_WIDTH(f) \ | |
669 FRAME_REAL_TOOLBAR_SIZE (f, LEFT_TOOLBAR) | |
670 #define FRAME_REAL_RIGHT_TOOLBAR_WIDTH(f) \ | |
671 FRAME_REAL_TOOLBAR_SIZE (f, RIGHT_TOOLBAR) | |
672 | |
673 #define FRAME_REAL_TOP_TOOLBAR_BORDER_WIDTH(f) \ | |
674 FRAME_REAL_TOOLBAR_BORDER_WIDTH (f, TOP_TOOLBAR) | |
675 #define FRAME_REAL_BOTTOM_TOOLBAR_BORDER_WIDTH(f) \ | |
676 FRAME_REAL_TOOLBAR_BORDER_WIDTH (f, BOTTOM_TOOLBAR) | |
677 #define FRAME_REAL_LEFT_TOOLBAR_BORDER_WIDTH(f) \ | |
678 FRAME_REAL_TOOLBAR_BORDER_WIDTH (f, LEFT_TOOLBAR) | |
679 #define FRAME_REAL_RIGHT_TOOLBAR_BORDER_WIDTH(f) \ | |
680 FRAME_REAL_TOOLBAR_BORDER_WIDTH (f, RIGHT_TOOLBAR) | |
681 | |
682 #define FRAME_REAL_TOP_TOOLBAR_VISIBLE(f) \ | |
683 FRAME_REAL_TOOLBAR_VISIBLE (f, TOP_TOOLBAR) | |
684 #define FRAME_REAL_BOTTOM_TOOLBAR_VISIBLE(f) \ | |
685 FRAME_REAL_TOOLBAR_VISIBLE (f, BOTTOM_TOOLBAR) | |
686 #define FRAME_REAL_LEFT_TOOLBAR_VISIBLE(f) \ | |
687 FRAME_REAL_TOOLBAR_VISIBLE (f, LEFT_TOOLBAR) | |
688 #define FRAME_REAL_RIGHT_TOOLBAR_VISIBLE(f) \ | |
689 FRAME_REAL_TOOLBAR_VISIBLE (f, RIGHT_TOOLBAR) | |
690 | |
691 #define FRAME_TOP_BORDER_START(f) \ | |
692 (FRAME_REAL_TOP_TOOLBAR_HEIGHT (f) + \ | |
693 2 * FRAME_REAL_TOP_TOOLBAR_BORDER_WIDTH (f)) | |
694 #define FRAME_TOP_BORDER_END(f) \ | |
695 (FRAME_TOP_BORDER_START (f) + FRAME_BORDER_HEIGHT (f)) | |
696 | |
697 #define FRAME_BOTTOM_BORDER_START(f) \ | |
698 (FRAME_PIXHEIGHT (f) - FRAME_BORDER_HEIGHT (f) - \ | |
699 FRAME_REAL_BOTTOM_TOOLBAR_HEIGHT (f) - \ | |
700 2 * FRAME_REAL_BOTTOM_TOOLBAR_BORDER_WIDTH (f)) | |
701 #define FRAME_BOTTOM_BORDER_END(f) \ | |
702 (FRAME_PIXHEIGHT (f) - FRAME_REAL_BOTTOM_TOOLBAR_HEIGHT (f) - \ | |
703 2 * FRAME_REAL_BOTTOM_TOOLBAR_BORDER_WIDTH (f)) | |
704 | |
705 #define FRAME_LEFT_BORDER_START(f) \ | |
706 (FRAME_REAL_LEFT_TOOLBAR_WIDTH (f) + \ | |
707 2 * FRAME_REAL_LEFT_TOOLBAR_BORDER_WIDTH (f)) | |
708 #define FRAME_LEFT_BORDER_END(f) \ | |
709 (FRAME_LEFT_BORDER_START (f) + FRAME_BORDER_WIDTH (f)) | |
710 | |
711 #define FRAME_RIGHT_BORDER_START(f) \ | |
712 (FRAME_PIXWIDTH (f) - FRAME_BORDER_WIDTH (f) - \ | |
713 FRAME_REAL_RIGHT_TOOLBAR_WIDTH(f) - \ | |
714 2 * FRAME_REAL_RIGHT_TOOLBAR_BORDER_WIDTH (f)) | |
715 #define FRAME_RIGHT_BORDER_END(f) \ | |
716 (FRAME_PIXWIDTH (f) - FRAME_REAL_RIGHT_TOOLBAR_WIDTH (f) - \ | |
717 2 * FRAME_REAL_RIGHT_TOOLBAR_BORDER_WIDTH(f)) | |
718 | |
719 #endif /* INCLUDED_frame_impl_h_ */ |