]> code.delx.au - gnu-emacs/blobdiff - src/window.c
(change_frame_size): Handle FRAME_MENU_BAR_LINES.
[gnu-emacs] / src / window.c
index 65c33093ebede05de98d5a6387edbcadefbc2f97..ab81e806aba477e953f2b24aea0f187ad14b0663 100644 (file)
@@ -1,6 +1,6 @@
 /* Window creation, deletion and examination for GNU Emacs.
    Does not include redisplay.
-   Copyright (C) 1985, 1986, 1987, 1992 Free Software Foundation, Inc.
+   Copyright (C) 1985, 1986, 1987, 1992, 1993 Free Software Foundation, Inc.
 
 This file is part of GNU Emacs.
 
@@ -34,7 +34,7 @@ Lisp_Object Qwindowp, Qlive_window_p;
 Lisp_Object Fnext_window (), Fdelete_window (), Fselect_window ();
 Lisp_Object Fset_window_buffer (), Fsplit_window (), Frecenter ();
 
-static void delete_all_subwindows ();
+void delete_all_subwindows ();
 static struct window *decode_window();
 
 /* This is the window in which the terminal's cursor should
@@ -60,9 +60,6 @@ Lisp_Object Vminibuf_scroll_window;
 /* Non-nil means this is the buffer whose window C-M-v should scroll.  */
 Lisp_Object Vother_window_scroll_buffer;
 
-/* Window that the mouse is over (nil if no mouse support).  */
-Lisp_Object Vmouse_window;
-
 /* Last mouse click data structure (nil if no mouse support).  */
 Lisp_Object Vmouse_event;
 
@@ -225,9 +222,7 @@ POS defaults to point; WINDOW, to the selected window.")
 
       /* If that info is not correct, calculate afresh */
       posval = *compute_motion (top, 0, 0, posint, height, 0,
-                               XFASTINT (w->width) - 1
-                               - (XFASTINT (w->width) + XFASTINT (w->left)
-                                  != FRAME_WIDTH (XFRAME (w->frame))),
+                               window_internal_width (w) - 1,
                                XINT (w->hscroll), 0);
 
       return posval.vpos < height ? Qt : Qnil;
@@ -267,13 +262,9 @@ DEFUN ("window-width", Fwindow_width, Swindow_width, 0, 1, 0,
      Lisp_Object window;
 {
   register struct window *w = decode_window (window);
-  register int width = w->width;
+  register int width = XFASTINT (w->width);
 
-  /* If this window does not end at the right margin,
-     must deduct one column for the border */
-  if ((width + w->left) == FRAME_WIDTH (XFRAME (WINDOW_FRAME (w))))
-    return width;
-  return width - 1;
+  return make_number (window_internal_width (w));
 }
 
 DEFUN ("window-hscroll", Fwindow_hscroll, Swindow_hscroll, 0, 1, 0,
@@ -297,7 +288,7 @@ NCOL should be zero or positive.")
   if (XFASTINT (ncol) >= (1 << (SHORTBITS - 1)))
     args_out_of_range (ncol, Qnil);
   w = decode_window (window);
-  if (w->hscroll != ncol)
+  if (XINT (w->hscroll) != XINT (ncol))
     clip_changed = 1;          /* Prevent redisplay shortcuts */
   w->hscroll = ncol;
   return ncol;
@@ -433,12 +424,12 @@ window_from_coordinates (frame, x, y, part)
 }
 
 DEFUN ("window-at", Fwindow_at, Swindow_at, 2, 3, 0,
-  "Return window containing row ROW, column COLUMN on FRAME.\n\
+  "Return window containing coordinates X and Y on FRAME.\n\
 If omitted, FRAME defaults to the currently selected frame.\n\
 The top left corner of the frame is considered to be row 0,\n\
 column 0.")
-  (row, column, frame)
-      Lisp_Object row, column, frame;
+  (x, y, frame)
+      Lisp_Object x, y, frame;
 {
   int part;
 
@@ -448,11 +439,11 @@ column 0.")
   else
     CHECK_LIVE_FRAME (frame, 2);
 #endif
-  CHECK_NUMBER (row, 0);
-  CHECK_NUMBER (column, 1);
+  CHECK_NUMBER (x, 0);
+  CHECK_NUMBER (y, 1);
 
   return window_from_coordinates (XFRAME (frame),
-                                 XINT (row), XINT (column),
+                                 XINT (x), XINT (y),
                                  &part);
 }
 
@@ -649,7 +640,7 @@ replace_window (old, replacement)
   /* If OLD is its frame's root_window, then replacement is the new
      root_window for that frame.  */
 
-  if (old == FRAME_ROOT_WINDOW (XFRAME (o->frame)))
+  if (EQ (old, FRAME_ROOT_WINDOW (XFRAME (o->frame))))
     FRAME_ROOT_WINDOW (XFRAME (o->frame)) = replacement;
 
   p->left = o->left;
@@ -762,8 +753,8 @@ DEFUN ("delete-window", Fdelete_window, Sdelete_window, 0, 1, "",
         set_window_{height,width} will re-position the sibling's
         children.  */
       sib = p->next;
-      XFASTINT (XWINDOW (sib)->top) = p->top;
-      XFASTINT (XWINDOW (sib)->left) = p->left;
+      XWINDOW (sib)->top = p->top;
+      XWINDOW (sib)->left = p->left;
     }
 
   /* Stretch that sibling.  */
@@ -817,7 +808,12 @@ minibuffer does not count, only windows from WINDOW's frame count.\n\
 \n\
 Optional third arg ALL-FRAMES t means include windows on all frames.\n\
 ALL-FRAMES nil or omitted means cycle within the frames as specified\n\
-above.  If neither nil nor t, restrict to WINDOW's frame.")
+above.  If neither nil nor t, restrict to WINDOW's frame.\n\
+\n\
+If you use consistent values for MINIBUF and ALL-FRAMES, you can use\n\
+`next-window' to iterate through the entire cycle of acceptable\n\
+windows, eventually ending up back at the window you started with.\n\
+`previous-window' traverses the same cycle, in the reverse order.")
   (window, minibuf, all_frames)
      register Lisp_Object window, minibuf, all_frames;
 {
@@ -891,7 +887,7 @@ above.  If neither nil nor t, restrict to WINDOW's frame.")
      we've come all the way around and we're back at the original window.  */
   while (MINI_WINDOW_P (XWINDOW (window))
         && ! EQ (minibuf, Qt)
-        && window != start_window);
+        && ! EQ (window, start_window));
 
   return window;
 }
@@ -914,7 +910,12 @@ count.\n\
 \n\
 Optional third arg ALL-FRAMES t means include windows on all frames.\n\
 ALL-FRAMES nil or omitted means cycle within the frames as specified\n\
-above.  If neither nil nor t, restrict to WINDOW's frame.")
+above.  If neither nil nor t, restrict to WINDOW's frame.\n\
+\n\
+If you use consistent values for MINIBUF and ALL-FRAMES, you can use\n\
+`previous-window' to iterate through the entire cycle of acceptable\n\
+windows, eventually ending up back at the window you started with.\n\
+`next-window' traverses the same cycle, in the reverse order.")
   (window, minibuf, all_frames)
      register Lisp_Object window, minibuf, all_frames;
 {
@@ -961,7 +962,16 @@ above.  If neither nil nor t, restrict to WINDOW's frame.")
            tem = WINDOW_FRAME (XWINDOW (window));
 #ifdef MULTI_FRAME
            if (! NILP (all_frames))
-             tem = next_frame (tem, all_frames);
+             /* It's actually important that we use prev_frame here,
+                rather than next_frame.  All the windows acceptable
+                according to the given parameters should form a ring;
+                Fnext_window and Fprevious_window should go back and
+                forth around the ring.  If we use next_frame here,
+                then Fnext_window and Fprevious_window take different
+                paths through the set of acceptable windows.
+                window_loop assumes that these `ring' requirement are
+                met.  */
+             tem = prev_frame (tem, all_frames);
 #endif
            tem = FRAME_ROOT_WINDOW (XFRAME (tem));
 
@@ -989,7 +999,7 @@ above.  If neither nil nor t, restrict to WINDOW's frame.")
      we've come all the way around and we're back at the original window.  */
   while (MINI_WINDOW_P (XWINDOW (window))
         && !EQ (minibuf, Qt)
-        && window != start_window);
+        && !EQ (window, start_window));
 
   return window;
 }
@@ -1591,7 +1601,7 @@ DEFUN ("display-buffer", Fdisplay_buffer, Sdisplay_buffer, 1, 2,
 BUFFER can be a buffer or a buffer name.\n\
 If BUFFER is shown already in some window, just use that one,\n\
 unless the window is the selected window and the optional second\n\
-argument NOT_THIS_WINDOW is non-nil.\n\
+argument NOT-THIS-WINDOW is non-nil (interactively, with prefix arg).\n\
 Returns the window displaying BUFFER.")
   (buffer, not_this_window)
      register Lisp_Object buffer, not_this_window;
@@ -1648,9 +1658,8 @@ Returns the window displaying BUFFER.")
 
       if (!NILP (window)
          && window_height (window) >= split_height_threshold
-         &&
-         (XFASTINT (XWINDOW (window)->width)
-          == FRAME_WIDTH (XFRAME (WINDOW_FRAME (XWINDOW (window))))))
+         && (XFASTINT (XWINDOW (window)->width)
+             == FRAME_WIDTH (XFRAME (WINDOW_FRAME (XWINDOW (window))))))
        window = Fsplit_window (window, Qnil, Qnil);
       else
        {
@@ -2027,6 +2036,36 @@ window_internal_height (w)
   return ht;
 }
 
+
+/* Return the number of columns in W.
+   Don't count columns occupied by scroll bars or the vertical bar
+   separating W from the sibling to its right.  */
+int
+window_internal_width (w)
+     struct window *w;
+{
+  FRAME_PTR f = XFRAME (WINDOW_FRAME (w));
+  int left = XINT (w->left);
+  int width = XINT (w->width);
+
+  /* If this window is flush against the right edge of the frame, its
+     internal width is its full width.  */
+  if (left + width >= FRAME_WIDTH (f))
+    return width;
+
+  /* If we are not flush right, then our rightmost columns are
+     occupied by some sort of separator.  */
+
+  /* Scroll bars occupy a few columns.  */
+  if (FRAME_HAS_VERTICAL_SCROLL_BARS (f))
+    return width - VERTICAL_SCROLL_BAR_WIDTH;
+
+  /* The column of `|' characters separating side-by-side windows
+     occupies one column only.  */
+  return width - 1;
+}
+
+
 /* Scroll contents of window WINDOW up N lines.  */
 
 void
@@ -2182,8 +2221,20 @@ showing that buffer, popping the buffer up if necessary.")
        window = Fdisplay_buffer (Vother_window_scroll_buffer, Qt);
     }
   else
-    /* Nothing specified; pick a neighboring window.  */
-    window = Fnext_window (selected_window, Qnil, Qt);
+    {
+      /* Nothing specified; look for a neighboring window on the same
+        frame.  */
+      window = Fnext_window (selected_window, Qnil, Qnil);
+
+      if (EQ (window, selected_window))
+       /* That didn't get us anywhere; look for a window on another
+           visible frame.  */
+       do
+         window = Fnext_window (window, Qnil, Qt);
+       while (! FRAME_VISIBLE_P (XFRAME (WINDOW_FRAME (XWINDOW (window))))
+              && ! EQ (window, selected_window));
+    }
+
   CHECK_LIVE_WINDOW (window, 0);
 
   if (EQ (window, selected_window))
@@ -2211,7 +2262,7 @@ showing that buffer, popping the buffer up if necessary.")
     }
 
   Fset_marker (w->pointm, make_number (point), Qnil);
-  unbind_to (count);
+  unbind_to (count, Qnil);
 
   return Qnil;
 }
@@ -2224,7 +2275,7 @@ Default for ARG is window width minus 2.")
 {
 
   if (NILP (arg))
-    XFASTINT (arg) = XFASTINT (XWINDOW (selected_window)->width) - 2;
+    XFASTINT (arg) = window_internal_width (XWINDOW (selected_window)) - 2;
   else
     arg = Fprefix_numeric_value (arg);
 
@@ -2241,7 +2292,7 @@ Default for ARG is window width minus 2.")
      register Lisp_Object arg;
 {
   if (NILP (arg))
-    XFASTINT (arg) = XFASTINT (XWINDOW (selected_window)->width) - 2;
+    XFASTINT (arg) = window_internal_width (XWINDOW (selected_window)) - 2;
   else
     arg = Fprefix_numeric_value (arg);
 
@@ -2394,22 +2445,12 @@ by `current-window-configuration' (which see).")
      (configuration)
      Lisp_Object configuration;
 {
-  register struct window *w;
   register struct save_window_data *data;
   struct Lisp_Vector *saved_windows;
-  register struct saved_window *p;
-  register Lisp_Object tem;
   Lisp_Object new_current_buffer;
-  int k;
+  Lisp_Object frame;
   FRAME_PTR f;
 
-  /* If the frame has been resized since this window configuration was
-     made, we change the frame to the size specified in the
-     configuration, restore the configuration, and then resize it
-     back.  We keep track of the prevailing height in these variables.  */
-  int previous_frame_height;
-  int previous_frame_width;
-
   while (XTYPE (configuration) != Lisp_Window_Configuration)
     {
       configuration = wrong_type_argument (intern ("window-configuration-p"),
@@ -2419,157 +2460,184 @@ by `current-window-configuration' (which see).")
   data = (struct save_window_data *) XVECTOR (configuration);
   saved_windows = XVECTOR (data->saved_windows);
 
-  f = XFRAME (XWINDOW (SAVED_WINDOW_N (saved_windows, 0)->window)->frame);
-
-  previous_frame_height = FRAME_HEIGHT (f);
-  previous_frame_width =  FRAME_WIDTH  (f);
-  if (XFASTINT (data->frame_height) != previous_frame_height
-      || XFASTINT (data->frame_width) != previous_frame_width)
-    change_frame_size (f, data->frame_height, data->frame_width, 0, 0);
-
-  windows_or_buffers_changed++;
   new_current_buffer = data->current_buffer;
   if (NILP (XBUFFER (new_current_buffer)->name))
     new_current_buffer = Qnil;
 
-  /* Kludge Alert!
-     Mark all windows now on frame as "deleted".
-     Restoring the new configuration "undeletes" any that are in it.
-
-     Save their current buffers in their height fields, since we may
-     need it later, if a buffer saved in the configuration is now
-     dead.  */
-  delete_all_subwindows (XWINDOW (FRAME_ROOT_WINDOW (f)));
+  frame = XWINDOW (SAVED_WINDOW_N (saved_windows, 0)->window)->frame;
+  f = XFRAME (frame);
 
-  for (k = 0; k < saved_windows->size; k++)
+  /* If f is a dead frame, don't bother rebuilding its window tree.
+     However, there is other stuff we should still try to do below.  */
+  if (FRAME_LIVE_P (f))
     {
-      p = SAVED_WINDOW_N (saved_windows, k);
-      w = XWINDOW (p->window);
-      w->next = Qnil;
+      register struct window *w;
+      register struct saved_window *p;
+      int k;
+
+      /* If the frame has been resized since this window configuration was
+        made, we change the frame to the size specified in the
+        configuration, restore the configuration, and then resize it
+        back.  We keep track of the prevailing height in these variables.  */
+      int previous_frame_height = FRAME_HEIGHT (f);
+      int previous_frame_width =  FRAME_WIDTH  (f);
+
+      if (XFASTINT (data->frame_height) != previous_frame_height
+         || XFASTINT (data->frame_width) != previous_frame_width)
+       change_frame_size (f, data->frame_height, data->frame_width, 0, 0);
+
+      windows_or_buffers_changed++;
+
+      /* Kludge Alert!
+        Mark all windows now on frame as "deleted".
+        Restoring the new configuration "undeletes" any that are in it.
+        
+        Save their current buffers in their height fields, since we may
+        need it later, if a buffer saved in the configuration is now
+        dead.  */
+      delete_all_subwindows (XWINDOW (FRAME_ROOT_WINDOW (f)));
+
+      for (k = 0; k < saved_windows->size; k++)
+       {
+         p = SAVED_WINDOW_N (saved_windows, k);
+         w = XWINDOW (p->window);
+         w->next = Qnil;
 
-      if (!NILP (p->parent))
-       w->parent = SAVED_WINDOW_N (saved_windows, XFASTINT (p->parent))->window;
-      else
-       w->parent = Qnil;
+         if (!NILP (p->parent))
+           w->parent = SAVED_WINDOW_N (saved_windows,
+                                       XFASTINT (p->parent))->window;
+         else
+           w->parent = Qnil;
 
-      if (!NILP (p->prev))
-       {
-         w->prev = SAVED_WINDOW_N (saved_windows, XFASTINT (p->prev))->window;
-         XWINDOW (w->prev)->next = p->window;
-       }
-      else
-       {
-         w->prev = Qnil;
-         if (!NILP (w->parent))
+         if (!NILP (p->prev))
            {
-             if (EQ (p->width, XWINDOW (w->parent)->width))
+             w->prev = SAVED_WINDOW_N (saved_windows,
+                                       XFASTINT (p->prev))->window;
+             XWINDOW (w->prev)->next = p->window;
+           }
+         else
+           {
+             w->prev = Qnil;
+             if (!NILP (w->parent))
                {
-                 XWINDOW (w->parent)->vchild = p->window;
-                 XWINDOW (w->parent)->hchild = Qnil;
+                 if (EQ (p->width, XWINDOW (w->parent)->width))
+                   {
+                     XWINDOW (w->parent)->vchild = p->window;
+                     XWINDOW (w->parent)->hchild = Qnil;
+                   }
+                 else
+                   {
+                     XWINDOW (w->parent)->hchild = p->window;
+                     XWINDOW (w->parent)->vchild = Qnil;
+                   }
+               }
+           }
+
+         /* If we squirreled away the buffer in the window's height,
+            restore it now.  */
+         if (XTYPE (w->height) == Lisp_Buffer)
+           w->buffer = w->height;
+         w->left = p->left;
+         w->top = p->top;
+         w->width = p->width;
+         w->height = p->height;
+         w->hscroll = p->hscroll;
+         w->display_table = p->display_table;
+         XFASTINT (w->last_modified) = 0;
+
+         /* Reinstall the saved buffer and pointers into it.  */
+         if (NILP (p->buffer))
+           w->buffer = p->buffer;
+         else
+           {
+             if (!NILP (XBUFFER (p->buffer)->name))
+               /* If saved buffer is alive, install it.  */
+               {
+                 w->buffer = p->buffer;
+                 w->start_at_line_beg = p->start_at_line_beg;
+                 set_marker_restricted (w->start,
+                                        Fmarker_position (p->start),
+                                        w->buffer);
+                 set_marker_restricted (w->pointm,
+                                        Fmarker_position (p->pointm),
+                                        w->buffer);
+                 Fset_marker (XBUFFER (w->buffer)->mark,
+                              Fmarker_position (p->mark), w->buffer);
+
+                 /* As documented in Fcurrent_window_configuration, don't
+                    save the location of point in the buffer which was current
+                    when the window configuration was recorded.  */
+                 if (!EQ (p->buffer, new_current_buffer) &&
+                     XBUFFER (p->buffer) == current_buffer)
+                   Fgoto_char (w->pointm);
+               }
+             else if (NILP (XBUFFER (w->buffer)->name))
+               /* Else if window's old buffer is dead too, get a live one.  */
+               {
+                 w->buffer = Fcdr (Fcar (Vbuffer_alist));
+                 /* This will set the markers to beginning of visible
+                    range.  */
+                 set_marker_restricted (w->start, make_number (0), w->buffer);
+                 set_marker_restricted (w->pointm, make_number (0),w->buffer);
+                 w->start_at_line_beg = Qt;
                }
              else
+               /* Keeping window's old buffer; make sure the markers
+                  are real.  Else if window's old buffer is dead too,
+                  get a live one.  */
                {
-                 XWINDOW (w->parent)->hchild = p->window;
-                 XWINDOW (w->parent)->vchild = Qnil;
+                 /* Set window markers at start of visible range.  */
+                 if (XMARKER (w->start)->buffer == 0)
+                   set_marker_restricted (w->start, make_number (0),
+                                          w->buffer);
+                 if (XMARKER (w->pointm)->buffer == 0)
+                   set_marker_restricted (w->pointm,
+                                          (make_number
+                                           (BUF_PT (XBUFFER (w->buffer)))),
+                                          w->buffer);
+                 w->start_at_line_beg = Qt;
                }
            }
        }
 
-      /* If we squirreled away the buffer in the window's height,
-        restore it now.  */
-      if (XTYPE (w->height) == Lisp_Buffer)
-       w->buffer = w->height;
-      w->left = p->left;
-      w->top = p->top;
-      w->width = p->width;
-      w->height = p->height;
-      w->hscroll = p->hscroll;
-      w->display_table = p->display_table;
-      XFASTINT (w->last_modified) = 0;
+      FRAME_ROOT_WINDOW (f) = data->root_window;
+      Fselect_window (data->current_window);
 
-      /* Reinstall the saved buffer and pointers into it.  */
-      if (NILP (p->buffer))
-       w->buffer = p->buffer;
-      else
-       {
-         if (!NILP (XBUFFER (p->buffer)->name))
-           /* If saved buffer is alive, install it.  */
-           {
-             w->buffer = p->buffer;
-             w->start_at_line_beg = p->start_at_line_beg;
-             set_marker_restricted (w->start, Fmarker_position (p->start), w->buffer);
-             set_marker_restricted (w->pointm, Fmarker_position (p->pointm), w->buffer);
-             Fset_marker (XBUFFER (w->buffer)->mark,
-                          Fmarker_position (p->mark), w->buffer);
-
-             /* As documented in Fcurrent_window_configuration, don't
-                save the location of point in the buffer which was current
-                when the window configuration was recorded.  */
-             if (!EQ (p->buffer, new_current_buffer) &&
-                 XBUFFER (p->buffer) == current_buffer)
-               Fgoto_char (w->pointm);
-           }
-         else if (NILP (XBUFFER (w->buffer)->name))
-           /* Else if window's old buffer is dead too, get a live one.  */
-           {
-             w->buffer = Fcdr (Fcar (Vbuffer_alist));
-             /* This will set the markers to beginning of visible range.  */
-             set_marker_restricted (w->start, make_number (0), w->buffer);
-             set_marker_restricted (w->pointm, make_number (0), w->buffer);
-             w->start_at_line_beg = Qt;
-           }
-         else
-           /* Keeping window's old buffer; make sure the markers are real.  */
-           /* Else if window's old buffer is dead too, get a live one.  */
-           {
-             /* Set window markers at start of visible range.  */
-             if (XMARKER (w->start)->buffer == 0)
-               set_marker_restricted (w->start, make_number (0), w->buffer);
-             if (XMARKER (w->pointm)->buffer == 0)
-               set_marker_restricted (w->pointm,
-                                      make_number (BUF_PT (XBUFFER (w->buffer))),
-                                      w->buffer);
-             w->start_at_line_beg = Qt;
-           }
-       }
-    }
+#ifdef MULTI_FRAME
+      if (NILP (data->focus_frame)
+         || (XTYPE (data->focus_frame) == Lisp_Frame
+             && FRAME_LIVE_P (XFRAME (data->focus_frame))))
+       Fredirect_frame_focus (frame, data->focus_frame);
+#endif
 
-  FRAME_ROOT_WINDOW (f) = data->root_window;
-  Fselect_window (data->current_window);
+#if 0 /* I don't understand why this is needed, and it causes problems
+         when the frame's old selected window has been deleted.  */
+#ifdef MULTI_FRAME
+      if (f != selected_frame && ! FRAME_TERMCAP_P (f))
+       Fselect_frame (WINDOW_FRAME (XWINDOW (data->root_window)), Qnil);
+#endif
+#endif
 
+      /* Set the screen height to the value it had before this function.  */
+      if (previous_frame_height != FRAME_HEIGHT (f)
+         || previous_frame_width != FRAME_WIDTH (f))
+       change_frame_size (f, previous_frame_height, previous_frame_width,
+                          0, 0);
+    }
+
+#ifdef MULTI_FRAME
   /* Fselect_window will have made f the selected frame, so we
      reselect the proper frame here.  Fselect_frame will change the
      selected window too, but that doesn't make the call to
      Fselect_window above totally superfluous; it still sets f's
      selected window.  */
-  Fselect_frame (data->selected_frame);
+  if (FRAME_LIVE_P (XFRAME (data->selected_frame)))
+    Fselect_frame (data->selected_frame, Qnil);
+#endif
 
   if (!NILP (new_current_buffer))
     Fset_buffer (new_current_buffer);
 
-#ifdef MULTI_FRAME
-  {
-    Lisp_Object frame;
-
-    XSET (frame, Lisp_Frame, f);
-    Fredirect_frame_focus (frame, data->focus_frame);
-  }
-#endif
-
-#if 0  /* I don't understand why this is needed, and it causes
-         problems when the frame's old selected window has been
-         deleted.  */
-#ifdef MULTI_FRAME
-  if (f != selected_frame && ! FRAME_TERMCAP_P (f))
-    Fselect_frame (WINDOW_FRAME (XWINDOW (data->root_window)), Qnil);
-#endif
-#endif
-
-  /* Set the screen height to the value it had before this function.  */
-  if (previous_frame_height != FRAME_HEIGHT (f)
-      || previous_frame_width != FRAME_WIDTH (f))
-    change_frame_size (f, previous_frame_height, previous_frame_width, 0, 0);
-
   Vminibuf_scroll_window = data->minibuf_scroll_window;
   return (Qnil);
 }
@@ -2577,7 +2645,7 @@ by `current-window-configuration' (which see).")
 /* Mark all windows now on frame as deleted
    by setting their buffers to nil.  */
 
-static void
+void
 delete_all_subwindows (w)
      register struct window *w;
 {
@@ -2717,7 +2785,9 @@ redirection (see `redirect-frame-focus').")
                                  Qnil));
   XFASTINT (data->frame_width) = FRAME_WIDTH (f);
   XFASTINT (data->frame_height) = FRAME_HEIGHT (f);
+#ifdef MULTI_FRAME
   XSET (data->selected_frame, Lisp_Frame, selected_frame);
+#endif
   data->current_window = FRAME_SELECTED_WINDOW (f);
   XSET (data->current_buffer, Lisp_Buffer, current_buffer);
   data->minibuf_scroll_window = Vminibuf_scroll_window;
@@ -2824,22 +2894,18 @@ Commands such as `switch-to-buffer-other-window' and `find-file-other-window'\n\
 work using this function.");
   Vdisplay_buffer_function = Qnil;
 
-  DEFVAR_LISP ("mouse-window", &Vmouse_window,
-     "Window that the last mouse click occurred on.");
-  Vmouse_window = Qnil;
-
   DEFVAR_LISP ("mouse-event", &Vmouse_event,
      "The last mouse-event object.  A list of four elements:\n\
   ((X-POS Y-POS) WINDOW FRAME-PART KEYSEQ).\n\
 KEYSEQ is a string, the key sequence to be looked up in the mouse maps.\n\
 WINDOW is the window that the click applies do.\n\
-If FRAME-PART is non-nil, the event was on a scrollbar;\n\
-then Y-POS is really the total length of the scrollbar, while X-POS is\n\
-the relative position of the scrollbar's value within that total length.\n\
+If FRAME-PART is non-nil, the event was on a scroll bar;\n\
+then Y-POS is really the total length of the scroll bar, while X-POS is\n\
+the relative position of the scroll bar's value within that total length.\n\
 FRAME-PART is one of the following symbols:\n\
- `vertical-scrollbar', `vertical-slider',\n\
+ `vertical-scroll-bar', `vertical-slider',\n\
  `vertical-thumbup', `vertical-thumbdown',\n\
- `horizontal-scrollbar', `horizontal-slider',\n\
+ `horizontal-scroll-bar', `horizontal-slider',\n\
  `horizontal-thumbleft', `horizontal-thumbright'");
   Vmouse_event = Qnil;