aboutsummaryrefslogtreecommitdiffstats
path: root/src/buffer.c
diff options
context:
space:
mode:
authorKaroly Lorentey2005-12-20 21:35:03 +0000
committerKaroly Lorentey2005-12-20 21:35:03 +0000
commita18b8cb5070a81da0659275bef52f77f925644c8 (patch)
tree4edd0aa560de4dc08c6e10e649909505b0e9f59f /src/buffer.c
parente93b29568add51c918892153759a1fcd440e85be (diff)
downloademacs-a18b8cb5070a81da0659275bef52f77f925644c8.tar.gz
emacs-a18b8cb5070a81da0659275bef52f77f925644c8.zip
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.c48
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. */)
212 (frame) 212 (frame)
213 Lisp_Object frame; 213 Lisp_Object frame;
214{ 214{
215 Lisp_Object framelist, general; 215 Lisp_Object general;
216 general = Fmapcar (Qcdr, Vbuffer_alist); 216 general = Fmapcar (Qcdr, Vbuffer_alist);
217 217
218 if (FRAMEP (frame)) 218 if (FRAMEP (frame))
219 { 219 {
220 Lisp_Object tail; 220 Lisp_Object framelist, prevlist, tail;
221 Lisp_Object args[3];
221 222
222 CHECK_FRAME (frame); 223 CHECK_FRAME (frame);
223 224
224 framelist = Fcopy_sequence (XFRAME (frame)->buffer_list); 225 framelist = Fcopy_sequence (XFRAME (frame)->buffer_list);
226 prevlist = Fnreverse (Fcopy_sequence (XFRAME (frame)->buried_buffer_list));
225 227
226 /* Remove from GENERAL any buffer that duplicates one in FRAMELIST. */ 228 /* Remove from GENERAL any buffer that duplicates one in
229 FRAMELIST or PREVLIST. */
227 tail = framelist; 230 tail = framelist;
228 while (! NILP (tail)) 231 while (CONSP (tail))
229 { 232 {
230 general = Fdelq (XCAR (tail), general); 233 general = Fdelq (XCAR (tail), general);
231 tail = XCDR (tail); 234 tail = XCDR (tail);
232 } 235 }
233 return nconc2 (framelist, general); 236 tail = prevlist;
237 while (CONSP (tail))
238 {
239 general = Fdelq (XCAR (tail), general);
240 tail = XCDR (tail);
241 }
242
243 args[0] = framelist;
244 args[1] = general;
245 args[2] = prevlist;
246 return Fnconc (3, args);
234 } 247 }
235 248
236 return general; 249 return general;
@@ -1545,6 +1558,23 @@ record_buffer (buf)
1545 XSETCDR (link, Vbuffer_alist); 1558 XSETCDR (link, Vbuffer_alist);
1546 Vbuffer_alist = link; 1559 Vbuffer_alist = link;
1547 1560
1561 /* Effectively do a delq on buried_buffer_list. */
1562
1563 prev = Qnil;
1564 for (link = XFRAME (frame)->buried_buffer_list; CONSP (link);
1565 link = XCDR (link))
1566 {
1567 if (EQ (XCAR (link), buf))
1568 {
1569 if (NILP (prev))
1570 XFRAME (frame)->buried_buffer_list = XCDR (link);
1571 else
1572 XSETCDR (prev, XCDR (XCDR (prev)));
1573 break;
1574 }
1575 prev = link;
1576 }
1577
1548 /* Now move this buffer to the front of frame_buffer_list also. */ 1578 /* Now move this buffer to the front of frame_buffer_list also. */
1549 1579
1550 prev = Qnil; 1580 prev = Qnil;
@@ -2016,10 +2046,10 @@ selected window if it is displayed there. */)
2016 XSETCDR (link, Qnil); 2046 XSETCDR (link, Qnil);
2017 Vbuffer_alist = nconc2 (Vbuffer_alist, link); 2047 Vbuffer_alist = nconc2 (Vbuffer_alist, link);
2018 2048
2019 /* Removing BUFFER from frame-specific lists 2049 XFRAME (selected_frame)->buffer_list
2020 has the effect of putting BUFFER at the end 2050 = Fdelq (buffer, XFRAME (selected_frame)->buffer_list);
2021 of the combined list in each frame. */ 2051 XFRAME (selected_frame)->buried_buffer_list
2022 frames_discard_buffer (buffer); 2052 = Fcons (buffer, Fdelq (buffer, XFRAME (selected_frame)->buried_buffer_list));
2023 } 2053 }
2024 2054
2025 return Qnil; 2055 return Qnil;