* doc.c (Fsubstitute_command_keys): Ask get_keymap_1 to
perform autoloads. Autoloading might GC; we need to GCPRO our
local variables now.
(Fdocumentation, Fdocumentation_property): Autoloading in
Fsubstitute_command_keys might GC; we need to GCPRO our
local variables now.
return a Lisp_Object. Add static declaration for this
before Fset_case_table and Fset_standard_case_table.
(Fset_case_table, Fset_standard_case_table): Return the return
value of set_case_table, instead of returning garbage.
first time the user quits, or SIGKILL if the user quits again.
#include "syssignal.h".
(call_process_kill): New function.
(call_process_cleanup): Send SIGINT to the subprocess, and then
arrange to call call_process_kill if the user quits while we wait
for it to terminate.
(Fcall_process, Fcall_process_region): Doc fix.
bytestr.
* bytecode.c (Fbyte_code): When metering the Bcall opcodes, make
sure the count on the symbol's `byte-code-meter' property does not
overflow.
* bytecode.c (syms_of_bytecode): Add a docstring for
byte-metering-on.
(Fcall_interactively): Preserve fns listed in preserved_fns
when they appear in an interactive spec which is a call to `list'.
(syms_of_callint): Set preserved_fns and staticpro it.
(r_alloc_sbrk): Provide hysteresis in relocating the blocs.
(relinquish): Never free less than extra_bytes;
keep extra_bytes of empty space.
(obtain): Always get extra_bytes additional space.
(r_alloc_init): Set extra_bytes and page_size.
(ALIGNED, ROUNDUP, ROUND_TO_PAGE): Use page_size.
* (Flive_window_p): New function.
(Qlive_window_p): New variable, to name it in type errors.
(syms_of_window): Defsubr Slive_window_p, init and staticpro
Qlive_window_p.
(decode_window): Use CHECK_LIVE_WINDOW instead of
CHECK_WINDOW; the only thing a user should be able to do to a dead
window is check its type.
(Fcoordinates_in_window_p, Fnext_window, Fprevious_window,
Fdelete_other_windows, Fselect_window, Fsplit_window,
Fscroll_other_window): Use CHECK_LIVE_WINDOW instead of
CHECK_WINDOW.
(Fdelete_window): If WINDOW is a deleted window, do nothing;
there's no harm in allowing people to delete deleted windows.
Delete all of WINDOW's subwindows, too.
(delete_all_subwindows): Set the buffer, vchild, and hchild of the
windows we delete all to nil.
* window.c (Fwindow_minibuffer_p): Make the WINDOW argument
optional, like all the other window-querying functions.
* window.c (Fpos_visible_in_window_p): Use decode_window to handle
the WINDOW argument, instead of writing out that function's code.
* window.c (check_frame_size): Don't define this extern; that
doesn't mean anything.
* window.c (Fdelete_window): Choose an alternative when we delete
any frame's selected window, not just when we delete the selected
frame's selected window.
keymap-scanning loop. Don't treat vectors as binding tables if
they're the wrong length.
* keymap.c (store_in_keymap): Don't forget to QUIT in the
keymap-scanning loop. Don't treat vectors as binding tables if
they're the wrong length.
an array of Lisp_Objects.
(this_command_keys_size): Deleted.
(echo, add_command_key, Fthis_command_keys): Adjusted
appropriately.
(init_keyboard): Don't allocate it here.
(syms_of_keyboard): Allocate it here, and staticpro it.
* keyboard.c (read_char): Call ourselves with the appropriate
number of arguments.
(read_char_menu_prompt): If USED_MOUSE_MENU is zero, don't try to
store things in it.
* keyboard.c (modify_event_symbol): Arrange to set the
click_modifier bit on otherwise unmodified mouse clicks.
* keyboard.c (kbd_buffer_get_event): Remember that
*mouse_position_hook may set *FRAME to 0; don't generate
switch-frame events in this case. Fix fencepost bug in fetching
events from keyboard buffer.
(XTread_socket): Pass it by reference to XLookupString.
* xterm.c: Clean up some of the caps lock handling:
(x_shift_lock_mask): New variable.
(x_find_modifier_mappings): Set it, based on the modifier mappings.
(x_convert_modifiers): Use x_shift_lock_mask, instead of assuming
that the lock bit always means to shift the character.
(XTread_socket): When handling KeyPress events, don't pass an
XComposeStatus structure along to XLookupString. When handling
MappingNotify events, call XRefreshKeyboardMapping for both
MappingModifier and MappingKeyboard events, not just the latter.
(check_memory_limits): New fn; most code from morecore_with_warning, but
only checks limits, doesn't do any work.
(memory_warnings): Set __after_morecore_hook to check_memory_limits;
don't set __morecore.
Removed elements `nruns' and `face_list'.
LINE_HEIGHT and LINE_WIDTH macros removed.
New struct face with associated typedef FACE declared, along with
accessing macros.
`nruns' and 'face_list' removed. Handle new element `max_ascent'.
(free_frame_glyphs): Don't free nonexistent elements `nruns' and
`face_list'; do free `max_ascent' element.
(make_frame_glyphs): Don't allocate nonexistent elements `nruns'
and `face_list'; do allocate `max_ascent' element.
(update_frame): Replaced use of macro LINE_HEIGHT with element
frame element `pix_height'.
[emacs]: Moved #undef NULL and #include "getpagesize.h" here.
[! emacs]: #include <unistd.h>, <malloc.h>, <string.h>.
(r_alloc_init): Use NIL, not NULL.
(real_morecore): New static variable.
(warnlevel, warn_function, check_memory_limits): Removed.
(obtain): Don't call check_memory_limits.
(obtain, relinquish, r_alloc_sbrk): Use (*real_morecore) in place of sbrk;
it returns 0 for errors, not -1.
(r_alloc_init): Set real_morecore to old value of __morecore.
Don't initialize lim_data or warnlevel, and don't call get_lim_data.
(memory_warnings): Function removed.
(memory_warnings): Renamed from malloc_init.
Don't set lim_data or warnlevel. Use start_of_data if start is 0.
[!emacs]: Don't include config.h or lisp.h;
instead, use stddef.h. Define POINTER, SIZE, EXCEEDS_LISP_PTR.
(morecore_with_warning): Use EXCEEDS_LISP_PTR.
(memory_warnings): New function; just set warning data.
Use start_of_data if start is 0.
[!emacs]: Don't include config.h or lisp.h;
instead, use stddef.h. Define POINTER, SIZE, EXCEEDS_LISP_PTR.
[!emacs] (safe_bcopy): Define as macro using memmove.
(r_alloc_free): Clear *ptr.
(r_alloc_init): Renamed from malloc_init. Take no args.
Make it static; declare at top of file.
(r_alloc): Call r_alloc_init, if not initialized yet.
(r_alloc_initialized): Renamed from malloc_initialized; moved to top.
(ROUNDUP): Subtract 1, in case arg is already aligned.
(check_memory_limits): EXCEEDS_LISP_PTR renamed from EXCEEDS_ELISP_PTR.
non-ascii keys.
* keymap.c (access_keymap): Treat bindings for Qt as default
bindings, when new argument T_OK is non-zero.
(get_keyelt, Fdefine_key, Flookup_key): Call access_keymap with
T_OK false.
when MULTI_FRAME isn't #defined. People might find it
necessary for writing correct programs, even when the programs
don't explicitly use multiple frames.
(read_char, kbd_buffer_store_event, kbd_buffer_get_event): No need
to test MULTI_FRAME before setting Vlast_event_frame.
(syms_of_keyboard): DEFVAR Vlast_event_frame whether or not
MULTI_FRAME is defined.
* keyboard.c: Add switch-frame events.
(Qswitch_frame): New event header symbol.
(head_table): Include Qswitch_frame in the table of event heads.
(kbd_buffer_get_event): Detect when a frame switch has occurred,
and return a frame switch event before the enqueued event.
(make_lispy_switch_frame): New function.
(unread_switch_frame): New variable.
(read_key_sequence): Don't throw away the key sequence if the user
switches frames in the middle of the sequence. Instead, when we
receive a switch-frame event in the middle of a key sequence, save
it, and stuff it into unread_switch_frame when the sequence
is complete.
(read_char): If unread_switch_frame is set, return that value.
(command_loop_1): No need to check Vlast_event_frame and select
new frames here; that's taken care of by switch-frame events now.
(syms_of_keyboard): Initialize and staticpro unread_switch_frame.
* keyboard.c (follow_key, read_key_sequence): Call access_keymap
with T_OK true.
* keyboard.c (apply_modifiers): Copy the value of BASE's
Qevent_kind property to the new symbol.
* keyboard.c (syms_of_keyboard): Qevent_kind should be initialized
to intern ("event-kind"), not intern ("event-type").
(Fselect_frame): Make this interactive, and accept
switch-frame events as arguments, so we can bind this function to
switch-frame events.
(keys_of_frame): New function; bind switch-frame to Fselect_frame.
areas as if they were prefixed with the symbol denoting the
area clicked on - `mode-line', etcetera.
When we throw away an unbound `down-' event, reset mock_input as
well.
* keyboard.c (Qevent_symbol_element_mask, Qmodifier_cache): Two
new symbols, used to implement caches on event heads. These take
the place of some of the caching that modify_event_symbol used to do.
(parse_modifiers_uncached, apply_modifiers_uncached,
lispy_modifier_list, parse_modifiers, apply_modifiers): New
functions, which replace format_modifiers and reorder_modifiers;
they can be useful elsewhere too.
(reorder_modifiers, modify_event_symbol): Re-implement these in
terms of parse_modifiers and apply_modifiers. modify_event_symbol
now uses a much simpler cache, and takes advantage of the caches
maintained by parse_ and apply_modifiers.
(follow_key): Don't modify NEXT if KEY has no bindings.
(read_key_sequence): Drop unbound `down-' events, and turn unbound
`drag-' events into clicks if that would make them bound. This
benefits from the rewriting of the modifier key handling code.
(syms_of_keyboard): Initialize and intern
Qevent_symbol_element_mask and Qmodifier_cache.
* keyboard.c (echo_prompt): Terminate the echo buffer properly
even when the string is too long to display in the minibuffer.
(echo_truncate): Just return echoptr - echobuf, rather than
calling strlen on echobuf.
* keyboard.c (modifier_names): The modifier is named "control",
not "ctrl".
instead of just saying it's 7; that way, we won't get screwed if
we add members to struct save_window_data.
* window.c (Fset_window_configuration): The pointer to the
saved window data is called `data', not just `d'.
frame, too.
(Fset_window_configuration): Restore the frame's selected window
using Fselect_window, and then restore the selected frame using
Fselect_frame.
(Fcurrent_window_configuration): Record the currently selected
frame. Update docstring to describe the information now recorded.
* window.c (Fset_window_configuration): Clean up the way we save
and restore the frame's size.
* window.c (struct save_window_data): Add a member called
focus_frame, to save and restore the screen's focus frame.
(Fset_window_configuration): Redirect the frame's focus as
indicated in the window configuration.
(Fcurrent_window_configuration): Record the frame's current focus.
modifiers containing a Meta_ keysym, use the Alt keysyms to
denote meta.
(construct_mouse_click): Set the down_modifier bit on mouse
button press events.
(XTread_socket): When processing keypress events, use
x_meta_mod_mask when processing ordinary ASCII characters, not
just when processing function keys and other non-ASCII events.
(XTread_socket): If we receive a MappingNotify event with the
`request' member set to `MappingModifier', then call
x_find_modifier_meanings to refresh x_meta_mod_mask.
event header gets the proper properties set on it, by recursing
and letting the same code build the properties for all event symbols.
* keyboard.c (Qmouse_click): Fix typo which assigned `mouse-click'
symbol to Qmouse_movement.
frame's focus, and have read_minibuf_unwind restore it; saving and
restoring the window configurations will take care of that.
(read_minibuf_unwind): Don't worry about restoring the frame's focus.
are not 5 elements long.
(EVENT_HEAD): Work correctly on all sorts of events, not just
events with parameters.
(EVENT_WINDOW, EVENT_BUFFER_POSN, EVENT_SCROLLBAR_BUTTON,
EVENT_WINDOW_POSN, EVENT_TIMESTAMP): These aren't useful
anymore; this information may appear twice in an event. These
are replaced by the POSN_ accessors, which are meant to be
composed with the EVENT_START and EVENT_END accessors.
(EVENT_START, EVENT_END): Two new accessors, to get at the
starting and ending position of an event.
(POSN_WINDOW, POSN_BUFFER_POSN, PONS_SCROLLBAR_BUTTON,
POSN_WINDOW_POSN, POSN_TIMESTAMP): New macros, to futher
diasassemble the values returned by EVENT_START and EVENT_END.
* keyboard.h (Qevent_unmodified): Extern declaration replaced by...
(Qevent_symbol_elements): This.
(EVENT_HEAD_UNMODIFIED): Use the Qevent_symbol_elements
property, rather than the Qevent_unmodified property.
testing for EVENT_HAS_PARAMETERS; EVENT_HEAD works properly on
all sorts of events now.
(read_key_sequence): Use the new accessors to decide in which window
an event occurred.
* keyboard.c (Qevent_unmodified): Replaced by...
(Qevent_symbol_elements): New property.
(syms_of_keyboard): initialize and staticpro the latter, not the
former.
* keyboard.c (readable_events): This doesn't need to scan and
discard mouse release events anymore; it just uses
EVENT_QUEUES_EMPTY.
(kbd_buffer_get_event): No need to skip past mouse release events.
* keyboard.c (button_down_location): New variable, which
stores the location at which each button was pressed, so we
can build a complete drag event when the button is released.
(make_lispy_event): When a button is pressed, record its
location in button_down_location, and turn it into a `down'
event. When a button is released, compare its release
location with its press location, and decide whether to call
it a `click' or `drag' event.
Change mouse movement events to be arranged like click events.
(format_modifiers): Note that the click modifier has no
written representation.
(modifier_names, modifer_symbols): New variables, used to
create the Qevent_symbol_elements property.
(modify_event_symbol): Change the format of the modified
symbol cache; there are too many modifier bits now to use a
vector indexed by a modifier mask. Use an assoc-list instead.
Document the format of the cache.
Put the Qevent_symbol_elements property on each new symbol,
instead of a Qevent_unmodified property.
(symbols_of_keyboard): Put Qevent_symbol_elements properties on
the symbols specified in head_table, not Qevent_unmodifed properties.
Initialize and staticpro modifier_symbols, and staticpro the
window elements of button_down_location.
(init_intervals, make_interval,
mark_interval, mark_interval_tree): New functions conditionally
defined.
(make_uninit_string): Call INITIALIZE_INTERVAL.
(INIT_INTERVALS, UNMARK_BALANCE_INTERVALS, MARK_INTERVAL_TREE):
New macros, conditionally defined.
(mark_object): Call MARK_INTERVAL_TREE in case Lisp_String.
(gc_sweep): If text properties are in use, place all unmarked
intervals on the free list. Call UNMARK_BALANCE_INTERVALS on
`buffer->intervals' when unmarking `buffer'.
(compact_strings): Include INTERVAL_PTR_SIZE in calculation for
target of bcopy when relocating strings.
(init_alloc_once): Call INIT_INTERVALS.
(make_pure_string): Include INTERVAL_PTR_SIZE in calculation of
`size'.
and TEMP_SET_PT are function calls.
Similarly for BUF_SET_PT and BUF_TEMP_SET_PT.
Added DECLARE_INTERVALS to buffer structure to conditionally
compile an interval tree into it..
just because we restored its configuration.
* window.c (Fset_window_configuration): Don't forget to set the
frame's selected window when we can't call Fselect_window.
modifier bits denote meta keys.
(x_find_modifier_meanings): New function, to set x_meta_mod_mask.
(x_convert_modifiers): Use that.
(x_term_init): Call x_find_modifier_meanings.
* xterm.c (XTread_socket): Pass PropertyNotify events from the
root window to x_invalidate_cut_buffer_cache.
(x_term_init): Call x_watch_cut_buffer_cache here.
interface to the cut buffer now.
(NUM_CUT_BUFFERS, cut_buffer_atom, cut_buffer_value,
cut_buffer_cached, cut_buffer_just_set): New variables.
(Fx_own_selection, Fx_selection_value): Dike out the code to
handle CUT_BUFFER0 requests.
(Fx_get_cut_buffer, Fx_set_cut_buffer, x_watch_cut_buffer_cache,
x_invalidate_cut_buffer_cache): New functions.
(syms_of_xselect): Don't bother to initialize Qcut_buffer0.
Initialize and staticpro cut_buffer_value, and defsubr
Sx_get_cut_buffer and Sx_set_cut_buffer.
* xterm.c (XTread_socket): Pass PropertyNotify events from the
root window to x_invalidate_cut_buffer_cache.
(x_term_init): Call x_watch_cut_buffer_cache here.
pain in the neck to staticpro, into a vector, which is easier.
(read_char, Frecent_keys): Access recent_keys as a lisp vector,
not a C array.
(init_keyboard): Set recent_keys to be a vector, and staticpro
it.
buried only if the BUFFER argument was nil. Instead, undisplay the
buffer whenever it's displayed in the selected window, no matter
how it was specified by BUFFER. This is how it behaves in 18.58,
and I can't find any ChangeLog entry in 18.58 or 19.0 saying why
they differ. Fix the doc string accordingly.
handle memory exhaustion, it's better to return an error code to
them than to call abort.
(obtain): If we cannot allocate more memory, don't call
abort. Instead, return non-zero iff the allocation is successful.
(get_more_space): If obtain fails, return zero.
(get_bloc): Return zero if we can't allocate the new bloc.
(r_alloc_sbrk): Return zero if we can't allocate more memory.
(r_alloc): If we can't allocate more memory, set *PTR to zero and
return zero.
(r_re_alloc): If we can't allocate more memory, leave *PTR
unchanged, and return zero.
* ralloc.c (warnfunction): Renamed to warn_function; users changed.
macro, set Vlast_event_frame to Qmacro, instead of leaving it set
to the frame of the previous real event.
(read_key_sequence): If Vlast_event_frame isn't a frame, don't
bother switching buffers.
(syms_of_keyboard): Doc fix for Vlast_event_frame.
(Vlast_event_frame): Doc fix.
* keyboard.c (format_modifiers, reorder_modifiers): Handle the new
modifier bits.
down_modifier, drag_modifier): New modifiers, to support the new
input system. Re-arranged modifiers so that their bits are in
canonical order; this makes reorder_modifiers slightly simpler.
its `height' field; we may need to know the window's old buffer
once we have restored it from a window configuration.
Fset_window_configuration): When we restore a window, if its
`height' field is a buffer, restore its `buffer' field from that.
This allows us to leave the window's buffer unchanged if the
buffer recorded in the configuration is dead.
* window.c (delete_all_subwindows): Removed unused variable named
"count".
Qt.
* keymap.c (Fwhere_is_internal): Don't forget to advance map to
the next element when we find something that is neither a vector
nor a cons. Don't forget to QUIT in the appropriate places,
either.
(keymap_table): Function removed; this function exists only to
support an incorrect understanding of the format of keymaps.
(access_keymap, store_in_keymap, Fcopy_keymap,
Faccessible_keymaps): Correctly handle vectors at any point in the
keymap; don't assume it must be at the front.
(describe_map): Instead of calling describe_vector on the vector
in the cadr of the keymap (if present) and then calling
describe_alist to do the rest, just call describe_map_2.
(describe_alist): Renamed to describe_map_2; call describe_vector
when we encounter a vector in the list.
* keymap.c (access_keymap, store_in_keymap): Clarify error message
for non-ASCII characters.
* keymap.c (access_keymap): Return the binding of Qt as the
binding for all unbound characters.
(create_process): #if 0 out the code which sets the child's
handler for SIGCHLD to sigchld; the code which gives sigchld its
value has been diked out under these CPP symbols, so this should
be diked out too.
set the subshell's priority to normal; nice doesn't return a
defined value on all systems. Instead, since emacs_priority gives
the priority that Emacs was nastied to, we can use it to reset the
priority in a straightforward way.
[BSD4_1], [USG], [VMS] (setpriority): Remove dummy and
compatibility definitions of setpriority.
argument, which specifies the value to return to the catch, or the
data to give to the condition handler. Renamed to
unwind_to_catch, to reflect new role.
(Fsignal, Fthrow): Removed code to set catch tag value and do the
long-jump; this is taken care of by unwind_to_catch.
of this structure; it is always equal to the poll_suppress_count
of its catchtag structure. The non-local exit code in eval.c is
difficult enough to understand as it is; needless duplication
doesn't help.
* lisp.h (struct specbinding, struct handler): More documentation.
about setting h.poll_suppress_count; it's guaranteed to be the
same as c.poll_suppress_count.
(internal_condition_case): Don't worry about
h.poll_suppress_count.
(Fsignal): Use h->tag->poll_suppress_count instead of
h->poll_suppress_count.
* eval.c (Fsignal): It's okay for the debugger to return to the
caller if the caller was signalling a quit.
* eval.c (unbind_catch): Restore the polling suppression count
here, instead of in Fsignal and Fthrow.
(Fthrow, Fsignal): Don't restore the polling suppression count here.
* eval.c (struct catchtag): More documentation.
* eval.c (entering_debugger): Variable renamed
when_entered_debugger, and is now a timestamp based on
num_nonmacro_input_chars.
(init_eval): Initialize when_entered_debugger, not
entering_debugger.
(call_debugger): Set when_entered_debugger to the current value of
num_nonmacro_input_chars.
(find_handler_clause): Don't call debugger unless
num_nonmacro_input_chars is greater than when_entered_debugger;
that way, we won't call the debugger unless the user has had a
chance to take control.
(Fbacktrace): Don't clear entering_debugger here.
(Fverify_visited_file_modtime):
Pass buffer itself to handler, if have handler.
(Fwrite_region): GCPRO around Fexpand_file_name, Ffie_name_directory.
(Fread_file_name_internal): GCPRO around file name manip.
(Ffile_writable_p, Ffile_readable_p): Use abspath, not filename,
(Ffile_executable_p, Ffile_exists_p): to run the handler.
(Fset_file_modes, Ffile_directory_p, Ffile_modes): Likewise.
(Ffile_newer_than_file_p): GCPRO around expand_and_dir_to_file.
if comment-end is 2 chars, assume it does end a comment.
Otherwise, scan back to previous comment-end to see if there's
a comment starter between. Also record whether the string quotes
between the start and the end are paired and uniform.
If so, skip to comment starter. If not, scan from start of
defun to find comment starter if any.
(find_defun_start): New function.
members of size_hints, if they're available (X11R4 and after);
otherwise, approximate the right thing, by using min_width and
min_height as the base size.
* xterm.c (x_catch_errors): Don't forget to initialize
x_caught_error_message to the null string, so x_check_errors can
tell when an error has occurred.
insists on defining SIGCHLD, even if it already has a definition.
(file_p): Use the constant 4 instead of R_OK; empirically, the
number is more portable than the symbol if you count the #include
hair you have to go through to get R_OK defined. Ffile_readable_p
does this too.
* xrdb.c (getuid): Declare this to return short.
if specified, return the minibuffer used by that frame.
* window.c (Fset_window_configuration): Don't signal an error
if the frame size saved in the window configuration doesn't
match the frame's current size; instead, temporarily resize
the frame while installing the window configuration. This is
important because using the minibuffer saves and restores the
current window configuration, and you don't want to signal an
error just because the user resized the frame while using the
minibuffer.
the format used by describe_map_tree. Also, don't reprint the
"key binding" header above the global bindings if we've already
printed it for the local bindings; it's clear enough that the
columns mean the same thing as above.
* keymap.c (describe_buffer_bindings): Declare buf and bufend...
* keymap.c (describe_buffer_bindings): Set the current buffer to
descbuf before calling current_minor_maps; that function's value
depends on the values of buffer-local variables. Don't set the
current buffer to Vstandard_output until afterwards.
* keymap.c (describe_buffer_bindings): If
Vkeyboard_translate_table is in effect, describe its effects.
FRAME_FOCUS_FRAME redirection, don't modify the frame field of
the event; that fatally corrupts mouse click events. Instead,
just perform the redirection on the value assigned to
Vlast_event_frame.
* keyboard.c (input_available_signal): Declare this to return
SIGTYPE.
code, in favor of 'e'; that's a better name.
* callint.c (Fcall_interactively): Don't try to get the
`enable-recursive-minibuffers' property from FUNCTION unless
FUNCTION is actually a symbol; there are some cases where a key
sequence is bound directly to a lambda form, and there's no reason
to break these.
value, function, and property list rather than before; this way,
symbols' names are readable, giving us a chance to detect some
kinds of heap corruption.
(Ffile_name_as_directory, Fdirectory_file_name, Fexpand_file_name):
Call find_file_handler.
(syms_of_fileio): Set up Qfile_name_directory, etc.
(Fcopy_file): Call find_file_handler for newname as well as for filename.
(read_char): Use num_nonmacro_input_chars to decide on auto-save & gc.
Increment it when appropriate.
(record_auto_save): Use num_nonmacro_input_chars.
end of the heap, copying the data to it, and then freeing the
original bloc, just expand the original block. This saves a copy
and a call to sbrk, and also removes the large spike in memory
allocation that would occur when resizing large buffers. And it's
less code.
Don't modify comstyle inside that loop.
If string quotes don't match up, don't take value from OFROM;
instead, parse forward using scan_sexps_forward.
(scan_sexps_forward): Return value via a pointer passed in.
New element in state contains char addr of last comment-starter seen.
(Fparse_partial_sexp): Change call to scan_sexps_forward.
(syms_of_keyboard): New Lisp var.
(read_key_sequence): Use that instead of prev_event.
(read_char): Call read_char_menu_prompt here.
Accept 4 new args to pass to it. Include them in recursive call.
Don't delay before starting echo if prev_event was a mouse event.
Test for eof in batch mode now understands C is a Lisp_Object.
(read_key_sequence): Don't call it here; always call read_char.
Don't change last_event_buffer after a mouse menu input.
(read_char_menu_prompt): Arg PROMPT deleted.
Return nil if nothing to do.
(read_key_sequence): Keep track of prev_event.
Pass new proper args to read_char_menu_prompt.
(read_char_menu_prompt): New arg prev_event. Use Fx_popup_menu.
Handle any number of keymaps, not just LOCAL and GLOBAL.
Invert meaning of arg PROMPT. Test of menu_prompting was backwards.
(keymap_table): No longer static.
(Fx_popup_menu): Treat coords relative to spec'd window.
(single_keymap_panes): New function; contains guts of keymap_panes.
If a command binding for submenu has a prompt string starting with @,
make a separate pane for it at this level.
(keymap_panes): New function.
(Fx_popup_menu): Accept keymap or list of keymaps as MENU argument.
Accept mouse button event as POSITION argument.
return value of XWithdrawWindow; it could indicate that the window
wasn't successfully redrawn.
* xterm.c (x_make_frame_invisible): Use XWithdrawWindow when
available [HAVE_X11R4]; send the UnmapNotify event when
appropriate [HAVE_X11]; just unmap the window if that's all that's
needed [not HAVE_X11].
* xterm.c (x_set_text_property): Removed; it's only called from
one place. Who wants *another* layer of indirection?
* xterm.c: Use the FRAME_X_WINDOW macro, for readability.
* xterm.c (x_death_handler): Renamed to x_connection_closed.
(x_term_init): Use x_connection_closed as the SIGPIPE handler.
* xterm.c (acceptable_x_error_p, x_handler_error_gracefully,
x_error_handler): Removed; you can't catch X errors this way,
since you can't perform X operations from within an X error
handler, and even though we call error, we're still within an X
error handler.
(x_error_quitter, x_error_catcher): New functions, for panicking
on and catching X protocol errors.
(x_caught_error_message): Buffer for caught X errors.
(x_catch_errors, x_check_errors, x_uncatch_errors): New functions
for catching errors.
(x_term_init): Set the error handler to x_error_quitter, rather
than x_error_handler.
* xterm.c (x_death_handler): Renamed to x_connection_closed.
(x_term_init): Use x_connection_closed as the SIGPIPE handler.
* xterm.c (acceptable_x_error_p, x_handler_error_gracefully,
x_error_handler): Removed; you can't catch X errors this way,
since you can't perform X operations from within an X error
handler, and even though we call error, we're still within an X
error handler.
(x_error_quitter, x_error_catcher): New functions, for panicking
on and catching X protocol errors.
(x_caught_error_message): Buffer for caught X errors.
(x_catch_errors, x_check_errors, x_uncatch_errors): New functions
for catching errors.
(x_term_init): Set the error handler to x_error_quitter, rather
than x_error_handler.
hasn't specified the icon position. Let the window manager put
the icon where it likes.
* xfns.c (x_set_name): Use XSetWM{Name,IconName} when available
[HAVE_X11R4], or XSetIconName and XStoreName otherwise.
* xfns.c: Use the FRAME_X_WINDOW for readability.
* xfns.c (x_set_mouse_color): Use x_catch_errors, x_check_errors,
and x_uncatch errors to avoid crashing if the user selects an
odd cursor.
* xfns.c (select_visual): Use XVisualIDFromVisual when available
[HAVE_X11R4].
one-line windows are the minibuffer, or that all minibuffers are
one line high. Use MINI_WINDOW_P.
* window.c (change_window_height): If the size of the window will
shrink below the minimum, this code would only try to delete it if
it had a parent. Well, even if the window doesn't have a parent,
you want Fdelete_window to signal an error, since you're trying to
resize one of the undeleteable windows into nothingness. So call
Fdelete_window even if the window doesn't have a parent.
* window.c (MINSIZE): Add kludge so that the minibuffer is always
allowed to shrink to one line in height.
(MINSIZE, CURBEG, CURSIZE): Change these so that their argument
are always Lisp_Objects, not struct window *'s.
(change_window_height): Changed accordingly.
test TERMIOS before TERMIO; when two options might both be
defined, test the most recent first, so that the most recent
functions get used.
* sysdep.c [HAVE_TERMIO] (init_baud_rate): Don't use tcgetattr
unless HAVE_TCATTR is defined. Only very rarely do termio systems
have the tc{get,set}attr macros.
* sysdep.c: #include "systty.h", not "systerm.h".
* dispnew.c (update_frame): Change the way we handle
cursor_in_echo_area. Firstly, ignore this if the frame we're
updating doesn't have a minibuffer. Secondly, don't handle the
selected frame specially. Thirdly, don't assume that the
minibuffer is only one line high. If cursor_in_echo_area < 0, put
the cursor in the upper-left corner; if cursor_in_echo_area > 0,
put it on the lowest non-empty line in the minibuffer window, or
on the top line.
* dispnew.c (direct_output_for_insert): Fail if
cursor_in_echo_area is set; we don't want to do the typing there.
(direct_output_for_insert): Same.
per-screen. Duh.
* xterm.c (x_wm_set_window_state, x_wm_set_icon_pixmap,
x_wm_set_icon_position): Use F->display.x->wm_hints, rather than
x_wm_hints.
(x_term_init): Don't initialize x_wm_hints here.
* xterm.c (x_set_text_property): Properly balance the BLOCK_INPUTs
and UNBLOCK_INPUTs. And remember that VALUE is the strin we want
to set the name to, not PROPERTY.
* xterm.c (x_set_text_property): Define this appropriately for
X11R3 and X11R4.
* xterm.c (x_set_text_property): Make this take a Lisp_Object
string as an argument, rather than a pointer and a length.
* xterm.c: Doc fixes.
* xterm.c [USG5]: Don't include <sys/types.h>.
* xterm.c (x_make_frame_invisible): Instead of calling XWithdraw
window, which isn't widely available, write out what it does,
since that's not much.
(x_iconify_frame): Explicitly perform both the X11R3 and X11R4
methods for iconification; don't use XIconifyWindow, since that's
not present in R3.
* xterm.c (x_wm_set_size_hint): Don't bother setting the
base_width and base_height members; their function is performed
just as well by the min_width and min_height members, and if we
use XSetNormalHints instead of XSetWMNormalHints, we can be
compatible with R3.
* xterm.c (x_error_handler): There is no way to invoke the default
error handler which works on all versions of X11, so don't bother;
call XGetErrorText and print the message ourselves.
* xterm.c (x_term_init): Don't use MAXHOSTNAMELEN; this isn't
defined on all systems. Since we only use that as an initial
guess anyway, it's not very important.
* xterm.c (x_set_text_property): New function.
wish I knew why.
Don't include <sys/types.h>; just declare getuid to return an
int. Big deal.
(MAXPATHLEN): If this is not defined by the system's include
files, give it a value of 256.
(get_user_db): Fetch the defaults directly from the display
structure, rather than using XResourceManagerString; that
function doesn't exist in the older versions of X.
OLDVAL.
(x_explicitly_set_name, x_implicitly_set_name): New functions.
(x_frame_parms): Use x_explicitly_set_name here.
(x_window): Use x_implicitly_set_name here.
* xfns.c (Fx_create_frame): Initialize f->display.x->wm_hints here.
* xfns.c (x_set_name): Call x_set_text_property with a Lisp_Object
string as an argument, rather than a pointer and a length.
* xfns.c (x_get_arg): Accept a new type - symbol. If we've
retrieved a string from the xrdb database and the user wants a
symbol, intern it.
(Fx_create_frame): Use the symbol type here.
* xfns.c (x_figure_window_size, x_icon, Fx_create_frame): Use
values from enum resource_types for the last arg to x_get_arg,
instead of passing numbers.
* xfns.c (Fx_create_frame): When setting up the scroll bars, use
the type parameter to x_default_parameter, rather than prefixing
the resource name with a question mark.
* xfns.c [not HAVE_X11] (Fx_create_frame): The resource which
determines whether or not to use a bitmapped icon is called
"IconType", not "BitmapIcon". Update this.
* xfns.c (x_set_name): Used x_set_text_property instead of XSetWMName and
XSetWMIconName.
* xfns.c (select_visual): Fetch the visual id directly from v;
don't call XVisualIDFromVisual, since that function is not
available in earlier versions of X.
* xfns.c (x_make_gc): cursor_bits can't be local to the function;
it's static.
* xfns.c (Fx_create_frame): Make the default for the icon-type
parameter nil, not t. It seems to cause problems with some X
servers.
assumes that minibuf_window is on the same frame as the window
configuration. Removed special case for windows whose prevs
point to themselves.
* window.c (Fset_window_configuration): Rename the argument from
ARG to CONFIGURATION, so it matches the docstring. The
make-docfile program cares.
* window.c [MULTI_FRAME] (syms_of_window): Don't staticpro
minibuf_window; the frame list will take care of it.
* window.c (window_loop): This used to keep track of the first
window processed and wait until we came back around to it. Sadly,
this doesn't work if that window gets deleted. So instead, use
Fprevious_window to find the last window to process, and loop
until we've done that one.
* window.c [not MULTI_FRAME] (init_window_once): Don't forget to
set the `mini_p' flag on the new minibuffer window to t.
* window.c (Fwindow_at): Don't check the type of the frame
argument.
* window.c [not MULTI_FRAME] (window_loop): Set frame to zero,
instead of trying to decode it.
* window.c (init_window_once): Initialize minibuf_window before
FRAME_ROOT_WINDOW, so the latter actually points to something.
empty string, which means that you can't have constant
initialized arrays inside a function. So move the `keys' array
outside of the function.
* term.c (keys): Include definitions for "K2" (the center key on
an IBM keypad), "F1" (F11), and "F2" (F12). Handle "k0" and "k;"
specially; see the code for details.
* term.c (clear_end_of_line): Remember that on some systems,
"static" gets defined to be the null string, so we can't declare
an array to be static and then initialize it. Since the array in
question (buf) is only one element long, just make it a scalar
rather than an array; it can then be initialized, even if it's
not static.
signal anymore, since we have the SIGTYPE macro defined.
* sysdep.c (read_input_waiting): When scanning for quit
characters, use the value of quit_char, rather than assuming that
C-g is the quit character. And don't forget to declare i.
* sysdep.c [USG5]: Don't include fcntl.h.
system doesn't have that facility.
* process.c: [USG5] Don't include <fcntl.h>.
[USG] Don't bother including termios, termio, or fcntl; systerm.h
takes care of all that.
Remove the "mis;tak-+;;" line from the code; apparently this
section of code does get used.
* process.c (wait_reading_process_input): Put comments around
text following #endif.
"#endif /* SIGIO */"
* keyboard.c (Fexecute_mouse_event): dyked-out function deleted.
We're not going to use this mouse interface.
(Vmouse_window, Vmouse_event, Vmouse_event_function,
Vmouse_left_hook, Vmap_frame_hook, Vunmap_frame_hook,
Vmouse_motion_handler): Variables deleted; they were to be used by
Fexecute_mouse_event.
(syms_of_keyboard): Same.
(command_loop_1): Remove dyked-out code to support
Fexecute_mouse_event.
(read_char): Same.
* keyboard.c (Vlast_event_frame): Don't define this window if
MULTI_FRAME is not #defined.
(syms_of_keyboard): Same.
(kbd_buffer_store_event): Don't try to work with Vlast_event_frame
if MULTI_FRAME is not #defined.
(kbd_buffer_get_event): Same.
* keyboard.c (Fdiscard_input): Removed dyked-out code from when
unread_command_char's quiescent value was -1, not nil.
available, and hardly vital.
(syms_of_floatfns): Adjusted appropriately.
* floatfns.c (Flog): Accept optional second arg, being the base
for the logarithm.
[USG] (Flogb): Define this in terms of Flog.
* data.c (store_symval_forwarding): When storing through a
Lisp_Buffer_Objfwd, check if the slot requires a particular type,
and report an error if the types clash.
signal handler. The original bug is probably gone, the test
wasn't written portably, and it should probably go somewhere else
anyway - say, funcall or eval.
We're not going to use this mouse interface.
(Vmouse_window, Vmouse_event, Vmouse_event_function,
Vmouse_left_hook, Vmap_frame_hook, Vunmap_frame_hook,
Vmouse_motion_handler): Variables deleted; they were to be used by
Fexecute_mouse_event.
(syms_of_keyboard): Same.
(command_loop_1): Remove dyked-out code to support
Fexecute_mouse_event.
(read_char): Same.
* keyboard.c (Vlast_event_frame): Don't define this window if
MULTI_FRAME is not #defined.
(syms_of_keyboard): Same.
(kbd_buffer_store_event): Don't try to work with Vlast_event_frame
if MULTI_FRAME is not #defined.
(kbd_buffer_get_event): Same.
* keyboard.c (Fdiscard_input): Removed dyked-out code from when
unread_command_char's quiescent value was -1, not nil.
window processed and wait until we came back around to it. Sadly,
this doesn't work if that window gets deleted. So instead, use
Fprevious_window to find the last window to process, and loop
until we've done that one.
* window.c [not MULTI_FRAME] (init_window_once): Don't forget to
set the `mini_p' flag on the new minibuffer window to t.
* window.c (Fwindow_at): Don't check the type of the frame
argument.
* window.c [not MULTI_FRAME] (window_loop): Set frame to zero,
instead of trying to decode it.
* window.c (init_window_once): Initialize minibuf_window before
FRAME_ROOT_WINDOW, so the latter actually points to something.
(x_wm_set_window_state, x_wm_set_icon_pixmap,
x_wm_set_icon_position): Use x_wm_hints.
(x_term_init): Set the `input' field of x_wm_hints, and its flag.
* xterm.c (x_text_icon): Call x_wm_set_icon_pixmap with a pixmap
of zero, to clear the pixmap.
(x_wm_set_icon_pixmap): Accept this protocol; if pixmap is zero,
specify no pixmap for the icon.
* xterm.c (x_set_window_size): Call check_frame_size to make sure
that the requested dimensions are within acceptable limits.
Store the new size information in the frame structure.
* xterm.c (x_wm_set_size_hint): Don't try to set the base_height
and base_width elements of size_hints if PBaseSize is not
#defined. Set the minimum frame size according to the information
returned by check_frame_size.
* xterm.c (XTread_socket, x_do_pending_expose): Call
change_frame_size with a DELAY of 1.
* xterm.c (in_display): Deleted this; it's never used in xterm.c,
and there is another variable by the same name in dispnew.c.
* xterm.c (FRAME_IS_TERMCAP, FRAME_IS_X, FRAME_HAS_MINIBUF):
Renamed these to FRAME_TERMCAP_P, FRAME_X_P, and
FRAME_HAS_MINIBUF_P, for consistency with the rest of the
frame macros.
resource, not nil. That way, we can tell the difference between a
false resource and an unspecified resource.
(x_default_error): Use DEFLT if x_get_arg returns Qunbound, not Qnil.
(x_figure_window_size, x_icon, Fx_create_frame): Deal with
Qunbound and Qnil properly.
* xfns.c (Fx_create_frame): Pass the correct number of arguments
to x_set_font.
* xfns.c [not HAVE_X11] (Fx_create_frame): Delete section that's
only included if we *do* have X11. Blind patching.
* xfns.c (x_icon): Rewritten to call x_wm_set_icon_position and
x_wm_set_window_state instead of calling XSetWMHints directly.
(x_wm_set_window_state, x_wm_set_icon_pixmap,
x_wm_set_icon_position): Use x_wm_hints.
(x_term_init): Set the `input' field of x_wm_hints, and its flag.
* xfns.c (x_default_parameter): Don't call store_frame_param here;
it's already taken care of by x_set_frame_parameters.
* xfns.c (Fx_create_frame): Check for the `icon-type',
`auto-raise', and `auto-lower' parameters. Have `icon-type'
default to t, indicating that we want the nifty gnu in our icons.
(Qauto_lower): New symbol.
* xfns.c (x_set_icon_type): UNBLOCK_INPUT before reporting the
error, not after. error doesn't return, sklitch-brain.
* xfns.c (x_set_frame_parameters): Properly recognize changes to
the height of the frame. Recognize changes of the frame's
position.
* xfns.c (x_set_frame_parameters): Iterate over ALIST while the
current element is cons, not while it's non-nil.
(syms_of_xfns): Call init_x_parm_symbols after interning all the
other atoms; init_x_parm_symbols expects Qx_frame_parameter to be
initialized.
* xfns.c (Qbackground_color, Qborder_color, Qborder_width,
Qcursor_color, Qfont, Qforeground_color, Qgeometry,
Qhorizontal_scroll_bar, Qicon_left, Qicon_top, Qiconic_startup,
Qinternal_border_width, Qleft, Qmouse_color, Qparent_id,
Qsuppress_icon, Qsuppress_initial_map, Qtop, Qundefined_color,
Qvertical_scroll_bar, Qwindow_id, Qx_frame_parameter): New
symbols, with lisp code to rebuild syms_of_xfns.
(syms_of_xfns): Initialize and staticpro them.
(Qheight, Qminibuffer, Qname, Qnone, Qonly, Qwidth,
Qunsplittable): Add extern declaration for these.
(x_init_parm_symbols): Don't initialize Qx_frame_parameter here;
it's done in syms_of_xfns.
(x_default_parameter): Change the argument char *PROPNAME into a
Lisp_Object PROP; let the caller take care of interning the atom.
(Fx_geometry, x_figure_window_size, x_icon, Fx_create_frame): Use
the new Q... variables, instead of interning things.
* xfns.c (x_set_frame_param): Replaced by x_set_frame_parameters.
(x_set_frame_parameters): Process the alist of parameters here.
Notice `width', `height', `top', and `left' parameters.
Hold off changing the frame size and position until the end, so we
can do both parameters at once when they are both specified.
(x_default_parameter): Call x_set_frame_parameters, not
x_set_frame_param.
* xfns.c (x_figure_window_size): Indicate that this function
returns an int, rather than just leaving it unstated.
* xfns.c (Fx_create_frame): Call change_frame_size with a DELAY of 0.
defined here now, rather than window.h.
(check_frame_size): New function.
* window.c (FRAME_IS_TERMCAP, FRAME_IS_X, FRAME_HAS_MINIBUF):
Renamed these to FRAME_TERMCAP_P, FRAME_X_P, and
FRAME_HAS_MINIBUF_P, for consistency with the rest of the
frame macros.
* window.c (check_min_window_sizes): New function.
(set_window_height): Call it.
(Fsplit_window, change_window_height): Call it, instead of writing
out its code.
proper arguments - the height and width are the second and third
arguments, not the first and second. Pass 0 for DELAY.
* keyboard.c (FRAME_IS_TERMCAP, FRAME_IS_X,
FRAME_HAS_MINIBUF): Renamed these to FRAME_TERMCAP_P,
FRAME_X_P, and FRAME_HAS_MINIBUF_P, for consistency with the
rest of the frame macros.
Qunsplittable, Qwidth, Qx): New symbols, with lisp code to rebuild
syms_of_frame.
(syms_of_xfns): Initialize and staticpro them.
(Fframep, Fframe_visible_p, Fframe_parameters): Use
the new Q... variables, instead of interning things.
(store_in_alist): Change the argument char *PROPNAME into a
Lisp_Object PROP; let the caller take care of interning the atom.
* frame.c (Fframe_visible_p): Doc fix.
* frame.c (Fframe_parameters): When figuring the `minibuffer'
parameter, if FRAME doesn't have a minibuffer, return `none', not
nil. If it does have a minibuffer with other windows, return the
window.
* frame.c (Fmodify_frame_parameters): Don't write out the loop for
processing X frame parameters here; do it in the x specific code.
Call the function which deals with this stuff
x_set_frame_parameters, not x_set_frame_parameter.
* frame.c (Fmake_frame_visible, Fmake_frame_invisible,
Ficonify_frame, Fframe_parameters, Fmodify_frame_parameters,
Fset_frame_height, Fset_frame_width, Fset_frame_size,
Fset_frame_position): Place clauses controlled by FRAME_X_P inside
`#ifdef HAVE_X_WINDOWS ... #endif' clauses.
* frame.c (Fset_frame_position): Doc fix.
* frame.c [MULTI_SCREEN] (Fset_frame_height, Fset_frame_width,
Fset_frame_size): Call change_frame_size with a DELAY of 0.
[not MULTI_SCREEN] (Fset_frame_height, Fset_frame_width,
Fset_frame_size, Fset_screen_height, Fset_screen_width): Same.
* frame.c [not MULTI_SCREEN] (Fset_frame_height, Fset_frame_width,
Fset_frame_size, Fframe_height, Fframe_width): New functions, for
use when Emacs is not compiled with multiple screens.
[not MULTI_SCREEN] (Fset_screen_height, Fset_screen_width):
Functions added for backward compatibility with Emacs 18. These
would be just aliases, except that the version 18 functions don't
take a FRAME argument.
[not MULTI_SCREEN] (syms_of_frame): New function, to defsubr the
above and add screen-height and screen-width as aliases for
Fframe_height and Fframe_width.
* frame.c (Fset_frame_width): Change the size of FRAME, not of
selected_frame.
* frame.c (Fset_frame_width, Fset_frame_height): Declare the
`frame' argument to be a Lisp_Object. It used to be undeclared.
* frame.c (FRAME_IS_TERMCAP, FRAME_IS_X, FRAME_HAS_MINIBUF):
Renamed these to FRAME_TERMCAP_P, FRAME_X_P, and
FRAME_HAS_MINIBUF_P, for consistency with the rest of the
frame macros.
* editfns.c (Fcurrent_time_zone): Don't forget to include code to
signal an error when EMACS_CURRENT_TIME_ZONE is not defined.
* editfns.c (Fcurrent_time_zone): New function.
(syms_of_editfns): defsubr it.
calling update_end, so that x_display_box_cursor can rely on the
contents of f->current_glyphs.
* dispnew.c (change_frame_size): Call check_frame_size here,
rather than writing out its code. Don't declare newheight and
newwidth to be register variables, since we take their address.
* dispnew.c (in_display): Variable deleted; it's only ever used as
an unofficial parameter to change_frame_size.
(change_frame_size): New argument, DELAY, which when non-zero
indicates to delay the size change until later. This should be
passed as one from signal handlers.
(window_change_signal): Call change_frame_size with a DELAY of 1.
(do_pending_window_change): Call change_frame_size with DELAY of 0.
* dispnew.c, frame.c, frame.h, keyboard.c, scroll.c, term.c,
window.c, xdisp.c, xfns.c xterm.c (FRAME_IS_TERMCAP, FRAME_IS_X,
FRAME_HAS_MINIBUF): Renamed these to FRAME_TERMCAP_P, FRAME_X_P,
and FRAME_HAS_MINIBUF_P, for consistency with the rest of the
frame macros.