along with GNU Emacs; see the file COPYING. If not, write to
the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
-#include <stdio.h>
-
#include <config.h>
+
+#include <stdio.h>
#include "lisp.h"
#include "frame.h"
#include "termhooks.h"
(object)
Lisp_Object object;
{
- if (XTYPE (object) != Lisp_Frame)
+ if (!FRAMEP (object))
return Qnil;
switch (XFRAME (object)->output_method)
{
/* Choose the minibuffer window to use. */
if (NILP (mini_window))
{
- if (XTYPE (Vdefault_minibuffer_frame) != Lisp_Frame)
+ if (!FRAMEP (Vdefault_minibuffer_frame))
error ("default-minibuffer-frame must be set when creating minibufferless frames");
if (! FRAME_LIVE_P (XFRAME (Vdefault_minibuffer_frame)))
error ("default-minibuffer-frame must be a live frame");
{
Lisp_Object focus;
- if (XTYPE (XCONS (tail)->car) != Lisp_Frame)
+ if (!FRAMEP (XCONS (tail)->car))
abort ();
focus = FRAME_FOCUS_FRAME (XFRAME (XCONS (tail)->car));
- if (XTYPE (focus) == Lisp_Frame
- && XFRAME (focus) == selected_frame)
+ if (FRAMEP (focus) && XFRAME (focus) == selected_frame)
Fredirect_frame_focus (XCONS (tail)->car, frame);
}
}
/* Return the next frame in the frame list after FRAME.
If MINIBUF is nil, exclude minibuffer-only frames.
- If MINIBUF is a window, include only frames using that window for
- their minibuffer.
+ If MINIBUF is a window, include only its own frame
+ and any frame now using that window as the minibuffer.
If MINIBUF is `visible', include all visible frames.
+ If MINIBUF is 0, include all visible and iconified frames.
Otherwise, include all frames. */
Lisp_Object
if (FRAME_VISIBLE_P (XFRAME (f)))
return f;
}
+ else if (XFASTINT (minibuf) == 0)
+ {
+ FRAME_SAMPLE_VISIBILITY (XFRAME (f));
+ if (FRAME_VISIBLE_P (XFRAME (f))
+ || FRAME_ICONIFIED_P (XFRAME (f)))
+ return f;
+ }
else if (WINDOWP (minibuf))
{
- if (EQ (FRAME_MINIBUF_WINDOW (XFRAME (f)), minibuf))
+ if (EQ (FRAME_MINIBUF_WINDOW (XFRAME (f)), minibuf)
+ /* Check that F either is, or has forwarded its focus to,
+ MINIBUF's frame. */
+ && (EQ (WINDOW_FRAME (XWINDOW (minibuf)), f)
+ || EQ (WINDOW_FRAME (XWINDOW (minibuf)),
+ FRAME_FOCUS_FRAME (XFRAME (f)))))
return f;
}
else
/* Return the previous frame in the frame list before FRAME.
If MINIBUF is nil, exclude minibuffer-only frames.
- If MINIBUF is a window, include only frames using that window for
- their minibuffer.
+ If MINIBUF is a window, include only its own frame
+ and any frame now using that window as the minibuffer.
If MINIBUF is `visible', include all visible frames.
+ If MINIBUF is 0, include all visible and iconified frames.
Otherwise, include all frames. */
Lisp_Object
Lisp_Object f;
f = XCONS (tail)->car;
- if (XTYPE (f) != Lisp_Frame)
+ if (!FRAMEP (f))
abort ();
if (EQ (frame, f) && !NILP (prev))
if (! FRAME_MINIBUF_ONLY_P (XFRAME (f)))
prev = f;
}
- else if (XTYPE (minibuf) == Lisp_Window)
+ else if (WINDOWP (minibuf))
{
- if (EQ (FRAME_MINIBUF_WINDOW (XFRAME (f)), minibuf))
+ if (EQ (FRAME_MINIBUF_WINDOW (XFRAME (f)), minibuf)
+ /* Check that F either is, or has forwarded its focus to,
+ MINIBUF's frame. */
+ && (EQ (WINDOW_FRAME (XWINDOW (minibuf)), f)
+ || EQ (WINDOW_FRAME (XWINDOW (minibuf)),
+ FRAME_FOCUS_FRAME (XFRAME (f)))))
prev = f;
}
else if (EQ (minibuf, Qvisible))
if (FRAME_VISIBLE_P (XFRAME (f)))
prev = f;
}
+ else if (XFASTINT (minibuf) == 0)
+ {
+ FRAME_SAMPLE_VISIBILITY (XFRAME (f));
+ if (FRAME_VISIBLE_P (XFRAME (f))
+ || FRAME_ICONIFIED_P (XFRAME (f)))
+ prev = f;
+ }
else
prev = f;
}
By default, skip minibuffer-only frames.\n\
If omitted, FRAME defaults to the selected frame.\n\
If optional argument MINIFRAME is nil, exclude minibuffer-only frames.\n\
-If MINIFRAME is a window, include only frames using that window for their\n\
-minibuffer.\n\
+If MINIBUF is a window, include only its own frame\n\
+and any frame now using that window as the minibuffer.\n\
If MINIFRAME is `visible', include all visible frames.\n\
+If MINIBUF is 0, include all visible and iconified frames.\n\
Otherwise, include all frames.")
(frame, miniframe)
Lisp_Object frame, miniframe;
By default, skip minibuffer-only frames.\n\
If omitted, FRAME defaults to the selected frame.\n\
If optional argument MINIFRAME is nil, exclude minibuffer-only frames.\n\
-If MINIFRAME is a window, include only frames using that window for their\n\
-minibuffer.\n\
+If MINIBUF is a window, include only its own frame\n\
+and any frame now using that window as the minibuffer.\n\
If MINIFRAME is `visible', include all visible frames.\n\
+If MINIBUF is 0, include all visible and iconified frames.\n\
Otherwise, include all frames.")
(frame, miniframe)
Lisp_Object frame, miniframe;
minibuf_window = selected_frame->minibuffer_window;
}
+ /* Clear any X selections for this frame. */
+#ifdef HAVE_X_WINDOWS
+ if (FRAME_X_P (f))
+ x_clear_frame_selections (f);
+#endif
+
/* Mark all the windows that used to be on FRAME as deleted, and then
remove the reference to them. */
delete_all_subwindows (XWINDOW (f->root_window));
Vframe_list = Fdelq (frame, Vframe_list);
FRAME_SET_VISIBLE (f, 0);
+ if (FRAME_CURRENT_GLYPHS (f))
+ free_frame_glyphs (f, FRAME_CURRENT_GLYPHS (f));
+ if (FRAME_DESIRED_GLYPHS (f))
+ free_frame_glyphs (f, FRAME_DESIRED_GLYPHS (f));
+ if (FRAME_TEMP_GLYPHS (f))
+ free_frame_glyphs (f, FRAME_TEMP_GLYPHS (f));
+ if (FRAME_INSERT_COST (f))
+ free (FRAME_INSERT_COST (f));
+ if (FRAME_DELETEN_COST (f))
+ free (FRAME_DELETEN_COST (f));
+ if (FRAME_INSERTN_COST (f))
+ free (FRAME_INSERTN_COST (f));
+ if (FRAME_DELETE_COST (f))
+ free (FRAME_DELETE_COST (f));
+
/* Since some events are handled at the interrupt level, we may get
an event for f at any time; if we zero out the frame's display
now, then we may trip up the event-handling code. Instead, we'll
Lisp_Object this;
this = XCONS (frames)->car;
- if (XTYPE (this) != Lisp_Frame)
+ if (!FRAMEP (this))
abort ();
f = XFRAME (this);
}
#endif
+ /* Make menu bar update for the Buffers and Frams menus. */
+ windows_or_buffers_changed++;
+
return frame;
}
if (NILP (force) && !other_visible_frames (XFRAME (frame)))
error ("Attempt to make invisible the sole visible or iconified frame");
+#if 0 /* This isn't logically necessary, and it can do GC. */
/* Don't let the frame remain selected. */
if (XFRAME (frame) == selected_frame)
Fhandle_switch_frame (next_frame (frame, Qt), Qnil);
+#endif
/* Don't allow minibuf_window to remain on a deleted frame. */
if (EQ (XFRAME (frame)->minibuffer_window, minibuf_window))
x_make_frame_invisible (XFRAME (frame));
#endif
+ /* Make menu bar update for the Buffers and Frams menus. */
+ windows_or_buffers_changed++;
+
return Qnil;
}
CHECK_LIVE_FRAME (frame, 0);
+#if 0 /* This isn't logically necessary, and it can do GC. */
/* Don't let the frame remain selected. */
if (XFRAME (frame) == selected_frame)
Fhandle_switch_frame (next_frame (frame, Qt), Qnil);
+#endif
/* Don't allow minibuf_window to remain on a deleted frame. */
if (EQ (XFRAME (frame)->minibuffer_window, minibuf_window))
x_iconify_frame (XFRAME (frame));
#endif
+ /* Make menu bar update for the Buffers and Frams menus. */
+ windows_or_buffers_changed++;
+
return Qnil;
}
for (tail = Vframe_list; CONSP (tail); tail = XCONS (tail)->cdr)
{
frame = XCONS (tail)->car;
- if (XTYPE (frame) != Lisp_Frame)
+ if (!FRAMEP (frame))
continue;
f = XFRAME (frame);
if (FRAME_VISIBLE_P (f))
else
Fsetcdr (tem, val);
- if (EQ (prop, Qminibuffer)
- && XTYPE (val) == Lisp_Window)
+ if (EQ (prop, Qminibuffer) && WINDOWP (val))
{
if (! MINI_WINDOW_P (XWINDOW (val)))
error ("Surrogate minibuffer windows must be minibuffer windows.");
: FRAME_MINIBUF_ONLY_P (f) ? Qonly
: FRAME_MINIBUF_WINDOW (f)));
store_in_alist (&alist, Qunsplittable, (FRAME_NO_SPLIT_P (f) ? Qt : Qnil));
- store_in_alist (&alist, Qmenu_bar_lines, (FRAME_MENU_BAR_LINES (f)));
/* I think this should be done with a hook. */
#ifdef HAVE_X_WINDOWS
if (FRAME_X_P (f))
x_report_frame_params (f, &alist);
+ else
#endif
+ {
+ /* This ought to be correct in f->param_alist for an X frame. */
+ Lisp_Object lines;
+ XFASTINT (lines) = FRAME_MENU_BAR_LINES (f);
+ store_in_alist (&alist, Qmenu_bar_lines, lines);
+ }
return alist;
}
XFASTINT (tem) = 0;
return tem;
}
+
+DEFUN ("frame-first-window", Fframe_first_window, Sframe_first_window, 0, 1, 0,
+ 0)
+ (frame)
+ Lisp_Object frame;
+{
+ Lisp_Object w;
+
+ w = FRAME_ROOT_WINDOW (selected_frame);
+
+ while (NILP (XWINDOW (w)->buffer))
+ {
+ if (! NILP (XWINDOW (w)->hchild))
+ w = XWINDOW (w)->hchild;
+ else if (! NILP (XWINDOW (w)->vchild))
+ w = XWINDOW (w)->vchild;
+ else
+ abort ();
+ }
+ return w;
+}
+
DEFUN ("framep", Fframep, Sframep, 1, 1, 0,
/* Don't confuse make-docfile by having two doc strings for this function.
make-docfile does not pay attention to #if, for good reason! */
XFASTINT (Vterminal_frame) = 0;
defsubr (&Sselected_frame);
+ defsubr (&Sframe_first_window);
defsubr (&Sframep);
defsubr (&Sframe_char_height);
defsubr (&Sframe_char_width);