]> code.delx.au - gnu-emacs/blobdiff - src/window.c
(LIBS_MACHINE): Add -lelf.
[gnu-emacs] / src / window.c
index 97a6c86059853439070b9bff98e9bc9d2e4928fc..b9b7f84eed66797614b8573c30edb02062ab4a18 100644 (file)
@@ -119,6 +119,9 @@ Lisp_Object Vwindow_configuration_change_hook;
    at the same screen height as previously.  */
 static int scroll_preserve_screen_position;
 
+/* Non-nil means we can split a frame even if it is "unsplittable".  */
+static int frame_override_unsplittable;
+
 #define min(a, b) ((a) < (b) ? (a) : (b))
 
 extern int scroll_margin;
@@ -819,7 +822,7 @@ delete_window (window)
   if (NILP (p->buffer)
       && NILP (p->hchild)
       && NILP (p->vchild))
-    return Qnil;
+    return;
 
   parent = p->parent;
   if (NILP (parent))
@@ -1890,7 +1893,7 @@ BUFFER can be a buffer or buffer name.")
     XBUFFER (w->buffer)->last_selected_window = window;
   if (INTEGERP (XBUFFER (buffer)->display_count))
     XSETINT (XBUFFER (buffer)->display_count,
-            XBUFFER (buffer)->display_count + 1);
+            XINT (XBUFFER (buffer)->display_count) + 1);
 
   XSETFASTINT (w->window_end_pos, 0);
   w->window_end_valid = Qnil;
@@ -2216,13 +2219,20 @@ buffer names are handled.")
              && window_height (window) >= window_min_height << 1)
            window = Fsplit_window (window, Qnil, Qnil);
          /* If Fget_lru_window returned nil, try other approaches.  */
+
          /* Try visible frames first.  */
+         if (NILP (window))
+           window = Fget_buffer_window (buffer, Qvisible);
          if (NILP (window))
            window = Fget_largest_window (Qvisible);
          /* If that didn't work, try iconified frames.  */
+         if (NILP (window))
+           window = Fget_buffer_window (buffer, make_number (0));
          if (NILP (window))
            window = Fget_largest_window (make_number (0));
          /* Try invisible frames.  */
+         if (NILP (window))
+           window = Fget_buffer_window (buffer, Qt);
          if (NILP (window))
            window = Fget_largest_window (Qt);
          /* As a last resort, make a new frame.  */
@@ -2237,15 +2247,19 @@ buffer names are handled.")
            other = lower = XWINDOW (window)->next, upper = window;
          if (!NILP (other)
              /* Check that OTHER and WINDOW are vertically arrayed.  */
-             && XWINDOW (other)->top != XWINDOW (window)->top
-             && XWINDOW (other)->height > XWINDOW (window)->height)
+             && !EQ (XWINDOW (other)->top, XWINDOW (window)->top)
+             && (XFASTINT (XWINDOW (other)->height)
+                 > XFASTINT (XWINDOW (window)->height)))
            {
-             int total = XWINDOW (other)->height + XWINDOW (window)->height;
+             int total = (XFASTINT (XWINDOW (other)->height)
+                          + XFASTINT (XWINDOW (window)->height));
              Lisp_Object old_selected_window;
              old_selected_window = selected_window;
 
              selected_window = upper;
-             change_window_height (total / 2 - XWINDOW (upper)->height, 0);
+             change_window_height ((total / 2
+                                    - XFASTINT (XWINDOW (upper)->height)),
+                                   0);
              selected_window = old_selected_window;
            }
        }
@@ -2383,7 +2397,7 @@ and put SIZE columns in the first of the pair.")
 
   if (MINI_WINDOW_P (o))
     error ("Attempt to split minibuffer window");
-  else if (FRAME_NO_SPLIT_P (fo))
+  else if (FRAME_NO_SPLIT_P (fo) && ! frame_override_unsplittable)
     error ("Attempt to split unsplittable frame");
 
   check_min_window_sizes ();
@@ -3363,6 +3377,8 @@ by `current-window-configuration' (which see).")
 
       FRAME_ROOT_WINDOW (f) = data->root_window;
       Fselect_window (data->current_window);
+      XBUFFER (XWINDOW (selected_window)->buffer)->last_selected_window
+       = selected_window;
 
       if (NILP (data->focus_frame)
          || (FRAMEP (data->focus_frame)
@@ -3763,6 +3779,12 @@ If there is only one window, it is split regardless of this value.");
 The selected frae is the one whose configuration has changed.");
   Vwindow_configuration_change_hook = Qnil;
 
+  DEFVAR_BOOL ("frame-override-unsplittable", &frame_override_unsplittable,
+    "Non-nil means allow splitting an `unsplittable' frame.\n\
+\(That means, a frame whise `unsplittable' parameter is non-nil.)\n\
+Packages such as Ispell that work by splitting the selected frame\n\
+can bind this, so that they will work when used in an unsplittable frame.");
+
   defsubr (&Sselected_window);
   defsubr (&Sminibuffer_window);
   defsubr (&Swindow_minibuffer_p);