changeset 7056:0a18af7eb587

Implement special frames for specified buffers. (Vspecial_display_buffer_names, Vspecial_display_regexps) (Vspecial_display_function): New variables. (syms_of_window): Set up Lisp variables. (Fdisplay_buffer): Handle them.
author Richard M. Stallman <rms@gnu.org>
date Sat, 23 Apr 1994 21:37:15 +0000
parents 5e4906d964b8
children 7102dd374da4
files src/window.c
diffstat 1 files changed, 48 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/src/window.c	Sat Apr 23 20:53:09 1994 +0000
+++ b/src/window.c	Sat Apr 23 21:37:15 1994 +0000
@@ -79,6 +79,15 @@
 /* Function to call to handle Fdisplay_buffer.  */
 Lisp_Object Vdisplay_buffer_function;
 
+/* List of buffer *names* for buffers that should have their own frames.  */
+Lisp_Object Vspecial_display_buffer_names;
+
+/* List of regexps for buffer names that should have their own frames.  */
+Lisp_Object Vspecial_display_regexps;
+
+/* Function to pop up a special frame.  */
+Lisp_Object Vspecial_display_function;
+
 /* Fdisplay_buffer always splits the largest window 
    if that window is more than this high.  */
 int split_height_threshold;
@@ -1699,7 +1708,7 @@
   (buffer, not_this_window)
      register Lisp_Object buffer, not_this_window;
 {
-  register Lisp_Object window;
+  register Lisp_Object window, tem;
 
   buffer = Fget_buffer (buffer);
   CHECK_BUFFER (buffer, 0);
@@ -1722,17 +1731,25 @@
       && (NILP (not_this_window) || !EQ (window, selected_window)))
     return window;
 
+  /* Certain buffer names get special handling.  */
+  if (! NILP (Vspecial_display_function))
+    {
+      tem = Fmember (XBUFFER (buffer)->name, Vspecial_display_buffer_names);
+      if (!NILP (tem))
+	return call1 (Vspecial_display_function, buffer);
+
+      for (tem = Vspecial_display_regexps; CONSP (tem); tem = XCONS (tem)->cdr)
+	if (fast_string_match (XCONS (tem)->car, XBUFFER (buffer)->name) >= 0)
+	  return call1 (Vspecial_display_function, buffer);
+    }
+
 #ifdef MULTI_FRAME
   /* If there are no frames open that have more than a minibuffer,
      we need to create a new frame.  */
   if (pop_up_frames || last_nonminibuf_frame == 0)
     {
-      window
-	= Fframe_selected_window (call0 (Vpop_up_frame_function));
+      window = Fframe_selected_window (call0 (Vpop_up_frame_function));
       Fset_window_buffer (window, buffer);
-#if 0
-      Fhandle_switch_frame (XWINDOW (window)->frame, Qnil);
-#endif
       return window;
     }
 #endif /* MULTI_FRAME */
@@ -3022,13 +3039,37 @@
   pop_up_frames = 0;
 
   DEFVAR_LISP ("pop-up-frame-function", &Vpop_up_frame_function,
-    "*If non-nil, function to call to handle automatic new frame creation.\n\
+    "Function to call to handle automatic new frame creation.\n\
 It is called with no arguments and should return a newly created frame.\n\
 \n\
 A typical value might be `(lambda () (new-frame pop-up-frame-alist))'\n\
 where `pop-up-frame-alist' would hold the default frame parameters.");
   Vpop_up_frame_function = Qnil;
 
+  DEFVAR_LISP ("special-display-buffer-names", &Vspecial_display_buffer_names,
+    "*List of buffer names that should have their own special frames.\n\
+Displaying a buffer whose name is in this list makes a special frame for it\n\
+using `special-display-function'.  See also `special-display-regexps'.");
+  Vspecial_display_buffer_names = Qnil;
+
+  DEFVAR_LISP ("special-display-regexps", &Vspecial_display_regexps,
+    "*List of regexps saying which buffers should have their own special frames.\n\
+If a buffer name matches one of these regexps, it gets its own frame.\n\
+Displaying a buffer whose name is in this list makes a special frame for it\n\
+using `special-display-function'.  See also `special-display-buffer-names'.");
+  Vspecial_display_regexps = Qnil;
+
+  DEFVAR_LISP ("special-display-function", &Vspecial_display_function,
+    "Function to call to make a new frame for a special buffer.\n\
+It is called with one argument, the buffer,\n\
+and should return a window displaying that buffer.\n\
+The default value makes a separate frame for the buffer,\n\
+using `special-display-alist' to specify the frame parameters.\n\
+\n\
+A buffer is special if its is listed in `special-display-buffer-names'\n\
+or matches a regexp in `special-display-regexps'.");
+  Vspecial_display_function = Qnil;
+
   DEFVAR_BOOL ("pop-up-windows", &pop_up_windows,
     "*Non-nil means display-buffer should make new windows.");
   pop_up_windows = 1;