Mercurial > emacs
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 |
