*** 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");