1 /* Generic frame functions.
2 Copyright (C) 1993 Free Software Foundation.
4 This file is part of GNU Emacs.
6 GNU Emacs is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
11 GNU Emacs is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GNU Emacs; see the file COPYING. If not, write to
18 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
30 #include "termhooks.h"
32 /* These help us bind and responding to switch-frame events. */
36 Lisp_Object Vemacs_iconified
;
37 Lisp_Object Vframe_list
;
38 Lisp_Object Vterminal_frame
;
39 Lisp_Object Vdefault_minibuffer_frame
;
40 Lisp_Object Vdefault_frame_alist
;
42 /* Evaluate this expression to rebuild the section of syms_of_frame
43 that initializes and staticpros the symbols declared below. Note
44 that Emacs 18 has a bug that keeps C-x C-e from being able to
45 evaluate this expression.
48 ;; Accumulate a list of the symbols we want to initialize from the
49 ;; declarations at the top of the file.
50 (goto-char (point-min))
51 (search-forward "/\*&&& symbols declared here &&&*\/\n")
53 (while (looking-at "Lisp_Object \\(Q[a-z_]+\\)")
55 (cons (buffer-substring (match-beginning 1) (match-end 1))
58 (setq symbol-list (nreverse symbol-list))
59 ;; Delete the section of syms_of_... where we initialize the symbols.
60 (search-forward "\n /\*&&& init symbols here &&&*\/\n")
61 (let ((start (point)))
62 (while (looking-at "^ Q")
64 (kill-region start (point)))
65 ;; Write a new symbol initialization section.
67 (insert (format " %s = intern (\"" (car symbol-list)))
68 (let ((start (point)))
69 (insert (substring (car symbol-list) 1))
70 (subst-char-in-region start (point) ?_ ?-))
71 (insert (format "\");\n staticpro (&%s);\n" (car symbol-list)))
72 (setq symbol-list (cdr symbol-list)))))
75 /*&&& symbols declared here &&&*/
77 Lisp_Object Qframe_live_p
;
80 Lisp_Object Qminibuffer
;
81 Lisp_Object Qmodeline
;
84 Lisp_Object Qunsplittable
;
85 Lisp_Object Qmenu_bar_lines
;
89 extern Lisp_Object Vminibuffer_list
;
90 extern Lisp_Object
get_minibuffer ();
92 DEFUN ("framep", Fframep
, Sframep
, 1, 1, 0,
93 "Return non-nil if OBJECT is a frame.\n\
94 Value is t for a termcap frame (a character-only terminal),\n\
95 `x' for an Emacs frame that is really an X window.\n\
96 Also see `live-frame-p'.")
100 if (XTYPE (object
) != Lisp_Frame
)
102 switch (XFRAME (object
)->output_method
)
106 case output_x_window
:
113 DEFUN ("frame-live-p", Fframe_live_p
, Sframe_live_p
, 1, 1, 0,
114 "Return non-nil if OBJECT is a frame which has not been deleted.\n\
115 Value is nil if OBJECT is not a live frame. If object is a live\n\
116 frame, the return value indicates what sort of output device it is\n\
117 displayed on. Value is t for a termcap frame (a character-only\n\
118 terminal), `x' for an Emacs frame being displayed in an X window.")
122 return ((FRAMEP (object
)
123 && FRAME_LIVE_P (XFRAME (object
)))
133 register struct frame
*f
;
134 register Lisp_Object root_window
;
135 register Lisp_Object mini_window
;
137 frame
= Fmake_vector (((sizeof (struct frame
) - (sizeof (Lisp_Vector
)
138 - sizeof (Lisp_Object
)))
139 / sizeof (Lisp_Object
)),
141 XSETTYPE (frame
, Lisp_Frame
);
146 f
->current_glyphs
= 0;
147 f
->desired_glyphs
= 0;
149 f
->async_visible
= 0;
150 f
->display
.nothing
= 0;
152 f
->async_iconified
= 0;
153 f
->wants_modeline
= 1;
158 f
->has_minibuffer
= mini_p
;
159 f
->focus_frame
= Qnil
;
160 f
->explicit_name
= 0;
161 f
->can_have_scroll_bars
= 0;
162 f
->has_vertical_scroll_bars
= 0;
163 f
->param_alist
= Qnil
;
164 f
->scroll_bars
= Qnil
;
165 f
->condemned_scroll_bars
= Qnil
;
166 f
->face_alist
= Qnil
;
168 root_window
= make_window ();
171 mini_window
= make_window ();
172 XWINDOW (root_window
)->next
= mini_window
;
173 XWINDOW (mini_window
)->prev
= root_window
;
174 XWINDOW (mini_window
)->mini_p
= Qt
;
175 XWINDOW (mini_window
)->frame
= frame
;
176 f
->minibuffer_window
= mini_window
;
181 XWINDOW (root_window
)->next
= Qnil
;
182 f
->minibuffer_window
= Qnil
;
185 XWINDOW (root_window
)->frame
= frame
;
188 just so that there is "something there."
189 Correct size will be set up later with change_frame_size. */
194 XFASTINT (XWINDOW (root_window
)->width
) = 10;
195 XFASTINT (XWINDOW (root_window
)->height
) = (mini_p
? 9 : 10);
199 XFASTINT (XWINDOW (mini_window
)->width
) = 10;
200 XFASTINT (XWINDOW (mini_window
)->top
) = 9;
201 XFASTINT (XWINDOW (mini_window
)->height
) = 1;
204 /* Choose a buffer for the frame's root window. */
208 XWINDOW (root_window
)->buffer
= Qt
;
209 buf
= Fcurrent_buffer ();
210 /* If buf is a 'hidden' buffer (i.e. one whose name starts with
211 a space), try to find another one. */
212 if (XSTRING (Fbuffer_name (buf
))->data
[0] == ' ')
213 buf
= Fother_buffer (buf
, Qnil
);
214 Fset_window_buffer (root_window
, buf
);
219 XWINDOW (mini_window
)->buffer
= Qt
;
220 Fset_window_buffer (mini_window
,
221 (NILP (Vminibuffer_list
)
223 : Fcar (Vminibuffer_list
)));
226 f
->root_window
= root_window
;
227 f
->selected_window
= root_window
;
228 /* Make sure this window seems more recently used than
229 a newly-created, never-selected window. */
230 XFASTINT (XWINDOW (f
->selected_window
)->use_time
) = ++window_select_count
;
232 Vframe_list
= Fcons (frame
, Vframe_list
);
237 /* Make a frame using a separate minibuffer window on another frame.
238 MINI_WINDOW is the minibuffer window to use. nil means use the
239 default (the global minibuffer). */
242 make_frame_without_minibuffer (mini_window
)
243 register Lisp_Object mini_window
;
245 register struct frame
*f
;
247 /* Choose the minibuffer window to use. */
248 if (NILP (mini_window
))
250 if (XTYPE (Vdefault_minibuffer_frame
) != Lisp_Frame
)
251 error ("default-minibuffer-frame must be set when creating minibufferless frames");
252 if (! FRAME_LIVE_P (XFRAME (Vdefault_minibuffer_frame
)))
253 error ("default-minibuffer-frame must be a live frame");
254 mini_window
= XFRAME (Vdefault_minibuffer_frame
)->minibuffer_window
;
258 CHECK_LIVE_WINDOW (mini_window
, 0);
261 /* Make a frame containing just a root window. */
264 /* Install the chosen minibuffer window, with proper buffer. */
265 f
->minibuffer_window
= mini_window
;
266 Fset_window_buffer (mini_window
,
267 (NILP (Vminibuffer_list
)
269 : Fcar (Vminibuffer_list
)));
273 /* Make a frame containing only a minibuffer window. */
276 make_minibuffer_frame ()
278 /* First make a frame containing just a root window, no minibuffer. */
280 register struct frame
*f
= make_frame (0);
281 register Lisp_Object mini_window
;
282 register Lisp_Object frame
;
284 XSET (frame
, Lisp_Frame
, f
);
289 f
->wants_modeline
= 0;
290 f
->has_minibuffer
= 1;
292 /* Now label the root window as also being the minibuffer.
293 Avoid infinite looping on the window chain by marking next pointer
296 mini_window
= f
->minibuffer_window
= f
->root_window
;
297 XWINDOW (mini_window
)->mini_p
= Qt
;
298 XWINDOW (mini_window
)->next
= Qnil
;
299 XWINDOW (mini_window
)->prev
= Qnil
;
300 XWINDOW (mini_window
)->frame
= frame
;
302 /* Put the proper buffer in that window. */
304 Fset_window_buffer (mini_window
,
305 (NILP (Vminibuffer_list
)
307 : Fcar (Vminibuffer_list
)));
311 /* Construct a frame that refers to the terminal (stdin and stdout). */
314 make_terminal_frame ()
316 register struct frame
*f
;
320 f
->name
= build_string ("terminal");
321 FRAME_SET_VISIBLE (f
, 1);
322 f
->display
.nothing
= 1; /* Nonzero means frame isn't deleted. */
323 XSET (Vterminal_frame
, Lisp_Frame
, f
);
327 DEFUN ("select-frame", Fselect_frame
, Sselect_frame
, 1, 2, "e",
328 "Select the frame FRAME.\n\
329 Subsequent editing commands apply to its selected window.\n\
330 The selection of FRAME lasts until the next time the user does\n\
331 something to select a different frame, or until the next time this\n\
332 function is called.")
334 Lisp_Object frame
, no_enter
;
336 return Fhandle_switch_frame (frame
, no_enter
);
340 DEFUN ("handle-switch-frame", Fhandle_switch_frame
, Shandle_switch_frame
, 1, 2, "e",
341 "Handle a switch-frame event EVENT.\n\
342 Switch-frame events is usually bound to this function.\n\
343 A switch-frame event tells Emacs that the window manager has requested\n\
344 that the user's events be directed to the frame mentioned in the event.\n\
345 This function selects the selected window of the frame of EVENT.\n\
347 If EVENT is frame object, handle it as if it were a switch-frame event\n\
350 Lisp_Object frame
, no_enter
;
352 /* If FRAME is a switch-frame event, extract the frame we should
355 && EQ (XCONS (frame
)->car
, Qswitch_frame
)
356 && CONSP (XCONS (frame
)->cdr
))
357 frame
= XCONS (XCONS (frame
)->cdr
)->car
;
359 CHECK_LIVE_FRAME (frame
, 0);
361 if (selected_frame
== XFRAME (frame
))
364 /* If a frame's focus has been redirected toward the currently
365 selected frame, we should change the redirection to point to the
366 newly selected frame. This means that if the focus is redirected
367 from a minibufferless frame to a surrogate minibuffer frame, we
368 can use `other-window' to switch between all the frames using
369 that minibuffer frame, and the focus redirection will follow us
374 for (tail
= Vframe_list
; CONSP (tail
); tail
= XCONS (tail
)->cdr
)
378 if (XTYPE (XCONS (tail
)->car
) != Lisp_Frame
)
381 focus
= FRAME_FOCUS_FRAME (XFRAME (XCONS (tail
)->car
));
383 if (XTYPE (focus
) == Lisp_Frame
384 && XFRAME (focus
) == selected_frame
)
385 Fredirect_frame_focus (XCONS (tail
)->car
, frame
);
389 selected_frame
= XFRAME (frame
);
390 if (! FRAME_MINIBUF_ONLY_P (selected_frame
))
391 last_nonminibuf_frame
= selected_frame
;
393 Fselect_window (XFRAME (frame
)->selected_window
);
394 choose_minibuf_frame ();
396 /* We want to make sure that the next event generates a frame-switch
397 event to the appropriate frame. This seems kludgy to me, but
398 before you take it out, make sure that evaluating something like
399 (select-window (frame-root-window (new-frame))) doesn't end up
400 with your typing being interpreted in the new frame instead of
401 the one you're actually typing in. */
402 internal_last_event_frame
= Qnil
;
407 DEFUN ("selected-frame", Fselected_frame
, Sselected_frame
, 0, 0, 0,
408 "Return the frame that is now selected.")
412 XSET (tem
, Lisp_Frame
, selected_frame
);
416 DEFUN ("window-frame", Fwindow_frame
, Swindow_frame
, 1, 1, 0,
417 "Return the frame object that window WINDOW is on.")
421 CHECK_LIVE_WINDOW (window
, 0);
422 return XWINDOW (window
)->frame
;
425 DEFUN ("frame-root-window", Fframe_root_window
, Sframe_root_window
, 0, 1, 0,
426 "Returns the root-window of FRAME.\n\
427 If omitted, FRAME defaults to the currently selected frame.")
432 XSET (frame
, Lisp_Frame
, selected_frame
);
434 CHECK_LIVE_FRAME (frame
, 0);
436 return XFRAME (frame
)->root_window
;
439 DEFUN ("frame-selected-window", Fframe_selected_window
,
440 Sframe_selected_window
, 0, 1, 0,
441 "Return the selected window of frame object FRAME.\n\
442 If omitted, FRAME defaults to the currently selected frame.")
447 XSET (frame
, Lisp_Frame
, selected_frame
);
449 CHECK_LIVE_FRAME (frame
, 0);
451 return XFRAME (frame
)->selected_window
;
454 DEFUN ("frame-list", Fframe_list
, Sframe_list
,
456 "Return a list of all frames.")
459 return Fcopy_sequence (Vframe_list
);
462 /* Return the next frame in the frame list after FRAME.
463 If MINIBUF is nil, exclude minibuffer-only frames.
464 If MINIBUF is a window, include only frames using that window for
466 If MINIBUF is non-nil, and not a window, include all frames. */
468 next_frame (frame
, minibuf
)
475 /* There must always be at least one frame in Vframe_list. */
476 if (! CONSP (Vframe_list
))
479 /* If this frame is dead, it won't be in Vframe_list, and we'll loop
480 forever. Forestall that. */
481 CHECK_LIVE_FRAME (frame
, 0);
484 for (tail
= Vframe_list
; CONSP (tail
); tail
= XCONS (tail
)->cdr
)
486 Lisp_Object f
= XCONS (tail
)->car
;
490 /* Decide whether this frame is eligible to be returned. */
492 /* If we've looped all the way around without finding any
493 eligible frames, return the original frame. */
497 /* Let minibuf decide if this frame is acceptable. */
500 if (! FRAME_MINIBUF_ONLY_P (XFRAME (f
)))
503 else if (XTYPE (minibuf
) == Lisp_Window
)
505 if (EQ (FRAME_MINIBUF_WINDOW (XFRAME (f
)), minibuf
))
517 /* Return the previous frame in the frame list before FRAME.
518 If MINIBUF is nil, exclude minibuffer-only frames.
519 If MINIBUF is a window, include only frames using that window for
521 If MINIBUF is non-nil and not a window, include all frames. */
523 prev_frame (frame
, minibuf
)
530 /* There must always be at least one frame in Vframe_list. */
531 if (! CONSP (Vframe_list
))
535 for (tail
= Vframe_list
; CONSP (tail
); tail
= XCONS (tail
)->cdr
)
537 Lisp_Object f
= XCONS (tail
)->car
;
539 if (XTYPE (f
) != Lisp_Frame
)
542 if (EQ (frame
, f
) && !NILP (prev
))
545 /* Decide whether this frame is eligible to be returned,
546 according to minibuf. */
549 if (! FRAME_MINIBUF_ONLY_P (XFRAME (f
)))
552 else if (XTYPE (minibuf
) == Lisp_Window
)
554 if (EQ (FRAME_MINIBUF_WINDOW (XFRAME (f
)), minibuf
))
561 /* We've scanned the entire list. */
563 /* We went through the whole frame list without finding a single
564 acceptable frame. Return the original frame. */
567 /* There were no acceptable frames in the list before FRAME; otherwise,
568 we would have returned directly from the loop. Since PREV is the last
569 acceptable frame in the list, return it. */
573 DEFUN ("next-frame", Fnext_frame
, Snext_frame
, 0, 2, 0,
574 "Return the next frame in the frame list after FRAME.\n\
575 By default, skip minibuffer-only frames.\n\
576 If omitted, FRAME defaults to the selected frame.\n\
577 If optional argument MINIFRAME is non-nil, include minibuffer-only frames.\n\
578 If MINIFRAME is a window, include only frames using that window for their\n\
580 If MINIFRAME is non-nil and not a window, include all frames.")
582 Lisp_Object frame
, miniframe
;
587 XSET (frame
, Lisp_Frame
, selected_frame
);
589 CHECK_LIVE_FRAME (frame
, 0);
591 return next_frame (frame
, miniframe
);
595 DEFUN ("delete-frame", Fdelete_frame
, Sdelete_frame
, 0, 1, "",
596 "Delete FRAME, permanently eliminating it from use.\n\
597 If omitted, FRAME defaults to the selected frame.\n\
598 A frame may not be deleted if its minibuffer is used by other frames.")
604 if (EQ (frame
, Qnil
))
607 XSET (frame
, Lisp_Frame
, f
);
611 CHECK_FRAME (frame
, 0);
615 if (! FRAME_LIVE_P (f
))
618 /* Are there any other frames besides this one? */
619 if (f
== selected_frame
&& EQ (next_frame (frame
, Qt
), frame
))
620 error ("Attempt to delete the only frame");
622 /* Does this frame have a minibuffer, and is it the surrogate
623 minibuffer for any other frame? */
624 if (FRAME_HAS_MINIBUF_P (XFRAME (frame
)))
628 for (frames
= Vframe_list
;
630 frames
= XCONS (frames
)->cdr
)
632 Lisp_Object
this = XCONS (frames
)->car
;
634 if (! EQ (this, frame
)
638 (FRAME_MINIBUF_WINDOW
640 error ("Attempt to delete a surrogate minibuffer frame");
644 /* Don't let the frame remain selected. */
645 if (f
== selected_frame
)
646 Fhandle_switch_frame (next_frame (frame
, Qt
), Qnil
);
648 /* Don't allow minibuf_window to remain on a deleted frame. */
649 if (EQ (f
->minibuffer_window
, minibuf_window
))
651 Fset_window_buffer (selected_frame
->minibuffer_window
,
652 XWINDOW (minibuf_window
)->buffer
);
653 minibuf_window
= selected_frame
->minibuffer_window
;
656 /* Mark all the windows that used to be on FRAME as deleted, and then
657 remove the reference to them. */
658 delete_all_subwindows (XWINDOW (f
->root_window
));
659 f
->root_window
= Qnil
;
661 Vframe_list
= Fdelq (frame
, Vframe_list
);
662 FRAME_SET_VISIBLE (f
, 0);
664 /* Since some events are handled at the interrupt level, we may get
665 an event for f at any time; if we zero out the frame's display
666 now, then we may trip up the event-handling code. Instead, we'll
667 promise that the display of the frame must be valid until we have
668 called the window-system-dependent frame destruction routine. */
670 /* I think this should be done with a hook. */
671 #ifdef HAVE_X_WINDOWS
673 x_destroy_window (f
);
676 f
->display
.nothing
= 0;
678 /* If we've deleted the last_nonminibuf_frame, then try to find
680 if (f
== last_nonminibuf_frame
)
684 last_nonminibuf_frame
= 0;
686 for (frames
= Vframe_list
;
688 frames
= XCONS (frames
)->cdr
)
690 f
= XFRAME (XCONS (frames
)->car
);
691 if (!FRAME_MINIBUF_ONLY_P (f
))
693 last_nonminibuf_frame
= f
;
699 /* If we've deleted Vdefault_minibuffer_frame, try to find another
700 one. Prefer minibuffer-only frames, but also notice frames
701 with other windows. */
702 if (EQ (frame
, Vdefault_minibuffer_frame
))
706 /* The last frame we saw with a minibuffer, minibuffer-only or not. */
707 Lisp_Object frame_with_minibuf
= Qnil
;
709 for (frames
= Vframe_list
;
711 frames
= XCONS (frames
)->cdr
)
713 Lisp_Object
this = XCONS (frames
)->car
;
715 if (XTYPE (this) != Lisp_Frame
)
719 if (FRAME_HAS_MINIBUF_P (f
))
721 frame_with_minibuf
= this;
722 if (FRAME_MINIBUF_ONLY_P (f
))
727 /* We know that there must be some frame with a minibuffer out
728 there. If this were not true, all of the frames present
729 would have to be minibufferless, which implies that at some
730 point their minibuffer frames must have been deleted, but
731 that is prohibited at the top; you can't delete surrogate
732 minibuffer frames. */
733 if (NILP (frame_with_minibuf
))
736 Vdefault_minibuffer_frame
= frame_with_minibuf
;
742 /* Return mouse position in character cell units. */
744 DEFUN ("mouse-position", Fmouse_position
, Smouse_position
, 0, 0, 0,
745 "Return a list (FRAME X . Y) giving the current mouse frame and position.\n\
746 The position is given in character cells, where (0, 0) is the\n\
747 upper-left corner.\n\
748 If Emacs is running on a mouseless terminal or hasn't been programmed\n\
749 to read the mouse position, it returns the selected frame for FRAME\n\
750 and nil for X and Y.")
754 Lisp_Object lispy_dummy
;
755 enum scroll_bar_part party_dummy
;
757 unsigned long long_dummy
;
762 /* It's okay for the hook to refrain from storing anything. */
763 if (mouse_position_hook
)
764 (*mouse_position_hook
) (&f
,
765 &lispy_dummy
, &party_dummy
,
769 XSET (lispy_dummy
, Lisp_Frame
, f
);
770 return Fcons (lispy_dummy
, Fcons (x
, y
));
773 DEFUN ("set-mouse-position", Fset_mouse_position
, Sset_mouse_position
, 3, 3, 0,
774 "Move the mouse pointer to the center of character cell (X,Y) in FRAME.\n\
775 WARNING: If you use this under X, you should do `unfocus-frame' afterwards.")
777 Lisp_Object frame
, x
, y
;
779 CHECK_LIVE_FRAME (frame
, 0);
783 /* I think this should be done with a hook. */
784 #ifdef HAVE_X_WINDOWS
785 if (FRAME_X_P (XFRAME (frame
)))
786 /* Warping the mouse will cause enternotify and focus events. */
787 x_set_mouse_position (XFRAME (frame
), x
, y
);
793 DEFUN ("make-frame-visible", Fmake_frame_visible
, Smake_frame_visible
,
795 "Make the frame FRAME visible (assuming it is an X-window).\n\
796 Also raises the frame so that nothing obscures it.\n\
797 If omitted, FRAME defaults to the currently selected frame.")
802 XSET (frame
, Lisp_Frame
, selected_frame
);
804 CHECK_LIVE_FRAME (frame
, 0);
806 /* I think this should be done with a hook. */
807 #ifdef HAVE_X_WINDOWS
808 if (FRAME_X_P (XFRAME (frame
)))
809 x_make_frame_visible (XFRAME (frame
));
815 DEFUN ("make-frame-invisible", Fmake_frame_invisible
, Smake_frame_invisible
,
817 "Make the frame FRAME invisible (assuming it is an X-window).\n\
818 If omitted, FRAME defaults to the currently selected frame.")
823 XSET (frame
, Lisp_Frame
, selected_frame
);
825 CHECK_LIVE_FRAME (frame
, 0);
827 /* Don't let the frame remain selected. */
828 if (XFRAME (frame
) == selected_frame
)
829 Fhandle_switch_frame (next_frame (frame
, Qt
), Qnil
);
831 /* Don't allow minibuf_window to remain on a deleted frame. */
832 if (EQ (XFRAME (frame
)->minibuffer_window
, minibuf_window
))
834 Fset_window_buffer (selected_frame
->minibuffer_window
,
835 XWINDOW (minibuf_window
)->buffer
);
836 minibuf_window
= selected_frame
->minibuffer_window
;
839 /* I think this should be done with a hook. */
840 #ifdef HAVE_X_WINDOWS
841 if (FRAME_X_P (XFRAME (frame
)))
842 x_make_frame_invisible (XFRAME (frame
));
848 DEFUN ("iconify-frame", Ficonify_frame
, Siconify_frame
,
850 "Make the frame FRAME into an icon.\n\
851 If omitted, FRAME defaults to the currently selected frame.")
856 XSET (frame
, Lisp_Frame
, selected_frame
);
858 CHECK_LIVE_FRAME (frame
, 0);
860 /* Don't let the frame remain selected. */
861 if (XFRAME (frame
) == selected_frame
)
862 Fhandle_switch_frame (next_frame (frame
, Qt
), Qnil
);
864 /* Don't allow minibuf_window to remain on a deleted frame. */
865 if (EQ (XFRAME (frame
)->minibuffer_window
, minibuf_window
))
867 Fset_window_buffer (selected_frame
->minibuffer_window
,
868 XWINDOW (minibuf_window
)->buffer
);
869 minibuf_window
= selected_frame
->minibuffer_window
;
872 /* I think this should be done with a hook. */
873 #ifdef HAVE_X_WINDOWS
874 if (FRAME_X_P (XFRAME (frame
)))
875 x_iconify_frame (XFRAME (frame
));
881 DEFUN ("frame-visible-p", Fframe_visible_p
, Sframe_visible_p
,
883 "Return t if FRAME is now \"visible\" (actually in use for display).\n\
884 A frame that is not \"visible\" is not updated and, if it works through\n\
885 a window system, it may not show at all.\n\
886 Return the symbol `icon' if frame is visible only as an icon.")
890 CHECK_LIVE_FRAME (frame
, 0);
892 if (FRAME_VISIBLE_P (XFRAME (frame
)))
894 if (FRAME_ICONIFIED_P (XFRAME (frame
)))
899 DEFUN ("visible-frame-list", Fvisible_frame_list
, Svisible_frame_list
,
901 "Return a list of all frames now \"visible\" (being updated).")
904 Lisp_Object tail
, frame
;
909 for (tail
= Vframe_list
; CONSP (tail
); tail
= XCONS (tail
)->cdr
)
911 frame
= XCONS (tail
)->car
;
912 if (XTYPE (frame
) != Lisp_Frame
)
915 if (FRAME_VISIBLE_P (f
))
916 value
= Fcons (frame
, value
);
922 DEFUN ("raise-frame", Fraise_frame
, Sraise_frame
, 1, 1, 0,
923 "Bring FRAME to the front, so it occludes any frames it overlaps.\n\
924 If FRAME is invisible, make it visible.\n\
925 If Emacs is displaying on an ordinary terminal or some other device which\n\
926 doesn't support multiple overlapping frames, this function does nothing.")
930 CHECK_LIVE_FRAME (frame
, 0);
932 if (frame_raise_lower_hook
)
933 (*frame_raise_lower_hook
) (XFRAME (frame
), 1);
938 /* Should we have a corresponding function called Flower_Power? */
939 DEFUN ("lower-frame", Flower_frame
, Slower_frame
, 1, 1, 0,
940 "Send FRAME to the back, so it is occluded by any frames that overlap it.\n\
941 If Emacs is displaying on an ordinary terminal or some other device which\n\
942 doesn't support multiple overlapping frames, this function does nothing.")
946 CHECK_LIVE_FRAME (frame
, 0);
948 if (frame_raise_lower_hook
)
949 (*frame_raise_lower_hook
) (XFRAME (frame
), 0);
955 DEFUN ("redirect-frame-focus", Fredirect_frame_focus
, Sredirect_frame_focus
,
957 "Arrange for keystrokes typed at FRAME to be sent to FOCUS-FRAME.\n\
958 In other words, switch-frame events caused by events in FRAME will\n\
959 request a switch to FOCUS-FRAME, and `last-event-frame' will be\n\
960 FOCUS-FRAME after reading an event typed at FRAME.\n\
962 If FOCUS-FRAME is omitted or nil, any existing redirection is\n\
963 cancelled, and the frame again receives its own keystrokes.\n\
965 Focus redirection is useful for temporarily redirecting keystrokes to\n\
966 a surrogate minibuffer frame when a frame doesn't have its own\n\
967 minibuffer window.\n\
969 A frame's focus redirection can be changed by select-frame. If frame\n\
970 FOO is selected, and then a different frame BAR is selected, any\n\
971 frames redirecting their focus to FOO are shifted to redirect their\n\
972 focus to BAR. This allows focus redirection to work properly when the\n\
973 user switches from one frame to another using `select-window'.\n\
975 This means that a frame whose focus is redirected to itself is treated\n\
976 differently from a frame whose focus is redirected to nil; the former\n\
977 is affected by select-frame, while the latter is not.\n\
979 The redirection lasts until `redirect-frame-focus' is called to change it.")
981 Lisp_Object frame
, focus_frame
;
983 CHECK_LIVE_FRAME (frame
, 0);
985 if (! NILP (focus_frame
))
986 CHECK_LIVE_FRAME (focus_frame
, 1);
988 XFRAME (frame
)->focus_frame
= focus_frame
;
990 /* I think this should be done with a hook. */
991 #ifdef HAVE_X_WINDOWS
992 if (!NILP (focus_frame
) && ! EQ (focus_frame
, frame
)
993 && FRAME_X_P (XFRAME (focus_frame
)))
994 Ffocus_frame (focus_frame
);
997 if (frame_rehighlight_hook
)
998 (*frame_rehighlight_hook
) ();
1004 DEFUN ("frame-focus", Fframe_focus
, Sframe_focus
, 1, 1, 0,
1005 "Return the frame to which FRAME's keystrokes are currently being sent.\n\
1006 This returns nil if FRAME's focus is not redirected.\n\
1007 See `redirect-frame-focus'.")
1011 CHECK_LIVE_FRAME (frame
, 0);
1013 return FRAME_FOCUS_FRAME (XFRAME (frame
));
1019 get_frame_param (frame
, prop
)
1020 register struct frame
*frame
;
1023 register Lisp_Object tem
;
1025 tem
= Fassq (prop
, frame
->param_alist
);
1032 store_in_alist (alistptr
, prop
, val
)
1033 Lisp_Object
*alistptr
, val
;
1036 register Lisp_Object tem
;
1038 tem
= Fassq (prop
, *alistptr
);
1040 *alistptr
= Fcons (Fcons (prop
, val
), *alistptr
);
1046 store_frame_param (f
, prop
, val
)
1048 Lisp_Object prop
, val
;
1050 register Lisp_Object tem
;
1052 tem
= Fassq (prop
, f
->param_alist
);
1054 f
->param_alist
= Fcons (Fcons (prop
, val
), f
->param_alist
);
1058 if (EQ (prop
, Qminibuffer
)
1059 && XTYPE (val
) == Lisp_Window
)
1061 if (! MINI_WINDOW_P (XWINDOW (val
)))
1062 error ("Surrogate minibuffer windows must be minibuffer windows.");
1064 if (FRAME_HAS_MINIBUF_P (f
) || FRAME_MINIBUF_ONLY_P (f
))
1065 error ("can't change the surrogate minibuffer of a frame with its own minibuffer");
1067 /* Install the chosen minibuffer window, with proper buffer. */
1068 f
->minibuffer_window
= val
;
1072 DEFUN ("frame-parameters", Fframe_parameters
, Sframe_parameters
, 0, 1, 0,
1073 "Return the parameters-alist of frame FRAME.\n\
1074 It is a list of elements of the form (PARM . VALUE), where PARM is a symbol.\n\
1075 The meaningful PARMs depend on the kind of frame.\n\
1076 If FRAME is omitted, return information on the currently selected frame.")
1083 if (EQ (frame
, Qnil
))
1087 CHECK_FRAME (frame
, 0);
1091 if (f
->display
.nothing
== 0)
1094 alist
= Fcopy_alist (f
->param_alist
);
1095 store_in_alist (&alist
, Qname
, f
->name
);
1096 store_in_alist (&alist
, Qheight
, make_number (f
->height
));
1097 store_in_alist (&alist
, Qwidth
, make_number (f
->width
));
1098 store_in_alist (&alist
, Qmodeline
, (f
->wants_modeline
? Qt
: Qnil
));
1099 store_in_alist (&alist
, Qminibuffer
,
1100 (! FRAME_HAS_MINIBUF_P (f
) ? Qnil
1101 : (FRAME_MINIBUF_ONLY_P (f
) ? Qonly
1102 : FRAME_MINIBUF_WINDOW (f
))));
1103 store_in_alist (&alist
, Qunsplittable
, (f
->no_split
? Qt
: Qnil
));
1104 store_in_alist (&alist
, Qmenu_bar_lines
, (FRAME_MENU_BAR_LINES (f
)));
1106 /* I think this should be done with a hook. */
1107 #ifdef HAVE_X_WINDOWS
1109 x_report_frame_params (f
, &alist
);
1114 DEFUN ("modify-frame-parameters", Fmodify_frame_parameters
,
1115 Smodify_frame_parameters
, 2, 2, 0,
1116 "Modify the parameters of frame FRAME according to ALIST.\n\
1117 ALIST is an alist of parameters to change and their new values.\n\
1118 Each element of ALIST has the form (PARM . VALUE), where PARM is a symbol.\n\
1119 The meaningful PARMs depend on the kind of frame; undefined PARMs are ignored.")
1121 Lisp_Object frame
, alist
;
1124 register Lisp_Object tail
, elt
, prop
, val
;
1126 if (EQ (frame
, Qnil
))
1130 CHECK_LIVE_FRAME (frame
, 0);
1134 /* I think this should be done with a hook. */
1135 #ifdef HAVE_X_WINDOWS
1138 x_set_frame_parameters (f
, alist
);
1140 for (tail
= alist
; !EQ (tail
, Qnil
); tail
= Fcdr (tail
))
1145 x_set_frame_param (f
, prop
, val
, get_frame_param (f
, prop
));
1146 store_frame_param (f
, prop
, val
);
1154 DEFUN ("frame-char-height", Fframe_char_height
, Sframe_char_height
,
1156 "Height in pixels of a line in the font in frame FRAME.\n\
1157 If FRAME is omitted, the selected frame is used.\n\
1158 For a terminal frame, the value is always 1.")
1168 CHECK_FRAME (frame
, 0);
1172 #ifdef HAVE_X_WINDOWS
1174 return make_number (x_char_height (f
));
1177 return make_number (1);
1181 DEFUN ("frame-char-width", Fframe_char_width
, Sframe_char_width
,
1183 "Width in pixels of characters in the font in frame FRAME.\n\
1184 If FRAME is omitted, the selected frame is used.\n\
1185 The width is the same for all characters, because\n\
1186 currently Emacs supports only fixed-width fonts.\n\
1187 For a terminal screen, the value is always 1.")
1197 CHECK_FRAME (frame
, 0);
1201 #ifdef HAVE_X_WINDOWS
1203 return make_number (x_char_width (f
));
1206 return make_number (1);
1209 DEFUN ("frame-pixel-height", Fframe_pixel_height
,
1210 Sframe_pixel_height
, 0, 1, 0,
1211 "Return a FRAME's height in pixels.\n\
1212 For a terminal frame, the result really gives the height in characters.\n\
1213 If FRAME is omitted, the selected frame is used.")
1223 CHECK_FRAME (frame
, 0);
1227 #ifdef HAVE_X_WINDOWS
1229 return make_number (x_pixel_height (f
));
1232 return make_number (FRAME_HEIGHT (f
));
1235 DEFUN ("frame-pixel-width", Fframe_pixel_width
,
1236 Sframe_pixel_width
, 0, 1, 0,
1237 "Return FRAME's width in pixels.\n\
1238 For a terminal frame, the result really gives the width in characters.\n\
1239 If FRAME is omitted, the selected frame is used.")
1249 CHECK_FRAME (frame
, 0);
1253 #ifdef HAVE_X_WINDOWS
1255 return make_number (x_pixel_width (f
));
1258 return make_number (FRAME_WIDTH (f
));
1261 DEFUN ("set-frame-height", Fset_frame_height
, Sset_frame_height
, 2, 3, 0,
1262 "Specify that the frame FRAME has LINES lines.\n\
1263 Optional third arg non-nil means that redisplay should use LINES lines\n\
1264 but that the idea of the actual height of the frame should not be changed.")
1265 (frame
, rows
, pretend
)
1266 Lisp_Object frame
, rows
, pretend
;
1268 register struct frame
*f
;
1270 CHECK_NUMBER (rows
, 0);
1275 CHECK_LIVE_FRAME (frame
, 0);
1279 /* I think this should be done with a hook. */
1280 #ifdef HAVE_X_WINDOWS
1283 if (XINT (rows
) != f
->width
)
1284 x_set_window_size (f
, f
->width
, XINT (rows
));
1288 change_frame_size (f
, XINT (rows
), 0, !NILP (pretend
), 0);
1292 DEFUN ("set-frame-width", Fset_frame_width
, Sset_frame_width
, 2, 3, 0,
1293 "Specify that the frame FRAME has COLS columns.\n\
1294 Optional third arg non-nil means that redisplay should use COLS columns\n\
1295 but that the idea of the actual width of the frame should not be changed.")
1296 (frame
, cols
, pretend
)
1297 Lisp_Object frame
, cols
, pretend
;
1299 register struct frame
*f
;
1300 CHECK_NUMBER (cols
, 0);
1305 CHECK_LIVE_FRAME (frame
, 0);
1309 /* I think this should be done with a hook. */
1310 #ifdef HAVE_X_WINDOWS
1313 if (XINT (cols
) != f
->width
)
1314 x_set_window_size (f
, XINT (cols
), f
->height
);
1318 change_frame_size (f
, 0, XINT (cols
), !NILP (pretend
), 0);
1322 DEFUN ("set-frame-size", Fset_frame_size
, Sset_frame_size
, 3, 3, 0,
1323 "Sets size of FRAME to COLS by ROWS, measured in characters.")
1325 Lisp_Object frame
, cols
, rows
;
1327 register struct frame
*f
;
1330 CHECK_LIVE_FRAME (frame
, 0);
1331 CHECK_NUMBER (cols
, 2);
1332 CHECK_NUMBER (rows
, 1);
1335 /* I think this should be done with a hook. */
1336 #ifdef HAVE_X_WINDOWS
1339 if (XINT (rows
) != f
->height
|| XINT (cols
) != f
->width
)
1340 x_set_window_size (f
, XINT (cols
), XINT (rows
));
1344 change_frame_size (f
, XINT (rows
), XINT (cols
), 0, 0);
1349 DEFUN ("set-frame-position", Fset_frame_position
,
1350 Sset_frame_position
, 3, 3, 0,
1351 "Sets position of FRAME in pixels to XOFFSET by YOFFSET.\n\
1352 If XOFFSET or YOFFSET are negative, they are interpreted relative to\n\
1353 the leftmost or bottommost position FRAME could occupy without going\n\
1355 (frame
, xoffset
, yoffset
)
1356 Lisp_Object frame
, xoffset
, yoffset
;
1358 register struct frame
*f
;
1361 CHECK_LIVE_FRAME (frame
, 0);
1362 CHECK_NUMBER (xoffset
, 1);
1363 CHECK_NUMBER (yoffset
, 2);
1366 /* I think this should be done with a hook. */
1367 #ifdef HAVE_X_WINDOWS
1369 x_set_offset (f
, XINT (xoffset
), XINT (yoffset
));
1376 choose_minibuf_frame ()
1378 /* For lowest-level minibuf, put it on currently selected frame
1379 if frame has a minibuffer. */
1381 if (minibuf_level
== 0
1382 && selected_frame
!= 0
1383 && !EQ (minibuf_window
, selected_frame
->minibuffer_window
))
1385 /* I don't think that any frames may validly have a null minibuffer
1387 if (NILP (selected_frame
->minibuffer_window
))
1390 Fset_window_buffer (selected_frame
->minibuffer_window
,
1391 XWINDOW (minibuf_window
)->buffer
);
1392 minibuf_window
= selected_frame
->minibuffer_window
;
1398 /*&&& init symbols here &&&*/
1399 Qframep
= intern ("framep");
1400 staticpro (&Qframep
);
1401 Qframe_live_p
= intern ("frame-live-p");
1402 staticpro (&Qframe_live_p
);
1403 Qheight
= intern ("height");
1404 staticpro (&Qheight
);
1405 Qicon
= intern ("icon");
1407 Qminibuffer
= intern ("minibuffer");
1408 staticpro (&Qminibuffer
);
1409 Qmodeline
= intern ("modeline");
1410 staticpro (&Qmodeline
);
1411 Qname
= intern ("name");
1413 Qonly
= intern ("only");
1415 Qunsplittable
= intern ("unsplittable");
1416 staticpro (&Qunsplittable
);
1417 Qwidth
= intern ("width");
1418 staticpro (&Qwidth
);
1421 Qmenu_bar_lines
= intern ("menu-bar-lines");
1422 staticpro (&Qmenu_bar_lines
);
1424 staticpro (&Vframe_list
);
1426 DEFVAR_LISP ("terminal-frame", &Vterminal_frame
,
1427 "The initial frame-object, which represents Emacs's stdout.");
1429 DEFVAR_LISP ("emacs-iconified", &Vemacs_iconified
,
1430 "Non-nil if all of emacs is iconified and frame updates are not needed.");
1431 Vemacs_iconified
= Qnil
;
1433 DEFVAR_LISP ("default-minibuffer-frame", &Vdefault_minibuffer_frame
,
1434 "Minibufferless frames use this frame's minibuffer.\n\
1436 Emacs cannot create minibufferless frames unless this is set to an\n\
1437 appropriate surrogate.\n\
1439 Emacs consults this variable only when creating minibufferless\n\
1440 frames; once the frame is created, it sticks with its assigned\n\
1441 minibuffer, no matter what this variable is set to. This means that\n\
1442 this variable doesn't necessarily say anything meaningful about the\n\
1443 current set of frames, or where the minibuffer is currently being\n\
1445 Vdefault_minibuffer_frame
= Qnil
;
1447 DEFVAR_LISP ("default-frame-alist", &Vdefault_frame_alist
,
1448 "Alist of default values for frame creation.\n\
1449 These may be set in your init file, like this:\n\
1450 (setq default-frame-alist '((width . 80) (height . 55)))\n\
1451 These override values given in window system configuration data, like\n\
1452 X Windows' defaults database.\n\
1453 For values specific to the first Emacs frame, see `initial-frame-alist'.\n\
1454 For values specific to the separate minibuffer frame, see\n\
1455 `minibuffer-frame-alist'.");
1456 Vdefault_frame_alist
= Qnil
;
1459 defsubr (&Sframe_live_p
);
1460 defsubr (&Shandle_switch_frame
);
1461 defsubr (&Sselect_frame
);
1462 defsubr (&Sselected_frame
);
1463 defsubr (&Swindow_frame
);
1464 defsubr (&Sframe_root_window
);
1465 defsubr (&Sframe_selected_window
);
1466 defsubr (&Sframe_list
);
1467 defsubr (&Snext_frame
);
1468 defsubr (&Sdelete_frame
);
1469 defsubr (&Smouse_position
);
1470 defsubr (&Sset_mouse_position
);
1472 defsubr (&Sframe_configuration
);
1473 defsubr (&Srestore_frame_configuration
);
1475 defsubr (&Smake_frame_visible
);
1476 defsubr (&Smake_frame_invisible
);
1477 defsubr (&Siconify_frame
);
1478 defsubr (&Sframe_visible_p
);
1479 defsubr (&Svisible_frame_list
);
1480 defsubr (&Sraise_frame
);
1481 defsubr (&Slower_frame
);
1482 defsubr (&Sredirect_frame_focus
);
1483 defsubr (&Sframe_focus
);
1484 defsubr (&Sframe_parameters
);
1485 defsubr (&Smodify_frame_parameters
);
1486 defsubr (&Sframe_char_height
);
1487 defsubr (&Sframe_char_width
);
1488 defsubr (&Sframe_pixel_height
);
1489 defsubr (&Sframe_pixel_width
);
1490 defsubr (&Sset_frame_height
);
1491 defsubr (&Sset_frame_width
);
1492 defsubr (&Sset_frame_size
);
1493 defsubr (&Sset_frame_position
);
1498 initial_define_lispy_key (global_map
, "switch-frame", "handle-switch-frame");
1501 #else /* not MULTI_FRAME */
1503 /* If we're not using multi-frame stuff, we still need to provide some
1504 support functions. */
1506 /* Unless this function is defined, providing set-frame-height and
1507 set-frame-width doesn't help compatibility any, since they both
1508 want this as their first argument. */
1509 DEFUN ("selected-frame", Fselected_frame
, Sselected_frame
, 0, 0, 0,
1510 "Return the frame that is now selected.")
1517 DEFUN ("framep", Fframep
, Sframep
, 1, 1, 0,
1518 "Return non-nil if OBJECT is a frame.\n\
1519 Value is t for a termcap frame (a character-only terminal),\n\
1520 `x' for an Emacs frame that is really an X window.\n\
1521 Also see `live-frame-p'.")
1528 DEFUN ("set-frame-height", Fset_frame_height
, Sset_frame_height
, 2, 3, 0,
1529 "Specify that the frame FRAME has LINES lines.\n\
1530 Optional third arg non-nil means that redisplay should use LINES lines\n\
1531 but that the idea of the actual height of the frame should not be changed.")
1532 (frame
, rows
, pretend
)
1533 Lisp_Object frame
, rows
, pretend
;
1535 CHECK_NUMBER (rows
, 0);
1537 change_frame_size (0, XINT (rows
), 0, !NILP (pretend
), 0);
1541 DEFUN ("set-frame-width", Fset_frame_width
, Sset_frame_width
, 2, 3, 0,
1542 "Specify that the frame FRAME has COLS columns.\n\
1543 Optional third arg non-nil means that redisplay should use COLS columns\n\
1544 but that the idea of the actual width of the frame should not be changed.")
1545 (frame
, cols
, pretend
)
1546 Lisp_Object frame
, cols
, pretend
;
1548 CHECK_NUMBER (cols
, 0);
1550 change_frame_size (0, 0, XINT (cols
), !NILP (pretend
), 0);
1554 DEFUN ("set-frame-size", Fset_frame_size
, Sset_frame_size
, 3, 3, 0,
1555 "Sets size of FRAME to COLS by ROWS, measured in characters.")
1557 Lisp_Object frame
, cols
, rows
;
1559 CHECK_NUMBER (cols
, 2);
1560 CHECK_NUMBER (rows
, 1);
1562 change_frame_size (0, XINT (rows
), XINT (cols
), 0, 0);
1567 DEFUN ("frame-height", Fframe_height
, Sframe_height
, 0, 1, 0,
1568 "Return number of lines available for display on FRAME.\n\
1569 If FRAME is omitted, describe the currently selected frame.")
1573 return make_number (FRAME_HEIGHT (selected_frame
));
1576 DEFUN ("frame-width", Fframe_width
, Sframe_width
, 0, 1, 0,
1577 "Return number of columns available for display on FRAME.\n\
1578 If FRAME is omitted, describe the currently selected frame.")
1582 return make_number (FRAME_WIDTH (selected_frame
));
1585 DEFUN ("frame-char-height", Fframe_char_height
, Sframe_char_height
,
1587 "Height in pixels of a line in the font in frame FRAME.\n\
1588 If FRAME is omitted, the selected frame is used.\n\
1589 For a terminal frame, the value is always 1.")
1593 return make_number (1);
1597 DEFUN ("frame-char-width", Fframe_char_width
, Sframe_char_width
,
1599 "Width in pixels of characters in the font in frame FRAME.\n\
1600 If FRAME is omitted, the selected frame is used.\n\
1601 The width is the same for all characters, because\n\
1602 currently Emacs supports only fixed-width fonts.\n\
1603 For a terminal screen, the value is always 1.")
1607 return make_number (1);
1610 DEFUN ("frame-pixel-height", Fframe_pixel_height
,
1611 Sframe_pixel_height
, 0, 1, 0,
1612 "Return FRAME's height in pixels.\n\
1613 For a terminal frame, the result really gives the height in characters.\n\
1614 If FRAME is omitted, the selected frame is used.")
1618 return make_number (FRAME_HEIGHT (f
));
1621 DEFUN ("frame-pixel-width", Fframe_pixel_width
,
1622 Sframe_pixel_width
, 0, 1, 0,
1623 "Return FRAME's width in pixels.\n\
1624 For a terminal frame, the result really gives the width in characters.\n\
1625 If FRAME is omitted, the selected frame is used.")
1629 return make_number (FRAME_WIDTH (f
));
1632 /* These are for backward compatibility with Emacs 18. */
1634 DEFUN ("set-screen-height", Fset_screen_height
, Sset_screen_height
, 1, 2, 0,
1635 "Tell redisplay that the screen has LINES lines.\n\
1636 Optional second arg non-nil means that redisplay should use LINES lines\n\
1637 but that the idea of the actual height of the screen should not be changed.")
1639 Lisp_Object lines
, pretend
;
1641 CHECK_NUMBER (lines
, 0);
1643 change_frame_size (0, XINT (lines
), 0, !NILP (pretend
), 0);
1647 DEFUN ("set-screen-width", Fset_screen_width
, Sset_screen_width
, 1, 2, 0,
1648 "Tell redisplay that the screen has COLS columns.\n\
1649 Optional second arg non-nil means that redisplay should use COLS columns\n\
1650 but that the idea of the actual width of the screen should not be changed.")
1652 Lisp_Object cols
, pretend
;
1654 CHECK_NUMBER (cols
, 0);
1656 change_frame_size (0, 0, XINT (cols
), !NILP (pretend
), 0);
1662 defsubr (&Sselected_frame
);
1664 defsubr (&Sframe_char_height
);
1665 defsubr (&Sframe_char_width
);
1666 defsubr (&Sframe_pixel_height
);
1667 defsubr (&Sframe_pixel_width
);
1668 defsubr (&Sset_frame_height
);
1669 defsubr (&Sset_frame_width
);
1670 defsubr (&Sset_frame_size
);
1671 defsubr (&Sset_screen_height
);
1672 defsubr (&Sset_screen_width
);
1673 defsubr (&Sframe_height
);
1674 Ffset (intern ("screen-height"), intern ("frame-height"));
1675 defsubr (&Sframe_width
);
1676 Ffset (intern ("screen-width"), intern ("frame-width"));
1683 #endif /* not MULTI_FRAME */