X-Git-Url: http://git.hcoop.net/bpt/emacs.git/blobdiff_plain/eceeb5fca618f3bc0743c2388148dd758229c7c9..404dbd373a91c0b994005e88fe703d9144873b27:/src/keyboard.c diff --git a/src/keyboard.c b/src/keyboard.c index 249e5ee954..65b7d53835 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -30,8 +30,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" @@ -122,7 +122,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 +135,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 +208,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 +374,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; @@ -448,9 +445,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 +459,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); @@ -615,7 +610,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 +623,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); @@ -673,7 +668,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,7 +681,7 @@ 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) @@ -715,9 +710,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 +720,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 +788,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. @@ -1200,13 +1193,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 +1210,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 +1255,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); @@ -1313,7 +1306,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. */ @@ -1329,7 +1322,6 @@ cancel_hourglass_unwind (Lisp_Object arg) /* 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,7 +1329,7 @@ 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; @@ -1378,9 +1370,9 @@ 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; + KVAR (current_kboard, Vreal_last_command) = Vreal_this_command; if (!CONSP (last_command_event)) - KVAR (current_kboard, Vlast_repeatable_command) = real_this_command; + KVAR (current_kboard, Vlast_repeatable_command) = Vreal_this_command; while (1) { @@ -1409,7 +1401,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 +1439,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; @@ -1486,10 +1478,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 +1523,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; @@ -1563,7 +1555,7 @@ command_loop_1 (void) /* 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)) @@ -1615,12 +1607,14 @@ 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; + KVAR (current_kboard, Vreal_last_command) = Vreal_this_command; if (!CONSP (last_command_event)) - KVAR (current_kboard, Vlast_repeatable_command) = real_this_command; + KVAR (current_kboard, Vlast_repeatable_command) + = Vreal_this_command; cancel_echoing (); this_command_key_count = 0; this_command_key_count_reset = 0; @@ -1657,9 +1651,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 +1713,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 +1749,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 +1831,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 +1937,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 +2017,13 @@ start_polling (void) if (poll_timer == NULL || EMACS_SECS (poll_timer->interval) != polling_period) { + time_t period = max (1, min (polling_period, TYPE_MAXIMUM (time_t))); EMACS_TIME interval; if (poll_timer) cancel_atimer (poll_timer); - EMACS_SET_SECS_USECS (interval, polling_period, 0); + EMACS_SET_SECS_USECS (interval, period, 0); poll_timer = start_atimer (ATIMER_CONTINUOUS, interval, poll_for_input, NULL); } @@ -2096,7 +2091,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; @@ -2226,7 +2221,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 +2273,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; @@ -2670,7 +2665,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 +2686,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); @@ -2886,7 +2882,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 @@ -2996,8 +2992,10 @@ read_char (int commandflag, ptrdiff_t nmaps, Lisp_Object *maps, && !(EQ (Qselect_window, XCAR (c))))) { if (!NILP (echo_area_buffer[0])) - safe_run_hooks (Qecho_area_clear_hook); - clear_message (1, 0); + { + safe_run_hooks (Qecho_area_clear_hook); + clear_message (1, 0); + } } reread_for_input_method: @@ -3011,9 +3009,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; @@ -3150,7 +3149,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), @@ -3310,7 +3309,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; @@ -3679,7 +3678,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; @@ -3782,9 +3781,8 @@ 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) { - register int c; Lisp_Object obj; #ifdef subprocesses @@ -3801,16 +3799,18 @@ kbd_buffer_get_event (KBOARD **kbp, } #endif /* subprocesses */ +#ifndef HAVE_DBUS /* We want to read D-Bus events in batch mode. */ if (noninteractive /* In case we are running as a daemon, only do this before detaching from the terminal. */ || (IS_DAEMON && daemon_pipe[1] >= 0)) { - c = getchar (); + int c = getchar (); XSETINT (obj, c); *kbp = current_kboard; return obj; } +#endif /* ! HAVE_DBUS */ /* Wait until there is input available. */ for (;;) @@ -3851,12 +3851,13 @@ kbd_buffer_get_event (KBOARD **kbp, EMACS_TIME duration; EMACS_GET_TIME (duration); if (EMACS_TIME_GE (duration, *end_time)) - return Qnil; /* finished waiting */ + return Qnil; /* Finished waiting. */ else { EMACS_SUB_TIME (duration, *end_time, duration); - wait_reading_process_output (EMACS_SECS (duration), - EMACS_USECS (duration), + wait_reading_process_output (min (EMACS_SECS (duration), + WAIT_READING_MAX), + EMACS_NSECS (duration), -1, 1, Qnil, NULL, 0); } } @@ -3978,9 +3979,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 @@ -4251,7 +4254,7 @@ 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); @@ -4265,9 +4268,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); } } @@ -4276,7 +4279,7 @@ timer_start_idle (void) static void timer_stop_idle (void) { - EMACS_SET_SECS_USECS (timer_idleness_start_time, -1, -1); + EMACS_SET_INVALID_TIME (timer_idleness_start_time); } /* Resume idle timer from last idle start time. */ @@ -4284,7 +4287,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; @@ -4298,6 +4301,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. @@ -4315,17 +4336,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); + EMACS_SET_INVALID_TIME (nexttime); /* 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; @@ -4343,8 +4363,10 @@ timer_check_2 (void) if (CONSP (timers) || CONSP (idle_timers)) { EMACS_GET_TIME (now); - if (! EMACS_TIME_NEG_P (timer_idleness_start_time)) + if (EMACS_TIME_VALID_P (timer_idleness_start_time)) EMACS_SUB_TIME (idleness_now, now, timer_idleness_start_time); + else + EMACS_SET_SECS_NSECS (idleness_now, 0, 0); } while (CONSP (timers) || CONSP (idle_timers)) @@ -4353,116 +4375,87 @@ timer_check_2 (void) 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, idle_timer_difference; + int ripe, timer_ripe = 0, idle_timer_ripe = 0; - /* Skip past invalid timers and timers already handled. */ + EMACS_SET_INVALID_TIME (timer_difference); + EMACS_SET_INVALID_TIME (idle_timer_difference); + + /* 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); + if (timer_ripe) + EMACS_SUB_TIME (timer_difference, now, timer_time); + else + EMACS_SUB_TIME (timer_difference, 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); + if (idle_timer_ripe) + EMACS_SUB_TIME (idle_timer_difference, + idleness_now, idle_timer_time); + else + EMACS_SUB_TIME (idle_timer_difference, + 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) { + vector = XVECTOR (chosen_timer)->contents; if (NILP (vector[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 @@ -4506,7 +4499,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. */ @@ -4519,33 +4512,29 @@ 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)) + if (EMACS_TIME_VALID_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))); + return make_lisp_time (idleness_now); } return Qnil; @@ -5173,7 +5162,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; @@ -5197,7 +5186,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 @@ -5220,7 +5209,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; @@ -5448,7 +5437,7 @@ make_lispy_event (struct input_event *event) 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, @@ -5580,9 +5569,10 @@ 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); @@ -5882,7 +5872,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, @@ -5985,9 +5977,10 @@ 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); @@ -6089,10 +6082,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); @@ -6100,9 +6093,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. @@ -6266,7 +6259,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; @@ -6299,7 +6292,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; @@ -6465,9 +6458,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; @@ -6497,7 +6490,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? */ @@ -6533,14 +6526,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 @@ -7313,8 +7306,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; @@ -7547,23 +7540,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], + memmove (&AREF (menu_bar_items_vector, i), + &AREF (menu_bar_items_vector, 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; + 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; } } @@ -7573,12 +7566,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; } @@ -7604,11 +7597,11 @@ 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], + memmove (&AREF (menu_bar_items_vector, i), + &AREF (menu_bar_items_vector, i + 4), (menu_bar_items_index - i - 4) * sizeof (Lisp_Object)); menu_bar_items_index -= 4; } @@ -7632,11 +7625,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. */ @@ -7644,24 +7637,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); } } @@ -7688,7 +7681,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, @@ -8178,7 +8171,7 @@ 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] +#define PROP(IDX) AREF (tool_bar_item_properties, (IDX)) Lisp_Object filter = Qnil; Lisp_Object caption; @@ -8413,13 +8406,14 @@ 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. */ @@ -8622,7 +8616,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); @@ -8657,7 +8651,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); @@ -8675,12 +8669,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 @@ -9004,15 +8998,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. */ @@ -9268,7 +9262,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; @@ -9450,7 +9444,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; @@ -9528,7 +9523,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; @@ -10156,7 +10152,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); @@ -10213,7 +10209,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); @@ -10559,7 +10555,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; } @@ -10641,7 +10637,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; @@ -10697,7 +10693,7 @@ stuff_buffered_input (Lisp_Object stuffstring) if (STRINGP (stuffstring)) { - register EMACS_INT count; + register ptrdiff_t count; p = SDATA (stuffstring); count = SBYTES (stuffstring); @@ -10728,7 +10724,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; @@ -11351,7 +11347,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); + EMACS_SET_INVALID_TIME (timer_idleness_start_time); total_keys = 0; recent_keys_index = 0; kbd_fetch_ptr = kbd_buffer; @@ -11464,9 +11460,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"); @@ -11581,7 +11574,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); } @@ -11720,12 +11713,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. @@ -11733,6 +11728,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.