comparison src/buffer.c @ 83415:d2c799f58129

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
author Karoly Lorentey <lorentey@elte.hu>
date Tue, 20 Dec 2005 21:35:03 +0000
parents 37d0562504bf
children b98066f4aa10
comparison
equal deleted inserted replaced
83414:14a4eb789b45 83415:d2c799f58129
210 in the proper order for that frame: the buffers in FRAME's `buffer-list' 210 in the proper order for that frame: the buffers in FRAME's `buffer-list'
211 frame parameter come first, followed by the rest of the buffers. */) 211 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);
225 226 prevlist = Fnreverse (Fcopy_sequence (XFRAME (frame)->buried_buffer_list));
226 /* Remove from GENERAL any buffer that duplicates one in FRAMELIST. */ 227
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;
237 } 250 }
238 251
1543 XSETCDR (prev, XCDR (XCDR (prev))); 1556 XSETCDR (prev, XCDR (XCDR (prev)));
1544 1557
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;
1551 for (link = frame_buffer_list (frame); CONSP (link); 1581 for (link = frame_buffer_list (frame); CONSP (link);
1552 link = XCDR (link)) 1582 link = XCDR (link))
2014 link = Fmemq (aelt, Vbuffer_alist); 2044 link = Fmemq (aelt, Vbuffer_alist);
2015 Vbuffer_alist = Fdelq (aelt, Vbuffer_alist); 2045 Vbuffer_alist = Fdelq (aelt, Vbuffer_alist);
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;
2026 } 2056 }
2027 2057