diff options
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 127bfba44e0..8cd13b07855 100644 --- a/src/buffer.c +++ b/src/buffer.c | |||
| @@ -215,25 +215,38 @@ frame parameter come first, followed by the rest of the buffers. */) | |||
| 215 | (frame) | 215 | (frame) |
| 216 | Lisp_Object frame; | 216 | Lisp_Object frame; |
| 217 | { | 217 | { |
| 218 | Lisp_Object framelist, general; | 218 | Lisp_Object general; |
| 219 | general = Fmapcar (Qcdr, Vbuffer_alist); | 219 | general = Fmapcar (Qcdr, Vbuffer_alist); |
| 220 | 220 | ||
| 221 | if (FRAMEP (frame)) | 221 | if (FRAMEP (frame)) |
| 222 | { | 222 | { |
| 223 | Lisp_Object tail; | 223 | Lisp_Object framelist, prevlist, tail; |
| 224 | Lisp_Object args[3]; | ||
| 224 | 225 | ||
| 225 | CHECK_FRAME (frame); | 226 | CHECK_FRAME (frame); |
| 226 | 227 | ||
| 227 | framelist = Fcopy_sequence (XFRAME (frame)->buffer_list); | 228 | framelist = Fcopy_sequence (XFRAME (frame)->buffer_list); |
| 229 | prevlist = Fnreverse (Fcopy_sequence (XFRAME (frame)->buried_buffer_list)); | ||
| 228 | 230 | ||
| 229 | /* Remove from GENERAL any buffer that duplicates one in FRAMELIST. */ | 231 | /* Remove from GENERAL any buffer that duplicates one in |
| 232 | FRAMELIST or PREVLIST. */ | ||
| 230 | tail = framelist; | 233 | tail = framelist; |
| 231 | while (! NILP (tail)) | 234 | while (CONSP (tail)) |
| 232 | { | 235 | { |
| 233 | general = Fdelq (XCAR (tail), general); | 236 | general = Fdelq (XCAR (tail), general); |
| 234 | tail = XCDR (tail); | 237 | tail = XCDR (tail); |
| 235 | } | 238 | } |
| 236 | return nconc2 (framelist, general); | 239 | tail = prevlist; |
| 240 | while (CONSP (tail)) | ||
| 241 | { | ||
| 242 | general = Fdelq (XCAR (tail), general); | ||
| 243 | tail = XCDR (tail); | ||
| 244 | } | ||
| 245 | |||
| 246 | args[0] = framelist; | ||
| 247 | args[1] = general; | ||
| 248 | args[2] = prevlist; | ||
| 249 | return Fnconc (3, args); | ||
| 237 | } | 250 | } |
| 238 | 251 | ||
| 239 | return general; | 252 | return general; |
| @@ -1583,6 +1596,23 @@ record_buffer (buf) | |||
| 1583 | XSETCDR (link, Vbuffer_alist); | 1596 | XSETCDR (link, Vbuffer_alist); |
| 1584 | Vbuffer_alist = link; | 1597 | Vbuffer_alist = link; |
| 1585 | 1598 | ||
| 1599 | /* Effectively do a delq on buried_buffer_list. */ | ||
| 1600 | |||
| 1601 | prev = Qnil; | ||
| 1602 | for (link = XFRAME (frame)->buried_buffer_list; CONSP (link); | ||
| 1603 | link = XCDR (link)) | ||
| 1604 | { | ||
| 1605 | if (EQ (XCAR (link), buf)) | ||
| 1606 | { | ||
| 1607 | if (NILP (prev)) | ||
| 1608 | XFRAME (frame)->buried_buffer_list = XCDR (link); | ||
| 1609 | else | ||
| 1610 | XSETCDR (prev, XCDR (XCDR (prev))); | ||
| 1611 | break; | ||
| 1612 | } | ||
| 1613 | prev = link; | ||
| 1614 | } | ||
| 1615 | |||
| 1586 | /* Now move this buffer to the front of frame_buffer_list also. */ | 1616 | /* Now move this buffer to the front of frame_buffer_list also. */ |
| 1587 | 1617 | ||
| 1588 | prev = Qnil; | 1618 | prev = Qnil; |
| @@ -2065,10 +2095,10 @@ selected window if it is displayed there. */) | |||
| 2065 | XSETCDR (link, Qnil); | 2095 | XSETCDR (link, Qnil); |
| 2066 | Vbuffer_alist = nconc2 (Vbuffer_alist, link); | 2096 | Vbuffer_alist = nconc2 (Vbuffer_alist, link); |
| 2067 | 2097 | ||
| 2068 | /* Removing BUFFER from frame-specific lists | 2098 | XFRAME (selected_frame)->buffer_list |
| 2069 | has the effect of putting BUFFER at the end | 2099 | = Fdelq (buffer, XFRAME (selected_frame)->buffer_list); |
| 2070 | of the combined list in each frame. */ | 2100 | XFRAME (selected_frame)->buried_buffer_list |
| 2071 | frames_discard_buffer (buffer); | 2101 | = Fcons (buffer, Fdelq (buffer, XFRAME (selected_frame)->buried_buffer_list)); |
| 2072 | } | 2102 | } |
| 2073 | 2103 | ||
| 2074 | return Qnil; | 2104 | return Qnil; |