1 /* Generic frame functions.
2 Copyright (C) 1993, 1994, 1995, 1997 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, Inc., 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. */
33 #ifdef HAVE_WINDOW_SYSTEM
36 #include "termhooks.h"
37 #include "dispextern.h"
43 /* Evaluate this expression to rebuild the section of syms_of_frame
44 that initializes and staticpros the symbols declared below. Note
45 that Emacs 18 has a bug that keeps C-x C-e from being able to
46 evaluate this expression.
49 ;; Accumulate a list of the symbols we want to initialize from the
50 ;; declarations at the top of the file.
51 (goto-char (point-min))
52 (search-forward "/\*&&& symbols declared here &&&*\/\n")
54 (while (looking-at "Lisp_Object \\(Q[a-z_]+\\)")
56 (cons (buffer-substring (match-beginning 1) (match-end 1))
59 (setq symbol-list (nreverse symbol-list))
60 ;; Delete the section of syms_of_... where we initialize the symbols.
61 (search-forward "\n /\*&&& init symbols here &&&*\/\n")
62 (let ((start (point)))
63 (while (looking-at "^ Q")
65 (kill-region start (point)))
66 ;; Write a new symbol initialization section.
68 (insert (format " %s = intern (\"" (car symbol-list)))
69 (let ((start (point)))
70 (insert (substring (car symbol-list) 1))
71 (subst-char-in-region start (point) ?_ ?-))
72 (insert (format "\");\n staticpro (&%s);\n" (car symbol-list)))
73 (setq symbol-list (cdr symbol-list)))))
76 /*&&& symbols declared here &&&*/
78 Lisp_Object Qframe_live_p
;
81 Lisp_Object Qminibuffer
;
82 Lisp_Object Qmodeline
;
85 Lisp_Object Qunsplittable
;
86 Lisp_Object Qmenu_bar_lines
;
87 Lisp_Object Qtoolbar_lines
;
93 Lisp_Object Qbuffer_predicate
;
94 Lisp_Object Qbuffer_list
;
97 Lisp_Object Vterminal_frame
;
98 Lisp_Object Vdefault_frame_alist
;
103 /*&&& init symbols here &&&*/
104 Qframep
= intern ("framep");
105 staticpro (&Qframep
);
106 Qframe_live_p
= intern ("frame-live-p");
107 staticpro (&Qframe_live_p
);
108 Qheight
= intern ("height");
109 staticpro (&Qheight
);
110 Qicon
= intern ("icon");
112 Qminibuffer
= intern ("minibuffer");
113 staticpro (&Qminibuffer
);
114 Qmodeline
= intern ("modeline");
115 staticpro (&Qmodeline
);
116 Qname
= intern ("name");
118 Qonly
= intern ("only");
120 Qunsplittable
= intern ("unsplittable");
121 staticpro (&Qunsplittable
);
122 Qmenu_bar_lines
= intern ("menu-bar-lines");
123 staticpro (&Qmenu_bar_lines
);
124 Qtoolbar_lines
= intern ("toolbar-lines");
125 staticpro (&Qtoolbar_lines
);
126 Qwidth
= intern ("width");
130 Qw32
= intern ("w32");
134 Qvisible
= intern ("visible");
135 staticpro (&Qvisible
);
136 Qbuffer_predicate
= intern ("buffer-predicate");
137 staticpro (&Qbuffer_predicate
);
138 Qbuffer_list
= intern ("buffer-list");
139 staticpro (&Qbuffer_list
);
140 Qtitle
= intern ("title");
143 DEFVAR_LISP ("default-frame-alist", &Vdefault_frame_alist
,
144 "Alist of default values for frame creation.\n\
145 These may be set in your init file, like this:\n\
146 (setq default-frame-alist '((width . 80) (height . 55) (menu-bar-lines . 1))\n\
147 These override values given in window system configuration data,\n\
148 including X Windows' defaults database.\n\
149 For values specific to the first Emacs frame, see `initial-frame-alist'.\n\
150 For values specific to the separate minibuffer frame, see\n\
151 `minibuffer-frame-alist'.\n\
152 The `menu-bar-lines' element of the list controls whether new frames\n\
153 have menu bars; `menu-bar-mode' works by altering this element.");
154 Vdefault_frame_alist
= Qnil
;
158 set_menu_bar_lines_1 (window
, n
)
162 struct window
*w
= XWINDOW (window
);
164 XSETFASTINT (w
->last_modified
, 0);
165 XSETFASTINT (w
->top
, XFASTINT (w
->top
) + n
);
166 XSETFASTINT (w
->height
, XFASTINT (w
->height
) - n
);
168 /* Handle just the top child in a vertical split. */
169 if (!NILP (w
->vchild
))
170 set_menu_bar_lines_1 (w
->vchild
, n
);
172 /* Adjust all children in a horizontal split. */
173 for (window
= w
->hchild
; !NILP (window
); window
= w
->next
)
175 w
= XWINDOW (window
);
176 set_menu_bar_lines_1 (window
, n
);
181 set_menu_bar_lines (f
, value
, oldval
)
183 Lisp_Object value
, oldval
;
186 int olines
= FRAME_MENU_BAR_LINES (f
);
188 /* Right now, menu bars don't work properly in minibuf-only frames;
189 most of the commands try to apply themselves to the minibuffer
190 frame itself, and get an error because you can't switch buffers
191 in or split the minibuffer window. */
192 if (FRAME_MINIBUF_ONLY_P (f
))
195 if (INTEGERP (value
))
196 nlines
= XINT (value
);
200 if (nlines
!= olines
)
202 windows_or_buffers_changed
++;
203 FRAME_WINDOW_SIZES_CHANGED (f
) = 1;
204 FRAME_MENU_BAR_LINES (f
) = nlines
;
205 set_menu_bar_lines_1 (f
->root_window
, nlines
- olines
);
212 /* These help us bind and responding to switch-frame events. */
213 #include "commands.h"
214 #include "keyboard.h"
216 Lisp_Object Vemacs_iconified
;
217 Lisp_Object Vframe_list
;
219 extern Lisp_Object Vminibuffer_list
;
220 extern Lisp_Object
get_minibuffer ();
221 extern Lisp_Object
Fhandle_switch_frame ();
222 extern Lisp_Object
Fredirect_frame_focus ();
223 extern Lisp_Object
x_get_focus_frame ();
225 DEFUN ("framep", Fframep
, Sframep
, 1, 1, 0,
226 "Return non-nil if OBJECT is a frame.\n\
227 Value is t for a termcap frame (a character-only terminal),\n\
228 `x' for an Emacs frame that is really an X window,\n\
229 `pc' for a direct-write MS-DOS frame.\n\
230 See also `frame-live-p'.")
234 if (!FRAMEP (object
))
236 switch (XFRAME (object
)->output_method
)
240 case output_x_window
:
244 case output_msdos_raw
:
251 DEFUN ("frame-live-p", Fframe_live_p
, Sframe_live_p
, 1, 1, 0,
252 "Return non-nil if OBJECT is a frame which has not been deleted.\n\
253 Value is nil if OBJECT is not a live frame. If object is a live\n\
254 frame, the return value indicates what sort of output device it is\n\
255 displayed on. Value is t for a termcap frame (a character-only\n\
256 terminal), `x' for an Emacs frame being displayed in an X window.")
260 return ((FRAMEP (object
)
261 && FRAME_LIVE_P (XFRAME (object
)))
271 register struct frame
*f
;
272 register Lisp_Object root_window
;
273 register Lisp_Object mini_window
;
274 register struct Lisp_Vector
*vec
;
277 vec
= allocate_vectorlike ((EMACS_INT
) VECSIZE (struct frame
));
278 for (i
= 0; i
< VECSIZE (struct frame
); i
++)
279 XSETFASTINT (vec
->contents
[i
], 0);
280 vec
->size
= VECSIZE (struct frame
);
281 f
= (struct frame
*)vec
;
282 XSETFRAME (frame
, f
);
284 f
->desired_matrix
= 0;
285 f
->current_matrix
= 0;
288 f
->glyphs_initialized_p
= 0;
289 f
->decode_mode_spec_buffer
= 0;
291 f
->async_visible
= 0;
292 f
->output_data
.nothing
= 0;
294 f
->async_iconified
= 0;
295 f
->wants_modeline
= 1;
300 f
->has_minibuffer
= mini_p
;
301 f
->focus_frame
= Qnil
;
302 f
->explicit_name
= 0;
303 f
->can_have_scroll_bars
= 0;
304 f
->vertical_scroll_bar_type
= vertical_scroll_bar_none
;
305 f
->param_alist
= Qnil
;
306 f
->scroll_bars
= Qnil
;
307 f
->condemned_scroll_bars
= Qnil
;
308 f
->face_alist
= Qnil
;
309 f
->face_cache
= NULL
;
310 f
->menu_bar_items
= Qnil
;
311 f
->menu_bar_vector
= Qnil
;
312 f
->menu_bar_items_used
= 0;
313 f
->buffer_predicate
= Qnil
;
314 f
->buffer_list
= Qnil
;
316 f
->kboard
= initial_kboard
;
320 f
->menu_bar_window
= Qnil
;
321 f
->toolbar_window
= Qnil
;
322 f
->desired_toolbar_items
= f
->current_toolbar_items
= Qnil
;
323 f
->desired_toolbar_string
= f
->current_toolbar_string
= Qnil
;
324 f
->n_desired_toolbar_items
= f
->n_current_toolbar_items
= 0;
326 root_window
= make_window ();
329 mini_window
= make_window ();
330 XWINDOW (root_window
)->next
= mini_window
;
331 XWINDOW (mini_window
)->prev
= root_window
;
332 XWINDOW (mini_window
)->mini_p
= Qt
;
333 XWINDOW (mini_window
)->frame
= frame
;
334 f
->minibuffer_window
= mini_window
;
339 XWINDOW (root_window
)->next
= Qnil
;
340 f
->minibuffer_window
= Qnil
;
343 XWINDOW (root_window
)->frame
= frame
;
346 just so that there is "something there."
347 Correct size will be set up later with change_frame_size. */
349 SET_FRAME_WIDTH (f
, 10);
352 XSETFASTINT (XWINDOW (root_window
)->width
, 10);
353 XSETFASTINT (XWINDOW (root_window
)->height
, (mini_p
? 9 : 10));
357 XSETFASTINT (XWINDOW (mini_window
)->width
, 10);
358 XSETFASTINT (XWINDOW (mini_window
)->top
, 9);
359 XSETFASTINT (XWINDOW (mini_window
)->height
, 1);
362 /* Choose a buffer for the frame's root window. */
366 XWINDOW (root_window
)->buffer
= Qt
;
367 buf
= Fcurrent_buffer ();
368 /* If buf is a 'hidden' buffer (i.e. one whose name starts with
369 a space), try to find another one. */
370 if (XSTRING (Fbuffer_name (buf
))->data
[0] == ' ')
371 buf
= Fother_buffer (buf
, Qnil
, Qnil
);
373 /* Use set_window_buffer, not Fset_window_buffer, and don't let
374 hooks be run by it. The reason is that the whole frame/window
375 arrangement is not yet fully intialized at this point. Windows
376 don't have the right size, glyph matrices aren't initialized
377 etc. Running Lisp functions at this point surely ends in a
379 set_window_buffer (root_window
, buf
, 0);
380 f
->buffer_list
= Fcons (buf
, Qnil
);
385 XWINDOW (mini_window
)->buffer
= Qt
;
386 set_window_buffer (mini_window
,
387 (NILP (Vminibuffer_list
)
389 : Fcar (Vminibuffer_list
)),
393 f
->root_window
= root_window
;
394 f
->selected_window
= root_window
;
395 /* Make sure this window seems more recently used than
396 a newly-created, never-selected window. */
397 XSETFASTINT (XWINDOW (f
->selected_window
)->use_time
, ++window_select_count
);
399 #ifdef HAVE_WINDOW_SYSTEM
400 f
->fontset_data
= alloc_fontset_data ();
406 #ifdef HAVE_WINDOW_SYSTEM
407 /* Make a frame using a separate minibuffer window on another frame.
408 MINI_WINDOW is the minibuffer window to use. nil means use the
409 default (the global minibuffer). */
412 make_frame_without_minibuffer (mini_window
, kb
, display
)
413 register Lisp_Object mini_window
;
417 register struct frame
*f
;
420 if (!NILP (mini_window
))
421 CHECK_LIVE_WINDOW (mini_window
, 0);
424 if (!NILP (mini_window
)
425 && XFRAME (XWINDOW (mini_window
)->frame
)->kboard
!= kb
)
426 error ("frame and minibuffer must be on the same display");
429 /* Make a frame containing just a root window. */
432 if (NILP (mini_window
))
434 /* Use default-minibuffer-frame if possible. */
435 if (!FRAMEP (kb
->Vdefault_minibuffer_frame
)
436 || ! FRAME_LIVE_P (XFRAME (kb
->Vdefault_minibuffer_frame
)))
438 Lisp_Object frame_dummy
;
440 XSETFRAME (frame_dummy
, f
);
441 GCPRO1 (frame_dummy
);
442 /* If there's no minibuffer frame to use, create one. */
443 kb
->Vdefault_minibuffer_frame
=
444 call1 (intern ("make-initial-minibuffer-frame"), display
);
448 mini_window
= XFRAME (kb
->Vdefault_minibuffer_frame
)->minibuffer_window
;
451 f
->minibuffer_window
= mini_window
;
453 /* Make the chosen minibuffer window display the proper minibuffer,
454 unless it is already showing a minibuffer. */
455 if (NILP (Fmemq (XWINDOW (mini_window
)->buffer
, Vminibuffer_list
)))
456 Fset_window_buffer (mini_window
,
457 (NILP (Vminibuffer_list
)
459 : Fcar (Vminibuffer_list
)));
463 /* Make a frame containing only a minibuffer window. */
466 make_minibuffer_frame ()
468 /* First make a frame containing just a root window, no minibuffer. */
470 register struct frame
*f
= make_frame (0);
471 register Lisp_Object mini_window
;
472 register Lisp_Object frame
;
474 XSETFRAME (frame
, f
);
479 f
->wants_modeline
= 0;
480 f
->has_minibuffer
= 1;
482 /* Now label the root window as also being the minibuffer.
483 Avoid infinite looping on the window chain by marking next pointer
486 mini_window
= f
->minibuffer_window
= f
->root_window
;
487 XWINDOW (mini_window
)->mini_p
= Qt
;
488 XWINDOW (mini_window
)->next
= Qnil
;
489 XWINDOW (mini_window
)->prev
= Qnil
;
490 XWINDOW (mini_window
)->frame
= frame
;
492 /* Put the proper buffer in that window. */
494 Fset_window_buffer (mini_window
,
495 (NILP (Vminibuffer_list
)
497 : Fcar (Vminibuffer_list
)));
500 #endif /* HAVE_WINDOW_SYSTEM */
502 /* Construct a frame that refers to the terminal (stdin and stdout). */
504 static int terminal_frame_count
;
507 make_terminal_frame ()
509 register struct frame
*f
;
516 initial_kboard
= (KBOARD
*) xmalloc (sizeof (KBOARD
));
517 init_kboard (initial_kboard
);
518 initial_kboard
->next_kboard
= all_kboards
;
519 all_kboards
= initial_kboard
;
523 /* The first call must initialize Vframe_list. */
524 if (! (NILP (Vframe_list
) || CONSP (Vframe_list
)))
529 XSETFRAME (frame
, f
);
530 Vframe_list
= Fcons (frame
, Vframe_list
);
532 terminal_frame_count
++;
533 sprintf (name
, "F%d", terminal_frame_count
);
534 f
->name
= build_string (name
);
536 f
->visible
= 1; /* FRAME_SET_VISIBLE wd set frame_garbaged. */
537 f
->async_visible
= 1; /* Don't let visible be cleared later. */
539 f
->output_data
.x
= &the_only_x_display
;
540 f
->output_method
= output_msdos_raw
;
541 #else /* not MSDOS */
542 f
->output_data
.nothing
= 1; /* Nonzero means frame isn't deleted. */
544 init_frame_faces (f
);
548 DEFUN ("make-terminal-frame", Fmake_terminal_frame
, Smake_terminal_frame
,
549 1, 1, 0, "Create an additional terminal frame.\n\
550 You can create multiple frames on a text-only terminal in this way.\n\
551 Only the selected terminal frame is actually displayed.\n\
552 This function takes one argument, an alist specifying frame parameters.\n\
553 In practice, generally you don't need to specify any parameters.\n\
554 Note that changing the size of one terminal frame automatically affects all.")
562 if (selected_frame
->output_method
!= output_msdos_raw
)
565 if (selected_frame
->output_method
!= output_termcap
)
566 error ("Not using an ASCII terminal now; cannot make a new ASCII frame");
569 f
= make_terminal_frame ();
570 change_frame_size (f
, FRAME_HEIGHT (selected_frame
),
571 FRAME_WIDTH (selected_frame
), 0, 0);
574 XSETFRAME (frame
, f
);
575 Fmodify_frame_parameters (frame
, Vdefault_frame_alist
);
576 Fmodify_frame_parameters (frame
, parms
);
577 f
->face_alist
= selected_frame
->face_alist
;
582 do_switch_frame (frame
, no_enter
, track
)
583 Lisp_Object frame
, no_enter
;
586 /* If FRAME is a switch-frame event, extract the frame we should
589 && EQ (XCONS (frame
)->car
, Qswitch_frame
)
590 && CONSP (XCONS (frame
)->cdr
))
591 frame
= XCONS (XCONS (frame
)->cdr
)->car
;
593 /* This used to say CHECK_LIVE_FRAME, but apparently it's possible for
594 a switch-frame event to arrive after a frame is no longer live,
595 especially when deleting the initial frame during startup. */
596 CHECK_FRAME (frame
, 0);
597 if (! FRAME_LIVE_P (XFRAME (frame
)))
600 if (selected_frame
== XFRAME (frame
))
603 /* This is too greedy; it causes inappropriate focus redirection
604 that's hard to get rid of. */
606 /* If a frame's focus has been redirected toward the currently
607 selected frame, we should change the redirection to point to the
608 newly selected frame. This means that if the focus is redirected
609 from a minibufferless frame to a surrogate minibuffer frame, we
610 can use `other-window' to switch between all the frames using
611 that minibuffer frame, and the focus redirection will follow us
617 for (tail
= Vframe_list
; CONSP (tail
); tail
= XCONS (tail
)->cdr
)
621 if (!FRAMEP (XCONS (tail
)->car
))
624 focus
= FRAME_FOCUS_FRAME (XFRAME (XCONS (tail
)->car
));
626 if (FRAMEP (focus
) && XFRAME (focus
) == selected_frame
)
627 Fredirect_frame_focus (XCONS (tail
)->car
, frame
);
631 /* Instead, apply it only to the frame we're pointing to. */
632 #ifdef HAVE_WINDOW_SYSTEM
633 if (track
&& (FRAME_WINDOW_P (XFRAME (frame
))))
635 Lisp_Object focus
, xfocus
;
637 xfocus
= x_get_focus_frame (XFRAME (frame
));
640 focus
= FRAME_FOCUS_FRAME (XFRAME (xfocus
));
641 if (FRAMEP (focus
) && XFRAME (focus
) == selected_frame
)
642 Fredirect_frame_focus (xfocus
, frame
);
645 #endif /* HAVE_X_WINDOWS */
648 selected_frame
= XFRAME (frame
);
649 if (! FRAME_MINIBUF_ONLY_P (selected_frame
))
650 last_nonminibuf_frame
= selected_frame
;
652 Fselect_window (XFRAME (frame
)->selected_window
);
654 /* We want to make sure that the next event generates a frame-switch
655 event to the appropriate frame. This seems kludgy to me, but
656 before you take it out, make sure that evaluating something like
657 (select-window (frame-root-window (new-frame))) doesn't end up
658 with your typing being interpreted in the new frame instead of
659 the one you're actually typing in. */
660 internal_last_event_frame
= Qnil
;
665 DEFUN ("select-frame", Fselect_frame
, Sselect_frame
, 1, 2, "e",
666 "Select the frame FRAME.\n\
667 Subsequent editing commands apply to its selected window.\n\
668 The selection of FRAME lasts until the next time the user does\n\
669 something to select a different frame, or until the next time this\n\
670 function is called.")
672 Lisp_Object frame
, no_enter
;
674 return do_switch_frame (frame
, no_enter
, 1);
678 DEFUN ("handle-switch-frame", Fhandle_switch_frame
, Shandle_switch_frame
, 1, 2, "e",
679 "Handle a switch-frame event EVENT.\n\
680 Switch-frame events are usually bound to this function.\n\
681 A switch-frame event tells Emacs that the window manager has requested\n\
682 that the user's events be directed to the frame mentioned in the event.\n\
683 This function selects the selected window of the frame of EVENT.\n\
685 If EVENT is frame object, handle it as if it were a switch-frame event\n\
688 Lisp_Object event
, no_enter
;
690 /* Preserve prefix arg that the command loop just cleared. */
691 current_kboard
->Vprefix_arg
= Vcurrent_prefix_arg
;
692 call1 (Vrun_hooks
, Qmouse_leave_buffer_hook
);
693 return do_switch_frame (event
, no_enter
, 0);
696 DEFUN ("ignore-event", Fignore_event
, Signore_event
, 0, 0, "",
697 "Do nothing, but preserve any prefix argument already specified.\n\
698 This is a suitable binding for iconify-frame and make-frame-visible.")
701 current_kboard
->Vprefix_arg
= Vcurrent_prefix_arg
;
705 DEFUN ("selected-frame", Fselected_frame
, Sselected_frame
, 0, 0, 0,
706 "Return the frame that is now selected.")
710 XSETFRAME (tem
, selected_frame
);
714 DEFUN ("window-frame", Fwindow_frame
, Swindow_frame
, 1, 1, 0,
715 "Return the frame object that window WINDOW is on.")
719 CHECK_LIVE_WINDOW (window
, 0);
720 return XWINDOW (window
)->frame
;
723 DEFUN ("frame-first-window", Fframe_first_window
, Sframe_first_window
, 0, 1, 0,
724 "Returns the topmost, leftmost window of FRAME.\n\
725 If omitted, FRAME defaults to the currently selected frame.")
732 w
= selected_frame
->root_window
;
735 CHECK_LIVE_FRAME (frame
, 0);
736 w
= XFRAME (frame
)->root_window
;
738 while (NILP (XWINDOW (w
)->buffer
))
740 if (! NILP (XWINDOW (w
)->hchild
))
741 w
= XWINDOW (w
)->hchild
;
742 else if (! NILP (XWINDOW (w
)->vchild
))
743 w
= XWINDOW (w
)->vchild
;
750 DEFUN ("active-minibuffer-window", Factive_minibuffer_window
,
751 Sactive_minibuffer_window
, 0, 0, 0,
752 "Return the currently active minibuffer window, or nil if none.")
755 return minibuf_level
? minibuf_window
: Qnil
;
758 DEFUN ("frame-root-window", Fframe_root_window
, Sframe_root_window
, 0, 1, 0,
759 "Returns the root-window of FRAME.\n\
760 If omitted, FRAME defaults to the currently selected frame.")
765 XSETFRAME (frame
, selected_frame
);
767 CHECK_LIVE_FRAME (frame
, 0);
769 return XFRAME (frame
)->root_window
;
772 DEFUN ("frame-selected-window", Fframe_selected_window
,
773 Sframe_selected_window
, 0, 1, 0,
774 "Return the selected window of frame object FRAME.\n\
775 If omitted, FRAME defaults to the currently selected frame.")
780 XSETFRAME (frame
, selected_frame
);
782 CHECK_LIVE_FRAME (frame
, 0);
784 return XFRAME (frame
)->selected_window
;
787 DEFUN ("set-frame-selected-window", Fset_frame_selected_window
,
788 Sset_frame_selected_window
, 2, 2, 0,
789 "Set the selected window of frame object FRAME to WINDOW.\n\
790 If FRAME is nil, the selected frame is used.\n\
791 If FRAME is the selected frame, this makes WINDOW the selected window.")
793 Lisp_Object frame
, window
;
796 XSETFRAME (frame
, selected_frame
);
798 CHECK_LIVE_FRAME (frame
, 0);
800 CHECK_LIVE_WINDOW (window
, 1);
802 if (! EQ (frame
, WINDOW_FRAME (XWINDOW (window
))))
803 error ("In `set-frame-selected-window', WINDOW is not on FRAME");
805 if (XFRAME (frame
) == selected_frame
)
806 return Fselect_window (window
);
808 return XFRAME (frame
)->selected_window
= window
;
811 DEFUN ("frame-list", Fframe_list
, Sframe_list
,
813 "Return a list of all frames.")
816 return Fcopy_sequence (Vframe_list
);
819 /* Return the next frame in the frame list after FRAME.
820 If MINIBUF is nil, exclude minibuffer-only frames.
821 If MINIBUF is a window, include only its own frame
822 and any frame now using that window as the minibuffer.
823 If MINIBUF is `visible', include all visible frames.
824 If MINIBUF is 0, include all visible and iconified frames.
825 Otherwise, include all frames. */
828 next_frame (frame
, minibuf
)
835 /* There must always be at least one frame in Vframe_list. */
836 if (! CONSP (Vframe_list
))
839 /* If this frame is dead, it won't be in Vframe_list, and we'll loop
840 forever. Forestall that. */
841 CHECK_LIVE_FRAME (frame
, 0);
844 for (tail
= Vframe_list
; CONSP (tail
); tail
= XCONS (tail
)->cdr
)
848 f
= XCONS (tail
)->car
;
851 && FRAME_KBOARD (XFRAME (f
)) == FRAME_KBOARD (XFRAME (frame
)))
853 /* Decide whether this frame is eligible to be returned. */
855 /* If we've looped all the way around without finding any
856 eligible frames, return the original frame. */
860 /* Let minibuf decide if this frame is acceptable. */
863 if (! FRAME_MINIBUF_ONLY_P (XFRAME (f
)))
866 else if (EQ (minibuf
, Qvisible
))
868 FRAME_SAMPLE_VISIBILITY (XFRAME (f
));
869 if (FRAME_VISIBLE_P (XFRAME (f
)))
872 else if (XFASTINT (minibuf
) == 0)
874 FRAME_SAMPLE_VISIBILITY (XFRAME (f
));
875 if (FRAME_VISIBLE_P (XFRAME (f
))
876 || FRAME_ICONIFIED_P (XFRAME (f
)))
879 else if (WINDOWP (minibuf
))
881 if (EQ (FRAME_MINIBUF_WINDOW (XFRAME (f
)), minibuf
)
882 /* Check that F either is, or has forwarded its focus to,
884 && (EQ (WINDOW_FRAME (XWINDOW (minibuf
)), f
)
885 || EQ (WINDOW_FRAME (XWINDOW (minibuf
)),
886 FRAME_FOCUS_FRAME (XFRAME (f
)))))
898 /* Return the previous frame in the frame list before FRAME.
899 If MINIBUF is nil, exclude minibuffer-only frames.
900 If MINIBUF is a window, include only its own frame
901 and any frame now using that window as the minibuffer.
902 If MINIBUF is `visible', include all visible frames.
903 If MINIBUF is 0, include all visible and iconified frames.
904 Otherwise, include all frames. */
907 prev_frame (frame
, minibuf
)
914 /* There must always be at least one frame in Vframe_list. */
915 if (! CONSP (Vframe_list
))
919 for (tail
= Vframe_list
; CONSP (tail
); tail
= XCONS (tail
)->cdr
)
923 f
= XCONS (tail
)->car
;
927 if (EQ (frame
, f
) && !NILP (prev
))
930 if (FRAME_KBOARD (XFRAME (f
)) == FRAME_KBOARD (XFRAME (frame
)))
932 /* Decide whether this frame is eligible to be returned,
933 according to minibuf. */
936 if (! FRAME_MINIBUF_ONLY_P (XFRAME (f
)))
939 else if (WINDOWP (minibuf
))
941 if (EQ (FRAME_MINIBUF_WINDOW (XFRAME (f
)), minibuf
)
942 /* Check that F either is, or has forwarded its focus to,
944 && (EQ (WINDOW_FRAME (XWINDOW (minibuf
)), f
)
945 || EQ (WINDOW_FRAME (XWINDOW (minibuf
)),
946 FRAME_FOCUS_FRAME (XFRAME (f
)))))
949 else if (EQ (minibuf
, Qvisible
))
951 FRAME_SAMPLE_VISIBILITY (XFRAME (f
));
952 if (FRAME_VISIBLE_P (XFRAME (f
)))
955 else if (XFASTINT (minibuf
) == 0)
957 FRAME_SAMPLE_VISIBILITY (XFRAME (f
));
958 if (FRAME_VISIBLE_P (XFRAME (f
))
959 || FRAME_ICONIFIED_P (XFRAME (f
)))
967 /* We've scanned the entire list. */
969 /* We went through the whole frame list without finding a single
970 acceptable frame. Return the original frame. */
973 /* There were no acceptable frames in the list before FRAME; otherwise,
974 we would have returned directly from the loop. Since PREV is the last
975 acceptable frame in the list, return it. */
980 DEFUN ("next-frame", Fnext_frame
, Snext_frame
, 0, 2, 0,
981 "Return the next frame in the frame list after FRAME.\n\
982 It considers only frames on the same terminal as FRAME.\n\
983 By default, skip minibuffer-only frames.\n\
984 If omitted, FRAME defaults to the selected frame.\n\
985 If optional argument MINIFRAME is nil, exclude minibuffer-only frames.\n\
986 If MINIFRAME is a window, include only its own frame\n\
987 and any frame now using that window as the minibuffer.\n\
988 If MINIFRAME is `visible', include all visible frames.\n\
989 If MINIFRAME is 0, include all visible and iconified frames.\n\
990 Otherwise, include all frames.")
992 Lisp_Object frame
, miniframe
;
997 XSETFRAME (frame
, selected_frame
);
999 CHECK_LIVE_FRAME (frame
, 0);
1001 return next_frame (frame
, miniframe
);
1004 DEFUN ("previous-frame", Fprevious_frame
, Sprevious_frame
, 0, 2, 0,
1005 "Return the previous frame in the frame list before FRAME.\n\
1006 It considers only frames on the same terminal as FRAME.\n\
1007 By default, skip minibuffer-only frames.\n\
1008 If omitted, FRAME defaults to the selected frame.\n\
1009 If optional argument MINIFRAME is nil, exclude minibuffer-only frames.\n\
1010 If MINIFRAME is a window, include only its own frame\n\
1011 and any frame now using that window as the minibuffer.\n\
1012 If MINIFRAME is `visible', include all visible frames.\n\
1013 If MINIFRAME is 0, include all visible and iconified frames.\n\
1014 Otherwise, include all frames.")
1016 Lisp_Object frame
, miniframe
;
1021 XSETFRAME (frame
, selected_frame
);
1023 CHECK_LIVE_FRAME (frame
, 0);
1025 return prev_frame (frame
, miniframe
);
1028 /* Return 1 if it is ok to delete frame F;
1029 0 if all frames aside from F are invisible.
1030 (Exception: if F is the terminal frame, and we are using X, return 1.) */
1033 other_visible_frames (f
)
1036 /* We know the selected frame is visible,
1037 so if F is some other frame, it can't be the sole visible one. */
1038 if (f
== selected_frame
)
1043 for (frames
= Vframe_list
;
1045 frames
= XCONS (frames
)->cdr
)
1049 this = XCONS (frames
)->car
;
1050 /* Verify that the frame's window still exists
1051 and we can still talk to it. And note any recent change
1053 #ifdef HAVE_WINDOW_SYSTEM
1054 if (FRAME_WINDOW_P (XFRAME (this)))
1056 x_sync (XFRAME (this));
1057 FRAME_SAMPLE_VISIBILITY (XFRAME (this));
1061 if (FRAME_VISIBLE_P (XFRAME (this))
1062 || FRAME_ICONIFIED_P (XFRAME (this))
1063 /* Allow deleting the terminal frame when at least
1064 one X frame exists! */
1065 || (FRAME_WINDOW_P (XFRAME (this)) && !FRAME_WINDOW_P (f
)))
1073 DEFUN ("delete-frame", Fdelete_frame
, Sdelete_frame
, 0, 2, "",
1074 "Delete FRAME, permanently eliminating it from use.\n\
1075 If omitted, FRAME defaults to the selected frame.\n\
1076 A frame may not be deleted if its minibuffer is used by other frames.\n\
1077 Normally, you may not delete a frame if all other frames are invisible,\n\
1078 but if the second optional argument FORCE is non-nil, you may do so.")
1080 Lisp_Object frame
, force
;
1083 int minibuffer_selected
;
1085 if (EQ (frame
, Qnil
))
1088 XSETFRAME (frame
, f
);
1092 CHECK_FRAME (frame
, 0);
1096 if (! FRAME_LIVE_P (f
))
1099 if (NILP (force
) && !other_visible_frames (f
))
1100 error ("Attempt to delete the sole visible or iconified frame");
1103 /* This is a nice idea, but x_connection_closed needs to be able
1104 to delete the last frame, if it is gone. */
1105 if (NILP (XCONS (Vframe_list
)->cdr
))
1106 error ("Attempt to delete the only frame");
1109 /* Does this frame have a minibuffer, and is it the surrogate
1110 minibuffer for any other frame? */
1111 if (FRAME_HAS_MINIBUF_P (XFRAME (frame
)))
1115 for (frames
= Vframe_list
;
1117 frames
= XCONS (frames
)->cdr
)
1120 this = XCONS (frames
)->car
;
1122 if (! EQ (this, frame
)
1124 WINDOW_FRAME (XWINDOW
1125 (FRAME_MINIBUF_WINDOW (XFRAME (this))))))
1126 error ("Attempt to delete a surrogate minibuffer frame");
1130 minibuffer_selected
= EQ (minibuf_window
, selected_window
);
1132 /* Don't let the frame remain selected. */
1133 if (f
== selected_frame
)
1135 Lisp_Object tail
, frame1
;
1137 /* Look for another visible frame on the same terminal. */
1138 frame1
= next_frame (frame
, Qvisible
);
1140 /* If there is none, find *some* other frame. */
1141 if (NILP (frame1
) || EQ (frame1
, frame
))
1143 FOR_EACH_FRAME (tail
, frame1
)
1145 if (! EQ (frame
, frame1
))
1150 do_switch_frame (frame1
, Qnil
, 0);
1153 /* Don't allow minibuf_window to remain on a deleted frame. */
1154 if (EQ (f
->minibuffer_window
, minibuf_window
))
1156 Fset_window_buffer (selected_frame
->minibuffer_window
,
1157 XWINDOW (minibuf_window
)->buffer
);
1158 minibuf_window
= selected_frame
->minibuffer_window
;
1160 /* If the dying minibuffer window was selected,
1161 select the new one. */
1162 if (minibuffer_selected
)
1163 Fselect_window (minibuf_window
);
1166 /* Clear any X selections for this frame. */
1167 #ifdef HAVE_X_WINDOWS
1169 x_clear_frame_selections (f
);
1173 This function must be called before the window tree of the
1174 frame is deleted because windows contain dynamically allocated
1178 /* Mark all the windows that used to be on FRAME as deleted, and then
1179 remove the reference to them. */
1180 delete_all_subwindows (XWINDOW (f
->root_window
));
1181 f
->root_window
= Qnil
;
1183 Vframe_list
= Fdelq (frame
, Vframe_list
);
1184 FRAME_SET_VISIBLE (f
, 0);
1186 if (echo_area_glyphs
== FRAME_MESSAGE_BUF (f
))
1188 echo_area_glyphs
= 0;
1189 previous_echo_glyphs
= 0;
1194 if (FRAME_INSERT_COST (f
))
1195 xfree (FRAME_INSERT_COST (f
));
1196 if (FRAME_DELETEN_COST (f
))
1197 xfree (FRAME_DELETEN_COST (f
));
1198 if (FRAME_INSERTN_COST (f
))
1199 xfree (FRAME_INSERTN_COST (f
));
1200 if (FRAME_DELETE_COST (f
))
1201 xfree (FRAME_DELETE_COST (f
));
1202 if (FRAME_MESSAGE_BUF (f
))
1203 xfree (FRAME_MESSAGE_BUF (f
));
1205 #ifdef HAVE_WINDOW_SYSTEM
1206 /* Free all fontset data. */
1207 free_fontset_data (FRAME_FONTSET_DATA (f
));
1210 /* Since some events are handled at the interrupt level, we may get
1211 an event for f at any time; if we zero out the frame's display
1212 now, then we may trip up the event-handling code. Instead, we'll
1213 promise that the display of the frame must be valid until we have
1214 called the window-system-dependent frame destruction routine. */
1216 /* I think this should be done with a hook. */
1217 #ifdef HAVE_WINDOW_SYSTEM
1218 if (FRAME_WINDOW_P (f
))
1219 x_destroy_window (f
);
1222 f
->output_data
.nothing
= 0;
1224 /* If we've deleted the last_nonminibuf_frame, then try to find
1226 if (f
== last_nonminibuf_frame
)
1230 last_nonminibuf_frame
= 0;
1232 for (frames
= Vframe_list
;
1234 frames
= XCONS (frames
)->cdr
)
1236 f
= XFRAME (XCONS (frames
)->car
);
1237 if (!FRAME_MINIBUF_ONLY_P (f
))
1239 last_nonminibuf_frame
= f
;
1245 /* If we've deleted this keyboard's default_minibuffer_frame, try to
1246 find another one. Prefer minibuffer-only frames, but also notice
1247 frames with other windows. */
1248 if (EQ (frame
, FRAME_KBOARD (f
)->Vdefault_minibuffer_frame
))
1252 /* The last frame we saw with a minibuffer, minibuffer-only or not. */
1253 Lisp_Object frame_with_minibuf
;
1254 /* Some frame we found on the same kboard, or nil if there are none. */
1255 Lisp_Object frame_on_same_kboard
;
1257 frame_on_same_kboard
= Qnil
;
1258 frame_with_minibuf
= Qnil
;
1260 for (frames
= Vframe_list
;
1262 frames
= XCONS (frames
)->cdr
)
1267 this = XCONS (frames
)->car
;
1272 /* Consider only frames on the same kboard
1273 and only those with minibuffers. */
1274 if (FRAME_KBOARD (f
) == FRAME_KBOARD (f1
)
1275 && FRAME_HAS_MINIBUF_P (f1
))
1277 frame_with_minibuf
= this;
1278 if (FRAME_MINIBUF_ONLY_P (f1
))
1282 if (FRAME_KBOARD (f
) == FRAME_KBOARD (f1
))
1283 frame_on_same_kboard
= this;
1286 if (!NILP (frame_on_same_kboard
))
1288 /* We know that there must be some frame with a minibuffer out
1289 there. If this were not true, all of the frames present
1290 would have to be minibufferless, which implies that at some
1291 point their minibuffer frames must have been deleted, but
1292 that is prohibited at the top; you can't delete surrogate
1293 minibuffer frames. */
1294 if (NILP (frame_with_minibuf
))
1297 FRAME_KBOARD (f
)->Vdefault_minibuffer_frame
= frame_with_minibuf
;
1300 /* No frames left on this kboard--say no minibuffer either. */
1301 FRAME_KBOARD (f
)->Vdefault_minibuffer_frame
= Qnil
;
1304 /* Cause frame titles to update--necessary if we now have just one frame. */
1305 update_mode_lines
= 1;
1310 /* Return mouse position in character cell units. */
1312 DEFUN ("mouse-position", Fmouse_position
, Smouse_position
, 0, 0, 0,
1313 "Return a list (FRAME X . Y) giving the current mouse frame and position.\n\
1314 The position is given in character cells, where (0, 0) is the\n\
1315 upper-left corner.\n\
1316 If Emacs is running on a mouseless terminal or hasn't been programmed\n\
1317 to read the mouse position, it returns the selected frame for FRAME\n\
1318 and nil for X and Y.")
1322 Lisp_Object lispy_dummy
;
1323 enum scroll_bar_part party_dummy
;
1326 unsigned long long_dummy
;
1332 /* It's okay for the hook to refrain from storing anything. */
1333 if (mouse_position_hook
)
1334 (*mouse_position_hook
) (&f
, -1,
1335 &lispy_dummy
, &party_dummy
,
1342 pixel_to_glyph_coords (f
, col
, row
, &col
, &row
, NULL
, 1);
1347 XSETFRAME (lispy_dummy
, f
);
1348 return Fcons (lispy_dummy
, Fcons (x
, y
));
1351 DEFUN ("mouse-pixel-position", Fmouse_pixel_position
,
1352 Smouse_pixel_position
, 0, 0, 0,
1353 "Return a list (FRAME X . Y) giving the current mouse frame and position.\n\
1354 The position is given in pixel units, where (0, 0) is the\n\
1355 upper-left corner.\n\
1356 If Emacs is running on a mouseless terminal or hasn't been programmed\n\
1357 to read the mouse position, it returns the selected frame for FRAME\n\
1358 and nil for X and Y.")
1362 Lisp_Object lispy_dummy
;
1363 enum scroll_bar_part party_dummy
;
1366 unsigned long long_dummy
;
1372 /* It's okay for the hook to refrain from storing anything. */
1373 if (mouse_position_hook
)
1374 (*mouse_position_hook
) (&f
, -1,
1375 &lispy_dummy
, &party_dummy
,
1379 XSETFRAME (lispy_dummy
, f
);
1380 return Fcons (lispy_dummy
, Fcons (x
, y
));
1383 DEFUN ("set-mouse-position", Fset_mouse_position
, Sset_mouse_position
, 3, 3, 0,
1384 "Move the mouse pointer to the center of character cell (X,Y) in FRAME.\n\
1385 Coordinates are relative to the frame, not a window,\n\
1386 so the coordinates of the top left character in the frame\n\
1387 may be nonzero due to left-hand scroll bars or the menu bar.\n\
1389 This function is a no-op for an X frame that is not visible.\n\
1390 If you have just created a frame, you must wait for it to become visible\n\
1391 before calling this function on it, like this.\n\
1392 (while (not (frame-visible-p frame)) (sleep-for .5))")
1394 Lisp_Object frame
, x
, y
;
1396 CHECK_LIVE_FRAME (frame
, 0);
1397 CHECK_NUMBER (x
, 2);
1398 CHECK_NUMBER (y
, 1);
1400 /* I think this should be done with a hook. */
1401 #ifdef HAVE_WINDOW_SYSTEM
1402 if (FRAME_WINDOW_P (XFRAME (frame
)))
1403 /* Warping the mouse will cause enternotify and focus events. */
1404 x_set_mouse_position (XFRAME (frame
), XINT (x
), XINT (y
));
1406 #if defined (MSDOS) && defined (HAVE_MOUSE)
1407 if (FRAME_MSDOS_P (XFRAME (frame
)))
1409 Fselect_frame (frame
, Qnil
);
1410 mouse_moveto (XINT (x
), XINT (y
));
1418 DEFUN ("set-mouse-pixel-position", Fset_mouse_pixel_position
,
1419 Sset_mouse_pixel_position
, 3, 3, 0,
1420 "Move the mouse pointer to pixel position (X,Y) in FRAME.\n\
1421 Note, this is a no-op for an X frame that is not visible.\n\
1422 If you have just created a frame, you must wait for it to become visible\n\
1423 before calling this function on it, like this.\n\
1424 (while (not (frame-visible-p frame)) (sleep-for .5))")
1426 Lisp_Object frame
, x
, y
;
1428 CHECK_LIVE_FRAME (frame
, 0);
1429 CHECK_NUMBER (x
, 2);
1430 CHECK_NUMBER (y
, 1);
1432 /* I think this should be done with a hook. */
1433 #ifdef HAVE_WINDOW_SYSTEM
1434 if (FRAME_WINDOW_P (XFRAME (frame
)))
1435 /* Warping the mouse will cause enternotify and focus events. */
1436 x_set_mouse_pixel_position (XFRAME (frame
), XINT (x
), XINT (y
));
1438 #if defined (MSDOS) && defined (HAVE_MOUSE)
1439 if (FRAME_MSDOS_P (XFRAME (frame
)))
1441 Fselect_frame (frame
, Qnil
);
1442 mouse_moveto (XINT (x
), XINT (y
));
1450 static void make_frame_visible_1
P_ ((Lisp_Object
));
1452 DEFUN ("make-frame-visible", Fmake_frame_visible
, Smake_frame_visible
,
1454 "Make the frame FRAME visible (assuming it is an X-window).\n\
1455 If omitted, FRAME defaults to the currently selected frame.")
1460 XSETFRAME (frame
, selected_frame
);
1462 CHECK_LIVE_FRAME (frame
, 0);
1464 /* I think this should be done with a hook. */
1465 #ifdef HAVE_WINDOW_SYSTEM
1466 if (FRAME_WINDOW_P (XFRAME (frame
)))
1468 FRAME_SAMPLE_VISIBILITY (XFRAME (frame
));
1469 x_make_frame_visible (XFRAME (frame
));
1473 make_frame_visible_1 (XFRAME (frame
)->root_window
);
1475 /* Make menu bar update for the Buffers and Frams menus. */
1476 windows_or_buffers_changed
++;
1481 /* Update the display_time slot of the buffers shown in WINDOW
1482 and all its descendents. */
1485 make_frame_visible_1 (window
)
1490 for (;!NILP (window
); window
= w
->next
)
1492 w
= XWINDOW (window
);
1494 if (!NILP (w
->buffer
))
1495 XBUFFER (w
->buffer
)->display_time
= Fcurrent_time ();
1497 if (!NILP (w
->vchild
))
1498 make_frame_visible_1 (w
->vchild
);
1499 if (!NILP (w
->hchild
))
1500 make_frame_visible_1 (w
->hchild
);
1504 DEFUN ("make-frame-invisible", Fmake_frame_invisible
, Smake_frame_invisible
,
1506 "Make the frame FRAME invisible (assuming it is an X-window).\n\
1507 If omitted, FRAME defaults to the currently selected frame.\n\
1508 Normally you may not make FRAME invisible if all other frames are invisible,\n\
1509 but if the second optional argument FORCE is non-nil, you may do so.")
1511 Lisp_Object frame
, force
;
1514 XSETFRAME (frame
, selected_frame
);
1516 CHECK_LIVE_FRAME (frame
, 0);
1518 if (NILP (force
) && !other_visible_frames (XFRAME (frame
)))
1519 error ("Attempt to make invisible the sole visible or iconified frame");
1521 #if 0 /* This isn't logically necessary, and it can do GC. */
1522 /* Don't let the frame remain selected. */
1523 if (XFRAME (frame
) == selected_frame
)
1524 do_switch_frame (next_frame (frame
, Qt
), Qnil
, 0)
1527 /* Don't allow minibuf_window to remain on a deleted frame. */
1528 if (EQ (XFRAME (frame
)->minibuffer_window
, minibuf_window
))
1530 Fset_window_buffer (selected_frame
->minibuffer_window
,
1531 XWINDOW (minibuf_window
)->buffer
);
1532 minibuf_window
= selected_frame
->minibuffer_window
;
1535 /* I think this should be done with a hook. */
1536 #ifdef HAVE_WINDOW_SYSTEM
1537 if (FRAME_WINDOW_P (XFRAME (frame
)))
1538 x_make_frame_invisible (XFRAME (frame
));
1541 /* Make menu bar update for the Buffers and Frams menus. */
1542 windows_or_buffers_changed
++;
1547 DEFUN ("iconify-frame", Ficonify_frame
, Siconify_frame
,
1549 "Make the frame FRAME into an icon.\n\
1550 If omitted, FRAME defaults to the currently selected frame.")
1555 XSETFRAME (frame
, selected_frame
);
1557 CHECK_LIVE_FRAME (frame
, 0);
1559 #if 0 /* This isn't logically necessary, and it can do GC. */
1560 /* Don't let the frame remain selected. */
1561 if (XFRAME (frame
) == selected_frame
)
1562 Fhandle_switch_frame (next_frame (frame
, Qt
), Qnil
);
1565 /* Don't allow minibuf_window to remain on a deleted frame. */
1566 if (EQ (XFRAME (frame
)->minibuffer_window
, minibuf_window
))
1568 Fset_window_buffer (selected_frame
->minibuffer_window
,
1569 XWINDOW (minibuf_window
)->buffer
);
1570 minibuf_window
= selected_frame
->minibuffer_window
;
1573 /* I think this should be done with a hook. */
1574 #ifdef HAVE_WINDOW_SYSTEM
1575 if (FRAME_WINDOW_P (XFRAME (frame
)))
1576 x_iconify_frame (XFRAME (frame
));
1579 /* Make menu bar update for the Buffers and Frams menus. */
1580 windows_or_buffers_changed
++;
1585 DEFUN ("frame-visible-p", Fframe_visible_p
, Sframe_visible_p
,
1587 "Return t if FRAME is now \"visible\" (actually in use for display).\n\
1588 A frame that is not \"visible\" is not updated and, if it works through\n\
1589 a window system, it may not show at all.\n\
1590 Return the symbol `icon' if frame is visible only as an icon.")
1594 CHECK_LIVE_FRAME (frame
, 0);
1596 FRAME_SAMPLE_VISIBILITY (XFRAME (frame
));
1598 if (FRAME_VISIBLE_P (XFRAME (frame
)))
1600 if (FRAME_ICONIFIED_P (XFRAME (frame
)))
1605 DEFUN ("visible-frame-list", Fvisible_frame_list
, Svisible_frame_list
,
1607 "Return a list of all frames now \"visible\" (being updated).")
1610 Lisp_Object tail
, frame
;
1615 for (tail
= Vframe_list
; CONSP (tail
); tail
= XCONS (tail
)->cdr
)
1617 frame
= XCONS (tail
)->car
;
1618 if (!FRAMEP (frame
))
1621 if (FRAME_VISIBLE_P (f
))
1622 value
= Fcons (frame
, value
);
1628 DEFUN ("raise-frame", Fraise_frame
, Sraise_frame
, 0, 1, "",
1629 "Bring FRAME to the front, so it occludes any frames it overlaps.\n\
1630 If FRAME is invisible, make it visible.\n\
1631 If you don't specify a frame, the selected frame is used.\n\
1632 If Emacs is displaying on an ordinary terminal or some other device which\n\
1633 doesn't support multiple overlapping frames, this function does nothing.")
1638 XSETFRAME (frame
, selected_frame
);
1640 CHECK_LIVE_FRAME (frame
, 0);
1642 /* Do like the documentation says. */
1643 Fmake_frame_visible (frame
);
1645 if (frame_raise_lower_hook
)
1646 (*frame_raise_lower_hook
) (XFRAME (frame
), 1);
1651 /* Should we have a corresponding function called Flower_Power? */
1652 DEFUN ("lower-frame", Flower_frame
, Slower_frame
, 0, 1, "",
1653 "Send FRAME to the back, so it is occluded by any frames that overlap it.\n\
1654 If you don't specify a frame, the selected frame is used.\n\
1655 If Emacs is displaying on an ordinary terminal or some other device which\n\
1656 doesn't support multiple overlapping frames, this function does nothing.")
1661 XSETFRAME (frame
, selected_frame
);
1663 CHECK_LIVE_FRAME (frame
, 0);
1665 if (frame_raise_lower_hook
)
1666 (*frame_raise_lower_hook
) (XFRAME (frame
), 0);
1672 DEFUN ("redirect-frame-focus", Fredirect_frame_focus
, Sredirect_frame_focus
,
1674 "Arrange for keystrokes typed at FRAME to be sent to FOCUS-FRAME.\n\
1675 In other words, switch-frame events caused by events in FRAME will\n\
1676 request a switch to FOCUS-FRAME, and `last-event-frame' will be\n\
1677 FOCUS-FRAME after reading an event typed at FRAME.\n\
1679 If FOCUS-FRAME is omitted or nil, any existing redirection is\n\
1680 cancelled, and the frame again receives its own keystrokes.\n\
1682 Focus redirection is useful for temporarily redirecting keystrokes to\n\
1683 a surrogate minibuffer frame when a frame doesn't have its own\n\
1684 minibuffer window.\n\
1686 A frame's focus redirection can be changed by select-frame. If frame\n\
1687 FOO is selected, and then a different frame BAR is selected, any\n\
1688 frames redirecting their focus to FOO are shifted to redirect their\n\
1689 focus to BAR. This allows focus redirection to work properly when the\n\
1690 user switches from one frame to another using `select-window'.\n\
1692 This means that a frame whose focus is redirected to itself is treated\n\
1693 differently from a frame whose focus is redirected to nil; the former\n\
1694 is affected by select-frame, while the latter is not.\n\
1696 The redirection lasts until `redirect-frame-focus' is called to change it.")
1697 (frame
, focus_frame
)
1698 Lisp_Object frame
, focus_frame
;
1700 /* Note that we don't check for a live frame here. It's reasonable
1701 to redirect the focus of a frame you're about to delete, if you
1702 know what other frame should receive those keystrokes. */
1703 CHECK_FRAME (frame
, 0);
1705 if (! NILP (focus_frame
))
1706 CHECK_LIVE_FRAME (focus_frame
, 1);
1708 XFRAME (frame
)->focus_frame
= focus_frame
;
1710 if (frame_rehighlight_hook
)
1711 (*frame_rehighlight_hook
) (XFRAME (frame
));
1717 DEFUN ("frame-focus", Fframe_focus
, Sframe_focus
, 1, 1, 0,
1718 "Return the frame to which FRAME's keystrokes are currently being sent.\n\
1719 This returns nil if FRAME's focus is not redirected.\n\
1720 See `redirect-frame-focus'.")
1724 CHECK_LIVE_FRAME (frame
, 0);
1726 return FRAME_FOCUS_FRAME (XFRAME (frame
));
1731 /* Return the value of frame parameter PROP in frame FRAME. */
1734 get_frame_param (frame
, prop
)
1735 register struct frame
*frame
;
1738 register Lisp_Object tem
;
1740 tem
= Fassq (prop
, frame
->param_alist
);
1746 /* Return the buffer-predicate of the selected frame. */
1749 frame_buffer_predicate (frame
)
1752 return XFRAME (frame
)->buffer_predicate
;
1755 /* Return the buffer-list of the selected frame. */
1758 frame_buffer_list (frame
)
1761 return XFRAME (frame
)->buffer_list
;
1764 /* Set the buffer-list of the selected frame. */
1767 set_frame_buffer_list (frame
, list
)
1768 Lisp_Object frame
, list
;
1770 XFRAME (frame
)->buffer_list
= list
;
1773 /* Discard BUFFER from the buffer-list of each frame. */
1776 frames_discard_buffer (buffer
)
1779 Lisp_Object frame
, tail
;
1781 FOR_EACH_FRAME (tail
, frame
)
1783 XFRAME (frame
)->buffer_list
1784 = Fdelq (buffer
, XFRAME (frame
)->buffer_list
);
1788 /* Move BUFFER to the end of the buffer-list of each frame. */
1791 frames_bury_buffer (buffer
)
1794 Lisp_Object frame
, tail
;
1796 FOR_EACH_FRAME (tail
, frame
)
1798 XFRAME (frame
)->buffer_list
1799 = nconc2 (Fdelq (buffer
, XFRAME (frame
)->buffer_list
),
1800 Fcons (buffer
, Qnil
));
1804 /* Modify the alist in *ALISTPTR to associate PROP with VAL.
1805 If the alist already has an element for PROP, we change it. */
1808 store_in_alist (alistptr
, prop
, val
)
1809 Lisp_Object
*alistptr
, val
;
1812 register Lisp_Object tem
;
1814 tem
= Fassq (prop
, *alistptr
);
1816 *alistptr
= Fcons (Fcons (prop
, val
), *alistptr
);
1822 frame_name_fnn_p (str
, len
)
1826 if (len
> 1 && str
[0] == 'F')
1829 long num
= strtol (str
+ 1, &end_ptr
, 10);
1831 if (end_ptr
== str
+ len
)
1837 /* Set the name of the terminal frame. Also used by MSDOS frames.
1838 Modeled after x_set_name which is used for WINDOW frames. */
1841 set_term_frame_name (f
, name
)
1845 f
->explicit_name
= ! NILP (name
);
1847 /* If NAME is nil, set the name to F<num>. */
1852 /* Check for no change needed in this very common case
1853 before we do any consing. */
1854 if (frame_name_fnn_p (XSTRING (f
->name
)->data
,
1855 STRING_BYTES (XSTRING (f
->name
))))
1858 terminal_frame_count
++;
1859 sprintf (namebuf
, "F%d", terminal_frame_count
);
1860 name
= build_string (namebuf
);
1864 CHECK_STRING (name
, 0);
1866 /* Don't change the name if it's already NAME. */
1867 if (! NILP (Fstring_equal (name
, f
->name
)))
1870 /* Don't allow the user to set the frame name to F<num>, so it
1871 doesn't clash with the names we generate for terminal frames. */
1872 if (frame_name_fnn_p (XSTRING (name
)->data
, STRING_BYTES (XSTRING (name
))))
1873 error ("Frame names of the form F<num> are usurped by Emacs");
1877 update_mode_lines
= 1;
1881 store_frame_param (f
, prop
, val
)
1883 Lisp_Object prop
, val
;
1885 register Lisp_Object tem
;
1887 if (EQ (prop
, Qbuffer_list
))
1889 f
->buffer_list
= val
;
1893 tem
= Fassq (prop
, f
->param_alist
);
1895 f
->param_alist
= Fcons (Fcons (prop
, val
), f
->param_alist
);
1899 if (EQ (prop
, Qbuffer_predicate
))
1900 f
->buffer_predicate
= val
;
1902 if (! FRAME_WINDOW_P (f
))
1904 if (EQ (prop
, Qmenu_bar_lines
))
1905 set_menu_bar_lines (f
, val
, make_number (FRAME_MENU_BAR_LINES (f
)));
1906 else if (EQ (prop
, Qname
))
1907 set_term_frame_name (f
, val
);
1910 if (EQ (prop
, Qminibuffer
) && WINDOWP (val
))
1912 if (! MINI_WINDOW_P (XWINDOW (val
)))
1913 error ("Surrogate minibuffer windows must be minibuffer windows.");
1915 if (FRAME_HAS_MINIBUF_P (f
) || FRAME_MINIBUF_ONLY_P (f
)
1916 && !EQ (val
, f
->minibuffer_window
))
1917 error ("Can't change the surrogate minibuffer of a frame with its own minibuffer");
1919 /* Install the chosen minibuffer window, with proper buffer. */
1920 f
->minibuffer_window
= val
;
1924 DEFUN ("frame-parameters", Fframe_parameters
, Sframe_parameters
, 0, 1, 0,
1925 "Return the parameters-alist of frame FRAME.\n\
1926 It is a list of elements of the form (PARM . VALUE), where PARM is a symbol.\n\
1927 The meaningful PARMs depend on the kind of frame.\n\
1928 If FRAME is omitted, return information on the currently selected frame.")
1936 if (EQ (frame
, Qnil
))
1940 CHECK_FRAME (frame
, 0);
1944 if (!FRAME_LIVE_P (f
))
1947 alist
= Fcopy_alist (f
->param_alist
);
1949 if (FRAME_MSDOS_P (f
))
1951 static char *colornames
[16] =
1953 "black", "blue", "green", "cyan", "red", "magenta", "brown",
1954 "lightgray", "darkgray", "lightblue", "lightgreen", "lightcyan",
1955 "lightred", "lightmagenta", "yellow", "white"
1957 store_in_alist (&alist
, intern ("foreground-color"),
1958 build_string (colornames
[FRAME_FOREGROUND_PIXEL (f
)]));
1959 store_in_alist (&alist
, intern ("background-color"),
1960 build_string (colornames
[FRAME_BACKGROUND_PIXEL (f
)]));
1962 store_in_alist (&alist
, intern ("font"), build_string ("default"));
1964 store_in_alist (&alist
, Qname
, f
->name
);
1965 height
= (FRAME_NEW_HEIGHT (f
) ? FRAME_NEW_HEIGHT (f
) : FRAME_HEIGHT (f
));
1966 store_in_alist (&alist
, Qheight
, make_number (height
));
1967 width
= (FRAME_NEW_WIDTH (f
) ? FRAME_NEW_WIDTH (f
) : FRAME_WIDTH (f
));
1968 store_in_alist (&alist
, Qwidth
, make_number (width
));
1969 store_in_alist (&alist
, Qmodeline
, (FRAME_WANTS_MODELINE_P (f
) ? Qt
: Qnil
));
1970 store_in_alist (&alist
, Qminibuffer
,
1971 (! FRAME_HAS_MINIBUF_P (f
) ? Qnil
1972 : FRAME_MINIBUF_ONLY_P (f
) ? Qonly
1973 : FRAME_MINIBUF_WINDOW (f
)));
1974 store_in_alist (&alist
, Qunsplittable
, (FRAME_NO_SPLIT_P (f
) ? Qt
: Qnil
));
1975 store_in_alist (&alist
, Qbuffer_list
,
1976 frame_buffer_list (Fselected_frame ()));
1978 /* I think this should be done with a hook. */
1979 #ifdef HAVE_WINDOW_SYSTEM
1980 if (FRAME_WINDOW_P (f
))
1981 x_report_frame_params (f
, &alist
);
1985 /* This ought to be correct in f->param_alist for an X frame. */
1987 XSETFASTINT (lines
, FRAME_MENU_BAR_LINES (f
));
1988 store_in_alist (&alist
, Qmenu_bar_lines
, lines
);
1993 DEFUN ("modify-frame-parameters", Fmodify_frame_parameters
,
1994 Smodify_frame_parameters
, 2, 2, 0,
1995 "Modify the parameters of frame FRAME according to ALIST.\n\
1996 ALIST is an alist of parameters to change and their new values.\n\
1997 Each element of ALIST has the form (PARM . VALUE), where PARM is a symbol.\n\
1998 The meaningful PARMs depend on the kind of frame.\n\
1999 Undefined PARMs are ignored, but stored in the frame's parameter list\n\
2000 so that `frame-parameters' will return them.")
2002 Lisp_Object frame
, alist
;
2005 register Lisp_Object tail
, elt
, prop
, val
;
2007 if (EQ (frame
, Qnil
))
2011 CHECK_LIVE_FRAME (frame
, 0);
2015 /* I think this should be done with a hook. */
2016 #ifdef HAVE_WINDOW_SYSTEM
2017 if (FRAME_WINDOW_P (f
))
2018 x_set_frame_parameters (f
, alist
);
2022 if (FRAME_MSDOS_P (f
))
2023 IT_set_frame_parameters (f
, alist
);
2027 int length
= XINT (Flength (alist
));
2030 = (Lisp_Object
*) alloca (length
* sizeof (Lisp_Object
));
2032 = (Lisp_Object
*) alloca (length
* sizeof (Lisp_Object
));
2034 /* Extract parm names and values into those vectors. */
2037 for (tail
= alist
; CONSP (tail
); tail
= Fcdr (tail
))
2039 Lisp_Object elt
, prop
, val
;
2042 parms
[i
] = Fcar (elt
);
2043 values
[i
] = Fcdr (elt
);
2047 /* Now process them in reverse of specified order. */
2048 for (i
--; i
>= 0; i
--)
2052 store_frame_param (f
, prop
, val
);
2059 DEFUN ("frame-char-height", Fframe_char_height
, Sframe_char_height
,
2061 "Height in pixels of a line in the font in frame FRAME.\n\
2062 If FRAME is omitted, the selected frame is used.\n\
2063 For a terminal frame, the value is always 1.")
2073 CHECK_FRAME (frame
, 0);
2077 #ifdef HAVE_WINDOW_SYSTEM
2078 if (FRAME_WINDOW_P (f
))
2079 return make_number (x_char_height (f
));
2082 return make_number (1);
2086 DEFUN ("frame-char-width", Fframe_char_width
, Sframe_char_width
,
2088 "Width in pixels of characters in the font in frame FRAME.\n\
2089 If FRAME is omitted, the selected frame is used.\n\
2090 The width is the same for all characters, because\n\
2091 currently Emacs supports only fixed-width fonts.\n\
2092 For a terminal screen, the value is always 1.")
2102 CHECK_FRAME (frame
, 0);
2106 #ifdef HAVE_WINDOW_SYSTEM
2107 if (FRAME_WINDOW_P (f
))
2108 return make_number (x_char_width (f
));
2111 return make_number (1);
2114 DEFUN ("frame-pixel-height", Fframe_pixel_height
,
2115 Sframe_pixel_height
, 0, 1, 0,
2116 "Return a FRAME's height in pixels.\n\
2117 This counts only the height available for text lines,\n\
2118 not menu bars on window-system Emacs frames.\n\
2119 For a terminal frame, the result really gives the height in characters.\n\
2120 If FRAME is omitted, the selected frame is used.")
2130 CHECK_FRAME (frame
, 0);
2134 #ifdef HAVE_WINDOW_SYSTEM
2135 if (FRAME_WINDOW_P (f
))
2136 return make_number (x_pixel_height (f
));
2139 return make_number (FRAME_HEIGHT (f
));
2142 DEFUN ("frame-pixel-width", Fframe_pixel_width
,
2143 Sframe_pixel_width
, 0, 1, 0,
2144 "Return FRAME's width in pixels.\n\
2145 For a terminal frame, the result really gives the width in characters.\n\
2146 If FRAME is omitted, the selected frame is used.")
2156 CHECK_FRAME (frame
, 0);
2160 #ifdef HAVE_WINDOW_SYSTEM
2161 if (FRAME_WINDOW_P (f
))
2162 return make_number (x_pixel_width (f
));
2165 return make_number (FRAME_WIDTH (f
));
2168 DEFUN ("set-frame-height", Fset_frame_height
, Sset_frame_height
, 2, 3, 0,
2169 "Specify that the frame FRAME has LINES lines.\n\
2170 Optional third arg non-nil means that redisplay should use LINES lines\n\
2171 but that the idea of the actual height of the frame should not be changed.")
2172 (frame
, lines
, pretend
)
2173 Lisp_Object frame
, lines
, pretend
;
2175 register struct frame
*f
;
2177 CHECK_NUMBER (lines
, 0);
2182 CHECK_LIVE_FRAME (frame
, 0);
2186 /* I think this should be done with a hook. */
2187 #ifdef HAVE_WINDOW_SYSTEM
2188 if (FRAME_WINDOW_P (f
))
2190 if (XINT (lines
) != f
->height
)
2191 x_set_window_size (f
, 1, f
->width
, XINT (lines
));
2195 change_frame_size (f
, XINT (lines
), 0, !NILP (pretend
), 0);
2199 DEFUN ("set-frame-width", Fset_frame_width
, Sset_frame_width
, 2, 3, 0,
2200 "Specify that the frame FRAME has COLS columns.\n\
2201 Optional third arg non-nil means that redisplay should use COLS columns\n\
2202 but that the idea of the actual width of the frame should not be changed.")
2203 (frame
, cols
, pretend
)
2204 Lisp_Object frame
, cols
, pretend
;
2206 register struct frame
*f
;
2207 CHECK_NUMBER (cols
, 0);
2212 CHECK_LIVE_FRAME (frame
, 0);
2216 /* I think this should be done with a hook. */
2217 #ifdef HAVE_WINDOW_SYSTEM
2218 if (FRAME_WINDOW_P (f
))
2220 if (XINT (cols
) != f
->width
)
2221 x_set_window_size (f
, 1, XINT (cols
), f
->height
);
2225 change_frame_size (f
, 0, XINT (cols
), !NILP (pretend
), 0);
2229 DEFUN ("set-frame-size", Fset_frame_size
, Sset_frame_size
, 3, 3, 0,
2230 "Sets size of FRAME to COLS by ROWS, measured in characters.")
2232 Lisp_Object frame
, cols
, rows
;
2234 register struct frame
*f
;
2237 CHECK_LIVE_FRAME (frame
, 0);
2238 CHECK_NUMBER (cols
, 2);
2239 CHECK_NUMBER (rows
, 1);
2242 /* I think this should be done with a hook. */
2243 #ifdef HAVE_WINDOW_SYSTEM
2244 if (FRAME_WINDOW_P (f
))
2246 if (XINT (rows
) != f
->height
|| XINT (cols
) != f
->width
2247 || FRAME_NEW_HEIGHT (f
) || FRAME_NEW_WIDTH (f
))
2248 x_set_window_size (f
, 1, XINT (cols
), XINT (rows
));
2252 change_frame_size (f
, XINT (rows
), XINT (cols
), 0, 0);
2257 DEFUN ("set-frame-position", Fset_frame_position
,
2258 Sset_frame_position
, 3, 3, 0,
2259 "Sets position of FRAME in pixels to XOFFSET by YOFFSET.\n\
2260 This is actually the position of the upper left corner of the frame.\n\
2261 Negative values for XOFFSET or YOFFSET are interpreted relative to\n\
2262 the rightmost or bottommost possible position (that stays within the screen).")
2263 (frame
, xoffset
, yoffset
)
2264 Lisp_Object frame
, xoffset
, yoffset
;
2266 register struct frame
*f
;
2269 CHECK_LIVE_FRAME (frame
, 0);
2270 CHECK_NUMBER (xoffset
, 1);
2271 CHECK_NUMBER (yoffset
, 2);
2274 /* I think this should be done with a hook. */
2275 #ifdef HAVE_WINDOW_SYSTEM
2276 if (FRAME_WINDOW_P (f
))
2277 x_set_offset (f
, XINT (xoffset
), XINT (yoffset
), 1);
2289 staticpro (&Vframe_list
);
2291 DEFVAR_LISP ("terminal-frame", &Vterminal_frame
,
2292 "The initial frame-object, which represents Emacs's stdout.");
2294 DEFVAR_LISP ("emacs-iconified", &Vemacs_iconified
,
2295 "Non-nil if all of emacs is iconified and frame updates are not needed.");
2296 Vemacs_iconified
= Qnil
;
2298 DEFVAR_KBOARD ("default-minibuffer-frame", Vdefault_minibuffer_frame
,
2299 "Minibufferless frames use this frame's minibuffer.\n\
2301 Emacs cannot create minibufferless frames unless this is set to an\n\
2302 appropriate surrogate.\n\
2304 Emacs consults this variable only when creating minibufferless\n\
2305 frames; once the frame is created, it sticks with its assigned\n\
2306 minibuffer, no matter what this variable is set to. This means that\n\
2307 this variable doesn't necessarily say anything meaningful about the\n\
2308 current set of frames, or where the minibuffer is currently being\n\
2311 defsubr (&Sactive_minibuffer_window
);
2313 defsubr (&Sframe_live_p
);
2314 defsubr (&Smake_terminal_frame
);
2315 defsubr (&Shandle_switch_frame
);
2316 defsubr (&Signore_event
);
2317 defsubr (&Sselect_frame
);
2318 defsubr (&Sselected_frame
);
2319 defsubr (&Swindow_frame
);
2320 defsubr (&Sframe_root_window
);
2321 defsubr (&Sframe_first_window
);
2322 defsubr (&Sframe_selected_window
);
2323 defsubr (&Sset_frame_selected_window
);
2324 defsubr (&Sframe_list
);
2325 defsubr (&Snext_frame
);
2326 defsubr (&Sprevious_frame
);
2327 defsubr (&Sdelete_frame
);
2328 defsubr (&Smouse_position
);
2329 defsubr (&Smouse_pixel_position
);
2330 defsubr (&Sset_mouse_position
);
2331 defsubr (&Sset_mouse_pixel_position
);
2333 defsubr (&Sframe_configuration
);
2334 defsubr (&Srestore_frame_configuration
);
2336 defsubr (&Smake_frame_visible
);
2337 defsubr (&Smake_frame_invisible
);
2338 defsubr (&Siconify_frame
);
2339 defsubr (&Sframe_visible_p
);
2340 defsubr (&Svisible_frame_list
);
2341 defsubr (&Sraise_frame
);
2342 defsubr (&Slower_frame
);
2343 defsubr (&Sredirect_frame_focus
);
2344 defsubr (&Sframe_focus
);
2345 defsubr (&Sframe_parameters
);
2346 defsubr (&Smodify_frame_parameters
);
2347 defsubr (&Sframe_char_height
);
2348 defsubr (&Sframe_char_width
);
2349 defsubr (&Sframe_pixel_height
);
2350 defsubr (&Sframe_pixel_width
);
2351 defsubr (&Sset_frame_height
);
2352 defsubr (&Sset_frame_width
);
2353 defsubr (&Sset_frame_size
);
2354 defsubr (&Sset_frame_position
);
2360 initial_define_lispy_key (global_map
, "switch-frame", "handle-switch-frame");
2361 initial_define_lispy_key (global_map
, "delete-frame", "handle-delete-frame");
2362 initial_define_lispy_key (global_map
, "iconify-frame", "ignore-event");
2363 initial_define_lispy_key (global_map
, "make-frame-visible", "ignore-event");