1 /* Generic frame functions.
2 Copyright (C) 1993, 1994 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. */
25 #include "termhooks.h"
35 /* These help us bind and responding to switch-frame events. */
39 Lisp_Object Vemacs_iconified
;
40 Lisp_Object Vframe_list
;
41 Lisp_Object Vterminal_frame
;
42 Lisp_Object Vdefault_minibuffer_frame
;
43 Lisp_Object Vdefault_frame_alist
;
45 /* Evaluate this expression to rebuild the section of syms_of_frame
46 that initializes and staticpros the symbols declared below. Note
47 that Emacs 18 has a bug that keeps C-x C-e from being able to
48 evaluate this expression.
51 ;; Accumulate a list of the symbols we want to initialize from the
52 ;; declarations at the top of the file.
53 (goto-char (point-min))
54 (search-forward "/\*&&& symbols declared here &&&*\/\n")
56 (while (looking-at "Lisp_Object \\(Q[a-z_]+\\)")
58 (cons (buffer-substring (match-beginning 1) (match-end 1))
61 (setq symbol-list (nreverse symbol-list))
62 ;; Delete the section of syms_of_... where we initialize the symbols.
63 (search-forward "\n /\*&&& init symbols here &&&*\/\n")
64 (let ((start (point)))
65 (while (looking-at "^ Q")
67 (kill-region start (point)))
68 ;; Write a new symbol initialization section.
70 (insert (format " %s = intern (\"" (car symbol-list)))
71 (let ((start (point)))
72 (insert (substring (car symbol-list) 1))
73 (subst-char-in-region start (point) ?_ ?-))
74 (insert (format "\");\n staticpro (&%s);\n" (car symbol-list)))
75 (setq symbol-list (cdr symbol-list)))))
78 /*&&& symbols declared here &&&*/
80 Lisp_Object Qframe_live_p
;
83 Lisp_Object Qminibuffer
;
84 Lisp_Object Qmodeline
;
87 Lisp_Object Qunsplittable
;
88 Lisp_Object Qmenu_bar_lines
;
92 Lisp_Object Qbuffer_predicate
;
94 extern Lisp_Object Vminibuffer_list
;
95 extern Lisp_Object
get_minibuffer ();
96 extern Lisp_Object
Fhandle_switch_frame ();
97 extern Lisp_Object
Fredirect_frame_focus ();
99 DEFUN ("framep", Fframep
, Sframep
, 1, 1, 0,
100 "Return non-nil if OBJECT is a frame.\n\
101 Value is t for a termcap frame (a character-only terminal),\n\
102 `x' for an Emacs frame that is really an X window,\n\
103 `pc' for a direct-write MS-DOS frame.\n\
104 See also `frame-live-p'.")
108 if (!FRAMEP (object
))
110 switch (XFRAME (object
)->output_method
)
114 case output_x_window
:
116 /* The `pc' case is in the Fframep below. */
122 DEFUN ("frame-live-p", Fframe_live_p
, Sframe_live_p
, 1, 1, 0,
123 "Return non-nil if OBJECT is a frame which has not been deleted.\n\
124 Value is nil if OBJECT is not a live frame. If object is a live\n\
125 frame, the return value indicates what sort of output device it is\n\
126 displayed on. Value is t for a termcap frame (a character-only\n\
127 terminal), `x' for an Emacs frame being displayed in an X window.")
131 return ((FRAMEP (object
)
132 && FRAME_LIVE_P (XFRAME (object
)))
142 register struct frame
*f
;
143 register Lisp_Object root_window
;
144 register Lisp_Object mini_window
;
145 register struct Lisp_Vector
*vec
;
148 vec
= allocate_vectorlike ((EMACS_INT
) VECSIZE (struct frame
));
149 for (i
= 0; i
< VECSIZE (struct frame
); i
++)
150 XSETFASTINT (vec
->contents
[i
], 0);
151 vec
->size
= VECSIZE (struct frame
);
152 f
= (struct frame
*)vec
;
153 XSETFRAME (frame
, f
);
157 f
->current_glyphs
= 0;
158 f
->desired_glyphs
= 0;
160 f
->async_visible
= 0;
161 f
->display
.nothing
= 0;
163 f
->async_iconified
= 0;
164 f
->wants_modeline
= 1;
169 f
->has_minibuffer
= mini_p
;
170 f
->focus_frame
= Qnil
;
171 f
->explicit_name
= 0;
172 f
->can_have_scroll_bars
= 0;
173 f
->has_vertical_scroll_bars
= 0;
174 f
->param_alist
= Qnil
;
175 f
->scroll_bars
= Qnil
;
176 f
->condemned_scroll_bars
= Qnil
;
177 f
->face_alist
= Qnil
;
178 f
->menu_bar_items
= Qnil
;
179 f
->menu_bar_vector
= Qnil
;
180 f
->menu_bar_items_used
= 0;
181 f
->buffer_predicate
= Qnil
;
183 f
->kboard
= initial_kboard
;
186 root_window
= make_window ();
189 mini_window
= make_window ();
190 XWINDOW (root_window
)->next
= mini_window
;
191 XWINDOW (mini_window
)->prev
= root_window
;
192 XWINDOW (mini_window
)->mini_p
= Qt
;
193 XWINDOW (mini_window
)->frame
= frame
;
194 f
->minibuffer_window
= mini_window
;
199 XWINDOW (root_window
)->next
= Qnil
;
200 f
->minibuffer_window
= Qnil
;
203 XWINDOW (root_window
)->frame
= frame
;
206 just so that there is "something there."
207 Correct size will be set up later with change_frame_size. */
212 XSETFASTINT (XWINDOW (root_window
)->width
, 10);
213 XSETFASTINT (XWINDOW (root_window
)->height
, (mini_p
? 9 : 10));
217 XSETFASTINT (XWINDOW (mini_window
)->width
, 10);
218 XSETFASTINT (XWINDOW (mini_window
)->top
, 9);
219 XSETFASTINT (XWINDOW (mini_window
)->height
, 1);
222 /* Choose a buffer for the frame's root window. */
226 XWINDOW (root_window
)->buffer
= Qt
;
227 buf
= Fcurrent_buffer ();
228 /* If buf is a 'hidden' buffer (i.e. one whose name starts with
229 a space), try to find another one. */
230 if (XSTRING (Fbuffer_name (buf
))->data
[0] == ' ')
231 buf
= Fother_buffer (buf
, Qnil
);
232 Fset_window_buffer (root_window
, buf
);
237 XWINDOW (mini_window
)->buffer
= Qt
;
238 Fset_window_buffer (mini_window
,
239 (NILP (Vminibuffer_list
)
241 : Fcar (Vminibuffer_list
)));
244 f
->root_window
= root_window
;
245 f
->selected_window
= root_window
;
246 /* Make sure this window seems more recently used than
247 a newly-created, never-selected window. */
248 XSETFASTINT (XWINDOW (f
->selected_window
)->use_time
, ++window_select_count
);
253 /* Make a frame using a separate minibuffer window on another frame.
254 MINI_WINDOW is the minibuffer window to use. nil means use the
255 default (the global minibuffer). */
258 make_frame_without_minibuffer (mini_window
)
259 register Lisp_Object mini_window
;
261 register struct frame
*f
;
263 /* Choose the minibuffer window to use. */
264 if (NILP (mini_window
))
266 if (!FRAMEP (Vdefault_minibuffer_frame
))
267 error ("default-minibuffer-frame must be set when creating minibufferless frames");
268 if (! FRAME_LIVE_P (XFRAME (Vdefault_minibuffer_frame
)))
269 error ("default-minibuffer-frame must be a live frame");
270 mini_window
= XFRAME (Vdefault_minibuffer_frame
)->minibuffer_window
;
274 CHECK_LIVE_WINDOW (mini_window
, 0);
277 /* Make a frame containing just a root window. */
280 /* Install the chosen minibuffer window, with proper buffer. */
281 f
->minibuffer_window
= mini_window
;
282 Fset_window_buffer (mini_window
,
283 (NILP (Vminibuffer_list
)
285 : Fcar (Vminibuffer_list
)));
289 /* Make a frame containing only a minibuffer window. */
292 make_minibuffer_frame ()
294 /* First make a frame containing just a root window, no minibuffer. */
296 register struct frame
*f
= make_frame (0);
297 register Lisp_Object mini_window
;
298 register Lisp_Object frame
;
300 XSETFRAME (frame
, f
);
305 f
->wants_modeline
= 0;
306 f
->has_minibuffer
= 1;
308 /* Now label the root window as also being the minibuffer.
309 Avoid infinite looping on the window chain by marking next pointer
312 mini_window
= f
->minibuffer_window
= f
->root_window
;
313 XWINDOW (mini_window
)->mini_p
= Qt
;
314 XWINDOW (mini_window
)->next
= Qnil
;
315 XWINDOW (mini_window
)->prev
= Qnil
;
316 XWINDOW (mini_window
)->frame
= frame
;
318 /* Put the proper buffer in that window. */
320 Fset_window_buffer (mini_window
,
321 (NILP (Vminibuffer_list
)
323 : Fcar (Vminibuffer_list
)));
327 /* Construct a frame that refers to the terminal (stdin and stdout). */
329 static int terminal_frame_count
;
332 make_terminal_frame ()
334 register struct frame
*f
;
341 initial_kboard
= (KBOARD
*) xmalloc (sizeof (KBOARD
));
342 init_kboard (initial_kboard
);
346 /* The first call must initialize Vframe_list. */
347 if (! (NILP (Vframe_list
) || CONSP (Vframe_list
)))
352 XSETFRAME (frame
, f
);
353 Vframe_list
= Fcons (frame
, Vframe_list
);
355 terminal_frame_count
++;
356 sprintf (name
, "terminal-%d", terminal_frame_count
);
358 f
->name
= build_string (name
);
359 f
->visible
= 1; /* FRAME_SET_VISIBLE wd set frame_garbaged. */
360 f
->async_visible
= 1; /* Don't let visible be cleared later. */
361 f
->display
.nothing
= 1; /* Nonzero means frame isn't deleted. */
362 XSETFRAME (Vterminal_frame
, f
);
366 DEFUN ("make-terminal-frame", Fmake_terminal_frame
, Smake_terminal_frame
,
367 1, 1, 0, "Create an additional terminal frame.\n\
368 You can create multiple frames on a text-only terminal in this way.\n\
369 Only the selected terminal frame is actually displayed.\n\
370 This function takes one argument, an alist specifying frame parameters.\n\
371 In practice, generally you don't need to specify any parameters.\n\
372 Note that changing the size of one terminal frame automatically affects all.")
379 if (selected_frame
->output_method
!= output_termcap
)
380 error ("Not using an ASCII terminal now; cannot make a new ASCII frame");
382 f
= make_terminal_frame ();
383 change_frame_size (f
, FRAME_HEIGHT (selected_frame
),
384 FRAME_WIDTH (selected_frame
), 0, 0);
385 remake_frame_glyphs (f
);
387 XSETFRAME (frame
, f
);
388 Fmodify_frame_parameters (frame
, parms
);
393 do_switch_frame (frame
, no_enter
, track
)
394 Lisp_Object frame
, no_enter
;
397 /* If FRAME is a switch-frame event, extract the frame we should
400 && EQ (XCONS (frame
)->car
, Qswitch_frame
)
401 && CONSP (XCONS (frame
)->cdr
))
402 frame
= XCONS (XCONS (frame
)->cdr
)->car
;
404 /* This used to say CHECK_LIVE_FRAME, but apparently it's possible for
405 a switch-frame event to arrive after a frame is no longer live,
406 especially when deleting the initial frame during startup. */
407 CHECK_FRAME (frame
, 0);
408 if (! FRAME_LIVE_P (XFRAME (frame
)))
411 if (selected_frame
== XFRAME (frame
))
414 /* This is too greedy; it causes inappropriate focus redirection
415 that's hard to get rid of. */
417 /* If a frame's focus has been redirected toward the currently
418 selected frame, we should change the redirection to point to the
419 newly selected frame. This means that if the focus is redirected
420 from a minibufferless frame to a surrogate minibuffer frame, we
421 can use `other-window' to switch between all the frames using
422 that minibuffer frame, and the focus redirection will follow us
428 for (tail
= Vframe_list
; CONSP (tail
); tail
= XCONS (tail
)->cdr
)
432 if (!FRAMEP (XCONS (tail
)->car
))
435 focus
= FRAME_FOCUS_FRAME (XFRAME (XCONS (tail
)->car
));
437 if (FRAMEP (focus
) && XFRAME (focus
) == selected_frame
)
438 Fredirect_frame_focus (XCONS (tail
)->car
, frame
);
442 /* Instead, apply it only to the frame we're pointing to. */
443 #ifdef HAVE_X_WINDOWS
446 Lisp_Object focus
, xfocus
;
448 xfocus
= x_get_focus_frame ();
451 focus
= FRAME_FOCUS_FRAME (XFRAME (xfocus
));
452 if (FRAMEP (focus
) && XFRAME (focus
) == selected_frame
)
453 Fredirect_frame_focus (xfocus
, frame
);
456 #endif /* HAVE_X_WINDOWS */
459 if (FRAME_TERMCAP_P (XFRAME (frame
)))
461 /* Since frames on an ASCII terminal share the same display area,
462 switching means we must redisplay the whole thing. */
463 windows_or_buffers_changed
++;
464 SET_FRAME_GARBAGED (XFRAME (frame
));
467 selected_frame
= XFRAME (frame
);
468 if (! FRAME_MINIBUF_ONLY_P (selected_frame
))
469 last_nonminibuf_frame
= selected_frame
;
471 Fselect_window (XFRAME (frame
)->selected_window
);
472 choose_minibuf_frame ();
474 /* We want to make sure that the next event generates a frame-switch
475 event to the appropriate frame. This seems kludgy to me, but
476 before you take it out, make sure that evaluating something like
477 (select-window (frame-root-window (new-frame))) doesn't end up
478 with your typing being interpreted in the new frame instead of
479 the one you're actually typing in. */
480 internal_last_event_frame
= Qnil
;
485 DEFUN ("select-frame", Fselect_frame
, Sselect_frame
, 1, 2, "e",
486 "Select the frame FRAME.\n\
487 Subsequent editing commands apply to its selected window.\n\
488 The selection of FRAME lasts until the next time the user does\n\
489 something to select a different frame, or until the next time this\n\
490 function is called.")
492 Lisp_Object frame
, no_enter
;
494 return do_switch_frame (frame
, no_enter
, 1);
498 DEFUN ("handle-switch-frame", Fhandle_switch_frame
, Shandle_switch_frame
, 1, 2, "e",
499 "Handle a switch-frame event EVENT.\n\
500 Switch-frame events are usually bound to this function.\n\
501 A switch-frame event tells Emacs that the window manager has requested\n\
502 that the user's events be directed to the frame mentioned in the event.\n\
503 This function selects the selected window of the frame of EVENT.\n\
505 If EVENT is frame object, handle it as if it were a switch-frame event\n\
508 Lisp_Object frame
, no_enter
;
510 return do_switch_frame (frame
, no_enter
, 0);
514 DEFUN ("selected-frame", Fselected_frame
, Sselected_frame
, 0, 0, 0,
515 "Return the frame that is now selected.")
519 XSETFRAME (tem
, selected_frame
);
523 DEFUN ("window-frame", Fwindow_frame
, Swindow_frame
, 1, 1, 0,
524 "Return the frame object that window WINDOW is on.")
528 CHECK_LIVE_WINDOW (window
, 0);
529 return XWINDOW (window
)->frame
;
532 DEFUN ("frame-first-window", Fframe_first_window
, Sframe_first_window
, 0, 1, 0,
533 "Returns the topmost, leftmost window of FRAME.\n\
534 If omitted, FRAME defaults to the currently selected frame.")
541 w
= selected_frame
->root_window
;
544 CHECK_LIVE_FRAME (frame
, 0);
545 w
= XFRAME (frame
)->root_window
;
547 while (NILP (XWINDOW (w
)->buffer
))
549 if (! NILP (XWINDOW (w
)->hchild
))
550 w
= XWINDOW (w
)->hchild
;
551 else if (! NILP (XWINDOW (w
)->vchild
))
552 w
= XWINDOW (w
)->vchild
;
559 DEFUN ("frame-root-window", Fframe_root_window
, Sframe_root_window
, 0, 1, 0,
560 "Returns the root-window of FRAME.\n\
561 If omitted, FRAME defaults to the currently selected frame.")
566 XSETFRAME (frame
, selected_frame
);
568 CHECK_LIVE_FRAME (frame
, 0);
570 return XFRAME (frame
)->root_window
;
573 DEFUN ("frame-selected-window", Fframe_selected_window
,
574 Sframe_selected_window
, 0, 1, 0,
575 "Return the selected window of frame object FRAME.\n\
576 If omitted, FRAME defaults to the currently selected frame.")
581 XSETFRAME (frame
, selected_frame
);
583 CHECK_LIVE_FRAME (frame
, 0);
585 return XFRAME (frame
)->selected_window
;
588 DEFUN ("set-frame-selected-window", Fset_frame_selected_window
,
589 Sset_frame_selected_window
, 2, 2, 0,
590 "Set the selected window of frame object FRAME to WINDOW.\n\
591 If FRAME is nil, the selected frame is used.\n\
592 If FRAME is the selected frame, this makes WINDOW the selected window.")
594 Lisp_Object frame
, window
;
597 XSETFRAME (frame
, selected_frame
);
599 CHECK_LIVE_FRAME (frame
, 0);
601 CHECK_LIVE_WINDOW (window
, 1);
603 if (! EQ (frame
, WINDOW_FRAME (XWINDOW (window
))))
604 error ("In `set-frame-selected-window', WINDOW is not on FRAME");
606 if (XFRAME (frame
) == selected_frame
)
607 return Fselect_window (window
);
609 return XFRAME (frame
)->selected_window
= window
;
612 DEFUN ("frame-list", Fframe_list
, Sframe_list
,
614 "Return a list of all frames.")
617 return Fcopy_sequence (Vframe_list
);
620 /* Return the next frame in the frame list after FRAME.
621 If MINIBUF is nil, exclude minibuffer-only frames.
622 If MINIBUF is a window, include only its own frame
623 and any frame now using that window as the minibuffer.
624 If MINIBUF is `visible', include all visible frames.
625 If MINIBUF is 0, include all visible and iconified frames.
626 Otherwise, include all frames. */
629 next_frame (frame
, minibuf
)
636 /* There must always be at least one frame in Vframe_list. */
637 if (! CONSP (Vframe_list
))
640 /* If this frame is dead, it won't be in Vframe_list, and we'll loop
641 forever. Forestall that. */
642 CHECK_LIVE_FRAME (frame
, 0);
645 for (tail
= Vframe_list
; CONSP (tail
); tail
= XCONS (tail
)->cdr
)
649 f
= XCONS (tail
)->car
;
652 /* Decide whether this frame is eligible to be returned. */
654 /* If we've looped all the way around without finding any
655 eligible frames, return the original frame. */
659 /* Let minibuf decide if this frame is acceptable. */
662 if (! FRAME_MINIBUF_ONLY_P (XFRAME (f
)))
665 else if (EQ (minibuf
, Qvisible
))
667 FRAME_SAMPLE_VISIBILITY (XFRAME (f
));
668 if (FRAME_VISIBLE_P (XFRAME (f
)))
671 else if (XFASTINT (minibuf
) == 0)
673 FRAME_SAMPLE_VISIBILITY (XFRAME (f
));
674 if (FRAME_VISIBLE_P (XFRAME (f
))
675 || FRAME_ICONIFIED_P (XFRAME (f
)))
678 else if (WINDOWP (minibuf
))
680 if (EQ (FRAME_MINIBUF_WINDOW (XFRAME (f
)), minibuf
)
681 /* Check that F either is, or has forwarded its focus to,
683 && (EQ (WINDOW_FRAME (XWINDOW (minibuf
)), f
)
684 || EQ (WINDOW_FRAME (XWINDOW (minibuf
)),
685 FRAME_FOCUS_FRAME (XFRAME (f
)))))
697 /* Return the previous frame in the frame list before FRAME.
698 If MINIBUF is nil, exclude minibuffer-only frames.
699 If MINIBUF is a window, include only its own frame
700 and any frame now using that window as the minibuffer.
701 If MINIBUF is `visible', include all visible frames.
702 If MINIBUF is 0, include all visible and iconified frames.
703 Otherwise, include all frames. */
706 prev_frame (frame
, minibuf
)
713 /* There must always be at least one frame in Vframe_list. */
714 if (! CONSP (Vframe_list
))
718 for (tail
= Vframe_list
; CONSP (tail
); tail
= XCONS (tail
)->cdr
)
722 f
= XCONS (tail
)->car
;
726 if (EQ (frame
, f
) && !NILP (prev
))
729 /* Decide whether this frame is eligible to be returned,
730 according to minibuf. */
733 if (! FRAME_MINIBUF_ONLY_P (XFRAME (f
)))
736 else if (WINDOWP (minibuf
))
738 if (EQ (FRAME_MINIBUF_WINDOW (XFRAME (f
)), minibuf
)
739 /* Check that F either is, or has forwarded its focus to,
741 && (EQ (WINDOW_FRAME (XWINDOW (minibuf
)), f
)
742 || EQ (WINDOW_FRAME (XWINDOW (minibuf
)),
743 FRAME_FOCUS_FRAME (XFRAME (f
)))))
746 else if (EQ (minibuf
, Qvisible
))
748 FRAME_SAMPLE_VISIBILITY (XFRAME (f
));
749 if (FRAME_VISIBLE_P (XFRAME (f
)))
752 else if (XFASTINT (minibuf
) == 0)
754 FRAME_SAMPLE_VISIBILITY (XFRAME (f
));
755 if (FRAME_VISIBLE_P (XFRAME (f
))
756 || FRAME_ICONIFIED_P (XFRAME (f
)))
763 /* We've scanned the entire list. */
765 /* We went through the whole frame list without finding a single
766 acceptable frame. Return the original frame. */
769 /* There were no acceptable frames in the list before FRAME; otherwise,
770 we would have returned directly from the loop. Since PREV is the last
771 acceptable frame in the list, return it. */
776 DEFUN ("next-frame", Fnext_frame
, Snext_frame
, 0, 2, 0,
777 "Return the next frame in the frame list after FRAME.\n\
778 By default, skip minibuffer-only frames.\n\
779 If omitted, FRAME defaults to the selected frame.\n\
780 If optional argument MINIFRAME is nil, exclude minibuffer-only frames.\n\
781 If MINIBUF is a window, include only its own frame\n\
782 and any frame now using that window as the minibuffer.\n\
783 If MINIFRAME is `visible', include all visible frames.\n\
784 If MINIBUF is 0, include all visible and iconified frames.\n\
785 Otherwise, include all frames.")
787 Lisp_Object frame
, miniframe
;
792 XSETFRAME (frame
, selected_frame
);
794 CHECK_LIVE_FRAME (frame
, 0);
796 return next_frame (frame
, miniframe
);
799 DEFUN ("previous-frame", Fprevious_frame
, Sprevious_frame
, 0, 2, 0,
800 "Return the previous frame in the frame list before FRAME.\n\
801 By default, skip minibuffer-only frames.\n\
802 If omitted, FRAME defaults to the selected frame.\n\
803 If optional argument MINIFRAME is nil, exclude minibuffer-only frames.\n\
804 If MINIBUF is a window, include only its own frame\n\
805 and any frame now using that window as the minibuffer.\n\
806 If MINIFRAME is `visible', include all visible frames.\n\
807 If MINIBUF is 0, include all visible and iconified frames.\n\
808 Otherwise, include all frames.")
810 Lisp_Object frame
, miniframe
;
815 XSETFRAME (frame
, selected_frame
);
817 CHECK_LIVE_FRAME (frame
, 0);
819 return prev_frame (frame
, miniframe
);
822 /* Return 1 if it is ok to delete frame F;
823 0 if all frames aside from F are invisible.
824 (Exception: if F is the terminal frame, and we are using X, return 1.) */
827 other_visible_frames (f
)
830 /* We know the selected frame is visible,
831 so if F is some other frame, it can't be the sole visible one. */
832 if (f
== selected_frame
)
837 for (frames
= Vframe_list
;
839 frames
= XCONS (frames
)->cdr
)
843 this = XCONS (frames
)->car
;
844 /* Verify that the frame's window still exists
845 and we can still talk to it. And note any recent change
847 #ifdef HAVE_X_WINDOWS
848 if (FRAME_X_P (XFRAME (this)))
850 x_sync (XFRAME (this));
851 FRAME_SAMPLE_VISIBILITY (XFRAME (this));
855 if (FRAME_VISIBLE_P (XFRAME (this))
856 || FRAME_ICONIFIED_P (XFRAME (this))
857 /* Allow deleting the terminal frame when at least
858 one X frame exists! */
859 || (FRAME_X_P (XFRAME (this)) && !FRAME_X_P (f
)))
867 DEFUN ("delete-frame", Fdelete_frame
, Sdelete_frame
, 0, 2, "",
868 "Delete FRAME, permanently eliminating it from use.\n\
869 If omitted, FRAME defaults to the selected frame.\n\
870 A frame may not be deleted if its minibuffer is used by other frames.\n\
871 Normally, you may not delete a frame if all other frames are invisible,\n\
872 but if the second optional argument FORCE is non-nil, you may do so.")
874 Lisp_Object frame
, force
;
878 if (EQ (frame
, Qnil
))
881 XSETFRAME (frame
, f
);
885 CHECK_FRAME (frame
, 0);
889 if (! FRAME_LIVE_P (f
))
892 if (NILP (force
) && !other_visible_frames (f
))
893 error ("Attempt to delete the sole visible or iconified frame");
895 /* Does this frame have a minibuffer, and is it the surrogate
896 minibuffer for any other frame? */
897 if (FRAME_HAS_MINIBUF_P (XFRAME (frame
)))
901 for (frames
= Vframe_list
;
903 frames
= XCONS (frames
)->cdr
)
906 this = XCONS (frames
)->car
;
908 if (! EQ (this, frame
)
910 WINDOW_FRAME (XWINDOW
911 (FRAME_MINIBUF_WINDOW (XFRAME (this))))))
912 error ("Attempt to delete a surrogate minibuffer frame");
916 /* Don't let the frame remain selected. */
917 if (f
== selected_frame
)
918 Fhandle_switch_frame (next_frame (frame
, Qt
), Qnil
);
920 /* Don't allow minibuf_window to remain on a deleted frame. */
921 if (EQ (f
->minibuffer_window
, minibuf_window
))
923 Fset_window_buffer (selected_frame
->minibuffer_window
,
924 XWINDOW (minibuf_window
)->buffer
);
925 minibuf_window
= selected_frame
->minibuffer_window
;
928 /* Clear any X selections for this frame. */
929 #ifdef HAVE_X_WINDOWS
931 x_clear_frame_selections (f
);
934 /* Mark all the windows that used to be on FRAME as deleted, and then
935 remove the reference to them. */
936 delete_all_subwindows (XWINDOW (f
->root_window
));
937 f
->root_window
= Qnil
;
939 Vframe_list
= Fdelq (frame
, Vframe_list
);
940 FRAME_SET_VISIBLE (f
, 0);
942 if (FRAME_CURRENT_GLYPHS (f
))
943 free_frame_glyphs (f
, FRAME_CURRENT_GLYPHS (f
));
944 if (FRAME_DESIRED_GLYPHS (f
))
945 free_frame_glyphs (f
, FRAME_DESIRED_GLYPHS (f
));
946 if (FRAME_TEMP_GLYPHS (f
))
947 free_frame_glyphs (f
, FRAME_TEMP_GLYPHS (f
));
948 if (FRAME_INSERT_COST (f
))
949 free (FRAME_INSERT_COST (f
));
950 if (FRAME_DELETEN_COST (f
))
951 free (FRAME_DELETEN_COST (f
));
952 if (FRAME_INSERTN_COST (f
))
953 free (FRAME_INSERTN_COST (f
));
954 if (FRAME_DELETE_COST (f
))
955 free (FRAME_DELETE_COST (f
));
957 /* Since some events are handled at the interrupt level, we may get
958 an event for f at any time; if we zero out the frame's display
959 now, then we may trip up the event-handling code. Instead, we'll
960 promise that the display of the frame must be valid until we have
961 called the window-system-dependent frame destruction routine. */
963 /* I think this should be done with a hook. */
964 #ifdef HAVE_X_WINDOWS
966 x_destroy_window (f
);
969 f
->display
.nothing
= 0;
971 /* If we've deleted the last_nonminibuf_frame, then try to find
973 if (f
== last_nonminibuf_frame
)
977 last_nonminibuf_frame
= 0;
979 for (frames
= Vframe_list
;
981 frames
= XCONS (frames
)->cdr
)
983 f
= XFRAME (XCONS (frames
)->car
);
984 if (!FRAME_MINIBUF_ONLY_P (f
))
986 last_nonminibuf_frame
= f
;
992 /* If we've deleted Vdefault_minibuffer_frame, try to find another
993 one. Prefer minibuffer-only frames, but also notice frames
994 with other windows. */
995 if (EQ (frame
, Vdefault_minibuffer_frame
))
999 /* The last frame we saw with a minibuffer, minibuffer-only or not. */
1000 Lisp_Object frame_with_minibuf
;
1002 frame_with_minibuf
= Qnil
;
1003 for (frames
= Vframe_list
;
1005 frames
= XCONS (frames
)->cdr
)
1009 this = XCONS (frames
)->car
;
1014 if (FRAME_HAS_MINIBUF_P (f
))
1016 frame_with_minibuf
= this;
1017 if (FRAME_MINIBUF_ONLY_P (f
))
1022 /* We know that there must be some frame with a minibuffer out
1023 there. If this were not true, all of the frames present
1024 would have to be minibufferless, which implies that at some
1025 point their minibuffer frames must have been deleted, but
1026 that is prohibited at the top; you can't delete surrogate
1027 minibuffer frames. */
1028 if (NILP (frame_with_minibuf
))
1031 Vdefault_minibuffer_frame
= frame_with_minibuf
;
1037 /* Return mouse position in character cell units. */
1039 DEFUN ("mouse-position", Fmouse_position
, Smouse_position
, 0, 0, 0,
1040 "Return a list (FRAME X . Y) giving the current mouse frame and position.\n\
1041 The position is given in character cells, where (0, 0) is the\n\
1042 upper-left corner.\n\
1043 If Emacs is running on a mouseless terminal or hasn't been programmed\n\
1044 to read the mouse position, it returns the selected frame for FRAME\n\
1045 and nil for X and Y.")
1049 Lisp_Object lispy_dummy
;
1050 enum scroll_bar_part party_dummy
;
1053 unsigned long long_dummy
;
1059 /* It's okay for the hook to refrain from storing anything. */
1060 if (mouse_position_hook
)
1061 (*mouse_position_hook
) (&f
,
1062 &lispy_dummy
, &party_dummy
,
1069 pixel_to_glyph_coords (f
, col
, row
, &col
, &row
, 0, 1);
1074 XSETFRAME (lispy_dummy
, f
);
1075 return Fcons (lispy_dummy
, Fcons (x
, y
));
1078 DEFUN ("mouse-pixel-position", Fmouse_pixel_position
,
1079 Smouse_pixel_position
, 0, 0, 0,
1080 "Return a list (FRAME X . Y) giving the current mouse frame and position.\n\
1081 The position is given in pixel units, where (0, 0) is the\n\
1082 upper-left corner.\n\
1083 If Emacs is running on a mouseless terminal or hasn't been programmed\n\
1084 to read the mouse position, it returns the selected frame for FRAME\n\
1085 and nil for X and Y.")
1089 Lisp_Object lispy_dummy
;
1090 enum scroll_bar_part party_dummy
;
1093 unsigned long long_dummy
;
1098 /* It's okay for the hook to refrain from storing anything. */
1099 if (mouse_position_hook
)
1100 (*mouse_position_hook
) (&f
,
1101 &lispy_dummy
, &party_dummy
,
1104 XSETFRAME (lispy_dummy
, f
);
1105 return Fcons (lispy_dummy
, Fcons (x
, y
));
1108 DEFUN ("set-mouse-position", Fset_mouse_position
, Sset_mouse_position
, 3, 3, 0,
1109 "Move the mouse pointer to the center of character cell (X,Y) in FRAME.\n\
1110 WARNING: If you use this under X windows,\n\
1111 you should call `unfocus-frame' afterwards.")
1113 Lisp_Object frame
, x
, y
;
1115 CHECK_LIVE_FRAME (frame
, 0);
1116 CHECK_NUMBER (x
, 2);
1117 CHECK_NUMBER (y
, 1);
1119 /* I think this should be done with a hook. */
1120 #ifdef HAVE_X_WINDOWS
1121 if (FRAME_X_P (XFRAME (frame
)))
1122 /* Warping the mouse will cause enternotify and focus events. */
1123 x_set_mouse_position (XFRAME (frame
), x
, y
);
1129 DEFUN ("set-mouse-pixel-position", Fset_mouse_pixel_position
,
1130 Sset_mouse_pixel_position
, 3, 3, 0,
1131 "Move the mouse pointer to pixel position (X,Y) in FRAME.\n\
1132 WARNING: If you use this under X windows,\n\
1133 you should call `unfocus-frame' afterwards.")
1135 Lisp_Object frame
, x
, y
;
1137 CHECK_LIVE_FRAME (frame
, 0);
1138 CHECK_NUMBER (x
, 2);
1139 CHECK_NUMBER (y
, 1);
1141 /* I think this should be done with a hook. */
1142 #ifdef HAVE_X_WINDOWS
1143 if (FRAME_X_P (XFRAME (frame
)))
1144 /* Warping the mouse will cause enternotify and focus events. */
1145 x_set_mouse_pixel_position (XFRAME (frame
), x
, y
);
1151 DEFUN ("make-frame-visible", Fmake_frame_visible
, Smake_frame_visible
,
1153 "Make the frame FRAME visible (assuming it is an X-window).\n\
1154 If omitted, FRAME defaults to the currently selected frame.")
1159 XSETFRAME (frame
, selected_frame
);
1161 CHECK_LIVE_FRAME (frame
, 0);
1163 /* I think this should be done with a hook. */
1164 #ifdef HAVE_X_WINDOWS
1165 if (FRAME_X_P (XFRAME (frame
)))
1167 FRAME_SAMPLE_VISIBILITY (XFRAME (frame
));
1168 x_make_frame_visible (XFRAME (frame
));
1172 /* Make menu bar update for the Buffers and Frams menus. */
1173 windows_or_buffers_changed
++;
1178 DEFUN ("make-frame-invisible", Fmake_frame_invisible
, Smake_frame_invisible
,
1180 "Make the frame FRAME invisible (assuming it is an X-window).\n\
1181 If omitted, FRAME defaults to the currently selected frame.\n\
1182 Normally you may not make FRAME invisible if all other frames are invisible,\n\
1183 but if the second optional argument FORCE is non-nil, you may do so.")
1185 Lisp_Object frame
, force
;
1188 XSETFRAME (frame
, selected_frame
);
1190 CHECK_LIVE_FRAME (frame
, 0);
1192 if (NILP (force
) && !other_visible_frames (XFRAME (frame
)))
1193 error ("Attempt to make invisible the sole visible or iconified frame");
1195 #if 0 /* This isn't logically necessary, and it can do GC. */
1196 /* Don't let the frame remain selected. */
1197 if (XFRAME (frame
) == selected_frame
)
1198 Fhandle_switch_frame (next_frame (frame
, Qt
), Qnil
);
1201 /* Don't allow minibuf_window to remain on a deleted frame. */
1202 if (EQ (XFRAME (frame
)->minibuffer_window
, minibuf_window
))
1204 Fset_window_buffer (selected_frame
->minibuffer_window
,
1205 XWINDOW (minibuf_window
)->buffer
);
1206 minibuf_window
= selected_frame
->minibuffer_window
;
1209 /* I think this should be done with a hook. */
1210 #ifdef HAVE_X_WINDOWS
1211 if (FRAME_X_P (XFRAME (frame
)))
1212 x_make_frame_invisible (XFRAME (frame
));
1215 /* Make menu bar update for the Buffers and Frams menus. */
1216 windows_or_buffers_changed
++;
1221 DEFUN ("iconify-frame", Ficonify_frame
, Siconify_frame
,
1223 "Make the frame FRAME into an icon.\n\
1224 If omitted, FRAME defaults to the currently selected frame.")
1229 XSETFRAME (frame
, selected_frame
);
1231 CHECK_LIVE_FRAME (frame
, 0);
1233 #if 0 /* This isn't logically necessary, and it can do GC. */
1234 /* Don't let the frame remain selected. */
1235 if (XFRAME (frame
) == selected_frame
)
1236 Fhandle_switch_frame (next_frame (frame
, Qt
), Qnil
);
1239 /* Don't allow minibuf_window to remain on a deleted frame. */
1240 if (EQ (XFRAME (frame
)->minibuffer_window
, minibuf_window
))
1242 Fset_window_buffer (selected_frame
->minibuffer_window
,
1243 XWINDOW (minibuf_window
)->buffer
);
1244 minibuf_window
= selected_frame
->minibuffer_window
;
1247 /* I think this should be done with a hook. */
1248 #ifdef HAVE_X_WINDOWS
1249 if (FRAME_X_P (XFRAME (frame
)))
1250 x_iconify_frame (XFRAME (frame
));
1253 /* Make menu bar update for the Buffers and Frams menus. */
1254 windows_or_buffers_changed
++;
1259 DEFUN ("frame-visible-p", Fframe_visible_p
, Sframe_visible_p
,
1261 "Return t if FRAME is now \"visible\" (actually in use for display).\n\
1262 A frame that is not \"visible\" is not updated and, if it works through\n\
1263 a window system, it may not show at all.\n\
1264 Return the symbol `icon' if frame is visible only as an icon.")
1268 CHECK_LIVE_FRAME (frame
, 0);
1270 FRAME_SAMPLE_VISIBILITY (XFRAME (frame
));
1272 if (FRAME_VISIBLE_P (XFRAME (frame
)))
1274 if (FRAME_ICONIFIED_P (XFRAME (frame
)))
1279 DEFUN ("visible-frame-list", Fvisible_frame_list
, Svisible_frame_list
,
1281 "Return a list of all frames now \"visible\" (being updated).")
1284 Lisp_Object tail
, frame
;
1289 for (tail
= Vframe_list
; CONSP (tail
); tail
= XCONS (tail
)->cdr
)
1291 frame
= XCONS (tail
)->car
;
1292 if (!FRAMEP (frame
))
1295 if (FRAME_VISIBLE_P (f
))
1296 value
= Fcons (frame
, value
);
1302 DEFUN ("raise-frame", Fraise_frame
, Sraise_frame
, 1, 1, 0,
1303 "Bring FRAME to the front, so it occludes any frames it overlaps.\n\
1304 If FRAME is invisible, make it visible.\n\
1305 If Emacs is displaying on an ordinary terminal or some other device which\n\
1306 doesn't support multiple overlapping frames, this function does nothing.")
1310 CHECK_LIVE_FRAME (frame
, 0);
1312 /* Do like the documentation says. */
1313 Fmake_frame_visible (frame
);
1315 if (frame_raise_lower_hook
)
1316 (*frame_raise_lower_hook
) (XFRAME (frame
), 1);
1321 /* Should we have a corresponding function called Flower_Power? */
1322 DEFUN ("lower-frame", Flower_frame
, Slower_frame
, 1, 1, 0,
1323 "Send FRAME to the back, so it is occluded by any frames that overlap it.\n\
1324 If Emacs is displaying on an ordinary terminal or some other device which\n\
1325 doesn't support multiple overlapping frames, this function does nothing.")
1329 CHECK_LIVE_FRAME (frame
, 0);
1331 if (frame_raise_lower_hook
)
1332 (*frame_raise_lower_hook
) (XFRAME (frame
), 0);
1338 DEFUN ("redirect-frame-focus", Fredirect_frame_focus
, Sredirect_frame_focus
,
1340 "Arrange for keystrokes typed at FRAME to be sent to FOCUS-FRAME.\n\
1341 In other words, switch-frame events caused by events in FRAME will\n\
1342 request a switch to FOCUS-FRAME, and `last-event-frame' will be\n\
1343 FOCUS-FRAME after reading an event typed at FRAME.\n\
1345 If FOCUS-FRAME is omitted or nil, any existing redirection is\n\
1346 cancelled, and the frame again receives its own keystrokes.\n\
1348 Focus redirection is useful for temporarily redirecting keystrokes to\n\
1349 a surrogate minibuffer frame when a frame doesn't have its own\n\
1350 minibuffer window.\n\
1352 A frame's focus redirection can be changed by select-frame. If frame\n\
1353 FOO is selected, and then a different frame BAR is selected, any\n\
1354 frames redirecting their focus to FOO are shifted to redirect their\n\
1355 focus to BAR. This allows focus redirection to work properly when the\n\
1356 user switches from one frame to another using `select-window'.\n\
1358 This means that a frame whose focus is redirected to itself is treated\n\
1359 differently from a frame whose focus is redirected to nil; the former\n\
1360 is affected by select-frame, while the latter is not.\n\
1362 The redirection lasts until `redirect-frame-focus' is called to change it.")
1363 (frame
, focus_frame
)
1364 Lisp_Object frame
, focus_frame
;
1366 /* Note that we don't check for a live frame here. It's reasonable
1367 to redirect the focus of a frame you're about to delete, if you
1368 know what other frame should receive those keystrokes. */
1369 CHECK_FRAME (frame
, 0);
1371 if (! NILP (focus_frame
))
1372 CHECK_LIVE_FRAME (focus_frame
, 1);
1374 XFRAME (frame
)->focus_frame
= focus_frame
;
1376 /* I think this should be done with a hook. */
1377 #ifdef HAVE_X_WINDOWS
1378 if (!NILP (focus_frame
) && ! EQ (focus_frame
, frame
)
1379 && FRAME_X_P (XFRAME (focus_frame
)))
1380 Ffocus_frame (focus_frame
);
1383 if (frame_rehighlight_hook
)
1384 (*frame_rehighlight_hook
) ();
1390 DEFUN ("frame-focus", Fframe_focus
, Sframe_focus
, 1, 1, 0,
1391 "Return the frame to which FRAME's keystrokes are currently being sent.\n\
1392 This returns nil if FRAME's focus is not redirected.\n\
1393 See `redirect-frame-focus'.")
1397 CHECK_LIVE_FRAME (frame
, 0);
1399 return FRAME_FOCUS_FRAME (XFRAME (frame
));
1404 /* Return the value of frame parameter PROP in frame FRAME. */
1407 get_frame_param (frame
, prop
)
1408 register struct frame
*frame
;
1411 register Lisp_Object tem
;
1413 tem
= Fassq (prop
, frame
->param_alist
);
1419 /* Return the buffer-predicate of the selected frame. */
1422 frame_buffer_predicate ()
1424 return selected_frame
->buffer_predicate
;
1427 /* Modify the alist in *ALISTPTR to associate PROP with VAL.
1428 If the alist already has an element for PROP, we change it. */
1431 store_in_alist (alistptr
, prop
, val
)
1432 Lisp_Object
*alistptr
, val
;
1435 register Lisp_Object tem
;
1437 tem
= Fassq (prop
, *alistptr
);
1439 *alistptr
= Fcons (Fcons (prop
, val
), *alistptr
);
1445 store_frame_param (f
, prop
, val
)
1447 Lisp_Object prop
, val
;
1449 register Lisp_Object tem
;
1451 tem
= Fassq (prop
, f
->param_alist
);
1453 f
->param_alist
= Fcons (Fcons (prop
, val
), f
->param_alist
);
1457 if (EQ (prop
, Qbuffer_predicate
))
1458 f
->buffer_predicate
= val
;
1460 if (EQ (prop
, Qminibuffer
) && WINDOWP (val
))
1462 if (! MINI_WINDOW_P (XWINDOW (val
)))
1463 error ("Surrogate minibuffer windows must be minibuffer windows.");
1465 if (FRAME_HAS_MINIBUF_P (f
) || FRAME_MINIBUF_ONLY_P (f
))
1466 error ("can't change the surrogate minibuffer of a frame with its own minibuffer");
1468 /* Install the chosen minibuffer window, with proper buffer. */
1469 f
->minibuffer_window
= val
;
1473 DEFUN ("frame-parameters", Fframe_parameters
, Sframe_parameters
, 0, 1, 0,
1474 "Return the parameters-alist of frame FRAME.\n\
1475 It is a list of elements of the form (PARM . VALUE), where PARM is a symbol.\n\
1476 The meaningful PARMs depend on the kind of frame.\n\
1477 If FRAME is omitted, return information on the currently selected frame.")
1484 if (EQ (frame
, Qnil
))
1488 CHECK_FRAME (frame
, 0);
1492 if (!FRAME_LIVE_P (f
))
1495 alist
= Fcopy_alist (f
->param_alist
);
1496 store_in_alist (&alist
, Qname
, f
->name
);
1497 store_in_alist (&alist
, Qheight
, make_number (FRAME_HEIGHT (f
)));
1498 store_in_alist (&alist
, Qwidth
, make_number (FRAME_WIDTH (f
)));
1499 store_in_alist (&alist
, Qmodeline
, (FRAME_WANTS_MODELINE_P (f
) ? Qt
: Qnil
));
1500 store_in_alist (&alist
, Qminibuffer
,
1501 (! FRAME_HAS_MINIBUF_P (f
) ? Qnil
1502 : FRAME_MINIBUF_ONLY_P (f
) ? Qonly
1503 : FRAME_MINIBUF_WINDOW (f
)));
1504 store_in_alist (&alist
, Qunsplittable
, (FRAME_NO_SPLIT_P (f
) ? Qt
: Qnil
));
1506 /* I think this should be done with a hook. */
1507 #ifdef HAVE_X_WINDOWS
1509 x_report_frame_params (f
, &alist
);
1513 /* This ought to be correct in f->param_alist for an X frame. */
1515 XSETFASTINT (lines
, FRAME_MENU_BAR_LINES (f
));
1516 store_in_alist (&alist
, Qmenu_bar_lines
, lines
);
1521 DEFUN ("modify-frame-parameters", Fmodify_frame_parameters
,
1522 Smodify_frame_parameters
, 2, 2, 0,
1523 "Modify the parameters of frame FRAME according to ALIST.\n\
1524 ALIST is an alist of parameters to change and their new values.\n\
1525 Each element of ALIST has the form (PARM . VALUE), where PARM is a symbol.\n\
1526 The meaningful PARMs depend on the kind of frame; undefined PARMs are ignored.")
1528 Lisp_Object frame
, alist
;
1531 register Lisp_Object tail
, elt
, prop
, val
;
1533 if (EQ (frame
, Qnil
))
1537 CHECK_LIVE_FRAME (frame
, 0);
1541 /* I think this should be done with a hook. */
1542 #ifdef HAVE_X_WINDOWS
1544 x_set_frame_parameters (f
, alist
);
1547 for (tail
= alist
; !EQ (tail
, Qnil
); tail
= Fcdr (tail
))
1552 store_frame_param (f
, prop
, val
);
1558 DEFUN ("frame-char-height", Fframe_char_height
, Sframe_char_height
,
1560 "Height in pixels of a line in the font in frame FRAME.\n\
1561 If FRAME is omitted, the selected frame is used.\n\
1562 For a terminal frame, the value is always 1.")
1572 CHECK_FRAME (frame
, 0);
1576 #ifdef HAVE_X_WINDOWS
1578 return make_number (x_char_height (f
));
1581 return make_number (1);
1585 DEFUN ("frame-char-width", Fframe_char_width
, Sframe_char_width
,
1587 "Width in pixels of characters in the font in frame FRAME.\n\
1588 If FRAME is omitted, the selected frame is used.\n\
1589 The width is the same for all characters, because\n\
1590 currently Emacs supports only fixed-width fonts.\n\
1591 For a terminal screen, the value is always 1.")
1601 CHECK_FRAME (frame
, 0);
1605 #ifdef HAVE_X_WINDOWS
1607 return make_number (x_char_width (f
));
1610 return make_number (1);
1613 DEFUN ("frame-pixel-height", Fframe_pixel_height
,
1614 Sframe_pixel_height
, 0, 1, 0,
1615 "Return a FRAME's height in pixels.\n\
1616 For a terminal frame, the result really gives the height in characters.\n\
1617 If FRAME is omitted, the selected frame is used.")
1627 CHECK_FRAME (frame
, 0);
1631 #ifdef HAVE_X_WINDOWS
1633 return make_number (x_pixel_height (f
));
1636 return make_number (FRAME_HEIGHT (f
));
1639 DEFUN ("frame-pixel-width", Fframe_pixel_width
,
1640 Sframe_pixel_width
, 0, 1, 0,
1641 "Return FRAME's width in pixels.\n\
1642 For a terminal frame, the result really gives the width in characters.\n\
1643 If FRAME is omitted, the selected frame is used.")
1653 CHECK_FRAME (frame
, 0);
1657 #ifdef HAVE_X_WINDOWS
1659 return make_number (x_pixel_width (f
));
1662 return make_number (FRAME_WIDTH (f
));
1665 DEFUN ("set-frame-height", Fset_frame_height
, Sset_frame_height
, 2, 3, 0,
1666 "Specify that the frame FRAME has LINES lines.\n\
1667 Optional third arg non-nil means that redisplay should use LINES lines\n\
1668 but that the idea of the actual height of the frame should not be changed.")
1669 (frame
, rows
, pretend
)
1670 Lisp_Object frame
, rows
, pretend
;
1672 register struct frame
*f
;
1674 CHECK_NUMBER (rows
, 0);
1679 CHECK_LIVE_FRAME (frame
, 0);
1683 /* I think this should be done with a hook. */
1684 #ifdef HAVE_X_WINDOWS
1687 if (XINT (rows
) != f
->height
)
1688 x_set_window_size (f
, 1, f
->width
, XINT (rows
));
1692 change_frame_size (f
, XINT (rows
), 0, !NILP (pretend
), 0);
1696 DEFUN ("set-frame-width", Fset_frame_width
, Sset_frame_width
, 2, 3, 0,
1697 "Specify that the frame FRAME has COLS columns.\n\
1698 Optional third arg non-nil means that redisplay should use COLS columns\n\
1699 but that the idea of the actual width of the frame should not be changed.")
1700 (frame
, cols
, pretend
)
1701 Lisp_Object frame
, cols
, pretend
;
1703 register struct frame
*f
;
1704 CHECK_NUMBER (cols
, 0);
1709 CHECK_LIVE_FRAME (frame
, 0);
1713 /* I think this should be done with a hook. */
1714 #ifdef HAVE_X_WINDOWS
1717 if (XINT (cols
) != f
->width
)
1718 x_set_window_size (f
, 1, XINT (cols
), f
->height
);
1722 change_frame_size (f
, 0, XINT (cols
), !NILP (pretend
), 0);
1726 DEFUN ("set-frame-size", Fset_frame_size
, Sset_frame_size
, 3, 3, 0,
1727 "Sets size of FRAME to COLS by ROWS, measured in characters.")
1729 Lisp_Object frame
, cols
, rows
;
1731 register struct frame
*f
;
1734 CHECK_LIVE_FRAME (frame
, 0);
1735 CHECK_NUMBER (cols
, 2);
1736 CHECK_NUMBER (rows
, 1);
1739 /* I think this should be done with a hook. */
1740 #ifdef HAVE_X_WINDOWS
1743 if (XINT (rows
) != f
->height
|| XINT (cols
) != f
->width
)
1744 x_set_window_size (f
, 1, XINT (cols
), XINT (rows
));
1748 change_frame_size (f
, XINT (rows
), XINT (cols
), 0, 0);
1753 DEFUN ("set-frame-position", Fset_frame_position
,
1754 Sset_frame_position
, 3, 3, 0,
1755 "Sets position of FRAME in pixels to XOFFSET by YOFFSET.\n\
1756 This is actually the position of the upper left corner of the frame.\n\
1757 Negative values for XOFFSET or YOFFSET are interpreted relative to\n\
1758 the rightmost or bottommost possible position (that stays within the screen).")
1759 (frame
, xoffset
, yoffset
)
1760 Lisp_Object frame
, xoffset
, yoffset
;
1762 register struct frame
*f
;
1765 CHECK_LIVE_FRAME (frame
, 0);
1766 CHECK_NUMBER (xoffset
, 1);
1767 CHECK_NUMBER (yoffset
, 2);
1770 /* I think this should be done with a hook. */
1771 #ifdef HAVE_X_WINDOWS
1773 x_set_offset (f
, XINT (xoffset
), XINT (yoffset
), 1);
1780 choose_minibuf_frame ()
1782 /* For lowest-level minibuf, put it on currently selected frame
1783 if frame has a minibuffer. */
1785 if (minibuf_level
== 0
1786 && selected_frame
!= 0
1787 && !EQ (minibuf_window
, selected_frame
->minibuffer_window
))
1789 /* I don't think that any frames may validly have a null minibuffer
1791 if (NILP (selected_frame
->minibuffer_window
))
1794 Fset_window_buffer (selected_frame
->minibuffer_window
,
1795 XWINDOW (minibuf_window
)->buffer
);
1796 minibuf_window
= selected_frame
->minibuffer_window
;
1802 /*&&& init symbols here &&&*/
1803 Qframep
= intern ("framep");
1804 staticpro (&Qframep
);
1805 Qframe_live_p
= intern ("frame-live-p");
1806 staticpro (&Qframe_live_p
);
1807 Qheight
= intern ("height");
1808 staticpro (&Qheight
);
1809 Qicon
= intern ("icon");
1811 Qminibuffer
= intern ("minibuffer");
1812 staticpro (&Qminibuffer
);
1813 Qmodeline
= intern ("modeline");
1814 staticpro (&Qmodeline
);
1815 Qname
= intern ("name");
1817 Qonly
= intern ("only");
1819 Qunsplittable
= intern ("unsplittable");
1820 staticpro (&Qunsplittable
);
1821 Qmenu_bar_lines
= intern ("menu-bar-lines");
1822 staticpro (&Qmenu_bar_lines
);
1823 Qwidth
= intern ("width");
1824 staticpro (&Qwidth
);
1827 Qvisible
= intern ("visible");
1828 staticpro (&Qvisible
);
1829 Qbuffer_predicate
= intern ("buffer-predicate");
1830 staticpro (&Qbuffer_predicate
);
1832 staticpro (&Vframe_list
);
1834 DEFVAR_LISP ("terminal-frame", &Vterminal_frame
,
1835 "The initial frame-object, which represents Emacs's stdout.");
1837 DEFVAR_LISP ("emacs-iconified", &Vemacs_iconified
,
1838 "Non-nil if all of emacs is iconified and frame updates are not needed.");
1839 Vemacs_iconified
= Qnil
;
1841 DEFVAR_LISP ("default-minibuffer-frame", &Vdefault_minibuffer_frame
,
1842 "Minibufferless frames use this frame's minibuffer.\n\
1844 Emacs cannot create minibufferless frames unless this is set to an\n\
1845 appropriate surrogate.\n\
1847 Emacs consults this variable only when creating minibufferless\n\
1848 frames; once the frame is created, it sticks with its assigned\n\
1849 minibuffer, no matter what this variable is set to. This means that\n\
1850 this variable doesn't necessarily say anything meaningful about the\n\
1851 current set of frames, or where the minibuffer is currently being\n\
1853 Vdefault_minibuffer_frame
= Qnil
;
1855 DEFVAR_LISP ("default-frame-alist", &Vdefault_frame_alist
,
1856 "Alist of default values for frame creation.\n\
1857 These may be set in your init file, like this:\n\
1858 (setq default-frame-alist '((width . 80) (height . 55) (menu-bar-lines . 1))\n\
1859 These override values given in window system configuration data,\n\
1860 including X Windows' defaults database.\n\
1861 For values specific to the first Emacs frame, see `initial-frame-alist'.\n\
1862 For values specific to the separate minibuffer frame, see\n\
1863 `minibuffer-frame-alist'.\n\
1864 The `menu-bar-lines' element of the list controls whether new frames\n\
1865 have menu bars; `menu-bar-mode' works by altering this element.");
1866 Vdefault_frame_alist
= Qnil
;
1869 defsubr (&Sframe_live_p
);
1870 defsubr (&Smake_terminal_frame
);
1871 defsubr (&Shandle_switch_frame
);
1872 defsubr (&Sselect_frame
);
1873 defsubr (&Sselected_frame
);
1874 defsubr (&Swindow_frame
);
1875 defsubr (&Sframe_root_window
);
1876 defsubr (&Sframe_first_window
);
1877 defsubr (&Sframe_selected_window
);
1878 defsubr (&Sset_frame_selected_window
);
1879 defsubr (&Sframe_list
);
1880 defsubr (&Snext_frame
);
1881 defsubr (&Sprevious_frame
);
1882 defsubr (&Sdelete_frame
);
1883 defsubr (&Smouse_position
);
1884 defsubr (&Smouse_pixel_position
);
1885 defsubr (&Sset_mouse_position
);
1886 defsubr (&Sset_mouse_pixel_position
);
1888 defsubr (&Sframe_configuration
);
1889 defsubr (&Srestore_frame_configuration
);
1891 defsubr (&Smake_frame_visible
);
1892 defsubr (&Smake_frame_invisible
);
1893 defsubr (&Siconify_frame
);
1894 defsubr (&Sframe_visible_p
);
1895 defsubr (&Svisible_frame_list
);
1896 defsubr (&Sraise_frame
);
1897 defsubr (&Slower_frame
);
1898 defsubr (&Sredirect_frame_focus
);
1899 defsubr (&Sframe_focus
);
1900 defsubr (&Sframe_parameters
);
1901 defsubr (&Smodify_frame_parameters
);
1902 defsubr (&Sframe_char_height
);
1903 defsubr (&Sframe_char_width
);
1904 defsubr (&Sframe_pixel_height
);
1905 defsubr (&Sframe_pixel_width
);
1906 defsubr (&Sset_frame_height
);
1907 defsubr (&Sset_frame_width
);
1908 defsubr (&Sset_frame_size
);
1909 defsubr (&Sset_frame_position
);
1914 initial_define_lispy_key (global_map
, "switch-frame", "handle-switch-frame");
1915 initial_define_lispy_key (global_map
, "delete-frame", "handle-delete-frame");
1916 initial_define_lispy_key (global_map
, "iconify-frame", "ignore");
1917 initial_define_lispy_key (global_map
, "make-frame-visible", "ignore");
1920 #else /* not MULTI_FRAME */
1922 /* If we're not using multi-frame stuff, we still need to provide some
1923 support functions. */
1925 Lisp_Object Qheight
;
1926 Lisp_Object Qminibuffer
;
1927 Lisp_Object Qmodeline
;
1929 Lisp_Object Qunsplittable
;
1930 Lisp_Object Qmenu_bar_lines
;
1933 Lisp_Object Vterminal_frame
;
1935 /* Unless this function is defined, providing set-frame-height and
1936 set-frame-width doesn't help compatibility any, since they both
1937 want this as their first argument. */
1938 DEFUN ("selected-frame", Fselected_frame
, Sselected_frame
, 0, 0, 0,
1939 /* Don't confuse make-docfile by having two doc strings for this function.
1940 make-docfile does not pay attention to #if, for good reason! */
1944 /* For your possible information, this code is unfolded into the
1945 second WINDOW_FRAME in frame.h. */
1947 XSETFASTINT (tem
, 0);
1951 DEFUN ("window-frame", Fwindow_frame
, Swindow_frame
, 1, 1, 0,
1952 /* Don't confuse make-docfile by having two doc strings for this function.
1953 make-docfile does not pay attention to #if, for good reason! */
1958 /* For your possible information, this code is unfolded into the
1959 second WINDOW_FRAME in frame.h. */
1961 XSETFASTINT (tem
, 0);
1965 DEFUN ("frame-first-window", Fframe_first_window
, Sframe_first_window
, 0, 1, 0,
1972 w
= FRAME_ROOT_WINDOW (selected_frame
);
1974 while (NILP (XWINDOW (w
)->buffer
))
1976 if (! NILP (XWINDOW (w
)->hchild
))
1977 w
= XWINDOW (w
)->hchild
;
1978 else if (! NILP (XWINDOW (w
)->vchild
))
1979 w
= XWINDOW (w
)->vchild
;
1986 DEFUN ("framep", Fframep
, Sframep
, 1, 1, 0,
1987 /* Don't confuse make-docfile by having two doc strings for this function.
1988 make-docfile does not pay attention to #if, for good reason! */
1994 if (FRAME_X_P (object
))
1995 return intern ("pc");
2000 DEFUN ("set-frame-height", Fset_frame_height
, Sset_frame_height
, 2, 3, 0,
2001 /* Don't confuse make-docfile by having two doc strings for this function.
2002 make-docfile does not pay attention to #if, for good reason! */
2004 (frame
, rows
, pretend
)
2005 Lisp_Object frame
, rows
, pretend
;
2007 CHECK_NUMBER (rows
, 0);
2009 change_frame_size (0, XINT (rows
), 0, !NILP (pretend
), 0);
2013 DEFUN ("set-frame-width", Fset_frame_width
, Sset_frame_width
, 2, 3, 0,
2014 /* Don't confuse make-docfile by having two doc strings for this function.
2015 make-docfile does not pay attention to #if, for good reason! */
2017 (frame
, cols
, pretend
)
2018 Lisp_Object frame
, cols
, pretend
;
2020 CHECK_NUMBER (cols
, 0);
2022 change_frame_size (0, 0, XINT (cols
), !NILP (pretend
), 0);
2026 DEFUN ("set-frame-size", Fset_frame_size
, Sset_frame_size
, 3, 3, 0,
2027 /* Don't confuse make-docfile by having two doc strings for this function.
2028 make-docfile does not pay attention to #if, for good reason! */
2031 Lisp_Object frame
, cols
, rows
;
2033 CHECK_NUMBER (cols
, 2);
2034 CHECK_NUMBER (rows
, 1);
2036 change_frame_size (0, XINT (rows
), XINT (cols
), 0, 0);
2041 DEFUN ("frame-height", Fframe_height
, Sframe_height
, 0, 1, 0,
2042 "Return number of lines available for display on FRAME.\n\
2043 If FRAME is omitted, describe the currently selected frame.")
2047 return make_number (FRAME_HEIGHT (selected_frame
));
2050 DEFUN ("frame-width", Fframe_width
, Sframe_width
, 0, 1, 0,
2051 "Return number of columns available for display on FRAME.\n\
2052 If FRAME is omitted, describe the currently selected frame.")
2056 return make_number (FRAME_WIDTH (selected_frame
));
2059 DEFUN ("frame-char-height", Fframe_char_height
, Sframe_char_height
,
2061 /* Don't confuse make-docfile by having two doc strings for this function.
2062 make-docfile does not pay attention to #if, for good reason! */
2067 return make_number (1);
2071 DEFUN ("frame-char-width", Fframe_char_width
, Sframe_char_width
,
2073 /* Don't confuse make-docfile by having two doc strings for this function.
2074 make-docfile does not pay attention to #if, for good reason! */
2079 return make_number (1);
2082 DEFUN ("frame-pixel-height", Fframe_pixel_height
,
2083 Sframe_pixel_height
, 0, 1, 0,
2084 /* Don't confuse make-docfile by having two doc strings for this function.
2085 make-docfile does not pay attention to #if, for good reason! */
2090 return make_number (FRAME_HEIGHT (f
));
2093 DEFUN ("frame-pixel-width", Fframe_pixel_width
,
2094 Sframe_pixel_width
, 0, 1, 0,
2095 /* Don't confuse make-docfile by having two doc strings for this function.
2096 make-docfile does not pay attention to #if, for good reason! */
2101 return make_number (FRAME_WIDTH (f
));
2104 /* These are for backward compatibility with Emacs 18. */
2106 DEFUN ("set-screen-height", Fset_screen_height
, Sset_screen_height
, 1, 2, 0,
2107 "Tell redisplay that the screen has LINES lines.\n\
2108 Optional second arg non-nil means that redisplay should use LINES lines\n\
2109 but that the idea of the actual height of the screen should not be changed.")
2111 Lisp_Object lines
, pretend
;
2113 CHECK_NUMBER (lines
, 0);
2115 change_frame_size (0, XINT (lines
), 0, !NILP (pretend
), 0);
2119 DEFUN ("set-screen-width", Fset_screen_width
, Sset_screen_width
, 1, 2, 0,
2120 "Tell redisplay that the screen has COLS columns.\n\
2121 Optional second arg non-nil means that redisplay should use COLS columns\n\
2122 but that the idea of the actual width of the screen should not be changed.")
2124 Lisp_Object cols
, pretend
;
2126 CHECK_NUMBER (cols
, 0);
2128 change_frame_size (0, 0, XINT (cols
), !NILP (pretend
), 0);
2132 DEFUN ("mouse-position", Fmouse_position
, Smouse_position
, 0, 0, 0,
2133 /* Don't confuse make-docfile by having two doc strings for this function.
2134 make-docfile does not pay attention to #if, for good reason! */
2139 if (mouse_position_hook
)
2142 Lisp_Object lispy_dummy
;
2143 enum scroll_bar_part party_dummy
;
2145 unsigned long long_dummy
;
2147 (*mouse_position_hook
) (&f
,
2148 &lispy_dummy
, &party_dummy
,
2151 return Fcons (Fselected_frame (), Fcons (x
, y
));
2154 return Fcons (Qnil
, Fcons (Qnil
, Qnil
));
2158 store_in_alist (alistptr
, prop
, val
)
2159 Lisp_Object
*alistptr
, val
;
2162 register Lisp_Object tem
;
2164 tem
= Fassq (prop
, *alistptr
);
2166 *alistptr
= Fcons (Fcons (prop
, val
), *alistptr
);
2171 DEFUN ("frame-parameters", Fframe_parameters
, Sframe_parameters
, 0, 1, 0,
2172 /* Don't confuse make-docfile by having two doc strings for this function.
2173 make-docfile does not pay attention to #if, for good reason! */
2181 if (EQ (frame
, Qnil
))
2185 CHECK_FRAME (frame
, 0);
2189 if (!FRAME_LIVE_P (f
))
2196 static char *colornames
[16] =
2198 "black", "blue", "green", "cyan", "red", "magenta", "brown",
2199 "lightgray", "darkgray", "lightblue", "lightgreen", "lightcyan",
2200 "lightred", "lightmagenta", "yellow", "white"
2202 store_in_alist (&alist
, intern ("foreground-color"),
2203 build_string (colornames
[FRAME_FOREGROUND_PIXEL (f
)]));
2204 store_in_alist (&alist
, intern ("background-color"),
2205 build_string (colornames
[FRAME_BACKGROUND_PIXEL (f
)]));
2208 store_in_alist (&alist
, intern ("font"), build_string ("default"));
2209 store_in_alist (&alist
, Qname
, build_string ("emacs"));
2210 store_in_alist (&alist
, Qheight
, make_number (FRAME_HEIGHT (f
)));
2211 store_in_alist (&alist
, Qwidth
, make_number (FRAME_WIDTH (f
)));
2212 store_in_alist (&alist
, Qmodeline
, (FRAME_WANTS_MODELINE_P (f
) ? Qt
: Qnil
));
2213 store_in_alist (&alist
, Qminibuffer
, FRAME_MINIBUF_WINDOW (f
));
2214 store_in_alist (&alist
, Qunsplittable
, (FRAME_NO_SPLIT_P (f
) ? Qt
: Qnil
));
2215 store_in_alist (&alist
, Qmenu_bar_lines
, (FRAME_MENU_BAR_LINES (f
)));
2220 DEFUN ("modify-frame-parameters", Fmodify_frame_parameters
,
2221 Smodify_frame_parameters
, 2, 2, 0,
2222 /* Don't confuse make-docfile by having two doc strings for this function.
2223 make-docfile does not pay attention to #if, for good reason! */
2226 Lisp_Object frame
, alist
;
2229 if (FRAME_X_P (frame
))
2230 IT_set_frame_parameters (XFRAME (frame
), alist
);
2235 DEFUN ("frame-live-p", Fframe_live_p
, Sframe_live_p
, 1, 1, 0,
2236 /* Don't confuse make-docfile by having two doc strings for this function.
2237 make-docfile does not pay attention to #if, for good reason! */
2245 DEFUN ("frame-list", Fframe_list
, Sframe_list
, 0, 0, 0,
2246 /* Don't confuse make-docfile by having two doc strings for this function.
2247 make-docfile does not pay attention to #if, for good reason! */
2251 return Fcons (Fselected_frame (), Qnil
);
2256 Qheight
= intern ("height");
2257 staticpro (&Qheight
);
2258 Qminibuffer
= intern ("minibuffer");
2259 staticpro (&Qminibuffer
);
2260 Qmodeline
= intern ("modeline");
2261 staticpro (&Qmodeline
);
2262 Qname
= intern ("name");
2264 Qunsplittable
= intern ("unsplittable");
2265 staticpro (&Qunsplittable
);
2266 Qmenu_bar_lines
= intern ("menu-bar-lines");
2267 staticpro (&Qmenu_bar_lines
);
2268 Qwidth
= intern ("width");
2269 staticpro (&Qwidth
);
2271 DEFVAR_LISP ("terminal-frame", &Vterminal_frame
,
2272 "The initial frame-object, which represents Emacs's stdout.");
2273 XSETFASTINT (Vterminal_frame
, 0);
2275 defsubr (&Sselected_frame
);
2276 defsubr (&Swindow_frame
);
2277 defsubr (&Sframe_first_window
);
2279 defsubr (&Sframe_char_height
);
2280 defsubr (&Sframe_char_width
);
2281 defsubr (&Sframe_pixel_height
);
2282 defsubr (&Sframe_pixel_width
);
2283 defsubr (&Sset_frame_height
);
2284 defsubr (&Sset_frame_width
);
2285 defsubr (&Sset_frame_size
);
2286 defsubr (&Sset_screen_height
);
2287 defsubr (&Sset_screen_width
);
2288 defsubr (&Sframe_height
);
2289 Ffset (intern ("screen-height"), intern ("frame-height"));
2290 defsubr (&Sframe_width
);
2291 Ffset (intern ("screen-width"), intern ("frame-width"));
2292 defsubr (&Smouse_position
);
2293 defsubr (&Sframe_parameters
);
2294 defsubr (&Smodify_frame_parameters
);
2295 defsubr (&Sframe_live_p
);
2296 defsubr (&Sframe_list
);
2299 /* A comment in dispnew.c says the_only_frame is not protected. */
2300 the_only_frame
.face_alist
= Qnil
;
2301 staticpro (&the_only_frame
.face_alist
);
2302 the_only_frame
.menu_bar_items
= Qnil
;
2303 staticpro (&the_only_frame
.menu_bar_items
);
2304 the_only_frame
.menu_bar_vector
= Qnil
;
2305 staticpro (&the_only_frame
.menu_bar_vector
);
2306 the_only_frame
.menu_bar_items
= menu_bar_items (Qnil
);
2314 #endif /* not MULTI_FRAME */