Commit 190b47e6 authored by Martin Rudalics's avatar Martin Rudalics

Move get-lru-window and get-largest-window to window.el.

* window.c (window_loop): Remove handling of GET_LRU_WINDOW and
GET_LARGEST_WINDOW.
(Fget_lru_window, Fget_largest_window): Move to window.el.

* window.el (get-lru-window, get-largest-window): Move here from
window.c.  Rename first argument to ALL-FRAMES.  Rephrase
doc-strings.
(get-buffer-window-list): Rewrite using window-list-1.  Rephrase
doc-string.
parent fa8a67e6
2011-06-07 Martin Rudalics <rudalics@gmx.at>
* window.el (get-lru-window, get-largest-window): Move here from
window.c. Rename first argument to ALL-FRAMES. Rephrase
doc-strings.
(get-buffer-window-list): Rewrite using window-list-1. Rephrase
doc-string.
2011-06-06 Martin Rudalics <rudalics@gmx.at>
* window.el (window-right, window-left, window-child)
......
......@@ -640,25 +640,112 @@ arguments."
(defalias 'some-window 'get-window-with-predicate)
;; This should probably be written in C (i.e., without using `walk-windows').
(defun get-lru-window (&optional all-frames dedicated)
"Return the least recently used window on frames specified by ALL-FRAMES.
Return a full-width window if possible. A minibuffer window is
never a candidate. A dedicated window is never a candidate
unless DEDICATED is non-nil, so if all windows are dedicated, the
value is nil. Avoid returning the selected window if possible.
The following non-nil values of the optional argument ALL-FRAMES
have special meanings:
- t means consider all windows on all existing frames.
- `visible' means consider all windows on all visible frames on
the current terminal.
- 0 (the number zero) means consider all windows on all visible
and iconified frames on the current terminal.
- A frame means consider all windows on that frame only.
Any other value of ALL-FRAMES means consider all windows on the
selected frame and no others."
(let (best-window best-time second-best-window second-best-time time)
(dolist (window (window-list-1 nil nil all-frames))
(when (or dedicated (not (window-dedicated-p window)))
(setq time (window-use-time window))
(if (or (eq window (selected-window))
(not (window-full-width-p window)))
(when (or (not second-best-time) (< time second-best-time))
(setq second-best-time time)
(setq second-best-window window))
(when (or (not best-time) (< time best-time))
(setq best-time time)
(setq best-window window)))))
(or best-window second-best-window)))
(defun get-largest-window (&optional all-frames dedicated)
"Return the largest window on frames specified by ALL-FRAMES.
A minibuffer window is never a candidate. A dedicated window is
never a candidate unless DEDICATED is non-nil, so if all windows
are dedicated, the value is nil.
The following non-nil values of the optional argument ALL-FRAMES
have special meanings:
- t means consider all windows on all existing frames.
- `visible' means consider all windows on all visible frames on
the current terminal.
- 0 (the number zero) means consider all windows on all visible
and iconified frames on the current terminal.
- A frame means consider all windows on that frame only.
Any other value of ALL-FRAMES means consider all windows on the
selected frame and no others."
(let ((best-size 0)
best-window size)
(dolist (window (window-list-1 nil nil all-frames))
(when (or dedicated (not (window-dedicated-p window)))
(setq size (* (window-total-size window)
(window-total-size window t)))
(when (> size best-size)
(setq best-size size)
(setq best-window window))))
best-window))
(defun get-buffer-window-list (&optional buffer-or-name minibuf all-frames)
"Return list of all windows displaying BUFFER-OR-NAME, or nil if none.
BUFFER-OR-NAME may be a buffer or the name of an existing buffer
and defaults to the current buffer.
The optional arguments MINIBUF and ALL-FRAMES specify the set of
windows to consider. See `walk-windows' for the precise meaning
of these arguments."
(let ((buffer (cond
((not buffer-or-name) (current-buffer))
((bufferp buffer-or-name) buffer-or-name)
(t (get-buffer buffer-or-name))))
Any windows showing BUFFER-OR-NAME on the selected frame are listed
first.
MINIBUF t means include the minibuffer window even if the
minibuffer is not active. MINIBUF nil or omitted means include
the minibuffer window only if the minibuffer is active. Any
other value means do not include the minibuffer window even if
the minibuffer is active.
ALL-FRAMES nil or omitted means consider all windows on the
selected frame, plus the minibuffer window if specified by the
MINIBUF argument. If the minibuffer counts, consider all windows
on all frames that share that minibuffer too. The following
non-nil values of ALL-FRAMES have special meanings:
- t means consider all windows on all existing frames.
- `visible' means consider all windows on all visible frames on
the current terminal.
- 0 (the number zero) means consider all windows on all visible
and iconified frames on the current terminal.
- A frame means consider all windows on that frame only.
Anything else means consider all windows on the selected frame
and no others."
(let ((buffer (normalize-live-buffer buffer-or-name))
windows)
(walk-windows (function (lambda (window)
(if (eq (window-buffer window) buffer)
(setq windows (cons window windows)))))
minibuf all-frames)
windows))
(dolist (window (window-list-1 (frame-first-window) minibuf all-frames))
(when (eq (window-buffer window) buffer)
(setq windows (cons window windows))))
(nreverse windows)))
(defun minibuffer-window-active-p (window)
"Return t if WINDOW is the currently active minibuffer window."
......
......@@ -10,6 +10,9 @@
delete_all_subwindows with window as argument.
(delete_all_subwindows): Take a window as argument and not a
structure. Rewrite.
(window_loop): Remove handling of GET_LRU_WINDOW and
GET_LARGEST_WINDOW.
(Fget_lru_window, Fget_largest_window): Move to window.el.
* window.h: Extern window_body_cols instead of
window_box_text_cols. delete_all_subwindows now takes a
......
......@@ -2487,10 +2487,8 @@ enum window_loop
{
WINDOW_LOOP_UNUSED,
GET_BUFFER_WINDOW, /* Arg is buffer */
GET_LRU_WINDOW, /* Arg is t for full-width windows only */
DELETE_OTHER_WINDOWS, /* Arg is window not to delete */
DELETE_BUFFER_WINDOWS, /* Arg is buffer */
GET_LARGEST_WINDOW,
UNSHOW_BUFFER, /* Arg is buffer */
REDISPLAY_BUFFER_WINDOWS, /* Arg is buffer */
CHECK_ALL_WINDOWS
......@@ -2573,21 +2571,6 @@ window_loop (enum window_loop type, Lisp_Object obj, int mini, Lisp_Object frame
}
break;
case GET_LRU_WINDOW:
/* `obj' is an integer encoding a bitvector.
`obj & 1' means consider only full-width windows.
`obj & 2' means consider also dedicated windows. */
if (((XINT (obj) & 1) && !WINDOW_FULL_WIDTH_P (w))
|| (!(XINT (obj) & 2) && !NILP (w->dedicated))
/* Minibuffer windows are always ignored. */
|| MINI_WINDOW_P (w))
break;
if (NILP (best_window)
|| (XFASTINT (XWINDOW (best_window)->use_time)
> XFASTINT (w->use_time)))
best_window = window;
break;
case DELETE_OTHER_WINDOWS:
if (!EQ (window, obj))
Fdelete_window (window);
......@@ -2632,24 +2615,6 @@ window_loop (enum window_loop type, Lisp_Object obj, int mini, Lisp_Object frame
}
break;
case GET_LARGEST_WINDOW:
{ /* nil `obj' means to ignore dedicated windows. */
/* Ignore dedicated windows and minibuffers. */
if (MINI_WINDOW_P (w) || (NILP (obj) && !NILP (w->dedicated)))
break;
if (NILP (best_window))
best_window = window;
else
{
struct window *b = XWINDOW (best_window);
if (XFASTINT (w->total_lines) * XFASTINT (w->total_cols)
> XFASTINT (b->total_lines) * XFASTINT (b->total_cols))
best_window = window;
}
}
break;
case UNSHOW_BUFFER:
if (EQ (w->buffer, obj))
{
......@@ -2740,50 +2705,6 @@ time is the least recently selected one. */)
return decode_window (window)->use_time;
}
DEFUN ("get-lru-window", Fget_lru_window, Sget_lru_window, 0, 2, 0,
doc: /* Return the window least recently selected or used for display.
\(LRU means Least Recently Used.)
Return a full-width window if possible.
A minibuffer window is never a candidate.
A dedicated window is never a candidate, unless DEDICATED is non-nil,
so if all windows are dedicated, the value is nil.
If optional argument FRAME is `visible', search all visible frames.
If FRAME is 0, search all visible and iconified frames.
If FRAME is t, search all frames.
If FRAME is nil, search only the selected frame.
If FRAME is a frame, search only that frame. */)
(Lisp_Object frame, Lisp_Object dedicated)
{
register Lisp_Object w;
/* First try for a window that is full-width */
w = window_loop (GET_LRU_WINDOW,
NILP (dedicated) ? make_number (1) : make_number (3),
0, frame);
if (!NILP (w) && !EQ (w, selected_window))
return w;
/* If none of them, try the rest */
return window_loop (GET_LRU_WINDOW,
NILP (dedicated) ? make_number (0) : make_number (2),
0, frame);
}
DEFUN ("get-largest-window", Fget_largest_window, Sget_largest_window, 0, 2, 0,
doc: /* Return the largest window in area.
A minibuffer window is never a candidate.
A dedicated window is never a candidate unless DEDICATED is non-nil,
so if all windows are dedicated, the value is nil.
If optional argument FRAME is `visible', search all visible frames.
If FRAME is 0, search all visible and iconified frames.
If FRAME is t, search all frames.
If FRAME is nil, search only the selected frame.
If FRAME is a frame, search only that frame. */)
(Lisp_Object frame, Lisp_Object dedicated)
{
return window_loop (GET_LARGEST_WINDOW, dedicated, 0,
frame);
}
DEFUN ("get-buffer-window", Fget_buffer_window, Sget_buffer_window, 0, 2, 0,
doc: /* Return a window currently displaying BUFFER-OR-NAME, or nil if none.
BUFFER-OR-NAME may be a buffer or a buffer name and defaults to the
......@@ -7431,8 +7352,6 @@ frame to be redrawn only if it is a tty frame. */);
defsubr (&Snext_window);
defsubr (&Sprevious_window);
defsubr (&Sother_window);
defsubr (&Sget_lru_window);
defsubr (&Sget_largest_window);
defsubr (&Sget_buffer_window);
defsubr (&Sdelete_other_windows);
defsubr (&Sdelete_windows_on);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment