diff options
| author | Karoly Lorentey <lorentey@elte.hu> | 2005-12-20 21:35:03 +0000 |
|---|---|---|
| committer | Karoly Lorentey <lorentey@elte.hu> | 2005-12-20 21:35:03 +0000 |
| commit | a18b8cb5070a81da0659275bef52f77f925644c8 (patch) | |
| tree | 4edd0aa560de4dc08c6e10e649909505b0e9f59f /src/buffer.c | |
| parent | e93b29568add51c918892153759a1fcd440e85be (diff) | |
| download | emacs-a18b8cb5070a81da0659275bef52f77f925644c8.tar.gz | |
Implement full support for frame-local `next-buffer' and `previous-buffer'.
* frame.h (frame): New field `buried_buffer_list'.
* alloc.c (mark_object): Mark it.
* frame.c (make_frame): Initialize it.
* frame.h (Qburied_buffer_list): New symbol declaration.
* buffer.c (Fbuffer_list): Handle the buried-buffer-list frame parameter.
* buffer.c (record_buffer): Delete the buffer from the buried_buffer_list.
* buffer.c (Fbury_buffer): Add buffer to buried_buffer_list.
* frame.c (Qburied_buffer_list): New symbol.
(syms_of_frame): Initialize and staticpro it.
(frames_discard_buffer): Also remove buffer from buried-buffer-list.
(store_frame_param): Handle `buried-buffer-list' specially.
(Fframe_parameters): Handle `buried-buffer-list' specially.
* simple.el (last-buffer): Don't look at buried-buffer-list, rely on
`buffer-list' doing that for us.
(next-buffer): Simplify.
(previous-buffer): Simplify.
git-archimport-id: lorentey@elte.hu--2004/emacs--multi-tty--0--patch-455
Diffstat (limited to 'src/buffer.c')
| -rw-r--r-- | src/buffer.c | 48 |
1 files changed, 39 insertions, 9 deletions
diff --git a/src/buffer.c b/src/buffer.c index d52a710573e..d0719ec9481 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -212,25 +212,38 @@ frame parameter come first, followed by the rest of the buffers. */) (frame) Lisp_Object frame; { - Lisp_Object framelist, general; + Lisp_Object general; general = Fmapcar (Qcdr, Vbuffer_alist); if (FRAMEP (frame)) { - Lisp_Object tail; + Lisp_Object framelist, prevlist, tail; + Lisp_Object args[3]; CHECK_FRAME (frame); framelist = Fcopy_sequence (XFRAME (frame)->buffer_list); + prevlist = Fnreverse (Fcopy_sequence (XFRAME (frame)->buried_buffer_list)); - /* Remove from GENERAL any buffer that duplicates one in FRAMELIST. */ + /* Remove from GENERAL any buffer that duplicates one in + FRAMELIST or PREVLIST. */ tail = framelist; - while (! NILP (tail)) + while (CONSP (tail)) { general = Fdelq (XCAR (tail), general); tail = XCDR (tail); } - return nconc2 (framelist, general); + tail = prevlist; + while (CONSP (tail)) + { + general = Fdelq (XCAR (tail), general); + tail = XCDR (tail); + } + + args[0] = framelist; + args[1] = general; + args[2] = prevlist; + return Fnconc (3, args); } return general; @@ -1545,6 +1558,23 @@ record_buffer (buf) XSETCDR (link, Vbuffer_alist); Vbuffer_alist = link; + /* Effectively do a delq on buried_buffer_list. */ + + prev = Qnil; + for (link = XFRAME (frame)->buried_buffer_list; CONSP (link); + link = XCDR (link)) + { + if (EQ (XCAR (link), buf)) + { + if (NILP (prev)) + XFRAME (frame)->buried_buffer_list = XCDR (link); + else + XSETCDR (prev, XCDR (XCDR (prev))); + break; + } + prev = link; + } + /* Now move this buffer to the front of frame_buffer_list also. */ prev = Qnil; @@ -2016,10 +2046,10 @@ selected window if it is displayed there. */) XSETCDR (link, Qnil); Vbuffer_alist = nconc2 (Vbuffer_alist, link); - /* Removing BUFFER from frame-specific lists - has the effect of putting BUFFER at the end - of the combined list in each frame. */ - frames_discard_buffer (buffer); + XFRAME (selected_frame)->buffer_list + = Fdelq (buffer, XFRAME (selected_frame)->buffer_list); + XFRAME (selected_frame)->buried_buffer_list + = Fcons (buffer, Fdelq (buffer, XFRAME (selected_frame)->buried_buffer_list)); } return Qnil; |
