diff options
| author | Karoly Lorentey | 2005-12-20 21:35:03 +0000 |
|---|---|---|
| committer | Karoly Lorentey | 2005-12-20 21:35:03 +0000 |
| commit | a18b8cb5070a81da0659275bef52f77f925644c8 (patch) | |
| tree | 4edd0aa560de4dc08c6e10e649909505b0e9f59f /src | |
| parent | e93b29568add51c918892153759a1fcd440e85be (diff) | |
| download | emacs-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.c | 1 | ||||
| -rw-r--r-- | src/buffer.c | 48 | ||||
| -rw-r--r-- | src/frame.c | 19 | ||||
| -rw-r--r-- | src/frame.h | 6 |
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; | |||
| 107 | Lisp_Object Qunsplittable; | 107 | Lisp_Object Qunsplittable; |
| 108 | Lisp_Object Qmenu_bar_lines, Qtool_bar_lines; | 108 | Lisp_Object Qmenu_bar_lines, Qtool_bar_lines; |
| 109 | Lisp_Object Qleft_fringe, Qright_fringe; | 109 | Lisp_Object Qleft_fringe, Qright_fringe; |
| 110 | Lisp_Object Qbuffer_predicate, Qbuffer_list; | 110 | Lisp_Object Qbuffer_predicate, Qbuffer_list, Qburied_buffer_list; |
| 111 | Lisp_Object Qtty_color_mode; | 111 | Lisp_Object Qtty_color_mode; |
| 112 | Lisp_Object Qtty, Qtty_type; | 112 | Lisp_Object Qtty, Qtty_type; |
| 113 | Lisp_Object Qwindow_system; | 113 | Lisp_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 | ||
| 2139 | void | 2140 | void |
| 2140 | frames_discard_buffer (buffer) | 2141 | frames_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 | ||
| 982 | extern Lisp_Object Qauto_raise, Qauto_lower; | 986 | extern Lisp_Object Qauto_raise, Qauto_lower; |
| 983 | extern Lisp_Object Qborder_color, Qborder_width; | 987 | extern Lisp_Object Qborder_color, Qborder_width; |
| 984 | extern Lisp_Object Qbuffer_predicate, Qbuffer_list; | 988 | extern Lisp_Object Qbuffer_predicate, Qbuffer_list, Qburied_buffer_list; |
| 985 | extern Lisp_Object Qcursor_color, Qcursor_type; | 989 | extern Lisp_Object Qcursor_color, Qcursor_type; |
| 986 | extern Lisp_Object Qfont; | 990 | extern Lisp_Object Qfont; |
| 987 | extern Lisp_Object Qbackground_color, Qforeground_color; | 991 | extern Lisp_Object Qbackground_color, Qforeground_color; |