aboutsummaryrefslogtreecommitdiffstats
path: root/src/buffer.c
diff options
context:
space:
mode:
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 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;