aboutsummaryrefslogtreecommitdiffstats
path: root/src
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
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')
-rw-r--r--src/alloc.c1
-rw-r--r--src/buffer.c48
-rw-r--r--src/frame.c19
-rw-r--r--src/frame.h6
4 files changed, 60 insertions, 14 deletions
diff --git a/src/alloc.c b/src/alloc.c
index 5d8ccdc7b7c..83ba06277f1 100644
--- a/src/alloc.c
+++ b/src/alloc.c
@@ -5373,6 +5373,7 @@ mark_object (arg)
5373 mark_object (ptr->menu_bar_vector); 5373 mark_object (ptr->menu_bar_vector);
5374 mark_object (ptr->buffer_predicate); 5374 mark_object (ptr->buffer_predicate);
5375 mark_object (ptr->buffer_list); 5375 mark_object (ptr->buffer_list);
5376 mark_object (ptr->buried_buffer_list);
5376 mark_object (ptr->menu_bar_window); 5377 mark_object (ptr->menu_bar_window);
5377 mark_object (ptr->tool_bar_window); 5378 mark_object (ptr->tool_bar_window);
5378 mark_face_cache (ptr->face_cache); 5379 mark_face_cache (ptr->face_cache);
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;
diff --git a/src/frame.c b/src/frame.c
index 8d45ddc33f2..9c83f961267 100644
--- a/src/frame.c
+++ b/src/frame.c
@@ -107,7 +107,7 @@ Lisp_Object Qtitle, Qname;
107Lisp_Object Qunsplittable; 107Lisp_Object Qunsplittable;
108Lisp_Object Qmenu_bar_lines, Qtool_bar_lines; 108Lisp_Object Qmenu_bar_lines, Qtool_bar_lines;
109Lisp_Object Qleft_fringe, Qright_fringe; 109Lisp_Object Qleft_fringe, Qright_fringe;
110Lisp_Object Qbuffer_predicate, Qbuffer_list; 110Lisp_Object Qbuffer_predicate, Qbuffer_list, Qburied_buffer_list;
111Lisp_Object Qtty_color_mode; 111Lisp_Object Qtty_color_mode;
112Lisp_Object Qtty, Qtty_type; 112Lisp_Object Qtty, Qtty_type;
113Lisp_Object Qwindow_system; 113Lisp_Object Qwindow_system;
@@ -303,6 +303,7 @@ make_frame (mini_p)
303 f->menu_bar_items_used = 0; 303 f->menu_bar_items_used = 0;
304 f->buffer_predicate = Qnil; 304 f->buffer_predicate = Qnil;
305 f->buffer_list = Qnil; 305 f->buffer_list = Qnil;
306 f->buried_buffer_list = Qnil;
306 f->namebuf = 0; 307 f->namebuf = 0;
307 f->title = Qnil; 308 f->title = Qnil;
308 f->menu_bar_window = Qnil; 309 f->menu_bar_window = Qnil;
@@ -2134,7 +2135,7 @@ set_frame_buffer_list (frame, list)
2134 XFRAME (frame)->buffer_list = list; 2135 XFRAME (frame)->buffer_list = list;
2135} 2136}
2136 2137
2137/* Discard BUFFER from the buffer-list of each frame. */ 2138/* Discard BUFFER from the buffer-list and buried-buffer-list of each frame. */
2138 2139
2139void 2140void
2140frames_discard_buffer (buffer) 2141frames_discard_buffer (buffer)
@@ -2146,6 +2147,8 @@ frames_discard_buffer (buffer)
2146 { 2147 {
2147 XFRAME (frame)->buffer_list 2148 XFRAME (frame)->buffer_list
2148 = Fdelq (buffer, XFRAME (frame)->buffer_list); 2149 = Fdelq (buffer, XFRAME (frame)->buffer_list);
2150 XFRAME (frame)->buried_buffer_list
2151 = Fdelq (buffer, XFRAME (frame)->buried_buffer_list);
2149 } 2152 }
2150} 2153}
2151 2154
@@ -2233,13 +2236,18 @@ store_frame_param (f, prop, val)
2233{ 2236{
2234 register Lisp_Object old_alist_elt; 2237 register Lisp_Object old_alist_elt;
2235 2238
2236 /* The buffer-alist parameter is stored in a special place and is 2239 /* The buffer-list parameters are stored in a special place and not
2237 not in the alist. */ 2240 in the alist. */
2238 if (EQ (prop, Qbuffer_list)) 2241 if (EQ (prop, Qbuffer_list))
2239 { 2242 {
2240 f->buffer_list = val; 2243 f->buffer_list = val;
2241 return; 2244 return;
2242 } 2245 }
2246 if (EQ (prop, Qburied_buffer_list))
2247 {
2248 f->buried_buffer_list = val;
2249 return;
2250 }
2243 2251
2244 /* If PROP is a symbol which is supposed to have frame-local values, 2252 /* If PROP is a symbol which is supposed to have frame-local values,
2245 and it is set up based on this frame, switch to the global 2253 and it is set up based on this frame, switch to the global
@@ -2379,6 +2387,7 @@ If FRAME is omitted, return information on the currently selected frame. */)
2379 : FRAME_MINIBUF_WINDOW (f))); 2387 : FRAME_MINIBUF_WINDOW (f)));
2380 store_in_alist (&alist, Qunsplittable, (FRAME_NO_SPLIT_P (f) ? Qt : Qnil)); 2388 store_in_alist (&alist, Qunsplittable, (FRAME_NO_SPLIT_P (f) ? Qt : Qnil));
2381 store_in_alist (&alist, Qbuffer_list, frame_buffer_list (frame)); 2389 store_in_alist (&alist, Qbuffer_list, frame_buffer_list (frame));
2390 store_in_alist (&alist, Qburied_buffer_list, XFRAME (frame)->buried_buffer_list);
2382 2391
2383 /* I think this should be done with a hook. */ 2392 /* I think this should be done with a hook. */
2384#ifdef HAVE_WINDOW_SYSTEM 2393#ifdef HAVE_WINDOW_SYSTEM
@@ -4199,6 +4208,8 @@ syms_of_frame ()
4199 staticpro (&Qbuffer_predicate); 4208 staticpro (&Qbuffer_predicate);
4200 Qbuffer_list = intern ("buffer-list"); 4209 Qbuffer_list = intern ("buffer-list");
4201 staticpro (&Qbuffer_list); 4210 staticpro (&Qbuffer_list);
4211 Qburied_buffer_list = intern ("buried-buffer-list");
4212 staticpro (&Qburied_buffer_list);
4202 Qdisplay_type = intern ("display-type"); 4213 Qdisplay_type = intern ("display-type");
4203 staticpro (&Qdisplay_type); 4214 staticpro (&Qdisplay_type);
4204 Qbackground_mode = intern ("background-mode"); 4215 Qbackground_mode = intern ("background-mode");
diff --git a/src/frame.h b/src/frame.h
index e8155ac8212..c63b0bec464 100644
--- a/src/frame.h
+++ b/src/frame.h
@@ -161,6 +161,10 @@ struct frame
161 /* List of buffers viewed in this frame, for other-buffer. */ 161 /* List of buffers viewed in this frame, for other-buffer. */
162 Lisp_Object buffer_list; 162 Lisp_Object buffer_list;
163 163
164 /* List of buffers that were viewed, then buried in this frame. The
165 most recently buried buffer is first. For last-buffer. */
166 Lisp_Object buried_buffer_list;
167
164 /* A dummy window used to display menu bars under X when no X 168 /* A dummy window used to display menu bars under X when no X
165 toolkit support is available. */ 169 toolkit support is available. */
166 Lisp_Object menu_bar_window; 170 Lisp_Object menu_bar_window;
@@ -981,7 +985,7 @@ extern Lisp_Object selected_frame;
981 985
982extern Lisp_Object Qauto_raise, Qauto_lower; 986extern Lisp_Object Qauto_raise, Qauto_lower;
983extern Lisp_Object Qborder_color, Qborder_width; 987extern Lisp_Object Qborder_color, Qborder_width;
984extern Lisp_Object Qbuffer_predicate, Qbuffer_list; 988extern Lisp_Object Qbuffer_predicate, Qbuffer_list, Qburied_buffer_list;
985extern Lisp_Object Qcursor_color, Qcursor_type; 989extern Lisp_Object Qcursor_color, Qcursor_type;
986extern Lisp_Object Qfont; 990extern Lisp_Object Qfont;
987extern Lisp_Object Qbackground_color, Qforeground_color; 991extern Lisp_Object Qbackground_color, Qforeground_color;