X-Git-Url: http://git.hcoop.net/bpt/emacs.git/blobdiff_plain/078c97cbfff4348646b4158fb9a160d88150daa9..25eac50084cbfda539894cedede5893656cdac2d:/src/keyboard.c diff --git a/src/keyboard.c b/src/keyboard.c index 56858acd6a..7b1ea341e7 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -18,6 +18,9 @@ You should have received a copy of the GNU General Public License along with GNU Emacs. If not, see . */ #include + +#define KEYBOARD_INLINE EXTERN_INLINE + #include #include #include @@ -30,8 +33,8 @@ along with GNU Emacs. If not, see . */ #include "keyboard.h" #include "window.h" #include "commands.h" -#include "buffer.h" #include "character.h" +#include "buffer.h" #include "disptab.h" #include "dispextern.h" #include "syntax.h" @@ -60,20 +63,11 @@ along with GNU Emacs. If not, see . */ #include #include -/* This is to get the definitions of the XK_ symbols. */ -#ifdef HAVE_X_WINDOWS -#include "xterm.h" -#endif - -#ifdef HAVE_NTGUI -#include "w32term.h" -#endif /* HAVE_NTGUI */ - -#ifdef HAVE_NS -#include "nsterm.h" -#endif +#ifdef HAVE_WINDOW_SYSTEM +#include TERM_HEADER +#endif /* HAVE_WINDOW_SYSTEM */ -/* Variables for blockinput.h: */ +/* Variables for blockinput.h: */ /* Non-zero if interrupt input is blocked right now. */ volatile int interrupt_input_blocked; @@ -122,7 +116,7 @@ static Lisp_Object recent_keys; actually mean something. It's easier to staticpro a single Lisp_Object than an array. */ Lisp_Object this_command_keys; -int this_command_key_count; +ptrdiff_t this_command_key_count; /* 1 after calling Freset_this_command_lengths. Usually it is 0. */ @@ -135,16 +129,16 @@ static int raw_keybuf_count; #define GROW_RAW_KEYBUF \ if (raw_keybuf_count == ASIZE (raw_keybuf)) \ - raw_keybuf = larger_vector (raw_keybuf, raw_keybuf_count * 2, Qnil) \ + raw_keybuf = larger_vector (raw_keybuf, 1, -1) /* Number of elements of this_command_keys that precede this key sequence. */ -static int this_single_command_key_start; +static ptrdiff_t this_single_command_key_start; /* Record values of this_command_key_count and echo_length () before this command was read. */ -static int before_command_key_count; -static int before_command_echo_length; +static ptrdiff_t before_command_key_count; +static ptrdiff_t before_command_echo_length; /* For longjmp to where kbd input is being done. */ @@ -208,20 +202,17 @@ EMACS_INT command_loop_level; Lisp_Object unread_switch_frame; /* Last size recorded for a current buffer which is not a minibuffer. */ -static EMACS_INT last_non_minibuf_size; +static ptrdiff_t last_non_minibuf_size; /* Total number of times read_char has returned, modulo UINTMAX_MAX + 1. */ uintmax_t num_input_events; /* Value of num_nonmacro_input_events as of last auto save. */ -static int last_auto_save; - -/* This is like Vthis_command, except that commands never set it. */ -Lisp_Object real_this_command; +static EMACS_INT last_auto_save; /* The value of point when the last command was started. */ -static EMACS_INT last_point_position; +static ptrdiff_t last_point_position; /* The buffer that was current when the last command was started. */ static Lisp_Object last_point_position_buffer; @@ -377,7 +368,7 @@ EMACS_TIME timer_check (void); static void record_menu_key (Lisp_Object c); static void echo_now (void); -static int echo_length (void); +static ptrdiff_t echo_length (void); static Lisp_Object Qpolling_period; @@ -395,7 +386,7 @@ int interrupt_input; /* Nonzero while interrupts are temporarily deferred during redisplay. */ int interrupts_deferred; -/* Allow m- file to inhibit use of FIONREAD. */ +/* Allow configure to inhibit use of FIONREAD. */ #ifdef BROKEN_FIONREAD #undef FIONREAD #endif @@ -448,9 +439,9 @@ static Lisp_Object make_lispy_movement (struct frame *, Lisp_Object, Lisp_Object, Lisp_Object, Time); #endif -static Lisp_Object modify_event_symbol (EMACS_INT, unsigned, Lisp_Object, +static Lisp_Object modify_event_symbol (ptrdiff_t, int, Lisp_Object, Lisp_Object, const char *const *, - Lisp_Object *, EMACS_INT); + Lisp_Object *, ptrdiff_t); static Lisp_Object make_lispy_switch_frame (Lisp_Object); static int help_char_p (Lisp_Object); static void save_getcjmp (jmp_buf); @@ -462,10 +453,8 @@ static void interrupt_signal (int signalnum); #ifdef SIGIO static void input_available_signal (int signo); #endif -static Lisp_Object (Fcommand_execute) (Lisp_Object, Lisp_Object, Lisp_Object, - Lisp_Object); static void handle_interrupt (void); -static void quit_throw_to_read_char (int) NO_RETURN; +static _Noreturn void quit_throw_to_read_char (int); static void process_special_events (void); static void timer_start_idle (void); static void timer_stop_idle (void); @@ -474,6 +463,53 @@ static void handle_user_signal (int); static char *find_user_signal_name (int); static int store_user_signal_events (void); +/* These setters are used only in this file, so they can be private. */ +static inline void +kset_echo_string (struct kboard *kb, Lisp_Object val) +{ + kb->INTERNAL_FIELD (echo_string) = val; +} +static inline void +kset_kbd_queue (struct kboard *kb, Lisp_Object val) +{ + kb->INTERNAL_FIELD (kbd_queue) = val; +} +static inline void +kset_keyboard_translate_table (struct kboard *kb, Lisp_Object val) +{ + kb->INTERNAL_FIELD (Vkeyboard_translate_table) = val; +} +static inline void +kset_last_prefix_arg (struct kboard *kb, Lisp_Object val) +{ + kb->INTERNAL_FIELD (Vlast_prefix_arg) = val; +} +static inline void +kset_last_repeatable_command (struct kboard *kb, Lisp_Object val) +{ + kb->INTERNAL_FIELD (Vlast_repeatable_command) = val; +} +static inline void +kset_local_function_key_map (struct kboard *kb, Lisp_Object val) +{ + kb->INTERNAL_FIELD (Vlocal_function_key_map) = val; +} +static inline void +kset_overriding_terminal_local_map (struct kboard *kb, Lisp_Object val) +{ + kb->INTERNAL_FIELD (Voverriding_terminal_local_map) = val; +} +static inline void +kset_real_last_command (struct kboard *kb, Lisp_Object val) +{ + kb->INTERNAL_FIELD (Vreal_last_command) = val; +} +static inline void +kset_system_key_syms (struct kboard *kb, Lisp_Object val) +{ + kb->INTERNAL_FIELD (system_key_syms) = val; +} + /* Add C to the echo string, if echoing is going on. C can be a character, which is printed prettily ("M-C-x" and all that @@ -485,7 +521,7 @@ echo_char (Lisp_Object c) if (current_kboard->immediate_echo) { int size = KEY_DESCRIPTION_SIZE + 100; - char *buffer = (char *) alloca (size); + char *buffer = alloca (size); char *ptr = buffer; Lisp_Object echo_string; @@ -507,7 +543,7 @@ echo_char (Lisp_Object c) { int offset = ptr - buffer; size = max (2 * size, size + nbytes); - buffer = (char *) alloca (size); + buffer = alloca (size); ptr = buffer + offset; } @@ -525,7 +561,7 @@ echo_char (Lisp_Object c) { int offset = ptr - buffer; size += len; - buffer = (char *) alloca (size); + buffer = alloca (size); ptr = buffer + offset; } @@ -556,8 +592,9 @@ echo_char (Lisp_Object c) else if (STRINGP (echo_string)) echo_string = concat2 (echo_string, build_string (" ")); - KVAR (current_kboard, echo_string) - = concat2 (echo_string, make_string (buffer, ptr - buffer)); + kset_echo_string + (current_kboard, + concat2 (echo_string, make_string (buffer, ptr - buffer))); echo_now (); } @@ -602,8 +639,9 @@ echo_dash (void) /* Put a dash at the end of the buffer temporarily, but make it go away when the next character is added. */ - KVAR (current_kboard, echo_string) = concat2 (KVAR (current_kboard, echo_string), - build_string ("-")); + kset_echo_string + (current_kboard, + concat2 (KVAR (current_kboard, echo_string), build_string ("-"))); echo_now (); } @@ -615,7 +653,7 @@ echo_now (void) { if (!current_kboard->immediate_echo) { - int i; + ptrdiff_t i; current_kboard->immediate_echo = 1; for (i = 0; i < this_command_key_count; i++) @@ -628,7 +666,7 @@ echo_now (void) if (i == this_single_command_key_start) before_command_echo_length = echo_length (); - c = XVECTOR (this_command_keys)->contents[i]; + c = AREF (this_command_keys, i); if (! (EVENT_HAS_PARAMETERS (c) && EQ (EVENT_HEAD_KIND (EVENT_HEAD (c)), Qmouse_movement))) echo_char (c); @@ -665,7 +703,7 @@ cancel_echoing (void) { current_kboard->immediate_echo = 0; current_kboard->echo_after_prompt = -1; - KVAR (current_kboard, echo_string) = Qnil; + kset_echo_string (current_kboard, Qnil); ok_to_echo_at_next_pause = NULL; echo_kboard = NULL; echo_message_buffer = Qnil; @@ -673,7 +711,7 @@ cancel_echoing (void) /* Return the length of the current echo string. */ -static int +static ptrdiff_t echo_length (void) { return (STRINGP (KVAR (current_kboard, echo_string)) @@ -686,12 +724,12 @@ echo_length (void) switches frames while entering a key sequence. */ static void -echo_truncate (EMACS_INT nchars) +echo_truncate (ptrdiff_t nchars) { if (STRINGP (KVAR (current_kboard, echo_string))) - KVAR (current_kboard, echo_string) - = Fsubstring (KVAR (current_kboard, echo_string), - make_number (0), make_number (nchars)); + kset_echo_string (current_kboard, + Fsubstring (KVAR (current_kboard, echo_string), + make_number (0), make_number (nchars))); truncate_echo_area (nchars); } @@ -715,9 +753,7 @@ add_command_key (Lisp_Object key) #endif if (this_command_key_count >= ASIZE (this_command_keys)) - this_command_keys = larger_vector (this_command_keys, - 2 * ASIZE (this_command_keys), - Qnil); + this_command_keys = larger_vector (this_command_keys, 1, -1); ASET (this_command_keys, this_command_key_count, key); ++this_command_key_count; @@ -727,7 +763,7 @@ add_command_key (Lisp_Object key) Lisp_Object recursive_edit_1 (void) { - int count = SPECPDL_INDEX (); + ptrdiff_t count = SPECPDL_INDEX (); Lisp_Object val; if (command_loop_level > 0) @@ -795,7 +831,7 @@ Alternatively, `(throw 'exit t)' makes this function signal an error. This function is called by the editor initialization to begin editing. */) (void) { - int count = SPECPDL_INDEX (); + ptrdiff_t count = SPECPDL_INDEX (); Lisp_Object buffer; /* If we enter while input is blocked, don't lock up here. @@ -891,8 +927,7 @@ static struct kboard_stack *kboard_stack; void push_kboard (struct kboard *k) { - struct kboard_stack *p - = (struct kboard_stack *) xmalloc (sizeof (struct kboard_stack)); + struct kboard_stack *p = xmalloc (sizeof *p); p->next = kboard_stack; p->kboard = current_kboard; @@ -1024,8 +1059,8 @@ cmd_error (Lisp_Object data) Vstandard_input = Qt; Vexecuting_kbd_macro = Qnil; executing_kbd_macro = Qnil; - KVAR (current_kboard, Vprefix_arg) = Qnil; - KVAR (current_kboard, Vlast_prefix_arg) = Qnil; + kset_prefix_arg (current_kboard, Qnil); + kset_last_prefix_arg (current_kboard, Qnil); cancel_echoing (); /* Avoid unquittable loop if data contains a circular list. */ @@ -1200,13 +1235,13 @@ This also exits all active minibuffers. */) Fthrow (Qtop_level, Qnil); } -static void user_error (const char*) NO_RETURN; -static void user_error (const char *msg) +static _Noreturn void +user_error (const char *msg) { xsignal1 (Quser_error, build_string (msg)); } -static Lisp_Object Fexit_recursive_edit (void) NO_RETURN; +_Noreturn DEFUN ("exit-recursive-edit", Fexit_recursive_edit, Sexit_recursive_edit, 0, 0, "", doc: /* Exit from the innermost recursive edit or minibuffer. */) (void) @@ -1217,7 +1252,7 @@ DEFUN ("exit-recursive-edit", Fexit_recursive_edit, Sexit_recursive_edit, 0, 0, user_error ("No recursive edit is in progress"); } -static Lisp_Object Fabort_recursive_edit (void) NO_RETURN; +_Noreturn DEFUN ("abort-recursive-edit", Fabort_recursive_edit, Sabort_recursive_edit, 0, 0, "", doc: /* Abort the command that requested this recursive edit or minibuffer input. */) (void) @@ -1262,7 +1297,7 @@ Normally, mouse motion is ignored. usage: (track-mouse BODY...) */) (Lisp_Object args) { - int count = SPECPDL_INDEX (); + ptrdiff_t count = SPECPDL_INDEX (); Lisp_Object val; record_unwind_protect (tracking_off, do_mouse_tracking); @@ -1280,7 +1315,7 @@ usage: (track-mouse BODY...) */) If ignore_mouse_drag_p is non-zero, ignore (implicit) mouse movement after resizing the tool-bar window. */ -#if !defined HAVE_WINDOW_SYSTEM || defined USE_GTK || defined HAVE_NS +#if !defined HAVE_WINDOW_SYSTEM static #endif int ignore_mouse_drag_p; @@ -1313,7 +1348,7 @@ some_mouse_moved (void) static int read_key_sequence (Lisp_Object *, int, Lisp_Object, int, int, int); void safe_run_hooks (Lisp_Object); -static void adjust_point_for_property (EMACS_INT, int); +static void adjust_point_for_property (ptrdiff_t, int); /* Cancel hourglass from protect_unwind. ARG is not used. */ @@ -1326,10 +1361,12 @@ cancel_hourglass_unwind (Lisp_Object arg) } #endif +/* The last boundary auto-added to buffer-undo-list. */ +Lisp_Object last_undo_boundary; + /* FIXME: This is wrong rather than test window-system, we should call a new set-selection, which will then dispatch to x-set-selection, or tty-set-selection, or w32-set-selection, ... */ -EXFUN (Fwindow_system, 1); Lisp_Object command_loop_1 (void) @@ -1337,15 +1374,15 @@ command_loop_1 (void) Lisp_Object cmd; Lisp_Object keybuf[30]; int i; - int prev_modiff = 0; + EMACS_INT prev_modiff = 0; struct buffer *prev_buffer = NULL; #if 0 /* This shouldn't be necessary anymore. --lorentey */ int was_locked = single_kboard; #endif int already_adjusted = 0; - KVAR (current_kboard, Vprefix_arg) = Qnil; - KVAR (current_kboard, Vlast_prefix_arg) = Qnil; + kset_prefix_arg (current_kboard, Qnil); + kset_last_prefix_arg (current_kboard, Qnil); Vdeactivate_mark = Qnil; waiting_for_input = 0; cancel_echoing (); @@ -1377,10 +1414,10 @@ command_loop_1 (void) } /* Do this after running Vpost_command_hook, for consistency. */ - KVAR (current_kboard, Vlast_command) = Vthis_command; - KVAR (current_kboard, Vreal_last_command) = real_this_command; + kset_last_command (current_kboard, Vthis_command); + kset_real_last_command (current_kboard, Vreal_this_command); if (!CONSP (last_command_event)) - KVAR (current_kboard, Vlast_repeatable_command) = real_this_command; + kset_last_repeatable_command (current_kboard, Vreal_this_command); while (1) { @@ -1388,8 +1425,7 @@ command_loop_1 (void) Fkill_emacs (Qnil); /* Make sure the current window's buffer is selected. */ - if (XBUFFER (XWINDOW (selected_window)->buffer) != current_buffer) - set_buffer_internal (XBUFFER (XWINDOW (selected_window)->buffer)); + set_buffer_internal (XBUFFER (XWINDOW (selected_window)->buffer)); /* Display any malloc warning that just came out. Use while because displaying one warning can cause another. */ @@ -1399,6 +1435,15 @@ command_loop_1 (void) Vdeactivate_mark = Qnil; +#if defined (HAVE_MOUSE) || defined (HAVE_GPM) + + /* Don't ignore mouse movements for more than a single command + loop. (This flag is set in xdisp.c whenever the tool bar is + resized, because the resize moves text up or down, and would + generate false mouse drag events if we don't ignore them.) */ + ignore_mouse_drag_p = 0; +#endif + /* If minibuffer on and echo area in use, wait a short time and redraw minibuffer. */ @@ -1409,7 +1454,7 @@ command_loop_1 (void) { /* Bind inhibit-quit to t so that C-g gets read in rather than quitting back to the minibuffer. */ - int count = SPECPDL_INDEX (); + ptrdiff_t count = SPECPDL_INDEX (); specbind (Qinhibit_quit, Qt); sit_for (Vminibuffer_message_timeout, 0, 2); @@ -1447,7 +1492,7 @@ command_loop_1 (void) before_command_echo_length = echo_length (); Vthis_command = Qnil; - real_this_command = Qnil; + Vreal_this_command = Qnil; Vthis_original_command = Qnil; Vthis_command_keys_shift_translated = Qnil; @@ -1458,8 +1503,7 @@ command_loop_1 (void) /* A filter may have run while we were reading the input. */ if (! FRAME_LIVE_P (XFRAME (selected_frame))) Fkill_emacs (Qnil); - if (XBUFFER (XWINDOW (selected_window)->buffer) != current_buffer) - set_buffer_internal (XBUFFER (XWINDOW (selected_window)->buffer)); + set_buffer_internal (XBUFFER (XWINDOW (selected_window)->buffer)); ++num_input_keys; @@ -1486,10 +1530,10 @@ command_loop_1 (void) from that position. But also throw away beg_unchanged and end_unchanged information in that case, so that redisplay will update the whole window properly. */ - if (!NILP (XWINDOW (selected_window)->force_start)) + if (XWINDOW (selected_window)->force_start) { struct buffer *b; - XWINDOW (selected_window)->force_start = Qnil; + XWINDOW (selected_window)->force_start = 0; b = XBUFFER (XWINDOW (selected_window)->buffer); BUF_BEG_UNCHANGED (b) = BUF_END_UNCHANGED (b) = 0; } @@ -1531,7 +1575,7 @@ command_loop_1 (void) /* Execute the command. */ Vthis_command = cmd; - real_this_command = cmd; + Vreal_this_command = cmd; safe_run_hooks (Qpre_command_hook); already_adjusted = 0; @@ -1543,7 +1587,7 @@ command_loop_1 (void) keys = Fkey_description (keys, Qnil); bitch_at_user (); message_with_string ("%s is undefined", keys, 0); - KVAR (current_kboard, defining_kbd_macro) = Qnil; + kset_defining_kbd_macro (current_kboard, Qnil); update_mode_lines = 1; /* If this is a down-mouse event, don't reset prefix-arg; pass it to the command run by the up event. */ @@ -1553,17 +1597,17 @@ command_loop_1 (void) = parse_modifiers (EVENT_HEAD (last_command_event)); int modifiers = XINT (XCAR (XCDR (breakdown))); if (!(modifiers & down_modifier)) - KVAR (current_kboard, Vprefix_arg) = Qnil; + kset_prefix_arg (current_kboard, Qnil); } else - KVAR (current_kboard, Vprefix_arg) = Qnil; + kset_prefix_arg (current_kboard, Qnil); } else { /* Here for a command that isn't executed directly. */ #ifdef HAVE_WINDOW_SYSTEM - int scount = SPECPDL_INDEX (); + ptrdiff_t scount = SPECPDL_INDEX (); if (display_hourglass_p && NILP (Vexecuting_kbd_macro)) @@ -1574,7 +1618,13 @@ command_loop_1 (void) #endif if (NILP (KVAR (current_kboard, Vprefix_arg))) /* FIXME: Why? --Stef */ - Fundo_boundary (); + { + Lisp_Object undo = BVAR (current_buffer, undo_list); + Fundo_boundary (); + last_undo_boundary + = (EQ (undo, BVAR (current_buffer, undo_list)) + ? Qnil : BVAR (current_buffer, undo_list)); + } Fcommand_execute (Vthis_command, Qnil, Qnil, Qnil); #ifdef HAVE_WINDOW_SYSTEM @@ -1587,7 +1637,7 @@ command_loop_1 (void) unbind_to (scount, Qnil); #endif } - KVAR (current_kboard, Vlast_prefix_arg) = Vcurrent_prefix_arg; + kset_last_prefix_arg (current_kboard, Vcurrent_prefix_arg); safe_run_hooks (Qpost_command_hook); @@ -1615,12 +1665,13 @@ command_loop_1 (void) If the command didn't actually create a prefix arg, but is merely a frame event that is transparent to prefix args, then the above doesn't apply. */ - if (NILP (KVAR (current_kboard, Vprefix_arg)) || CONSP (last_command_event)) + if (NILP (KVAR (current_kboard, Vprefix_arg)) + || CONSP (last_command_event)) { - KVAR (current_kboard, Vlast_command) = Vthis_command; - KVAR (current_kboard, Vreal_last_command) = real_this_command; + kset_last_command (current_kboard, Vthis_command); + kset_real_last_command (current_kboard, Vreal_this_command); if (!CONSP (last_command_event)) - KVAR (current_kboard, Vlast_repeatable_command) = real_this_command; + kset_last_repeatable_command (current_kboard, Vreal_this_command); cancel_echoing (); this_command_key_count = 0; this_command_key_count_reset = 0; @@ -1657,9 +1708,9 @@ command_loop_1 (void) && NILP (Fmemq (Vthis_command, Vselection_inhibit_update_commands))) { - EMACS_INT beg = + ptrdiff_t beg = XINT (Fmarker_position (BVAR (current_buffer, mark))); - EMACS_INT end = PT; + ptrdiff_t end = PT; if (beg < end) call2 (Qx_set_selection, QPRIMARY, make_buffer_string (beg, end, 0)); @@ -1719,16 +1770,16 @@ command_loop_1 (void) LAST_PT is the last position of point. */ static void -adjust_point_for_property (EMACS_INT last_pt, int modified) +adjust_point_for_property (ptrdiff_t last_pt, int modified) { - EMACS_INT beg, end; + ptrdiff_t beg, end; Lisp_Object val, overlay, tmp; /* When called after buffer modification, we should temporarily suppress the point adjustment for automatic composition so that a user can keep inserting another character at point or keep deleting characters around point. */ int check_composition = ! modified, check_display = 1, check_invisible = 1; - EMACS_INT orig_pt = PT; + ptrdiff_t orig_pt = PT; /* FIXME: cycling is probably not necessary because these properties can't be usefully combined anyway. */ @@ -1755,7 +1806,7 @@ adjust_point_for_property (EMACS_INT last_pt, int modified) && (beg < PT /* && end > PT <- It's always the case. */ || (beg <= PT && STRINGP (val) && SCHARS (val) == 0))) { - xassert (end > PT); + eassert (end > PT); SET_PT (PT < last_pt ? (STRINGP (val) && SCHARS (val) == 0 ? max (beg - 1, BEGV) @@ -1837,7 +1888,7 @@ adjust_point_for_property (EMACS_INT last_pt, int modified) #if 0 /* This assertion isn't correct, because SET_PT may end up setting the point to something other than its argument, due to point-motion hooks, intangibility, etc. */ - xassert (PT == beg || PT == end); + eassert (PT == beg || PT == end); #endif /* Pretend the area doesn't exist if the buffer is not @@ -1943,7 +1994,7 @@ safe_run_hooks (Lisp_Object hook) /* FIXME: our `internal_condition_case' does not provide any way to pass data to its body or to its handlers other than via globals such as dynamically-bound variables ;-) */ - int count = SPECPDL_INDEX (); + ptrdiff_t count = SPECPDL_INDEX (); specbind (Qinhibit_quit, hook); run_hook_with_args (1, &hook, safe_run_hook_funcall); @@ -2023,12 +2074,12 @@ start_polling (void) if (poll_timer == NULL || EMACS_SECS (poll_timer->interval) != polling_period) { - EMACS_TIME interval; + time_t period = max (1, min (polling_period, TYPE_MAXIMUM (time_t))); + EMACS_TIME interval = make_emacs_time (period, 0); if (poll_timer) cancel_atimer (poll_timer); - EMACS_SET_SECS_USECS (interval, polling_period, 0); poll_timer = start_atimer (ATIMER_CONTINUOUS, interval, poll_for_input, NULL); } @@ -2096,7 +2147,7 @@ void bind_polling_period (int n) { #ifdef POLL_FOR_INPUT - int new = polling_period; + EMACS_INT new = polling_period; if (n > new) new = n; @@ -2183,14 +2234,7 @@ show_help_echo (Lisp_Object help, Lisp_Object window, Lisp_Object object, if (!NILP (help) && !STRINGP (help)) { if (FUNCTIONP (help)) - { - Lisp_Object args[4]; - args[0] = help; - args[1] = window; - args[2] = object; - args[3] = pos; - help = safe_call (4, args); - } + help = safe_call (4, help, window, object, pos); else help = safe_eval (help); @@ -2226,7 +2270,7 @@ show_help_echo (Lisp_Object help, Lisp_Object window, Lisp_Object object, /* Input of single characters from keyboard */ static Lisp_Object kbd_buffer_get_event (KBOARD **kbp, int *used_mouse_menu, - struct timeval *end_time); + EMACS_TIME *end_time); static void record_char (Lisp_Object c); static Lisp_Object help_form_saved_window_configs; @@ -2278,10 +2322,10 @@ do { if (polling_stopped_here) start_polling (); \ Lisp_Object read_char (int commandflag, ptrdiff_t nmaps, Lisp_Object *maps, Lisp_Object prev_event, - int *used_mouse_menu, struct timeval *end_time) + int *used_mouse_menu, EMACS_TIME *end_time) { volatile Lisp_Object c; - int jmpcount; + ptrdiff_t jmpcount; jmp_buf local_getcjmp; jmp_buf save_jump; volatile int key_already_recorded = 0; @@ -2570,7 +2614,7 @@ read_char (int commandflag, ptrdiff_t nmaps, Lisp_Object *maps, abort (); } if (!CONSP (last)) - KVAR (kb, kbd_queue) = Fcons (c, Qnil); + kset_kbd_queue (kb, Fcons (c, Qnil)); else XSETCDR (last, Fcons (c, Qnil)); kb->kbd_queue_has_data = 1; @@ -2670,7 +2714,7 @@ read_char (int commandflag, ptrdiff_t nmaps, Lisp_Object *maps, if (INTERACTIVE && NILP (c)) { int delay_level; - EMACS_INT buffer_size; + ptrdiff_t buffer_size; /* Slow down auto saves logarithmically in size of current buffer, and garbage collect while we're at it. */ @@ -2691,8 +2735,9 @@ read_char (int commandflag, ptrdiff_t nmaps, Lisp_Object *maps, && XINT (Vauto_save_timeout) > 0) { Lisp_Object tem0; - int timeout = delay_level * XFASTINT (Vauto_save_timeout) / 4; - + EMACS_INT timeout = (delay_level + * min (XFASTINT (Vauto_save_timeout) / 4, + MOST_POSITIVE_FIXNUM / delay_level)); save_getcjmp (save_jump); restore_getcjmp (local_getcjmp); tem0 = sit_for (make_number (timeout), 1, 1); @@ -2702,17 +2747,13 @@ read_char (int commandflag, ptrdiff_t nmaps, Lisp_Object *maps, && ! CONSP (Vunread_command_events)) { Fdo_auto_save (Qnil, Qnil); - - /* If we have auto-saved and there is still no input - available, garbage collect if there has been enough - consing going on to make it worthwhile. */ - if (!detect_input_pending_run_timers (0) - && consing_since_gc > gc_cons_threshold / 2) - Fgarbage_collect (); - redisplay (); } } + + /* If there is still no input available, ask for GC. */ + if (!detect_input_pending_run_timers (0)) + maybe_gc (); } /* Notify the caller if an autosave hook, or a timer, sentinel or @@ -2745,8 +2786,8 @@ read_char (int commandflag, ptrdiff_t nmaps, Lisp_Object *maps, if (!CONSP (KVAR (current_kboard, kbd_queue))) abort (); c = XCAR (KVAR (current_kboard, kbd_queue)); - KVAR (current_kboard, kbd_queue) - = XCDR (KVAR (current_kboard, kbd_queue)); + kset_kbd_queue (current_kboard, + XCDR (KVAR (current_kboard, kbd_queue))); if (NILP (KVAR (current_kboard, kbd_queue))) current_kboard->kbd_queue_has_data = 0; input_pending = readable_events (0); @@ -2791,13 +2832,8 @@ read_char (int commandflag, ptrdiff_t nmaps, Lisp_Object *maps, { KBOARD *kb IF_LINT (= NULL); - if (end_time) - { - EMACS_TIME now; - EMACS_GET_TIME (now); - if (EMACS_TIME_GE (now, *end_time)) - goto exit; - } + if (end_time && EMACS_TIME_LE (*end_time, current_emacs_time ())) + goto exit; /* Actually read a character, waiting if necessary. */ save_getcjmp (save_jump); @@ -2818,7 +2854,7 @@ read_char (int commandflag, ptrdiff_t nmaps, Lisp_Object *maps, abort (); } if (!CONSP (last)) - KVAR (kb, kbd_queue) = Fcons (c, Qnil); + kset_kbd_queue (kb, Fcons (c, Qnil)); else XSETCDR (last, Fcons (c, Qnil)); kb->kbd_queue_has_data = 1; @@ -2886,7 +2922,7 @@ read_char (int commandflag, ptrdiff_t nmaps, Lisp_Object *maps, struct buffer *prev_buffer = current_buffer; #if 0 /* This shouldn't be necessary anymore. --lorentey */ int was_locked = single_kboard; - int count = SPECPDL_INDEX (); + ptrdiff_t count = SPECPDL_INDEX (); record_single_kboard_state (); #endif @@ -3013,9 +3049,10 @@ read_char (int commandflag, ptrdiff_t nmaps, Lisp_Object *maps, && ' ' <= XINT (c) && XINT (c) < 256 && XINT (c) != 127) { Lisp_Object keys; - int key_count, key_count_reset; + ptrdiff_t key_count; + int key_count_reset; struct gcpro gcpro1; - int count = SPECPDL_INDEX (); + ptrdiff_t count = SPECPDL_INDEX (); /* Save the echo status. */ int saved_immediate_echo = current_kboard->immediate_echo; @@ -3075,7 +3112,7 @@ read_char (int commandflag, ptrdiff_t nmaps, Lisp_Object *maps, cancel_echoing (); ok_to_echo_at_next_pause = saved_ok_to_echo; - KVAR (current_kboard, echo_string) = saved_echo_string; + kset_echo_string (current_kboard, saved_echo_string); current_kboard->echo_after_prompt = saved_echo_after_prompt; if (saved_immediate_echo) echo_now (); @@ -3152,7 +3189,7 @@ read_char (int commandflag, ptrdiff_t nmaps, Lisp_Object *maps, /* Process the help character specially if enabled */ if (!NILP (Vhelp_form) && help_char_p (c)) { - int count = SPECPDL_INDEX (); + ptrdiff_t count = SPECPDL_INDEX (); help_form_saved_window_configs = Fcons (Fcurrent_window_configuration (Qnil), @@ -3312,7 +3349,7 @@ record_char (Lisp_Object c) if (!recorded) { - total_keys++; + total_keys += total_keys < NUM_RECENT_KEYS; ASET (recent_keys, recent_keys_index, c); if (++recent_keys_index >= NUM_RECENT_KEYS) recent_keys_index = 0; @@ -3546,9 +3583,9 @@ kbd_buffer_store_event_hold (register struct input_event *event, if (single_kboard && kb != current_kboard) { - KVAR (kb, kbd_queue) - = Fcons (make_lispy_switch_frame (event->frame_or_window), - Fcons (make_number (c), Qnil)); + kset_kbd_queue + (kb, Fcons (make_lispy_switch_frame (event->frame_or_window), + Fcons (make_number (c), Qnil))); kb->kbd_queue_has_data = 1; for (sp = kbd_fetch_ptr; sp != kbd_store_ptr; sp++) { @@ -3681,7 +3718,7 @@ kbd_buffer_unget_event (register struct input_event *event) void gen_help_event (Lisp_Object help, Lisp_Object frame, Lisp_Object window, - Lisp_Object object, EMACS_INT pos) + Lisp_Object object, ptrdiff_t pos) { struct input_event event; @@ -3784,7 +3821,7 @@ clear_event (struct input_event *event) static Lisp_Object kbd_buffer_get_event (KBOARD **kbp, int *used_mouse_menu, - struct timeval *end_time) + EMACS_TIME *end_time) { Lisp_Object obj; @@ -3851,15 +3888,15 @@ kbd_buffer_get_event (KBOARD **kbp, #endif if (end_time) { - EMACS_TIME duration; - EMACS_GET_TIME (duration); - if (EMACS_TIME_GE (duration, *end_time)) - return Qnil; /* finished waiting */ + EMACS_TIME now = current_emacs_time (); + if (EMACS_TIME_LE (*end_time, now)) + return Qnil; /* Finished waiting. */ else { - EMACS_SUB_TIME (duration, *end_time, duration); - wait_reading_process_output (EMACS_SECS (duration), - EMACS_USECS (duration), + EMACS_TIME duration = sub_emacs_time (*end_time, now); + wait_reading_process_output (min (EMACS_SECS (duration), + WAIT_READING_MAX), + EMACS_NSECS (duration), -1, 1, Qnil, NULL, 0); } } @@ -3981,9 +4018,11 @@ kbd_buffer_get_event (KBOARD **kbp, #if defined (WINDOWSNT) else if (event->kind == LANGUAGE_CHANGE_EVENT) { - /* Make an event (language-change (FRAME CHARSET LCID)). */ - obj = Fcons (event->frame_or_window, Qnil); - obj = Fcons (Qlanguage_change, Fcons (obj, Qnil)); + /* Make an event (language-change (FRAME CODEPAGE LANGUAGE-ID)). */ + obj = Fcons (Qlanguage_change, + list3 (event->frame_or_window, + make_number (event->code), + make_number (event->modifiers))); kbd_fetch_ptr = event + 1; } #endif @@ -4254,11 +4293,10 @@ timer_start_idle (void) Lisp_Object timers; /* If we are already in the idle state, do nothing. */ - if (! EMACS_TIME_NEG_P (timer_idleness_start_time)) + if (EMACS_TIME_VALID_P (timer_idleness_start_time)) return; - EMACS_GET_TIME (timer_idleness_start_time); - + timer_idleness_start_time = current_emacs_time (); timer_last_idleness_start_time = timer_idleness_start_time; /* Mark all idle-time timers as once again candidates for running. */ @@ -4268,9 +4306,9 @@ timer_start_idle (void) timer = XCAR (timers); - if (!VECTORP (timer) || ASIZE (timer) != 8) + if (!VECTORP (timer) || ASIZE (timer) != 9) continue; - XVECTOR (timer)->contents[0] = Qnil; + ASET (timer, 0, Qnil); } } @@ -4279,7 +4317,7 @@ timer_start_idle (void) static void timer_stop_idle (void) { - EMACS_SET_SECS_USECS (timer_idleness_start_time, -1, -1); + timer_idleness_start_time = invalid_emacs_time (); } /* Resume idle timer from last idle start time. */ @@ -4287,7 +4325,7 @@ timer_stop_idle (void) static void timer_resume_idle (void) { - if (! EMACS_TIME_NEG_P (timer_idleness_start_time)) + if (EMACS_TIME_VALID_P (timer_idleness_start_time)) return; timer_idleness_start_time = timer_last_idleness_start_time; @@ -4301,6 +4339,24 @@ struct input_event last_timer_event EXTERNALLY_VISIBLE; ...). Each element has the form (FUN . ARGS). */ Lisp_Object pending_funcalls; +/* If TIMER is a valid timer, return nonzero and place its value into + *RESULT. Otherwise return zero. */ +static int +decode_timer (Lisp_Object timer, EMACS_TIME *result) +{ + Lisp_Object *vector; + + if (! (VECTORP (timer) && ASIZE (timer) == 9)) + return 0; + vector = XVECTOR (timer)->contents; + if (! NILP (vector[0])) + return 0; + + return decode_time_components (vector[1], vector[2], vector[3], vector[4], + result, 0); +} + + /* Check whether a timer has fired. To prevent larger problems we simply disregard elements that are not proper timers. Do not make a circular timer list for the time being. @@ -4318,17 +4374,16 @@ timer_check_2 (void) { EMACS_TIME nexttime; EMACS_TIME now; - EMACS_TIME idleness_now IF_LINT (= {0}); + EMACS_TIME idleness_now; Lisp_Object timers, idle_timers, chosen_timer; struct gcpro gcpro1, gcpro2, gcpro3; - EMACS_SET_SECS (nexttime, -1); - EMACS_SET_USECS (nexttime, -1); + nexttime = invalid_emacs_time (); /* Always consider the ordinary timers. */ timers = Vtimer_list; /* Consider the idle timers only if Emacs is idle. */ - if (! EMACS_TIME_NEG_P (timer_idleness_start_time)) + if (EMACS_TIME_VALID_P (timer_idleness_start_time)) idle_timers = Vtimer_idle_list; else idle_timers = Qnil; @@ -4345,132 +4400,97 @@ timer_check_2 (void) if (CONSP (timers) || CONSP (idle_timers)) { - EMACS_GET_TIME (now); - if (! EMACS_TIME_NEG_P (timer_idleness_start_time)) - EMACS_SUB_TIME (idleness_now, now, timer_idleness_start_time); + now = current_emacs_time (); + idleness_now = (EMACS_TIME_VALID_P (timer_idleness_start_time) + ? sub_emacs_time (now, timer_idleness_start_time) + : make_emacs_time (0, 0)); } while (CONSP (timers) || CONSP (idle_timers)) { - Lisp_Object *vector; Lisp_Object timer = Qnil, idle_timer = Qnil; EMACS_TIME timer_time, idle_timer_time; EMACS_TIME difference; - EMACS_TIME timer_difference IF_LINT (= {0}); - EMACS_TIME idle_timer_difference IF_LINT (= {0}); + EMACS_TIME timer_difference = invalid_emacs_time (); + EMACS_TIME idle_timer_difference = invalid_emacs_time (); + int ripe, timer_ripe = 0, idle_timer_ripe = 0; - /* Skip past invalid timers and timers already handled. */ + /* Set TIMER and TIMER_DIFFERENCE + based on the next ordinary timer. + TIMER_DIFFERENCE is the distance in time from NOW to when + this timer becomes ripe (negative if it's already ripe). + Skip past invalid timers and timers already handled. */ if (CONSP (timers)) { timer = XCAR (timers); - if (!VECTORP (timer) || ASIZE (timer) != 8) + if (! decode_timer (timer, &timer_time)) { timers = XCDR (timers); continue; } - vector = XVECTOR (timer)->contents; - if (!INTEGERP (vector[1]) || !INTEGERP (vector[2]) - || !INTEGERP (vector[3]) - || ! NILP (vector[0])) - { - timers = XCDR (timers); - continue; - } + timer_ripe = EMACS_TIME_LE (timer_time, now); + timer_difference = (timer_ripe + ? sub_emacs_time (now, timer_time) + : sub_emacs_time (timer_time, now)); } + + /* Likewise for IDLE_TIMER and IDLE_TIMER_DIFFERENCE + based on the next idle timer. */ if (CONSP (idle_timers)) { - timer = XCAR (idle_timers); - if (!VECTORP (timer) || ASIZE (timer) != 8) - { - idle_timers = XCDR (idle_timers); - continue; - } - vector = XVECTOR (timer)->contents; - - if (!INTEGERP (vector[1]) || !INTEGERP (vector[2]) - || !INTEGERP (vector[3]) - || ! NILP (vector[0])) + idle_timer = XCAR (idle_timers); + if (! decode_timer (idle_timer, &idle_timer_time)) { idle_timers = XCDR (idle_timers); continue; } - } - /* Set TIMER, TIMER_TIME and TIMER_DIFFERENCE - based on the next ordinary timer. - TIMER_DIFFERENCE is the distance in time from NOW to when - this timer becomes ripe (negative if it's already ripe). */ - if (CONSP (timers)) - { - timer = XCAR (timers); - vector = XVECTOR (timer)->contents; - EMACS_SET_SECS (timer_time, - (XINT (vector[1]) << 16) | (XINT (vector[2]))); - EMACS_SET_USECS (timer_time, XINT (vector[3])); - EMACS_SUB_TIME (timer_difference, timer_time, now); - } - - /* Set IDLE_TIMER, IDLE_TIMER_TIME and IDLE_TIMER_DIFFERENCE - based on the next idle timer. */ - if (CONSP (idle_timers)) - { - idle_timer = XCAR (idle_timers); - vector = XVECTOR (idle_timer)->contents; - EMACS_SET_SECS (idle_timer_time, - (XINT (vector[1]) << 16) | (XINT (vector[2]))); - EMACS_SET_USECS (idle_timer_time, XINT (vector[3])); - EMACS_SUB_TIME (idle_timer_difference, idle_timer_time, idleness_now); + idle_timer_ripe = EMACS_TIME_LE (idle_timer_time, idleness_now); + idle_timer_difference = + (idle_timer_ripe + ? sub_emacs_time (idleness_now, idle_timer_time) + : sub_emacs_time (idle_timer_time, idleness_now)); } /* Decide which timer is the next timer, - and set CHOSEN_TIMER, VECTOR and DIFFERENCE accordingly. + and set CHOSEN_TIMER, DIFFERENCE, and RIPE accordingly. Also step down the list where we found that timer. */ - if (CONSP (timers) && CONSP (idle_timers)) - { - EMACS_TIME temp; - EMACS_SUB_TIME (temp, timer_difference, idle_timer_difference); - if (EMACS_TIME_NEG_P (temp)) - { - chosen_timer = timer; - timers = XCDR (timers); - difference = timer_difference; - } - else - { - chosen_timer = idle_timer; - idle_timers = XCDR (idle_timers); - difference = idle_timer_difference; - } - } - else if (CONSP (timers)) + if (EMACS_TIME_VALID_P (timer_difference) + && (! EMACS_TIME_VALID_P (idle_timer_difference) + || idle_timer_ripe < timer_ripe + || (idle_timer_ripe == timer_ripe + && (timer_ripe + ? EMACS_TIME_LT (idle_timer_difference, + timer_difference) + : EMACS_TIME_LT (timer_difference, + idle_timer_difference))))) { chosen_timer = timer; timers = XCDR (timers); difference = timer_difference; + ripe = timer_ripe; } else { chosen_timer = idle_timer; idle_timers = XCDR (idle_timers); difference = idle_timer_difference; + ripe = idle_timer_ripe; } - vector = XVECTOR (chosen_timer)->contents; /* If timer is ripe, run it if it hasn't been run. */ - if (EMACS_TIME_NEG_P (difference) - || (EMACS_SECS (difference) == 0 - && EMACS_USECS (difference) == 0)) + if (ripe) { - if (NILP (vector[0])) + if (NILP (AREF (chosen_timer, 0))) { - int count = SPECPDL_INDEX (); + ptrdiff_t count = SPECPDL_INDEX (); Lisp_Object old_deactivate_mark = Vdeactivate_mark; /* Mark the timer as triggered to prevent problems if the lisp code fails to reschedule it right. */ - vector[0] = Qt; + ASET (chosen_timer, 0, Qt); specbind (Qinhibit_quit, Qt); @@ -4485,8 +4505,8 @@ timer_check_2 (void) return 0 to indicate that. */ } - EMACS_SET_SECS (nexttime, 0); - EMACS_SET_USECS (nexttime, 0); + nexttime = make_emacs_time (0, 0); + break; } else /* When we encounter a timer that is still waiting, @@ -4509,7 +4529,7 @@ timer_check_2 (void) timer list for the time being. Returns the time to wait until the next timer fires. - If no timer is active, return -1. + If no timer is active, return an invalid value. As long as any timer is ripe, we run it. */ @@ -4522,34 +4542,24 @@ timer_check (void) { nexttime = timer_check_2 (); } - while (EMACS_SECS (nexttime) == 0 && EMACS_USECS (nexttime) == 0); + while (EMACS_SECS (nexttime) == 0 && EMACS_NSECS (nexttime) == 0); return nexttime; } DEFUN ("current-idle-time", Fcurrent_idle_time, Scurrent_idle_time, 0, 0, 0, doc: /* Return the current length of Emacs idleness, or nil. -The value when Emacs is idle is a list of three integers. The first has -the most significant 16 bits of the seconds, while the second has the least -significant 16 bits. The third integer gives the microsecond count. +The value when Emacs is idle is a list of four integers (HIGH LOW USEC PSEC) +in the same style as (current-time). The value when Emacs is not idle is nil. -The microsecond count is zero on systems that do not provide -resolution finer than a second. */) +NSEC is a multiple of the system clock resolution. */) (void) { - if (! EMACS_TIME_NEG_P (timer_idleness_start_time)) - { - EMACS_TIME now, idleness_now; - - EMACS_GET_TIME (now); - EMACS_SUB_TIME (idleness_now, now, timer_idleness_start_time); - - return list3 (make_number ((EMACS_SECS (idleness_now) >> 16) & 0xffff), - make_number ((EMACS_SECS (idleness_now) >> 0) & 0xffff), - make_number (EMACS_USECS (idleness_now))); - } + if (EMACS_TIME_VALID_P (timer_idleness_start_time)) + return make_lisp_time (sub_emacs_time (current_emacs_time (), + timer_idleness_start_time)); return Qnil; } @@ -5176,7 +5186,7 @@ make_lispy_position (struct frame *f, Lisp_Object x, Lisp_Object y, /* It's a click in window WINDOW at frame coordinates (X,Y) */ struct window *w = XWINDOW (window); Lisp_Object string_info = Qnil; - EMACS_INT textpos = -1; + ptrdiff_t textpos = -1; int col = -1, row = -1; int dx = -1, dy = -1; int width = -1, height = -1; @@ -5200,7 +5210,7 @@ make_lispy_position (struct frame *f, Lisp_Object x, Lisp_Object y, else if (part == ON_MODE_LINE || part == ON_HEADER_LINE) { Lisp_Object string; - EMACS_INT charpos; + ptrdiff_t charpos; posn = (part == ON_MODE_LINE) ? Qmode_line : Qheader_line; /* Note that mode_line_string takes COL, ROW as pixels and @@ -5223,7 +5233,7 @@ make_lispy_position (struct frame *f, Lisp_Object x, Lisp_Object y, else if (part == ON_LEFT_MARGIN || part == ON_RIGHT_MARGIN) { Lisp_Object string; - EMACS_INT charpos; + ptrdiff_t charpos; posn = (part == ON_LEFT_MARGIN) ? Qleft_margin : Qright_margin; col = wx; @@ -5357,7 +5367,7 @@ make_lispy_event (struct input_event *event) { int i; - switch (SWITCH_ENUM_CAST (event->kind)) + switch (event->kind) { /* A simple keystroke. */ case ASCII_KEYSTROKE_EVENT: @@ -5445,13 +5455,13 @@ make_lispy_event (struct input_event *event) /* We need to use an alist rather than a vector as the cache since we can't make a vector long enough. */ if (NILP (KVAR (current_kboard, system_key_syms))) - KVAR (current_kboard, system_key_syms) = Fcons (Qnil, Qnil); + kset_system_key_syms (current_kboard, Fcons (Qnil, Qnil)); return modify_event_symbol (event->code, event->modifiers, Qfunction_key, KVAR (current_kboard, Vsystem_key_alist), 0, &KVAR (current_kboard, system_key_syms), - TYPE_MAXIMUM (EMACS_INT)); + PTRDIFF_MAX); } return modify_event_symbol (event->code - FUNCTION_KEY_OFFSET, @@ -5583,12 +5593,13 @@ make_lispy_event (struct input_event *event) if (button >= ASIZE (button_down_location)) { + ptrdiff_t incr = button - ASIZE (button_down_location) + 1; button_down_location = larger_vector (button_down_location, - button + 1, Qnil); - mouse_syms = larger_vector (mouse_syms, button + 1, Qnil); + incr, -1); + mouse_syms = larger_vector (mouse_syms, incr, -1); } - start_pos_ptr = &AREF (button_down_location, button); + start_pos_ptr = aref_addr (button_down_location, button); start_pos = *start_pos_ptr; *start_pos_ptr = Qnil; @@ -5885,7 +5896,9 @@ make_lispy_event (struct input_event *event) event->modifiers &= ~up_modifier; if (event->code >= ASIZE (mouse_syms)) - mouse_syms = larger_vector (mouse_syms, event->code + 1, Qnil); + mouse_syms = larger_vector (mouse_syms, + event->code - ASIZE (mouse_syms) + 1, + -1); /* Get the symbol we should use for the mouse click. */ head = modify_event_symbol (event->code, @@ -5988,12 +6001,13 @@ make_lispy_event (struct input_event *event) if (button >= ASIZE (button_down_location)) { + ptrdiff_t incr = button - ASIZE (button_down_location) + 1; button_down_location = larger_vector (button_down_location, - button + 1, Qnil); - mouse_syms = larger_vector (mouse_syms, button + 1, Qnil); + incr, -1); + mouse_syms = larger_vector (mouse_syms, incr, -1); } - start_pos_ptr = &AREF (button_down_location, button); + start_pos_ptr = aref_addr (button_down_location, button); start_pos = *start_pos_ptr; position = make_lispy_position (f, event->x, event->y, @@ -6092,10 +6106,10 @@ make_lispy_switch_frame (Lisp_Object frame) This doesn't use any caches. */ static int -parse_modifiers_uncached (Lisp_Object symbol, EMACS_INT *modifier_end) +parse_modifiers_uncached (Lisp_Object symbol, ptrdiff_t *modifier_end) { Lisp_Object name; - EMACS_INT i; + ptrdiff_t i; int modifiers; CHECK_SYMBOL (symbol); @@ -6103,9 +6117,9 @@ parse_modifiers_uncached (Lisp_Object symbol, EMACS_INT *modifier_end) modifiers = 0; name = SYMBOL_NAME (symbol); - for (i = 0; i+2 <= SBYTES (name); ) + for (i = 0; i < SBYTES (name) - 1; ) { - EMACS_INT this_mod_end = 0; + ptrdiff_t this_mod_end = 0; int this_mod = 0; /* See if the name continues with a modifier word. @@ -6145,7 +6159,7 @@ parse_modifiers_uncached (Lisp_Object symbol, EMACS_INT *modifier_end) #define MULTI_LETTER_MOD(BIT, NAME, LEN) \ if (i + LEN + 1 <= SBYTES (name) \ - && ! strncmp (SSDATA (name) + i, NAME, LEN)) \ + && ! memcmp (SDATA (name) + i, NAME, LEN)) \ { \ this_mod_end = i + LEN; \ this_mod = BIT; \ @@ -6183,13 +6197,13 @@ parse_modifiers_uncached (Lisp_Object symbol, EMACS_INT *modifier_end) if (! (modifiers & (down_modifier | drag_modifier | double_modifier | triple_modifier)) && i + 7 == SBYTES (name) - && strncmp (SSDATA (name) + i, "mouse-", 6) == 0 + && memcmp (SDATA (name) + i, "mouse-", 6) == 0 && ('0' <= SREF (name, i + 6) && SREF (name, i + 6) <= '9')) modifiers |= click_modifier; if (! (modifiers & (double_modifier | triple_modifier)) && i + 6 < SBYTES (name) - && strncmp (SSDATA (name) + i, "wheel-", 6) == 0) + && memcmp (SDATA (name) + i, "wheel-", 6) == 0) modifiers |= click_modifier; if (modifier_end) @@ -6207,8 +6221,7 @@ apply_modifiers_uncached (int modifiers, char *base, int base_len, int base_len_ /* Since BASE could contain nulls, we can't use intern here; we have to use Fintern, which expects a genuine Lisp_String, and keeps a reference to it. */ - char *new_mods - = (char *) alloca (sizeof ("A-C-H-M-S-s-down-drag-double-triple-")); + char new_mods[sizeof "A-C-H-M-S-s-down-drag-double-triple-"]; int mod_len; { @@ -6269,7 +6282,7 @@ lispy_modifier_list (int modifiers) modifier_list = Qnil; for (i = 0; (1<contents[i], + modifier_list = Fcons (AREF (modifier_symbols, i), modifier_list); return modifier_list; @@ -6302,7 +6315,7 @@ parse_modifiers (Lisp_Object symbol) return elements; else { - EMACS_INT end; + ptrdiff_t end; int modifiers = parse_modifiers_uncached (symbol, &end); Lisp_Object unmodified; Lisp_Object mask; @@ -6468,9 +6481,9 @@ reorder_modifiers (Lisp_Object symbol) in the symbol's name. */ static Lisp_Object -modify_event_symbol (EMACS_INT symbol_num, unsigned int modifiers, Lisp_Object symbol_kind, +modify_event_symbol (ptrdiff_t symbol_num, int modifiers, Lisp_Object symbol_kind, Lisp_Object name_alist_or_stem, const char *const *name_table, - Lisp_Object *symbol_table, EMACS_INT table_size) + Lisp_Object *symbol_table, ptrdiff_t table_size) { Lisp_Object value; Lisp_Object symbol_int; @@ -6500,7 +6513,7 @@ modify_event_symbol (EMACS_INT symbol_num, unsigned int modifiers, Lisp_Object s *symbol_table = Fmake_vector (size, Qnil); } - value = XVECTOR (*symbol_table)->contents[symbol_num]; + value = AREF (*symbol_table, symbol_num); } /* Have we already used this symbol before? */ @@ -6515,7 +6528,7 @@ modify_event_symbol (EMACS_INT symbol_num, unsigned int modifiers, Lisp_Object s ptrdiff_t len = (SBYTES (name_alist_or_stem) + sizeof "-" + INT_STRLEN_BOUND (EMACS_INT)); USE_SAFE_ALLOCA; - SAFE_ALLOCA (buf, char *, len); + buf = SAFE_ALLOCA (len); esprintf (buf, "%s-%"pI"d", SDATA (name_alist_or_stem), XINT (symbol_int) + 1); value = intern (buf); @@ -6536,14 +6549,14 @@ modify_event_symbol (EMACS_INT symbol_num, unsigned int modifiers, Lisp_Object s if (NILP (value)) { char buf[sizeof "key-" + INT_STRLEN_BOUND (EMACS_INT)]; - sprintf (buf, "key-%"pI"d", symbol_num); + sprintf (buf, "key-%"pD"d", symbol_num); value = intern (buf); } if (CONSP (*symbol_table)) *symbol_table = Fcons (Fcons (symbol_int, value), *symbol_table); else - XVECTOR (*symbol_table)->contents[symbol_num] = value; + ASET (*symbol_table, symbol_num, value); /* Fill in the cache entries for this symbol; this also builds the Qevent_symbol_elements property, which the user @@ -6642,7 +6655,7 @@ parse_solitary_modifier (Lisp_Object symbol) #define MULTI_LETTER_MOD(BIT, NAME, LEN) \ if (LEN == SBYTES (name) \ - && ! strncmp (SSDATA (name), NAME, LEN)) \ + && ! memcmp (SDATA (name), NAME, LEN)) \ return BIT; case 'A': @@ -7236,7 +7249,7 @@ input_available_signal (int signo) #endif if (input_available_clear_time) - EMACS_SET_SECS_USECS (*input_available_clear_time, 0, 0); + *input_available_clear_time = make_emacs_time (0, 0); #ifndef SYNC_INPUT handle_async_input (); @@ -7291,7 +7304,7 @@ add_user_signal (int sig, const char *name) /* Already added. */ return; - p = xmalloc (sizeof (struct user_signal_info)); + p = xmalloc (sizeof *p); p->sig = sig; p->name = xstrdup (name); p->npending = 0; @@ -7316,8 +7329,8 @@ handle_user_signal (int sig) for (p = user_signals; p; p = p->next) if (p->sig == sig) { - if (special_event_name && - strcmp (special_event_name, p->name) == 0) + if (special_event_name + && strcmp (special_event_name, p->name) == 0) { /* Enter the debugger in many ways. */ debug_on_next_call = 1; @@ -7339,7 +7352,7 @@ handle_user_signal (int sig) /* Tell wait_reading_process_output that it needs to wake up and look around. */ if (input_available_clear_time) - EMACS_SET_SECS_USECS (*input_available_clear_time, 0, 0); + *input_available_clear_time = make_emacs_time (0, 0); } break; } @@ -7430,7 +7443,7 @@ menu_separator_name_p (const char *label) if (!label) return 0; else if (strlen (label) > 3 - && strncmp (label, "--", 2) == 0 + && memcmp (label, "--", 2) == 0 && label[2] != '-') { int i; @@ -7500,7 +7513,7 @@ menu_bar_items (Lisp_Object old) if (!NILP (Voverriding_local_map_menu_flag)) { /* Yes, use them (if non-nil) as well as the global map. */ - maps = (Lisp_Object *) alloca (3 * sizeof (maps[0])); + maps = alloca (3 * sizeof (maps[0])); nmaps = 0; if (!NILP (KVAR (current_kboard, Voverriding_terminal_local_map))) maps[nmaps++] = KVAR (current_kboard, Voverriding_terminal_local_map); @@ -7517,7 +7530,7 @@ menu_bar_items (Lisp_Object old) Lisp_Object tem; ptrdiff_t nminor; nminor = current_minor_maps (NULL, &tmaps); - maps = (Lisp_Object *) alloca ((nminor + 3) * sizeof (maps[0])); + maps = alloca ((nminor + 3) * sizeof *maps); nmaps = 0; if (tem = get_local_map (PT, current_buffer, Qkeymap), !NILP (tem)) maps[nmaps++] = tem; @@ -7550,23 +7563,23 @@ menu_bar_items (Lisp_Object old) int end = menu_bar_items_index; for (i = 0; i < end; i += 4) - if (EQ (XCAR (tail), XVECTOR (menu_bar_items_vector)->contents[i])) + if (EQ (XCAR (tail), AREF (menu_bar_items_vector, i))) { Lisp_Object tem0, tem1, tem2, tem3; /* Move the item at index I to the end, shifting all the others forward. */ - tem0 = XVECTOR (menu_bar_items_vector)->contents[i + 0]; - tem1 = XVECTOR (menu_bar_items_vector)->contents[i + 1]; - tem2 = XVECTOR (menu_bar_items_vector)->contents[i + 2]; - tem3 = XVECTOR (menu_bar_items_vector)->contents[i + 3]; + tem0 = AREF (menu_bar_items_vector, i + 0); + tem1 = AREF (menu_bar_items_vector, i + 1); + tem2 = AREF (menu_bar_items_vector, i + 2); + tem3 = AREF (menu_bar_items_vector, i + 3); if (end > i + 4) - memmove (&XVECTOR (menu_bar_items_vector)->contents[i], - &XVECTOR (menu_bar_items_vector)->contents[i + 4], - (end - i - 4) * sizeof (Lisp_Object)); - XVECTOR (menu_bar_items_vector)->contents[end - 4] = tem0; - XVECTOR (menu_bar_items_vector)->contents[end - 3] = tem1; - XVECTOR (menu_bar_items_vector)->contents[end - 2] = tem2; - XVECTOR (menu_bar_items_vector)->contents[end - 1] = tem3; + memmove (aref_addr (menu_bar_items_vector, i), + aref_addr (menu_bar_items_vector, i + 4), + (end - i - 4) * word_size); + ASET (menu_bar_items_vector, end - 4, tem0); + ASET (menu_bar_items_vector, end - 3, tem1); + ASET (menu_bar_items_vector, end - 2, tem2); + ASET (menu_bar_items_vector, end - 1, tem3); break; } } @@ -7576,12 +7589,12 @@ menu_bar_items (Lisp_Object old) int i = menu_bar_items_index; if (i + 4 > ASIZE (menu_bar_items_vector)) menu_bar_items_vector = - larger_vector (menu_bar_items_vector, 2 * i, Qnil); + larger_vector (menu_bar_items_vector, 4, -1); /* Add this item. */ - XVECTOR (menu_bar_items_vector)->contents[i++] = Qnil; - XVECTOR (menu_bar_items_vector)->contents[i++] = Qnil; - XVECTOR (menu_bar_items_vector)->contents[i++] = Qnil; - XVECTOR (menu_bar_items_vector)->contents[i++] = Qnil; + ASET (menu_bar_items_vector, i, Qnil); i++; + ASET (menu_bar_items_vector, i, Qnil); i++; + ASET (menu_bar_items_vector, i, Qnil); i++; + ASET (menu_bar_items_vector, i, Qnil); i++; menu_bar_items_index = i; } @@ -7607,12 +7620,12 @@ menu_bar_item (Lisp_Object key, Lisp_Object item, Lisp_Object dummy1, void *dumm discard any previously made menu bar item. */ for (i = 0; i < menu_bar_items_index; i += 4) - if (EQ (key, XVECTOR (menu_bar_items_vector)->contents[i])) + if (EQ (key, AREF (menu_bar_items_vector, i))) { if (menu_bar_items_index > i + 4) - memmove (&XVECTOR (menu_bar_items_vector)->contents[i], - &XVECTOR (menu_bar_items_vector)->contents[i + 4], - (menu_bar_items_index - i - 4) * sizeof (Lisp_Object)); + memmove (aref_addr (menu_bar_items_vector, i), + aref_addr (menu_bar_items_vector, i + 4), + (menu_bar_items_index - i - 4) * word_size); menu_bar_items_index -= 4; } } @@ -7635,11 +7648,11 @@ menu_bar_item (Lisp_Object key, Lisp_Object item, Lisp_Object dummy1, void *dumm if (!i) return; - item = XVECTOR (item_properties)->contents[ITEM_PROPERTY_DEF]; + item = AREF (item_properties, ITEM_PROPERTY_DEF); /* Find any existing item for this KEY. */ for (i = 0; i < menu_bar_items_index; i += 4) - if (EQ (key, XVECTOR (menu_bar_items_vector)->contents[i])) + if (EQ (key, AREF (menu_bar_items_vector, i))) break; /* If we did not find this KEY, add it at the end. */ @@ -7647,24 +7660,24 @@ menu_bar_item (Lisp_Object key, Lisp_Object item, Lisp_Object dummy1, void *dumm { /* If vector is too small, get a bigger one. */ if (i + 4 > ASIZE (menu_bar_items_vector)) - menu_bar_items_vector = larger_vector (menu_bar_items_vector, 2 * i, Qnil); + menu_bar_items_vector = larger_vector (menu_bar_items_vector, 4, -1); /* Add this item. */ - XVECTOR (menu_bar_items_vector)->contents[i++] = key; - XVECTOR (menu_bar_items_vector)->contents[i++] - = XVECTOR (item_properties)->contents[ITEM_PROPERTY_NAME]; - XVECTOR (menu_bar_items_vector)->contents[i++] = Fcons (item, Qnil); - XVECTOR (menu_bar_items_vector)->contents[i++] = make_number (0); + ASET (menu_bar_items_vector, i, key); i++; + ASET (menu_bar_items_vector, i, + AREF (item_properties, ITEM_PROPERTY_NAME)); i++; + ASET (menu_bar_items_vector, i, Fcons (item, Qnil)); i++; + ASET (menu_bar_items_vector, i, make_number (0)); i++; menu_bar_items_index = i; } /* We did find an item for this KEY. Add ITEM to its list of maps. */ else { Lisp_Object old; - old = XVECTOR (menu_bar_items_vector)->contents[i + 2]; + old = AREF (menu_bar_items_vector, i + 2); /* If the new and the old items are not both keymaps, the lookup will only find `item'. */ item = Fcons (item, KEYMAPP (item) && KEYMAPP (XCAR (old)) ? old : Qnil); - XVECTOR (menu_bar_items_vector)->contents[i + 2] = item; + ASET (menu_bar_items_vector, i + 2, item); } } @@ -7691,7 +7704,7 @@ eval_dyn (Lisp_Object form) Lisp_Object menu_item_eval_property (Lisp_Object sexpr) { - int count = SPECPDL_INDEX (); + ptrdiff_t count = SPECPDL_INDEX (); Lisp_Object val; specbind (Qinhibit_redisplay, Qt); val = internal_condition_case_1 (eval_dyn, sexpr, Qerror, @@ -7929,7 +7942,8 @@ parse_menu_item (Lisp_Object item, int inmenubar) /* If the command is an alias for another (such as lmenu.el set it up), check if the original command matches the cached command. */ - && !(SYMBOLP (def) && EQ (tem, XSYMBOL (def)->function)))) + && !(SYMBOLP (def) + && EQ (tem, XSYMBOL (def)->function)))) keys = Qnil; } @@ -8044,7 +8058,7 @@ tool_bar_items (Lisp_Object reuse, int *nitems) if (!NILP (Voverriding_local_map_menu_flag)) { /* Yes, use them (if non-nil) as well as the global map. */ - maps = (Lisp_Object *) alloca (3 * sizeof (maps[0])); + maps = alloca (3 * sizeof *maps); nmaps = 0; if (!NILP (KVAR (current_kboard, Voverriding_terminal_local_map))) maps[nmaps++] = KVAR (current_kboard, Voverriding_terminal_local_map); @@ -8061,7 +8075,7 @@ tool_bar_items (Lisp_Object reuse, int *nitems) Lisp_Object tem; ptrdiff_t nminor; nminor = current_minor_maps (NULL, &tmaps); - maps = (Lisp_Object *) alloca ((nminor + 3) * sizeof (maps[0])); + maps = alloca ((nminor + 3) * sizeof *maps); nmaps = 0; if (tem = get_local_map (PT, current_buffer, Qkeymap), !NILP (tem)) maps[nmaps++] = tem; @@ -8116,7 +8130,7 @@ process_tool_bar_item (Lisp_Object key, Lisp_Object def, Lisp_Object data, void if (ntool_bar_items > i + TOOL_BAR_ITEM_NSLOTS) memmove (v, v + TOOL_BAR_ITEM_NSLOTS, ((ntool_bar_items - i - TOOL_BAR_ITEM_NSLOTS) - * sizeof (Lisp_Object))); + * word_size)); ntool_bar_items -= TOOL_BAR_ITEM_NSLOTS; break; } @@ -8130,6 +8144,14 @@ process_tool_bar_item (Lisp_Object key, Lisp_Object def, Lisp_Object data, void UNGCPRO; } +/* Access slot with index IDX of vector tool_bar_item_properties. */ +#define PROP(IDX) AREF (tool_bar_item_properties, (IDX)) +static inline void +set_prop (ptrdiff_t idx, Lisp_Object val) +{ + ASET (tool_bar_item_properties, idx, val); +} + /* Parse a tool bar item specification ITEM for key KEY and return the result in tool_bar_item_properties. Value is zero if ITEM is @@ -8180,9 +8202,6 @@ process_tool_bar_item (Lisp_Object key, Lisp_Object def, Lisp_Object data, void static int parse_tool_bar_item (Lisp_Object key, Lisp_Object item) { - /* Access slot with index IDX of vector tool_bar_item_properties. */ -#define PROP(IDX) XVECTOR (tool_bar_item_properties)->contents[IDX] - Lisp_Object filter = Qnil; Lisp_Object caption; int i, have_label = 0; @@ -8206,15 +8225,15 @@ parse_tool_bar_item (Lisp_Object key, Lisp_Object item) if (VECTORP (tool_bar_item_properties)) { for (i = 0; i < TOOL_BAR_ITEM_NSLOTS; ++i) - PROP (i) = Qnil; + set_prop (i, Qnil); } else tool_bar_item_properties = Fmake_vector (make_number (TOOL_BAR_ITEM_NSLOTS), Qnil); /* Set defaults. */ - PROP (TOOL_BAR_ITEM_KEY) = key; - PROP (TOOL_BAR_ITEM_ENABLED_P) = Qt; + set_prop (TOOL_BAR_ITEM_KEY, key); + set_prop (TOOL_BAR_ITEM_ENABLED_P, Qt); /* Get the caption of the item. If the caption is not a string, evaluate it to get a string. If we don't get a string, skip this @@ -8226,7 +8245,7 @@ parse_tool_bar_item (Lisp_Object key, Lisp_Object item) if (!STRINGP (caption)) return 0; } - PROP (TOOL_BAR_ITEM_CAPTION) = caption; + set_prop (TOOL_BAR_ITEM_CAPTION, caption); /* If the rest following the caption is not a list, the menu item is either a separator, or invalid. */ @@ -8235,7 +8254,7 @@ parse_tool_bar_item (Lisp_Object key, Lisp_Object item) { if (menu_separator_name_p (SSDATA (caption))) { - PROP (TOOL_BAR_ITEM_TYPE) = Qt; + set_prop (TOOL_BAR_ITEM_TYPE, Qt); #if !defined (USE_GTK) && !defined (HAVE_NS) /* If we use build_desired_tool_bar_string to render the tool bar, the separator is rendered as an image. */ @@ -8251,7 +8270,7 @@ parse_tool_bar_item (Lisp_Object key, Lisp_Object item) } /* Store the binding. */ - PROP (TOOL_BAR_ITEM_BINDING) = XCAR (item); + set_prop (TOOL_BAR_ITEM_BINDING, XCAR (item)); item = XCDR (item); /* Ignore cached key binding, if any. */ @@ -8270,9 +8289,9 @@ parse_tool_bar_item (Lisp_Object key, Lisp_Object item) { /* `:enable FORM'. */ if (!NILP (Venable_disabled_menus_and_buttons)) - PROP (TOOL_BAR_ITEM_ENABLED_P) = Qt; + set_prop (TOOL_BAR_ITEM_ENABLED_P, Qt); else - PROP (TOOL_BAR_ITEM_ENABLED_P) = value; + set_prop (TOOL_BAR_ITEM_ENABLED_P, value); } else if (EQ (ikey, QCvisible)) { @@ -8283,17 +8302,16 @@ parse_tool_bar_item (Lisp_Object key, Lisp_Object item) } else if (EQ (ikey, QChelp)) /* `:help HELP-STRING'. */ - PROP (TOOL_BAR_ITEM_HELP) = value; + set_prop (TOOL_BAR_ITEM_HELP, value); else if (EQ (ikey, QCvert_only)) /* `:vert-only t/nil'. */ - PROP (TOOL_BAR_ITEM_VERT_ONLY) = value; + set_prop (TOOL_BAR_ITEM_VERT_ONLY, value); else if (EQ (ikey, QClabel)) { const char *bad_label = "!!?GARBLED ITEM?!!"; /* `:label LABEL-STRING'. */ - PROP (TOOL_BAR_ITEM_LABEL) = STRINGP (value) - ? value - : build_string (bad_label); + set_prop (TOOL_BAR_ITEM_LABEL, + STRINGP (value) ? value : build_string (bad_label)); have_label = 1; } else if (EQ (ikey, QCfilter)) @@ -8308,8 +8326,8 @@ parse_tool_bar_item (Lisp_Object key, Lisp_Object item) selected = XCDR (value); if (EQ (type, QCtoggle) || EQ (type, QCradio)) { - PROP (TOOL_BAR_ITEM_SELECTED_P) = selected; - PROP (TOOL_BAR_ITEM_TYPE) = type; + set_prop (TOOL_BAR_ITEM_SELECTED_P, selected); + set_prop (TOOL_BAR_ITEM_TYPE, type); } } else if (EQ (ikey, QCimage) @@ -8317,10 +8335,10 @@ parse_tool_bar_item (Lisp_Object key, Lisp_Object item) || (VECTORP (value) && ASIZE (value) == 4))) /* Value is either a single image specification or a vector of 4 such specifications for the different button states. */ - PROP (TOOL_BAR_ITEM_IMAGES) = value; + set_prop (TOOL_BAR_ITEM_IMAGES, value); else if (EQ (ikey, QCrtl)) /* ':rtl STRING' */ - PROP (TOOL_BAR_ITEM_RTL_IMAGE) = value; + set_prop (TOOL_BAR_ITEM_RTL_IMAGE, value); } @@ -8333,7 +8351,7 @@ parse_tool_bar_item (Lisp_Object key, Lisp_Object item) const char *capt = STRINGP (tcapt) ? SSDATA (tcapt) : ""; ptrdiff_t max_lbl = 2 * max (0, min (tool_bar_max_label_size, STRING_BYTES_BOUND / 2)); - char *buf = (char *) xmalloc (max_lbl + 1); + char *buf = xmalloc (max_lbl + 1); Lisp_Object new_lbl; ptrdiff_t caption_len = strlen (capt); @@ -8362,18 +8380,19 @@ parse_tool_bar_item (Lisp_Object key, Lisp_Object item) new_lbl = Fupcase_initials (build_string (label)); if (SCHARS (new_lbl) <= tool_bar_max_label_size) - PROP (TOOL_BAR_ITEM_LABEL) = new_lbl; + set_prop (TOOL_BAR_ITEM_LABEL, new_lbl); else - PROP (TOOL_BAR_ITEM_LABEL) = make_string ("", 0); + set_prop (TOOL_BAR_ITEM_LABEL, empty_unibyte_string); xfree (buf); } /* If got a filter apply it on binding. */ if (!NILP (filter)) - PROP (TOOL_BAR_ITEM_BINDING) - = menu_item_eval_property (list2 (filter, - list2 (Qquote, - PROP (TOOL_BAR_ITEM_BINDING)))); + set_prop (TOOL_BAR_ITEM_BINDING, + (menu_item_eval_property + (list2 (filter, + list2 (Qquote, + PROP (TOOL_BAR_ITEM_BINDING)))))); /* See if the binding is a keymap. Give up if it is. */ if (CONSP (get_keymap (PROP (TOOL_BAR_ITEM_BINDING), 0, 1))) @@ -8381,13 +8400,13 @@ parse_tool_bar_item (Lisp_Object key, Lisp_Object item) /* Enable or disable selection of item. */ if (!EQ (PROP (TOOL_BAR_ITEM_ENABLED_P), Qt)) - PROP (TOOL_BAR_ITEM_ENABLED_P) - = menu_item_eval_property (PROP (TOOL_BAR_ITEM_ENABLED_P)); + set_prop (TOOL_BAR_ITEM_ENABLED_P, + menu_item_eval_property (PROP (TOOL_BAR_ITEM_ENABLED_P))); /* Handle radio buttons or toggle boxes. */ if (!NILP (PROP (TOOL_BAR_ITEM_SELECTED_P))) - PROP (TOOL_BAR_ITEM_SELECTED_P) - = menu_item_eval_property (PROP (TOOL_BAR_ITEM_SELECTED_P)); + set_prop (TOOL_BAR_ITEM_SELECTED_P, + menu_item_eval_property (PROP (TOOL_BAR_ITEM_SELECTED_P))); return 1; @@ -8415,20 +8434,19 @@ init_tool_bar_items (Lisp_Object reuse) static void append_tool_bar_item (void) { - Lisp_Object *to, *from; + ptrdiff_t incr = + (ntool_bar_items + - (ASIZE (tool_bar_items_vector) - TOOL_BAR_ITEM_NSLOTS)); /* Enlarge tool_bar_items_vector if necessary. */ - if (ntool_bar_items + TOOL_BAR_ITEM_NSLOTS - >= ASIZE (tool_bar_items_vector)) + if (0 < incr) tool_bar_items_vector - = larger_vector (tool_bar_items_vector, - 2 * ASIZE (tool_bar_items_vector), Qnil); + = larger_vector (tool_bar_items_vector, incr, -1); /* Append entries from tool_bar_item_properties to the end of tool_bar_items_vector. */ - to = XVECTOR (tool_bar_items_vector)->contents + ntool_bar_items; - from = XVECTOR (tool_bar_item_properties)->contents; - memcpy (to, from, TOOL_BAR_ITEM_NSLOTS * sizeof *to); + vcopy (tool_bar_items_vector, ntool_bar_items, + XVECTOR (tool_bar_item_properties)->contents, TOOL_BAR_ITEM_NSLOTS); ntool_bar_items += TOOL_BAR_ITEM_NSLOTS; } @@ -8460,7 +8478,9 @@ static Lisp_Object read_char_x_menu_prompt (ptrdiff_t nmaps, Lisp_Object *maps, Lisp_Object prev_event, int *used_mouse_menu) { +#ifdef HAVE_MENUS ptrdiff_t mapno; +#endif if (used_mouse_menu) *used_mouse_menu = 0; @@ -8485,8 +8505,7 @@ read_char_x_menu_prompt (ptrdiff_t nmaps, Lisp_Object *maps, && !EQ (XCAR (prev_event), Qtool_bar)) { /* Display the menu and get the selection. */ - Lisp_Object *realmaps - = (Lisp_Object *) alloca (nmaps * sizeof (Lisp_Object)); + Lisp_Object *realmaps = alloca (nmaps * sizeof *realmaps); Lisp_Object value; ptrdiff_t nmaps1 = 0; @@ -8580,7 +8599,7 @@ read_char_minibuf_menu_prompt (int commandflag, if (width + 4 > read_char_minibuf_menu_width) { read_char_minibuf_menu_text - = (char *) xrealloc (read_char_minibuf_menu_text, width + 4); + = xrealloc (read_char_minibuf_menu_text, width + 4); read_char_minibuf_menu_width = width + 4; } menu = read_char_minibuf_menu_text; @@ -8625,7 +8644,7 @@ read_char_minibuf_menu_prompt (int commandflag, /* Look at the next element of the map. */ if (idx >= 0) - elt = XVECTOR (vector)->contents[idx]; + elt = AREF (vector, idx); else elt = Fcar_safe (rest); @@ -8660,7 +8679,7 @@ read_char_minibuf_menu_prompt (int commandflag, Lisp_Object upcased_event, downcased_event; Lisp_Object desc = Qnil; Lisp_Object s - = XVECTOR (item_properties)->contents[ITEM_PROPERTY_NAME]; + = AREF (item_properties, ITEM_PROPERTY_NAME); upcased_event = Fupcase (event); downcased_event = Fdowncase (event); @@ -8678,12 +8697,12 @@ read_char_minibuf_menu_prompt (int commandflag, s = concat2 (s, tem); #endif tem - = XVECTOR (item_properties)->contents[ITEM_PROPERTY_TYPE]; + = AREF (item_properties, ITEM_PROPERTY_TYPE); if (EQ (tem, QCradio) || EQ (tem, QCtoggle)) { /* Insert button prefix. */ Lisp_Object selected - = XVECTOR (item_properties)->contents[ITEM_PROPERTY_SELECTED]; + = AREF (item_properties, ITEM_PROPERTY_SELECTED); if (EQ (tem, QCradio)) tem = build_string (NILP (selected) ? "(*) " : "( ) "); else @@ -8757,11 +8776,11 @@ read_char_minibuf_menu_prompt (int commandflag, is not used on replay. */ orig_defn_macro = KVAR (current_kboard, defining_kbd_macro); - KVAR (current_kboard, defining_kbd_macro) = Qnil; + kset_defining_kbd_macro (current_kboard, Qnil); do obj = read_char (commandflag, 0, 0, Qt, 0, NULL); while (BUFFERP (obj)); - KVAR (current_kboard, defining_kbd_macro) = orig_defn_macro; + kset_defining_kbd_macro (current_kboard, orig_defn_macro); if (!INTEGERP (obj)) return obj; @@ -8855,23 +8874,17 @@ access_keymap_keyremap (Lisp_Object map, Lisp_Object key, Lisp_Object prompt, next = access_keymap (map, key, 1, 0, 1); - /* Handle symbol with autoload definition. */ - if (SYMBOLP (next) && !NILP (Ffboundp (next)) - && CONSP (XSYMBOL (next)->function) - && EQ (XCAR (XSYMBOL (next)->function), Qautoload)) - do_autoload (XSYMBOL (next)->function, next); - /* Handle a symbol whose function definition is a keymap or an array. */ if (SYMBOLP (next) && !NILP (Ffboundp (next)) && (ARRAYP (XSYMBOL (next)->function) || KEYMAPP (XSYMBOL (next)->function))) - next = XSYMBOL (next)->function; + next = Fautoload_do_load (XSYMBOL (next)->function, next, Qnil); /* If the keymap gives a function, not an array, then call the function with one arg and use its value instead. */ - if (SYMBOLP (next) && !NILP (Ffboundp (next)) && do_funcall) + if (do_funcall && FUNCTIONP (next)) { Lisp_Object tem; tem = next; @@ -9007,15 +9020,15 @@ read_key_sequence (Lisp_Object *keybuf, int bufsize, Lisp_Object prompt, int fix_current_buffer) { Lisp_Object from_string; - int count = SPECPDL_INDEX (); + ptrdiff_t count = SPECPDL_INDEX (); /* How many keys there are in the current key sequence. */ int t; /* The length of the echo buffer when we started reading, and the length of this_command_keys when we started reading. */ - int echo_start IF_LINT (= 0); - int keys_start; + ptrdiff_t echo_start IF_LINT (= 0); + ptrdiff_t keys_start; /* The number of keymaps we're scanning right now, and the number of keymaps we have allocated space for. */ @@ -9123,7 +9136,7 @@ read_key_sequence (Lisp_Object *keybuf, int bufsize, Lisp_Object prompt, /* Install the string STR as the beginning of the string of echoing, so that it serves as a prompt for the next character. */ - KVAR (current_kboard, echo_string) = prompt; + kset_echo_string (current_kboard, prompt); current_kboard->echo_after_prompt = SCHARS (prompt); echo_now (); } @@ -9187,8 +9200,8 @@ read_key_sequence (Lisp_Object *keybuf, int bufsize, Lisp_Object prompt, { if (2 > nmaps_allocated) { - submaps = (Lisp_Object *) alloca (2 * sizeof (submaps[0])); - defs = (Lisp_Object *) alloca (2 * sizeof (defs[0])); + submaps = alloca (2 * sizeof *submaps); + defs = alloca (2 * sizeof *defs); nmaps_allocated = 2; } submaps[nmaps++] = KVAR (current_kboard, Voverriding_terminal_local_map); @@ -9197,8 +9210,8 @@ read_key_sequence (Lisp_Object *keybuf, int bufsize, Lisp_Object prompt, { if (2 > nmaps_allocated) { - submaps = (Lisp_Object *) alloca (2 * sizeof (submaps[0])); - defs = (Lisp_Object *) alloca (2 * sizeof (defs[0])); + submaps = alloca (2 * sizeof *submaps); + defs = alloca (2 * sizeof *defs); nmaps_allocated = 2; } submaps[nmaps++] = Voverriding_local_map; @@ -9214,8 +9227,8 @@ read_key_sequence (Lisp_Object *keybuf, int bufsize, Lisp_Object prompt, if (total > nmaps_allocated) { - submaps = (Lisp_Object *) alloca (total * sizeof (submaps[0])); - defs = (Lisp_Object *) alloca (total * sizeof (defs[0])); + submaps = alloca (total * sizeof *submaps); + defs = alloca (total * sizeof *defs); nmaps_allocated = total; } @@ -9271,7 +9284,7 @@ read_key_sequence (Lisp_Object *keybuf, int bufsize, Lisp_Object prompt, while those allow us to restart the entire key sequence, echo_local_start and keys_local_start allow us to throw away just one key. */ - int echo_local_start IF_LINT (= 0); + ptrdiff_t echo_local_start IF_LINT (= 0); int keys_local_start; ptrdiff_t local_first_binding; @@ -9369,15 +9382,17 @@ read_key_sequence (Lisp_Object *keybuf, int bufsize, Lisp_Object prompt, if (!NILP (delayed_switch_frame)) { - KVAR (interrupted_kboard, kbd_queue) - = Fcons (delayed_switch_frame, - KVAR (interrupted_kboard, kbd_queue)); + kset_kbd_queue + (interrupted_kboard, + Fcons (delayed_switch_frame, + KVAR (interrupted_kboard, kbd_queue))); delayed_switch_frame = Qnil; } while (t > 0) - KVAR (interrupted_kboard, kbd_queue) - = Fcons (keybuf[--t], KVAR (interrupted_kboard, kbd_queue)); + kset_kbd_queue + (interrupted_kboard, + Fcons (keybuf[--t], KVAR (interrupted_kboard, kbd_queue))); /* If the side queue is non-empty, ensure it begins with a switch-frame, so we'll replay it in the right context. */ @@ -9389,9 +9404,10 @@ read_key_sequence (Lisp_Object *keybuf, int bufsize, Lisp_Object prompt, { Lisp_Object frame; XSETFRAME (frame, interrupted_frame); - KVAR (interrupted_kboard, kbd_queue) - = Fcons (make_lispy_switch_frame (frame), - KVAR (interrupted_kboard, kbd_queue)); + kset_kbd_queue + (interrupted_kboard, + Fcons (make_lispy_switch_frame (frame), + KVAR (interrupted_kboard, kbd_queue))); } mock_input = 0; orig_local_map = get_local_map (PT, current_buffer, Qlocal_map); @@ -9453,7 +9469,8 @@ read_key_sequence (Lisp_Object *keybuf, int bufsize, Lisp_Object prompt, && current_buffer != starting_buffer) { GROW_RAW_KEYBUF; - XVECTOR (raw_keybuf)->contents[raw_keybuf_count++] = key; + ASET (raw_keybuf, raw_keybuf_count, key); + raw_keybuf_count++; keybuf[t++] = key; mock_input = t; Vquit_flag = Qnil; @@ -9531,7 +9548,8 @@ read_key_sequence (Lisp_Object *keybuf, int bufsize, Lisp_Object prompt, && BUFFERP (XWINDOW (window)->buffer) && XBUFFER (XWINDOW (window)->buffer) != current_buffer) { - XVECTOR (raw_keybuf)->contents[raw_keybuf_count++] = key; + ASET (raw_keybuf, raw_keybuf_count, key); + raw_keybuf_count++; keybuf[t] = key; mock_input = t + 1; @@ -9545,7 +9563,7 @@ read_key_sequence (Lisp_Object *keybuf, int bufsize, Lisp_Object prompt, because we may get input from a subprocess which wants to change the selected window and stuff (say, emacsclient). */ - record_unwind_protect (Fset_buffer, Fcurrent_buffer ()); + record_unwind_current_buffer (); if (! FRAME_LIVE_P (XFRAME (selected_frame))) Fkill_emacs (Qnil); @@ -10159,7 +10177,7 @@ will read just one key sequence. */) Lisp_Object keybuf[30]; register int i; struct gcpro gcpro1; - int count = SPECPDL_INDEX (); + ptrdiff_t count = SPECPDL_INDEX (); if (!NILP (prompt)) CHECK_STRING (prompt); @@ -10216,7 +10234,7 @@ DEFUN ("read-key-sequence-vector", Fread_key_sequence_vector, Lisp_Object keybuf[30]; register int i; struct gcpro gcpro1; - int count = SPECPDL_INDEX (); + ptrdiff_t count = SPECPDL_INDEX (); if (!NILP (prompt)) CHECK_STRING (prompt); @@ -10283,7 +10301,7 @@ a special event, so ignore the prefix argument and don't clear it. */) { prefixarg = KVAR (current_kboard, Vprefix_arg); Vcurrent_prefix_arg = prefixarg; - KVAR (current_kboard, Vprefix_arg) = Qnil; + kset_prefix_arg (current_kboard, Qnil); } else prefixarg = Qnil; @@ -10308,7 +10326,7 @@ a special event, so ignore the prefix argument and don't clear it. */) struct gcpro gcpro1, gcpro2; GCPRO2 (cmd, prefixarg); - do_autoload (final, cmd); + Fautoload_do_load (final, cmd, Qnil); UNGCPRO; } else @@ -10457,10 +10475,10 @@ DEFUN ("recent-keys", Frecent_keys, Srecent_keys, 0, 0, 0, else { val = Fvector (NUM_RECENT_KEYS, keys); - memcpy (XVECTOR (val)->contents, keys + recent_keys_index, - (NUM_RECENT_KEYS - recent_keys_index) * sizeof (Lisp_Object)); - memcpy (XVECTOR (val)->contents + NUM_RECENT_KEYS - recent_keys_index, - keys, recent_keys_index * sizeof (Lisp_Object)); + vcopy (val, 0, keys + recent_keys_index, + NUM_RECENT_KEYS - recent_keys_index); + vcopy (val, NUM_RECENT_KEYS - recent_keys_index, + keys, recent_keys_index); return val; } } @@ -10562,7 +10580,7 @@ KEEP-RECORD is non-nil. */) if (NILP (keep_record)) { for (i = 0; i < ASIZE (recent_keys); ++i) - XVECTOR (recent_keys)->contents[i] = Qnil; + ASET (recent_keys, i, Qnil); total_keys = 0; recent_keys_index = 0; } @@ -10644,7 +10662,7 @@ Some operating systems cannot stop the Emacs process and resume it later. On such systems, Emacs starts a subshell instead of suspending. */) (Lisp_Object stuffstring) { - int count = SPECPDL_INDEX (); + ptrdiff_t count = SPECPDL_INDEX (); int old_height, old_width; int width, height; struct gcpro gcpro1; @@ -10700,7 +10718,7 @@ stuff_buffered_input (Lisp_Object stuffstring) if (STRINGP (stuffstring)) { - register EMACS_INT count; + register ptrdiff_t count; p = SDATA (stuffstring); count = SBYTES (stuffstring); @@ -10731,7 +10749,7 @@ stuff_buffered_input (Lisp_Object stuffstring) } void -set_waiting_for_input (struct timeval *time_to_clear) +set_waiting_for_input (EMACS_TIME *time_to_clear) { input_available_clear_time = time_to_clear; @@ -11222,11 +11240,8 @@ The `posn-' functions access elements of such lists. */) if (WINDOWP (frame_or_window)) { - struct window *w; - - CHECK_LIVE_WINDOW (frame_or_window); + struct window *w = decode_live_window (frame_or_window); - w = XWINDOW (frame_or_window); XSETINT (x, (XINT (x) + WINDOW_LEFT_EDGE_X (w) + (NILP (whole) @@ -11281,30 +11296,30 @@ The `posn-' functions access elements of such lists. */) void init_kboard (KBOARD *kb) { - KVAR (kb, Voverriding_terminal_local_map) = Qnil; - KVAR (kb, Vlast_command) = Qnil; - KVAR (kb, Vreal_last_command) = Qnil; - KVAR (kb, Vkeyboard_translate_table) = Qnil; - KVAR (kb, Vlast_repeatable_command) = Qnil; - KVAR (kb, Vprefix_arg) = Qnil; - KVAR (kb, Vlast_prefix_arg) = Qnil; - KVAR (kb, kbd_queue) = Qnil; + kset_overriding_terminal_local_map (kb, Qnil); + kset_last_command (kb, Qnil); + kset_real_last_command (kb, Qnil); + kset_keyboard_translate_table (kb, Qnil); + kset_last_repeatable_command (kb, Qnil); + kset_prefix_arg (kb, Qnil); + kset_last_prefix_arg (kb, Qnil); + kset_kbd_queue (kb, Qnil); kb->kbd_queue_has_data = 0; kb->immediate_echo = 0; - KVAR (kb, echo_string) = Qnil; + kset_echo_string (kb, Qnil); kb->echo_after_prompt = -1; kb->kbd_macro_buffer = 0; kb->kbd_macro_bufsize = 0; - KVAR (kb, defining_kbd_macro) = Qnil; - KVAR (kb, Vlast_kbd_macro) = Qnil; + kset_defining_kbd_macro (kb, Qnil); + kset_last_kbd_macro (kb, Qnil); kb->reference_count = 0; - KVAR (kb, Vsystem_key_alist) = Qnil; - KVAR (kb, system_key_syms) = Qnil; - KVAR (kb, Vwindow_system) = Qt; /* Unset. */ - KVAR (kb, Vinput_decode_map) = Fmake_sparse_keymap (Qnil); - KVAR (kb, Vlocal_function_key_map) = Fmake_sparse_keymap (Qnil); + kset_system_key_alist (kb, Qnil); + kset_system_key_syms (kb, Qnil); + kset_window_system (kb, Qt); /* Unset. */ + kset_input_decode_map (kb, Fmake_sparse_keymap (Qnil)); + kset_local_function_key_map (kb, Fmake_sparse_keymap (Qnil)); Fset_keymap_parent (KVAR (kb, Vlocal_function_key_map), Vfunction_key_map); - KVAR (kb, Vdefault_minibuffer_frame) = Qnil; + kset_default_minibuffer_frame (kb, Qnil); } /* @@ -11354,7 +11369,7 @@ init_keyboard (void) quit_char = Ctl ('g'); Vunread_command_events = Qnil; unread_command_char = -1; - EMACS_SET_SECS_USECS (timer_idleness_start_time, -1, -1); + timer_idleness_start_time = invalid_emacs_time (); total_keys = 0; recent_keys_index = 0; kbd_fetch_ptr = kbd_buffer; @@ -11380,7 +11395,7 @@ init_keyboard (void) init_kboard (current_kboard); /* A value of nil for Vwindow_system normally means a tty, but we also use it for the initial terminal since there is no window system there. */ - KVAR (current_kboard, Vwindow_system) = Qnil; + kset_window_system (current_kboard, Qnil); if (!noninteractive) { @@ -11451,7 +11466,7 @@ syms_of_keyboard (void) pending_funcalls = Qnil; staticpro (&pending_funcalls); - Vlispy_mouse_stem = make_pure_c_string ("mouse"); + Vlispy_mouse_stem = build_pure_c_string ("mouse"); staticpro (&Vlispy_mouse_stem); /* Tool-bars. */ @@ -11467,9 +11482,6 @@ syms_of_keyboard (void) staticpro (&tool_bar_items_vector); tool_bar_items_vector = Qnil; - staticpro (&real_this_command); - real_this_command = Qnil; - DEFSYM (Qtimer_event_handler, "timer-event-handler"); DEFSYM (Qdisabled_command_function, "disabled-command-function"); DEFSYM (Qself_insert_command, "self-insert-command"); @@ -11584,7 +11596,7 @@ syms_of_keyboard (void) modifier_symbols = Fmake_vector (make_number (len), Qnil); for (i = 0; i < len; i++) if (modifier_names[i]) - XVECTOR (modifier_symbols)->contents[i] = intern_c_string (modifier_names[i]); + ASET (modifier_symbols, i, intern_c_string (modifier_names[i])); staticpro (&modifier_symbols); } @@ -11723,12 +11735,14 @@ was a kill command. See Info node `(elisp)Multiple Terminals'. */); DEFVAR_KBOARD ("real-last-command", Vreal_last_command, - doc: /* Same as `last-command', but never altered by Lisp code. */); + doc: /* Same as `last-command', but never altered by Lisp code. +Taken from the previous value of `real-this-command'. */); DEFVAR_KBOARD ("last-repeatable-command", Vlast_repeatable_command, doc: /* Last command that may be repeated. The last command executed that was not bound to an input event. -This is the command `repeat' will try to repeat. */); +This is the command `repeat' will try to repeat. +Taken from a previous value of `real-this-command'. */); DEFVAR_LISP ("this-command", Vthis_command, doc: /* The command now being executed. @@ -11736,6 +11750,10 @@ The command can set this variable; whatever is put here will be in `last-command' during the following command. */); Vthis_command = Qnil; + DEFVAR_LISP ("real-this-command", Vreal_this_command, + doc: /* This is like `this-command', except that commands should never modify it. */); + Vreal_this_command = Qnil; + DEFVAR_LISP ("this-command-keys-shift-translated", Vthis_command_keys_shift_translated, doc: /* Non-nil if the key sequence activating this command was shift-translated. @@ -12192,7 +12210,7 @@ variable are `sigusr1' and `sigusr2'. */); Vdebug_on_event = intern_c_string ("sigusr2"); /* Create the initial keyboard. */ - initial_kboard = (KBOARD *) xmalloc (sizeof (KBOARD)); + initial_kboard = xmalloc (sizeof *initial_kboard); init_kboard (initial_kboard); /* Vwindow_system is left at t for now. */ initial_kboard->next_kboard = all_kboards; @@ -12255,6 +12273,10 @@ keys_of_keyboard (void) initial_define_lispy_key (Vspecial_event_map, "config-changed-event", "ignore"); +#if defined (WINDOWSNT) + initial_define_lispy_key (Vspecial_event_map, "language-change", + "ignore"); +#endif } /* Mark the pointers in the kboard objects.