emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: address@hidden: window-min-height not obeying its documentation in E


From: martin rudalics
Subject: Re: address@hidden: window-min-height not obeying its documentation in Emacs 22.1]
Date: Tue, 10 Jul 2007 14:11:42 +0200
User-agent: Mozilla Thunderbird 1.0 (Windows/20041206)

>     !            && (window_height (window) >=
>     !                window_min_size_2 (XWINDOW (window), 0) << 1))
>
> Please break the line before the >= operator, not after.

Done.  I also replaced shifting by multiplication as proposed by David
(there are still two ">>" left in `split-window').  Moreover, I now do
the check in `display-buffer' for the largest _and_ the LRU window.

Finally, I do not reset `split-height-threshold' any more when it is
less than `window-min-height'.  Otherwise, binding `window-min-height'
temporarily to a larger value may break a user's customizations of
`split-height-threshold' due to the following assignment in
`display-buffer':

      if (split_height_threshold < window_min_height << 1)
        split_height_threshold = window_min_height << 1;
*** window.c.~1.577.~   Tue Jun  5 22:41:24 2007
--- window.c    Tue Jul 10 13:59:22 2007
***************
*** 62,67 ****
--- 62,68 ----
  static void window_scroll_pixel_based P_ ((Lisp_Object, int, int, int));
  static void window_scroll_line_based P_ ((Lisp_Object, int, int, int));
  static int window_min_size_1 P_ ((struct window *, int));
+ static int window_min_size_2 P_ ((struct window *, int));
  static int window_min_size P_ ((struct window *, int, int, int *));
  static void size_window P_ ((Lisp_Object, int, int, int, int, int));
  static int freeze_window_start P_ ((struct window *, void *));
***************
*** 2553,2559 ****
      *cols = MIN_SAFE_WINDOW_WIDTH;
  }
  
- 
  /* Value is non-zero if window W is fixed-size.  WIDTH_P non-zero means
     check if W's width can be changed, otherwise check W's height.
     CHECK_SIBLINGS_P non-zero means check resizablity of WINDOW's
--- 2554,2559 ----
***************
*** 2655,2660 ****
--- 2655,2687 ----
    return fixed_p;
  }
  
+ /* Return the minimum size for leaf window W.  WIDTH_P non-zero means
+    take into account fringes and the scrollbar of W.  WIDTH_P zero
+    means take into account mode-line and header-line of W.  Return 1
+    for the minibuffer.  */
+ 
+ static int
+ window_min_size_2 (w, width_p)
+      struct window *w;
+      int width_p;
+ {
+   int size;
+   
+   if (width_p)
+     size = max (window_min_width,
+               (MIN_SAFE_WINDOW_WIDTH
+                + WINDOW_FRINGE_COLS (w)
+                + WINDOW_SCROLL_BAR_COLS (w)));
+   else if (MINI_WINDOW_P (w))
+     size = 1;
+   else
+     size = max (window_min_height,
+               (MIN_SAFE_WINDOW_HEIGHT
+                + (WINDOW_WANTS_MODELINE_P (w) ? 1 : 0)
+                + (WINDOW_WANTS_HEADER_LINE_P (w) ? 1 : 0 )));
+ 
+   return size;
+ }
  
  /* Return the minimum size of window W, not taking fixed-width windows
     into account.  WIDTH_P non-zero means return the minimum width,
***************
*** 2724,2745 ****
        }
      }
    else
!     {
!       if (width_p)
!       size = max (window_min_width,
!                   (MIN_SAFE_WINDOW_WIDTH
!                    + WINDOW_FRINGE_COLS (w)
!                    + WINDOW_SCROLL_BAR_COLS (w)));
!       else
!       {
!         if (MINI_WINDOW_P (w)
!             || (!WINDOW_WANTS_MODELINE_P (w)
!                 && !WINDOW_WANTS_HEADER_LINE_P (w)))
!           size = 1;
!         else
!           size = window_min_height;
!       }
!     }
  
    return size;
  }
--- 2751,2757 ----
        }
      }
    else
!     size = window_min_size_2 (w, width_p);
  
    return size;
  }
***************
*** 2981,2991 ****
    Lisp_Object child, *forward, *sideward;
    int old_size, min_size, safe_min_size;
  
-   /* We test nodelete_p != 2 and nodelete_p != 1 below, so it
-      seems like it's too soon to do this here.  ++KFS.  */
-   if (nodelete_p == 2)
-     nodelete_p = 0;
- 
    check_min_window_sizes ();
    size = max (0, size);
  
--- 2993,2998 ----
***************
*** 2996,3017 ****
      {
        old_size = WINDOW_TOTAL_COLS (w);
        min_size = window_min_width;
!       /* Ensure that there is room for the scroll bar and fringes!
!          We may reduce display margins though.  */
!       safe_min_size = (MIN_SAFE_WINDOW_WIDTH
!                      + WINDOW_FRINGE_COLS (w)
!                      + WINDOW_SCROLL_BAR_COLS (w));
      }
    else
      {
        old_size = XINT (w->total_lines);
        min_size = window_min_height;
!       safe_min_size = MIN_SAFE_WINDOW_HEIGHT;
      }
  
    if (old_size < min_size && nodelete_p != 2)
      w->too_small_ok = Qt;
  
    /* Maybe delete WINDOW if it's too small.  */
    if (nodelete_p != 1 && !NILP (w->parent))
      {
--- 3003,3025 ----
      {
        old_size = WINDOW_TOTAL_COLS (w);
        min_size = window_min_width;
!       safe_min_size = window_min_size_2 (w, 1);
      }
    else
      {
        old_size = XINT (w->total_lines);
        min_size = window_min_height;
!       safe_min_size = window_min_size_2 (w, 0);
      }
  
    if (old_size < min_size && nodelete_p != 2)
      w->too_small_ok = Qt;
  
+   /* Move the following test here since otherwise the
+      preceding test doesn't make sense.  martin. */
+   if (nodelete_p == 2)
+     nodelete_p = 0;
+ 
    /* Maybe delete WINDOW if it's too small.  */
    if (nodelete_p != 1 && !NILP (w->parent))
      {
***************
*** 3708,3716 ****
        frames = Qnil;
        if (FRAME_MINIBUF_ONLY_P (f))
        XSETFRAME (frames, last_nonminibuf_frame);
-       /* Don't try to create a window if we would get an error.  */
-       if (split_height_threshold < window_min_height << 1)
-       split_height_threshold = window_min_height << 1;
  
        /* Note that both Fget_largest_window and Fget_lru_window
         ignore minibuffers and dedicated windows.
--- 3716,3721 ----
***************
*** 3737,3744 ****
         split it.  */
        if (!NILP (window)
          && ! FRAME_NO_SPLIT_P (XFRAME (XWINDOW (window)->frame))
          && window_height (window) >= split_height_threshold
!         && WINDOW_FULL_WIDTH_P (XWINDOW (window)))
        window = Fsplit_window (window, Qnil, Qnil);
        else
        {
--- 3742,3751 ----
         split it.  */
        if (!NILP (window)
          && ! FRAME_NO_SPLIT_P (XFRAME (XWINDOW (window)->frame))
+         && WINDOW_FULL_WIDTH_P (XWINDOW (window))
          && window_height (window) >= split_height_threshold
!         && (window_height (window)
!             >= (2 * window_min_size_2 (XWINDOW (window), 0))))
        window = Fsplit_window (window, Qnil, Qnil);
        else
        {
***************
*** 3751,3757 ****
              && ! FRAME_NO_SPLIT_P (XFRAME (XWINDOW (window)->frame))
              && (EQ (window, selected_window)
                  || EQ (XWINDOW (window)->parent, Qnil))
!             && window_height (window) >= window_min_height << 1)
            window = Fsplit_window (window, Qnil, Qnil);
          else
            window = Fget_lru_window (frames, Qnil);
--- 3758,3766 ----
              && ! FRAME_NO_SPLIT_P (XFRAME (XWINDOW (window)->frame))
              && (EQ (window, selected_window)
                  || EQ (XWINDOW (window)->parent, Qnil))
!             && window_height (window) >= split_height_threshold
!             && (window_height (window)
!                 >= (2 * window_min_size_2 (XWINDOW (window), 0))))
            window = Fsplit_window (window, Qnil, Qnil);
          else
            window = Fget_lru_window (frames, Qnil);
***************
*** 4000,4008 ****
  
    if (NILP (horflag))
      {
!       if (size_int < window_min_height)
        error ("Window height %d too small (after splitting)", size_int);
!       if (size_int + window_min_height > XFASTINT (o->total_lines))
        error ("Window height %d too small (after splitting)",
               XFASTINT (o->total_lines) - size_int);
        if (NILP (o->parent)
--- 4009,4019 ----
  
    if (NILP (horflag))
      {
!       int window_safe_height = window_min_size_2 (o, 0);
!       
!       if (size_int < window_safe_height)
        error ("Window height %d too small (after splitting)", size_int);
!       if (size_int + window_safe_height > XFASTINT (o->total_lines))
        error ("Window height %d too small (after splitting)",
               XFASTINT (o->total_lines) - size_int);
        if (NILP (o->parent)
***************
*** 4015,4024 ****
      }
    else
      {
!       if (size_int < window_min_width)
        error ("Window width %d too small (after splitting)", size_int);
! 
!       if (size_int + window_min_width > XFASTINT (o->total_cols))
        error ("Window width %d too small (after splitting)",
               XFASTINT (o->total_cols) - size_int);
        if (NILP (o->parent)
--- 4026,4036 ----
      }
    else
      {
!       int window_safe_width = window_min_size_2 (o, 1);
!       
!       if (size_int < window_safe_width)
        error ("Window width %d too small (after splitting)", size_int);
!       if (size_int + window_safe_width > XFASTINT (o->total_cols))
        error ("Window width %d too small (after splitting)",
               XFASTINT (o->total_cols) - size_int);
        if (NILP (o->parent)
***************
*** 4499,4505 ****
  
        /* Don't make this window too small.  */
        if (XINT (CURSIZE (window)) + delta
!         < (horiz_flag ? window_min_width : window_min_height))
        {
          Fset_window_configuration (old_config);
          error ("Cannot adjust window size as specified");
--- 4511,4517 ----
  
        /* Don't make this window too small.  */
        if (XINT (CURSIZE (window)) + delta
!         < window_min_size_2 (XWINDOW (window), horiz_flag))
        {
          Fset_window_configuration (old_config);
          error ("Cannot adjust window size as specified");

reply via email to

[Prev in Thread] Current Thread [Next in Thread]