/* Generic frame functions.
- Copyright (C) 1993 Free Software Foundation.
+ Copyright (C) 1993, 1994 Free Software Foundation.
This file is part of GNU Emacs.
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"
+#include "window.h"
#ifdef MULTI_FRAME
#include "buffer.h"
-#include "window.h"
/* These help us bind and responding to switch-frame events. */
#include "commands.h"
(object)
Lisp_Object object;
{
- if (XTYPE (object) != Lisp_Frame)
+ if (!FRAMEP (object))
return Qnil;
switch (XFRAME (object)->output_method)
{
f->condemned_scroll_bars = Qnil;
f->face_alist = Qnil;
f->menu_bar_items = Qnil;
+ f->menu_bar_vector = Qnil;
+ f->menu_bar_items_used = 0;
root_window = make_window ();
if (mini_p)
f->width = 10;
f->height = 10;
- XFASTINT (XWINDOW (root_window)->width) = 10;
- XFASTINT (XWINDOW (root_window)->height) = (mini_p ? 9 : 10);
+ XSETFASTINT (XWINDOW (root_window)->width, 10);
+ XSETFASTINT (XWINDOW (root_window)->height, (mini_p ? 9 : 10));
if (mini_p)
{
- XFASTINT (XWINDOW (mini_window)->width) = 10;
- XFASTINT (XWINDOW (mini_window)->top) = 9;
- XFASTINT (XWINDOW (mini_window)->height) = 1;
+ XSETFASTINT (XWINDOW (mini_window)->width, 10);
+ XSETFASTINT (XWINDOW (mini_window)->top, 9);
+ XSETFASTINT (XWINDOW (mini_window)->height, 1);
}
/* Choose a buffer for the frame's root window. */
f->selected_window = root_window;
/* Make sure this window seems more recently used than
a newly-created, never-selected window. */
- XFASTINT (XWINDOW (f->selected_window)->use_time) = ++window_select_count;
+ XSETFASTINT (XWINDOW (f->selected_window)->use_time, ++window_select_count);
return f;
}
/* 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");
register Lisp_Object mini_window;
register Lisp_Object frame;
- XSET (frame, Lisp_Frame, f);
+ XSETFRAME (frame, f);
f->auto_raise = 0;
f->auto_lower = 0;
Vframe_list = Qnil;
f = make_frame (1);
- XSET (frame, Lisp_Frame, f);
+ XSETFRAME (frame, f);
Vframe_list = Fcons (frame, Vframe_list);
f->name = build_string ("terminal");
FRAME_SET_VISIBLE (f, 1);
f->display.nothing = 1; /* Nonzero means frame isn't deleted. */
- XSET (Vterminal_frame, Lisp_Frame, f);
+ XSETFRAME (Vterminal_frame, f);
return f;
}
\f
{
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);
}
}
()
{
Lisp_Object tem;
- XSET (tem, Lisp_Frame, selected_frame);
+ XSETFRAME (tem, selected_frame);
return tem;
}
-
+\f
DEFUN ("window-frame", Fwindow_frame, Swindow_frame, 1, 1, 0,
"Return the frame object that window WINDOW is on.")
(window)
Lisp_Object frame;
{
if (NILP (frame))
- XSET (frame, Lisp_Frame, selected_frame);
+ XSETFRAME (frame, selected_frame);
else
CHECK_LIVE_FRAME (frame, 0);
Lisp_Object frame;
{
if (NILP (frame))
- XSET (frame, Lisp_Frame, selected_frame);
+ XSETFRAME (frame, selected_frame);
else
CHECK_LIVE_FRAME (frame, 0);
return XFRAME (frame)->selected_window;
}
+DEFUN ("set-frame-selected-window", Fset_frame_selected_window,
+ Sset_frame_selected_window, 2, 2, 0,
+ "Set the selected window of frame object FRAME to WINDOW.\n\
+If FRAME is nil, the selected frame is used.\n\
+If FRAME is the selected frame, this makes WINDOW the selected window.")
+ (frame, window)
+ Lisp_Object frame, window;
+{
+ if (NILP (frame))
+ XSETFRAME (frame, selected_frame);
+ else
+ CHECK_LIVE_FRAME (frame, 0);
+
+ CHECK_LIVE_WINDOW (window, 1);
+
+ if (! EQ (frame, WINDOW_FRAME (XWINDOW (window))))
+ error ("In `set-frame-selected-window', WINDOW is not on FRAME");
+
+ if (XFRAME (frame) == selected_frame)
+ return Fselect_window (window);
+
+ return XFRAME (frame)->selected_window = window;
+}
+\f
DEFUN ("frame-list", Fframe_list, Sframe_list,
0, 0, 0,
"Return a list of all frames.")
/* 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;
Lisp_Object tail;
if (NILP (frame))
- XSET (frame, Lisp_Frame, selected_frame);
+ XSETFRAME (frame, selected_frame);
else
CHECK_LIVE_FRAME (frame, 0);
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;
Lisp_Object tail;
if (NILP (frame))
- XSET (frame, Lisp_Frame, selected_frame);
+ XSETFRAME (frame, selected_frame);
else
CHECK_LIVE_FRAME (frame, 0);
0 if all frames aside from F are invisible.
(Exception: if F is the terminal frame, and we are using X, return 1.) */
-static int
+int
other_visible_frames (f)
FRAME_PTR f;
{
if (EQ (frame, Qnil))
{
f = selected_frame;
- XSET (frame, Lisp_Frame, f);
+ XSETFRAME (frame, f);
}
else
{
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);
&lispy_dummy, &party_dummy,
&x, &y,
&long_dummy);
- col = XINT (x);
- row = XINT (y);
- glyph_to_pixel_coords (f, col, row, &col, &row);
- XSETINT (x, col);
- XSETINT (y, row);
- XSET (lispy_dummy, Lisp_Frame, f);
+ if (! NILP (x))
+ {
+ col = XINT (x);
+ row = XINT (y);
+ pixel_to_glyph_coords (f, col, row, &col, &row, 0, 1);
+ XSETINT (x, col);
+ XSETINT (y, row);
+ }
+ XSETFRAME (lispy_dummy, f);
+ return Fcons (lispy_dummy, Fcons (x, y));
+}
+
+DEFUN ("mouse-pixel-position", Fmouse_pixel_position,
+ Smouse_pixel_position, 0, 0, 0,
+ "Return a list (FRAME X . Y) giving the current mouse frame and position.\n\
+The position is given in pixel units, where (0, 0) is the\n\
+upper-left corner.\n\
+If Emacs is running on a mouseless terminal or hasn't been programmed\n\
+to read the mouse position, it returns the selected frame for FRAME\n\
+and nil for X and Y.")
+ ()
+{
+ FRAME_PTR f;
+ Lisp_Object lispy_dummy;
+ enum scroll_bar_part party_dummy;
+ Lisp_Object x, y;
+ int col, row;
+ unsigned long long_dummy;
+
+ f = selected_frame;
+ x = y = Qnil;
+
+ /* It's okay for the hook to refrain from storing anything. */
+ if (mouse_position_hook)
+ (*mouse_position_hook) (&f,
+ &lispy_dummy, &party_dummy,
+ &x, &y,
+ &long_dummy);
+ XSETFRAME (lispy_dummy, f);
return Fcons (lispy_dummy, Fcons (x, y));
}
DEFUN ("set-mouse-position", Fset_mouse_position, Sset_mouse_position, 3, 3, 0,
"Move the mouse pointer to the center of character cell (X,Y) in FRAME.\n\
-WARNING: If you use this under X, you should do `unfocus-frame' afterwards.")
+WARNING: If you use this under X windows,\n\
+you should call `unfocus-frame' afterwards.")
(frame, x, y)
Lisp_Object frame, x, y;
{
return Qnil;
}
+
+DEFUN ("set-mouse-pixel-position", Fset_mouse_pixel_position,
+ Sset_mouse_pixel_position, 3, 3, 0,
+ "Move the mouse pointer to pixel position (X,Y) in FRAME.\n\
+WARNING: If you use this under X windows,\n\
+you should call `unfocus-frame' afterwards.")
+ (frame, x, y)
+ Lisp_Object frame, x, y;
+{
+ CHECK_LIVE_FRAME (frame, 0);
+ CHECK_NUMBER (x, 2);
+ CHECK_NUMBER (y, 1);
+
+ /* I think this should be done with a hook. */
+#ifdef HAVE_X_WINDOWS
+ if (FRAME_X_P (XFRAME (frame)))
+ /* Warping the mouse will cause enternotify and focus events. */
+ x_set_mouse_pixel_position (XFRAME (frame), x, y);
+#endif
+
+ return Qnil;
+}
\f
DEFUN ("make-frame-visible", Fmake_frame_visible, Smake_frame_visible,
0, 1, "",
Lisp_Object frame;
{
if (NILP (frame))
- XSET (frame, Lisp_Frame, selected_frame);
+ XSETFRAME (frame, selected_frame);
CHECK_LIVE_FRAME (frame, 0);
}
#endif
+ /* Make menu bar update for the Buffers and Frams menus. */
+ windows_or_buffers_changed++;
+
return frame;
}
Lisp_Object frame, force;
{
if (NILP (frame))
- XSET (frame, Lisp_Frame, selected_frame);
+ XSETFRAME (frame, selected_frame);
CHECK_LIVE_FRAME (frame, 0);
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;
}
Lisp_Object frame;
{
if (NILP (frame))
- XSET (frame, Lisp_Frame, selected_frame);
+ XSETFRAME (frame, selected_frame);
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.");
Lisp_Object frame;
{
Lisp_Object alist;
- struct frame *f;
+ FRAME_PTR f;
if (EQ (frame, Qnil))
f = selected_frame;
f = XFRAME (frame);
}
- if (f->display.nothing == 0)
+ if (!FRAME_LIVE_P (f))
return Qnil;
alist = Fcopy_alist (f->param_alist);
store_in_alist (&alist, Qname, f->name);
- store_in_alist (&alist, Qheight, make_number (f->height));
- store_in_alist (&alist, Qwidth, make_number (f->width));
- store_in_alist (&alist, Qmodeline, (f->wants_modeline ? Qt : Qnil));
+ store_in_alist (&alist, Qheight, make_number (FRAME_HEIGHT (f)));
+ store_in_alist (&alist, Qwidth, make_number (FRAME_WIDTH (f)));
+ store_in_alist (&alist, Qmodeline, (FRAME_WANTS_MODELINE_P (f) ? Qt : Qnil));
store_in_alist (&alist, Qminibuffer,
(! FRAME_HAS_MINIBUF_P (f) ? Qnil
- : (FRAME_MINIBUF_ONLY_P (f) ? Qonly
- : FRAME_MINIBUF_WINDOW (f))));
- store_in_alist (&alist, Qunsplittable, (f->no_split ? Qt : Qnil));
- store_in_alist (&alist, Qmenu_bar_lines, (FRAME_MENU_BAR_LINES (f)));
+ : FRAME_MINIBUF_ONLY_P (f) ? Qonly
+ : FRAME_MINIBUF_WINDOW (f)));
+ store_in_alist (&alist, Qunsplittable, (FRAME_NO_SPLIT_P (f) ? Qt : Qnil));
/* 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;
+ XSETFASTINT (lines, FRAME_MENU_BAR_LINES (f));
+ store_in_alist (&alist, Qmenu_bar_lines, lines);
+ }
return alist;
}
/* I think this should be done with a hook. */
#ifdef HAVE_X_WINDOWS
if (FRAME_X_P (f))
- x_set_offset (f, XINT (xoffset), XINT (yoffset));
+ x_set_offset (f, XINT (xoffset), XINT (yoffset), 1);
#endif
return Qt;
defsubr (&Sselected_frame);
defsubr (&Swindow_frame);
defsubr (&Sframe_root_window);
+ defsubr (&Sframe_first_window);
defsubr (&Sframe_selected_window);
+ defsubr (&Sset_frame_selected_window);
defsubr (&Sframe_list);
defsubr (&Snext_frame);
defsubr (&Sprevious_frame);
defsubr (&Sdelete_frame);
defsubr (&Smouse_position);
+ defsubr (&Smouse_pixel_position);
defsubr (&Sset_mouse_position);
+ defsubr (&Sset_mouse_pixel_position);
#if 0
defsubr (&Sframe_configuration);
defsubr (&Srestore_frame_configuration);
keys_of_frame ()
{
initial_define_lispy_key (global_map, "switch-frame", "handle-switch-frame");
+ initial_define_lispy_key (global_map, "delete-frame", "handle-delete-frame");
}
\f
#else /* not MULTI_FRAME */
/* If we're not using multi-frame stuff, we still need to provide some
support functions. */
+Lisp_Object Qheight;
+Lisp_Object Qminibuffer;
+Lisp_Object Qmodeline;
+Lisp_Object Qname;
+Lisp_Object Qunsplittable;
+Lisp_Object Qmenu_bar_lines;
+Lisp_Object Qwidth;
+
Lisp_Object Vterminal_frame;
/* Unless this function is defined, providing set-frame-height and
()
{
Lisp_Object tem;
- XFASTINT (tem) = 0;
+ XSETFASTINT (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! */
return Qnil;
}
-
+\f
DEFUN ("frame-height", Fframe_height, Sframe_height, 0, 1, 0,
"Return number of lines available for display on FRAME.\n\
If FRAME is omitted, describe the currently selected frame.")
}
DEFUN ("mouse-position", Fmouse_position, Smouse_position, 0, 0, 0,
- "Return a list (FRAME X . Y) giving the current mouse frame and position.\n\
-The position is given in character cells, where (0, 0) is the\n\
-upper-left corner.\n\
-If Emacs is running on a mouseless terminal or hasn't been programmed\n\
-to read the mouse position, it returns the selected frame for FRAME\n\
-and nil for X and Y.")
+ /* Don't confuse make-docfile by having two doc strings for this function.
+ make-docfile does not pay attention to #if, for good reason! */
+ 0)
()
{
+ return Fcons (Qnil, Fcons (Qnil, Qnil));
+}
+\f
+void
+store_in_alist (alistptr, prop, val)
+ Lisp_Object *alistptr, val;
+ Lisp_Object prop;
+{
+ register Lisp_Object tem;
+
+ tem = Fassq (prop, *alistptr);
+ if (EQ (tem, Qnil))
+ *alistptr = Fcons (Fcons (prop, val), *alistptr);
+ else
+ Fsetcdr (tem, val);
+}
+
+DEFUN ("frame-parameters", Fframe_parameters, Sframe_parameters, 0, 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! */
+ 0)
+ (frame)
+ Lisp_Object frame;
+{
+ Lisp_Object alist;
FRAME_PTR f;
- Lisp_Object lispy_dummy;
- enum scroll_bar_part party_dummy;
- Lisp_Object x, y;
- int col, row;
- unsigned long long_dummy;
- f = selected_frame;
- x = y = Qnil;
+ if (EQ (frame, Qnil))
+ f = selected_frame;
+ else
+ {
+ CHECK_FRAME (frame, 0);
+ f = XFRAME (frame);
+ }
- /* It's okay for the hook to refrain from storing anything. */
- if (mouse_position_hook)
- (*mouse_position_hook) (&f,
- &lispy_dummy, &party_dummy,
- &x, &y,
- &long_dummy);
- col = XINT (x);
- row = XINT (y);
- glyph_to_pixel_coords (f, col, row, &col, &row);
- XSETINT (x, col);
- XSETINT (y, row);
- /* Always return nil for frame. */
- return Fcons (Qnil, Fcons (x, y));
+ if (!FRAME_LIVE_P (f))
+ return Qnil;
+
+ alist = Qnil;
+ store_in_alist (&alist, Qname, build_string ("emacs"));
+ store_in_alist (&alist, Qheight, make_number (FRAME_HEIGHT (f)));
+ store_in_alist (&alist, Qwidth, make_number (FRAME_WIDTH (f)));
+ store_in_alist (&alist, Qmodeline, (FRAME_WANTS_MODELINE_P (f) ? Qt : Qnil));
+ store_in_alist (&alist, Qminibuffer, 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)));
+
+ return alist;
+}
+
+DEFUN ("modify-frame-parameters", Fmodify_frame_parameters,
+ Smodify_frame_parameters, 2, 2, 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! */
+ 0)
+ (frame, alist)
+ Lisp_Object frame, alist;
+{
+ return Qnil;
+}
+
+DEFUN ("frame-live-p", Fframe_live_p, Sframe_live_p, 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! */
+ 0)
+ (frame)
+ Lisp_Object frame;
+{
+ return Qt;
}
syms_of_frame ()
{
+ Qheight = intern ("height");
+ staticpro (&Qheight);
+ Qminibuffer = intern ("minibuffer");
+ staticpro (&Qminibuffer);
+ Qmodeline = intern ("modeline");
+ staticpro (&Qmodeline);
+ Qname = intern ("name");
+ staticpro (&Qname);
+ Qunsplittable = intern ("unsplittable");
+ staticpro (&Qunsplittable);
+ Qmenu_bar_lines = intern ("menu-bar-lines");
+ staticpro (&Qmenu_bar_lines);
+ Qwidth = intern ("width");
+ staticpro (&Qwidth);
+
DEFVAR_LISP ("terminal-frame", &Vterminal_frame,
"The initial frame-object, which represents Emacs's stdout.");
- XFASTINT (Vterminal_frame) = 0;
+ XSETFASTINT (Vterminal_frame, 0);
defsubr (&Sselected_frame);
+ defsubr (&Sframe_first_window);
defsubr (&Sframep);
defsubr (&Sframe_char_height);
defsubr (&Sframe_char_width);
defsubr (&Sframe_width);
Ffset (intern ("screen-width"), intern ("frame-width"));
defsubr (&Smouse_position);
+ defsubr (&Sframe_parameters);
+ defsubr (&Smodify_frame_parameters);
+ defsubr (&Sframe_live_p);
}
keys_of_frame ()