Auto-commit of loaddefs files.
[bpt/emacs.git] / src / keyboard.c
index 3911247..7b1ea34 100644 (file)
@@ -18,6 +18,9 @@ You should have received a copy of the GNU General Public License
 along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 
 #include <config.h>
+
+#define KEYBOARD_INLINE EXTERN_INLINE
+
 #include <signal.h>
 #include <stdio.h>
 #include <setjmp.h>
@@ -60,20 +63,11 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 #include <unistd.h>
 #include <fcntl.h>
 
-/* 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;
@@ -392,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
@@ -469,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;
+}
+
 \f
 /* 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
@@ -551,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 ();
     }
@@ -597,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 ();
 }
 
@@ -660,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;
@@ -684,9 +727,9 @@ static void
 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);
 }
 
@@ -800,7 +843,7 @@ This function is called by the editor initialization to begin editing.  */)
   update_mode_lines = 1;
 
   if (command_loop_level
-      && current_buffer != XBUFFER (WVAR (XWINDOW (selected_window), buffer)))
+      && current_buffer != XBUFFER (XWINDOW (selected_window)->buffer))
     buffer = Fcurrent_buffer ();
   else
     buffer = Qnil;
@@ -1016,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.  */
@@ -1272,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;
@@ -1338,8 +1381,8 @@ command_loop_1 (void)
 #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 ();
@@ -1371,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) = Vreal_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) = Vreal_this_command;
+    kset_last_repeatable_command (current_kboard, Vreal_this_command);
 
   while (1)
     {
@@ -1382,8 +1425,7 @@ command_loop_1 (void)
        Fkill_emacs (Qnil);
 
       /* Make sure the current window's buffer is selected.  */
-      if (XBUFFER (WVAR (XWINDOW (selected_window), buffer)) != current_buffer)
-       set_buffer_internal (XBUFFER (WVAR (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.  */
@@ -1393,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.  */
 
@@ -1452,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 (WVAR (XWINDOW (selected_window), buffer)) != current_buffer)
-       set_buffer_internal (XBUFFER (WVAR (XWINDOW (selected_window), buffer)));
+      set_buffer_internal (XBUFFER (XWINDOW (selected_window)->buffer));
 
       ++num_input_keys;
 
@@ -1484,7 +1534,7 @@ command_loop_1 (void)
        {
          struct buffer *b;
          XWINDOW (selected_window)->force_start = 0;
-         b = XBUFFER (WVAR (XWINDOW (selected_window), buffer));
+         b = XBUFFER (XWINDOW (selected_window)->buffer);
          BUF_BEG_UNCHANGED (b) = BUF_END_UNCHANGED (b) = 0;
        }
 
@@ -1537,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.  */
@@ -1547,10 +1597,10 @@ 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
        {
@@ -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);
 
@@ -1618,11 +1668,10 @@ command_loop_1 (void)
       if (NILP (KVAR (current_kboard, Vprefix_arg))
          || CONSP (last_command_event))
        {
-         KVAR (current_kboard, Vlast_command) = Vthis_command;
-         KVAR (current_kboard, Vreal_last_command) = Vreal_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)
-             = Vreal_this_command;
+           kset_last_repeatable_command (current_kboard, Vreal_this_command);
          cancel_echoing ();
          this_command_key_count = 0;
          this_command_key_count_reset = 0;
@@ -2565,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;
@@ -2737,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);
@@ -2805,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;
@@ -3063,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 ();
@@ -3534,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++)
                {
@@ -4359,7 +4408,6 @@ timer_check_2 (void)
 
   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;
@@ -4435,15 +4483,14 @@ timer_check_2 (void)
       /* If timer is ripe, run it if it hasn't been run.  */
       if (ripe)
        {
-         vector = XVECTOR (chosen_timer)->contents;
-         if (NILP (vector[0]))
+         if (NILP (AREF (chosen_timer, 0)))
            {
              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);
 
@@ -4459,6 +4506,7 @@ timer_check_2 (void)
            }
 
          nexttime = make_emacs_time (0, 0);
+          break;
        }
       else
        /* When we encounter a timer that is still waiting,
@@ -5174,8 +5222,8 @@ make_lispy_position (struct frame *f, Lisp_Object x, Lisp_Object y,
          if (STRINGP (string))
            string_info = Fcons (string, make_number (charpos));
          textpos = (w == XWINDOW (selected_window)
-                    && current_buffer == XBUFFER (WVAR (w, buffer)))
-           ? PT : XMARKER (WVAR (w, pointm))->charpos;
+                    && current_buffer == XBUFFER (w->buffer))
+           ? PT : XMARKER (w->pointm)->charpos;
 
          xret = wx;
          yret = wy;
@@ -5407,7 +5455,7 @@ 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,
@@ -5563,7 +5611,7 @@ make_lispy_event (struct input_event *event)
          int fuzz;
 
          if (WINDOWP (event->frame_or_window))
-           f = XFRAME (WVAR (XWINDOW (event->frame_or_window), frame));
+           f = XFRAME (XWINDOW (event->frame_or_window)->frame);
          else if (FRAMEP (event->frame_or_window))
            f = XFRAME (event->frame_or_window);
          else
@@ -5731,7 +5779,7 @@ make_lispy_event (struct input_event *event)
          int is_double;
 
          if (WINDOWP (event->frame_or_window))
-           fr = XFRAME (WVAR (XWINDOW (event->frame_or_window), frame));
+           fr = XFRAME (XWINDOW (event->frame_or_window)->frame);
          else if (FRAMEP (event->frame_or_window))
            fr = XFRAME (event->frame_or_window);
          else
@@ -7527,7 +7575,7 @@ menu_bar_items (Lisp_Object old)
            if (end > i + 4)
              memmove (aref_addr (menu_bar_items_vector, i),
                       aref_addr (menu_bar_items_vector, i + 4),
-                      (end - i - 4) * sizeof (Lisp_Object));
+                      (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);
@@ -7577,7 +7625,7 @@ menu_bar_item (Lisp_Object key, Lisp_Object item, Lisp_Object dummy1, void *dumm
            if (menu_bar_items_index > i + 4)
              memmove (aref_addr (menu_bar_items_vector, i),
                       aref_addr (menu_bar_items_vector, i + 4),
-                      (menu_bar_items_index - i - 4) * sizeof (Lisp_Object));
+                      (menu_bar_items_index - i - 4) * word_size);
            menu_bar_items_index -= 4;
          }
     }
@@ -7895,7 +7943,7 @@ parse_menu_item (Lisp_Object item, int inmenubar)
                       (such as lmenu.el set it up), check if the
                       original command matches the cached command.  */
                    && !(SYMBOLP (def)
-                        && EQ (tem, SVAR (XSYMBOL (def), function)))))
+                        && EQ (tem, XSYMBOL (def)->function))))
              keys = Qnil;
          }
 
@@ -8082,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;
            }
@@ -8386,7 +8434,6 @@ 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));
@@ -8398,9 +8445,8 @@ append_tool_bar_item (void)
 
   /* 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;
 }
 
@@ -8432,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;
@@ -8728,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;
@@ -8829,14 +8877,14 @@ access_keymap_keyremap (Lisp_Object map, Lisp_Object key, Lisp_Object prompt,
   /* Handle a symbol whose function definition is a keymap
      or an array.  */
   if (SYMBOLP (next) && !NILP (Ffboundp (next))
-      && (ARRAYP (SVAR (XSYMBOL (next), function))
-         || KEYMAPP (SVAR (XSYMBOL (next), function))))
-    next = Fautoload_do_load (SVAR (XSYMBOL (next), function), next, Qnil);
+      && (ARRAYP (XSYMBOL (next)->function)
+         || KEYMAPP (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;
@@ -9088,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 ();
        }
@@ -9334,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.  */
@@ -9354,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);
@@ -9401,8 +9452,8 @@ read_key_sequence (Lisp_Object *keybuf, int bufsize, Lisp_Object prompt,
                {
                  if (! FRAME_LIVE_P (XFRAME (selected_frame)))
                    Fkill_emacs (Qnil);
-                 if (XBUFFER (WVAR (XWINDOW (selected_window), buffer)) != current_buffer)
-                   Fset_buffer (WVAR (XWINDOW (selected_window), buffer));
+                 if (XBUFFER (XWINDOW (selected_window)->buffer) != current_buffer)
+                   Fset_buffer (XWINDOW (selected_window)->buffer);
                }
 
              orig_local_map = get_local_map (PT, current_buffer, Qlocal_map);
@@ -9494,8 +9545,8 @@ read_key_sequence (Lisp_Object *keybuf, int bufsize, Lisp_Object prompt,
                     not the current buffer.  If we're at the
                     beginning of a key sequence, switch buffers.  */
                  if (WINDOWP (window)
-                     && BUFFERP (WVAR (XWINDOW (window), buffer))
-                     && XBUFFER (WVAR (XWINDOW (window), buffer)) != current_buffer)
+                     && BUFFERP (XWINDOW (window)->buffer)
+                     && XBUFFER (XWINDOW (window)->buffer) != current_buffer)
                    {
                      ASET (raw_keybuf, raw_keybuf_count, key);
                      raw_keybuf_count++;
@@ -9512,11 +9563,11 @@ 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);
-                     set_buffer_internal (XBUFFER (WVAR (XWINDOW (window), buffer)));
+                     set_buffer_internal (XBUFFER (XWINDOW (window)->buffer));
                      orig_local_map = get_local_map (PT, current_buffer,
                                                      Qlocal_map);
                      orig_keymap = get_local_map (PT, current_buffer,
@@ -10250,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;
@@ -10424,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;
     }
 }
@@ -11189,18 +11240,15 @@ 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)
                      ? window_box_left_offset (w, TEXT_AREA)
                      : 0)));
       XSETINT (y, WINDOW_TO_FRAME_PIXEL_Y (w, XINT (y)));
-      frame_or_window = WVAR (w, frame);
+      frame_or_window = w->frame;
     }
 
   CHECK_LIVE_FRAME (frame_or_window);
@@ -11248,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);
 }
 
 /*
@@ -11347,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)
     {