comparison lisp/window.el @ 223:2c611d1463a6 r20-4b10

Import from CVS: tag r20-4b10
author cvs
date Mon, 13 Aug 2007 10:10:54 +0200
parents 41ff10fd062f
children c5d627a313b1
comparison
equal deleted inserted replaced
222:aae4c8b01452 223:2c611d1463a6
276 or if the window is the only window of its frame." 276 or if the window is the only window of its frame."
277 (interactive) 277 (interactive)
278 (or window (setq window (selected-window))) 278 (or window (setq window (selected-window)))
279 (save-excursion 279 (save-excursion
280 (set-buffer (window-buffer window)) 280 (set-buffer (window-buffer window))
281 (let* ((w (selected-window)) ;save-window-excursion can't win 281 (let ((n 0)
282 (buffer-file-name buffer-file-name) 282 (test-pos
283 (p (point)) 283 (- (point-max)
284 (n 0) 284 ;; If buffer ends with a newline, ignore it when counting
285 (ignore-final-newline 285 ;; height unless point is after it.
286 ;; If buffer ends with a newline, ignore it when counting height 286 (if (and (not (eobp))
287 ;; unless point is after it. 287 (eq ?\n (char-after (1- (point-max)))))
288 (and (not (eobp)) 288 1 0)))
289 (eq ?\n (char-after (1- (point-max)))))) 289 (mini (frame-property (window-frame window) 'minibuffer))
290 (buffer-read-only nil) 290 (edges (window-pixel-edges (selected-window))))
291 (modified (buffer-modified-p))
292 (buffer (current-buffer))
293 (mini (frame-property (window-frame window) 'minibuffer))
294 (edges (window-pixel-edges (selected-window))))
295 (if (and (< 1 (let ((frame (selected-frame))) 291 (if (and (< 1 (let ((frame (selected-frame)))
296 (select-frame (window-frame window)) 292 (select-frame (window-frame window))
297 (unwind-protect 293 (unwind-protect
298 (count-windows) 294 (count-windows)
299 (select-frame frame)))) 295 (select-frame frame))))
305 (not (eq mini 'only)) 301 (not (eq mini 'only))
306 (or (not mini) (eq mini t) 302 (or (not mini) (eq mini t)
307 (< (nth 3 edges) 303 (< (nth 3 edges)
308 (nth 1 (window-pixel-edges mini))) 304 (nth 1 (window-pixel-edges mini)))
309 (> (nth 1 edges) 305 (> (nth 1 edges)
310 ;FSFmacs (frame-property (window-frame window)
311 ; 'menu-bar-lines params)
312 0))) 306 0)))
313 (unwind-protect 307 (progn
314 (let ((shrinkee (or window w))) 308 (save-window-excursion
315 (set-buffer (window-buffer shrinkee)) 309 (goto-char (point-min))
316 (goto-char (point-min)) 310 (while (and (window-live-p window)
317 (while (pos-visible-in-window-p 311 (pos-visible-in-window-p test-pos window))
318 (- (point-max) 312 (shrink-window 1 nil window)
319 (if ignore-final-newline 1 0)) 313 (setq n (1+ n))))
320 shrinkee) 314 (if (> n 0)
321 ;; defeat file locking... don't try this at home, kids! 315 (shrink-window (min (1- n)
322 (setq buffer-file-name nil) 316 (- (window-height window)
323 (insert ?\n) (setq n (1+ n))) 317 (1+ window-min-height)))
324 (if (> n 0) 318 nil
325 (shrink-window (min (1- n) 319 window)))))))
326 (- (window-height shrinkee)
327 window-min-height))
328 nil
329 shrinkee)))
330 (delete-region (point-min) (point))
331 (set-buffer-modified-p modified)
332 (goto-char p)
333 ;; (select-window w) ; Emacs
334 ;; Make sure we unbind buffer-read-only
335 ;; with the proper current buffer.
336 (set-buffer buffer))))))
337 320
338 (defun kill-buffer-and-window () 321 (defun kill-buffer-and-window ()
339 "Kill the current buffer and delete the selected window." 322 "Kill the current buffer and delete the selected window."
340 (interactive) 323 (interactive)
341 (if (yes-or-no-p (format "Kill buffer `%s'? " (buffer-name))) 324 (if (yes-or-no-p (format "Kill buffer `%s'? " (buffer-name)))