1 /* Generic frame functions.
2 Copyright (C) 1993, 1994, 1995, 1997, 1999, 2000, 2001
3 Free Software Foundation.
5 This file is part of GNU Emacs.
7 GNU Emacs is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
12 GNU Emacs is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GNU Emacs; see the file COPYING. If not, write to
19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
37 /* These help us bind and responding to switch-frame events. */
41 #ifdef HAVE_WINDOW_SYSTEM
44 #include "termhooks.h"
45 #include "dispextern.h"
53 Lisp_Object Qframe_live_p
;
56 Lisp_Object Qminibuffer
;
57 Lisp_Object Qmodeline
;
60 Lisp_Object Qunsplittable
;
61 Lisp_Object Qmenu_bar_lines
;
62 Lisp_Object Qtool_bar_lines
;
69 Lisp_Object Qbuffer_predicate
;
70 Lisp_Object Qbuffer_list
;
72 Lisp_Object Qdisplay_type
;
73 Lisp_Object Qbackground_mode
;
74 Lisp_Object Qinhibit_default_face_x_resources
;
76 Lisp_Object Vterminal_frame
;
77 Lisp_Object Vdefault_frame_alist
;
78 Lisp_Object Vmouse_position_function
;
81 set_menu_bar_lines_1 (window
, n
)
85 struct window
*w
= XWINDOW (window
);
87 XSETFASTINT (w
->last_modified
, 0);
88 XSETFASTINT (w
->top
, XFASTINT (w
->top
) + n
);
89 XSETFASTINT (w
->height
, XFASTINT (w
->height
) - n
);
91 if (INTEGERP (w
->orig_top
))
92 XSETFASTINT (w
->orig_top
, XFASTINT (w
->orig_top
) + n
);
93 if (INTEGERP (w
->orig_height
))
94 XSETFASTINT (w
->orig_height
, XFASTINT (w
->orig_height
) - n
);
96 /* Handle just the top child in a vertical split. */
97 if (!NILP (w
->vchild
))
98 set_menu_bar_lines_1 (w
->vchild
, n
);
100 /* Adjust all children in a horizontal split. */
101 for (window
= w
->hchild
; !NILP (window
); window
= w
->next
)
103 w
= XWINDOW (window
);
104 set_menu_bar_lines_1 (window
, n
);
109 set_menu_bar_lines (f
, value
, oldval
)
111 Lisp_Object value
, oldval
;
114 int olines
= FRAME_MENU_BAR_LINES (f
);
116 /* Right now, menu bars don't work properly in minibuf-only frames;
117 most of the commands try to apply themselves to the minibuffer
118 frame itself, and get an error because you can't switch buffers
119 in or split the minibuffer window. */
120 if (FRAME_MINIBUF_ONLY_P (f
))
123 if (INTEGERP (value
))
124 nlines
= XINT (value
);
128 if (nlines
!= olines
)
130 windows_or_buffers_changed
++;
131 FRAME_WINDOW_SIZES_CHANGED (f
) = 1;
132 FRAME_MENU_BAR_LINES (f
) = nlines
;
133 set_menu_bar_lines_1 (f
->root_window
, nlines
- olines
);
138 Lisp_Object Vemacs_iconified
;
139 Lisp_Object Vframe_list
;
141 struct x_output tty_display
;
143 extern Lisp_Object Vminibuffer_list
;
144 extern Lisp_Object
get_minibuffer ();
145 extern Lisp_Object
Fhandle_switch_frame ();
146 extern Lisp_Object
Fredirect_frame_focus ();
147 extern Lisp_Object
x_get_focus_frame ();
149 DEFUN ("framep", Fframep
, Sframep
, 1, 1, 0,
150 "Return non-nil if OBJECT is a frame.\n\
151 Value is t for a termcap frame (a character-only terminal),\n\
152 `x' for an Emacs frame that is really an X window,\n\
153 `w32' for an Emacs frame that is a window on MS-Windows display,\n\
154 `mac' for an Emacs frame on a Macintosh display,\n\
155 `pc' for a direct-write MS-DOS frame.\n\
156 See also `frame-live-p'.")
160 if (!FRAMEP (object
))
162 switch (XFRAME (object
)->output_method
)
166 case output_x_window
:
170 case output_msdos_raw
:
179 DEFUN ("frame-live-p", Fframe_live_p
, Sframe_live_p
, 1, 1, 0,
180 "Return non-nil if OBJECT is a frame which has not been deleted.\n\
181 Value is nil if OBJECT is not a live frame. If object is a live\n\
182 frame, the return value indicates what sort of output device it is\n\
183 displayed on. Value is t for a termcap frame (a character-only\n\
184 terminal), `x' for an Emacs frame being displayed in an X window.")
188 return ((FRAMEP (object
)
189 && FRAME_LIVE_P (XFRAME (object
)))
199 register struct frame
*f
;
200 register Lisp_Object root_window
;
201 register Lisp_Object mini_window
;
203 f
= allocate_frame ();
204 XSETFRAME (frame
, f
);
206 f
->desired_matrix
= 0;
207 f
->current_matrix
= 0;
210 f
->glyphs_initialized_p
= 0;
211 f
->decode_mode_spec_buffer
= 0;
213 f
->async_visible
= 0;
214 f
->output_data
.nothing
= 0;
216 f
->async_iconified
= 0;
217 f
->wants_modeline
= 1;
222 f
->has_minibuffer
= mini_p
;
223 f
->focus_frame
= Qnil
;
224 f
->explicit_name
= 0;
225 f
->can_have_scroll_bars
= 0;
226 f
->vertical_scroll_bar_type
= vertical_scroll_bar_none
;
227 f
->param_alist
= Qnil
;
228 f
->scroll_bars
= Qnil
;
229 f
->condemned_scroll_bars
= Qnil
;
230 f
->face_alist
= Qnil
;
231 f
->face_cache
= NULL
;
232 f
->menu_bar_items
= Qnil
;
233 f
->menu_bar_vector
= Qnil
;
234 f
->menu_bar_items_used
= 0;
235 f
->buffer_predicate
= Qnil
;
236 f
->buffer_list
= Qnil
;
238 f
->kboard
= initial_kboard
;
242 f
->menu_bar_window
= Qnil
;
243 f
->tool_bar_window
= Qnil
;
244 f
->tool_bar_items
= Qnil
;
245 f
->desired_tool_bar_string
= f
->current_tool_bar_string
= Qnil
;
246 f
->n_tool_bar_items
= 0;
248 root_window
= make_window ();
251 mini_window
= make_window ();
252 XWINDOW (root_window
)->next
= mini_window
;
253 XWINDOW (mini_window
)->prev
= root_window
;
254 XWINDOW (mini_window
)->mini_p
= Qt
;
255 XWINDOW (mini_window
)->frame
= frame
;
256 f
->minibuffer_window
= mini_window
;
261 XWINDOW (root_window
)->next
= Qnil
;
262 f
->minibuffer_window
= Qnil
;
265 XWINDOW (root_window
)->frame
= frame
;
268 just so that there is "something there."
269 Correct size will be set up later with change_frame_size. */
271 SET_FRAME_WIDTH (f
, 10);
274 XSETFASTINT (XWINDOW (root_window
)->width
, 10);
275 XSETFASTINT (XWINDOW (root_window
)->height
, (mini_p
? 9 : 10));
279 XSETFASTINT (XWINDOW (mini_window
)->width
, 10);
280 XSETFASTINT (XWINDOW (mini_window
)->top
, 9);
281 XSETFASTINT (XWINDOW (mini_window
)->height
, 1);
284 /* Choose a buffer for the frame's root window. */
288 XWINDOW (root_window
)->buffer
= Qt
;
289 buf
= Fcurrent_buffer ();
290 /* If buf is a 'hidden' buffer (i.e. one whose name starts with
291 a space), try to find another one. */
292 if (XSTRING (Fbuffer_name (buf
))->data
[0] == ' ')
293 buf
= Fother_buffer (buf
, Qnil
, Qnil
);
295 /* Use set_window_buffer, not Fset_window_buffer, and don't let
296 hooks be run by it. The reason is that the whole frame/window
297 arrangement is not yet fully intialized at this point. Windows
298 don't have the right size, glyph matrices aren't initialized
299 etc. Running Lisp functions at this point surely ends in a
301 set_window_buffer (root_window
, buf
, 0);
302 f
->buffer_list
= Fcons (buf
, Qnil
);
307 XWINDOW (mini_window
)->buffer
= Qt
;
308 set_window_buffer (mini_window
,
309 (NILP (Vminibuffer_list
)
311 : Fcar (Vminibuffer_list
)),
315 f
->root_window
= root_window
;
316 f
->selected_window
= root_window
;
317 /* Make sure this window seems more recently used than
318 a newly-created, never-selected window. */
319 XSETFASTINT (XWINDOW (f
->selected_window
)->use_time
, ++window_select_count
);
324 #ifdef HAVE_WINDOW_SYSTEM
325 /* Make a frame using a separate minibuffer window on another frame.
326 MINI_WINDOW is the minibuffer window to use. nil means use the
327 default (the global minibuffer). */
330 make_frame_without_minibuffer (mini_window
, kb
, display
)
331 register Lisp_Object mini_window
;
335 register struct frame
*f
;
338 if (!NILP (mini_window
))
339 CHECK_LIVE_WINDOW (mini_window
, 0);
342 if (!NILP (mini_window
)
343 && XFRAME (XWINDOW (mini_window
)->frame
)->kboard
!= kb
)
344 error ("frame and minibuffer must be on the same display");
347 /* Make a frame containing just a root window. */
350 if (NILP (mini_window
))
352 /* Use default-minibuffer-frame if possible. */
353 if (!FRAMEP (kb
->Vdefault_minibuffer_frame
)
354 || ! FRAME_LIVE_P (XFRAME (kb
->Vdefault_minibuffer_frame
)))
356 Lisp_Object frame_dummy
;
358 XSETFRAME (frame_dummy
, f
);
359 GCPRO1 (frame_dummy
);
360 /* If there's no minibuffer frame to use, create one. */
361 kb
->Vdefault_minibuffer_frame
=
362 call1 (intern ("make-initial-minibuffer-frame"), display
);
366 mini_window
= XFRAME (kb
->Vdefault_minibuffer_frame
)->minibuffer_window
;
369 f
->minibuffer_window
= mini_window
;
371 /* Make the chosen minibuffer window display the proper minibuffer,
372 unless it is already showing a minibuffer. */
373 if (NILP (Fmemq (XWINDOW (mini_window
)->buffer
, Vminibuffer_list
)))
374 Fset_window_buffer (mini_window
,
375 (NILP (Vminibuffer_list
)
377 : Fcar (Vminibuffer_list
)));
381 /* Make a frame containing only a minibuffer window. */
384 make_minibuffer_frame ()
386 /* First make a frame containing just a root window, no minibuffer. */
388 register struct frame
*f
= make_frame (0);
389 register Lisp_Object mini_window
;
390 register Lisp_Object frame
;
392 XSETFRAME (frame
, f
);
397 f
->wants_modeline
= 0;
398 f
->has_minibuffer
= 1;
400 /* Now label the root window as also being the minibuffer.
401 Avoid infinite looping on the window chain by marking next pointer
404 mini_window
= f
->minibuffer_window
= f
->root_window
;
405 XWINDOW (mini_window
)->mini_p
= Qt
;
406 XWINDOW (mini_window
)->next
= Qnil
;
407 XWINDOW (mini_window
)->prev
= Qnil
;
408 XWINDOW (mini_window
)->frame
= frame
;
410 /* Put the proper buffer in that window. */
412 Fset_window_buffer (mini_window
,
413 (NILP (Vminibuffer_list
)
415 : Fcar (Vminibuffer_list
)));
418 #endif /* HAVE_WINDOW_SYSTEM */
420 /* Construct a frame that refers to the terminal (stdin and stdout). */
422 static int terminal_frame_count
;
425 make_terminal_frame ()
427 register struct frame
*f
;
434 initial_kboard
= (KBOARD
*) xmalloc (sizeof (KBOARD
));
435 init_kboard (initial_kboard
);
436 initial_kboard
->next_kboard
= all_kboards
;
437 all_kboards
= initial_kboard
;
441 /* The first call must initialize Vframe_list. */
442 if (! (NILP (Vframe_list
) || CONSP (Vframe_list
)))
447 XSETFRAME (frame
, f
);
448 Vframe_list
= Fcons (frame
, Vframe_list
);
450 terminal_frame_count
++;
451 sprintf (name
, "F%d", terminal_frame_count
);
452 f
->name
= build_string (name
);
454 f
->visible
= 1; /* FRAME_SET_VISIBLE wd set frame_garbaged. */
455 f
->async_visible
= 1; /* Don't let visible be cleared later. */
457 f
->output_data
.x
= &the_only_x_display
;
458 if (!inhibit_window_system
459 && (!FRAMEP (selected_frame
) || !FRAME_LIVE_P (XFRAME (selected_frame
))
460 || XFRAME (selected_frame
)->output_method
== output_msdos_raw
))
462 f
->output_method
= output_msdos_raw
;
463 /* This initialization of foreground and background pixels is
464 only important for the initial frame created in temacs. If
465 we don't do that, we get black background and foreground in
466 the dumped Emacs because the_only_x_display is a static
467 variable, hence it is born all-zeroes, and zero is the code
468 for the black color. Other frames all inherit their pixels
469 from what's already in the_only_x_display. */
470 if ((!FRAMEP (selected_frame
) || !FRAME_LIVE_P (XFRAME (selected_frame
)))
471 && f
->output_data
.x
->background_pixel
== 0
472 && f
->output_data
.x
->foreground_pixel
== 0)
474 f
->output_data
.x
->background_pixel
= FACE_TTY_DEFAULT_BG_COLOR
;
475 f
->output_data
.x
->foreground_pixel
= FACE_TTY_DEFAULT_FG_COLOR
;
479 f
->output_method
= output_termcap
;
482 f
->output_method
= output_termcap
;
483 f
->output_data
.x
= &tty_display
;
486 make_mac_terminal_frame (f
);
488 f
->output_data
.x
= &tty_display
;
489 #endif /* macintosh */
490 #endif /* WINDOWSNT */
494 init_frame_faces (f
);
499 DEFUN ("make-terminal-frame", Fmake_terminal_frame
, Smake_terminal_frame
,
500 1, 1, 0, "Create an additional terminal frame.\n\
501 You can create multiple frames on a text-only terminal in this way.\n\
502 Only the selected terminal frame is actually displayed.\n\
503 This function takes one argument, an alist specifying frame parameters.\n\
504 In practice, generally you don't need to specify any parameters.\n\
505 Note that changing the size of one terminal frame automatically affects all.")
510 Lisp_Object frame
, tem
;
511 struct frame
*sf
= SELECTED_FRAME ();
514 if (sf
->output_method
!= output_msdos_raw
515 && sf
->output_method
!= output_termcap
)
517 #else /* not MSDOS */
520 if (sf
->output_method
!= output_mac
)
521 error ("Not running on a Macintosh screen; cannot make a new Macintosh frame");
523 if (sf
->output_method
!= output_termcap
)
524 error ("Not using an ASCII terminal now; cannot make a new ASCII frame");
526 #endif /* not MSDOS */
528 f
= make_terminal_frame ();
530 change_frame_size (f
, FRAME_HEIGHT (sf
),
531 FRAME_WIDTH (sf
), 0, 0, 0);
534 XSETFRAME (frame
, f
);
535 Fmodify_frame_parameters (frame
, Vdefault_frame_alist
);
536 Fmodify_frame_parameters (frame
, parms
);
538 /* Make the frame face alist be frame-specific, so that each
539 frame could change its face definitions independently. */
540 f
->face_alist
= Fcopy_alist (sf
->face_alist
);
541 /* Simple Fcopy_alist isn't enough, because we need the contents of
542 the vectors which are the CDRs of associations in face_alist to
543 be copied as well. */
544 for (tem
= f
->face_alist
; CONSP (tem
); tem
= XCDR (tem
))
545 XCDR (XCAR (tem
)) = Fcopy_sequence (XCDR (XCAR (tem
)));
550 /* Perform the switch to frame FRAME.
552 If FRAME is a switch-frame event `(switch-frame FRAME1)', use
555 If TRACK is non-zero and the frame that currently has the focus
556 redirects its focus to the selected frame, redirect that focused
557 frame's focus to FRAME instead.
559 FOR_DELETION non-zero means that the selected frame is being
560 deleted, which includes the possibility that the frame's display
564 do_switch_frame (frame
, track
, for_deletion
)
566 int track
, for_deletion
;
568 struct frame
*sf
= SELECTED_FRAME ();
570 /* If FRAME is a switch-frame event, extract the frame we should
573 && EQ (XCAR (frame
), Qswitch_frame
)
574 && CONSP (XCDR (frame
)))
575 frame
= XCAR (XCDR (frame
));
577 /* This used to say CHECK_LIVE_FRAME, but apparently it's possible for
578 a switch-frame event to arrive after a frame is no longer live,
579 especially when deleting the initial frame during startup. */
580 CHECK_FRAME (frame
, 0);
581 if (! FRAME_LIVE_P (XFRAME (frame
)))
584 if (sf
== XFRAME (frame
))
587 /* This is too greedy; it causes inappropriate focus redirection
588 that's hard to get rid of. */
590 /* If a frame's focus has been redirected toward the currently
591 selected frame, we should change the redirection to point to the
592 newly selected frame. This means that if the focus is redirected
593 from a minibufferless frame to a surrogate minibuffer frame, we
594 can use `other-window' to switch between all the frames using
595 that minibuffer frame, and the focus redirection will follow us
601 for (tail
= Vframe_list
; CONSP (tail
); tail
= XCDR (tail
))
605 if (!FRAMEP (XCAR (tail
)))
608 focus
= FRAME_FOCUS_FRAME (XFRAME (XCAR (tail
)));
610 if (FRAMEP (focus
) && XFRAME (focus
) == SELECTED_FRAME ())
611 Fredirect_frame_focus (XCAR (tail
), frame
);
615 /* Instead, apply it only to the frame we're pointing to. */
616 #ifdef HAVE_WINDOW_SYSTEM
617 if (track
&& FRAME_WINDOW_P (XFRAME (frame
)))
619 Lisp_Object focus
, xfocus
;
621 xfocus
= x_get_focus_frame (XFRAME (frame
));
624 focus
= FRAME_FOCUS_FRAME (XFRAME (xfocus
));
625 if (FRAMEP (focus
) && XFRAME (focus
) == SELECTED_FRAME ())
626 Fredirect_frame_focus (xfocus
, frame
);
629 #endif /* HAVE_X_WINDOWS */
632 if (!for_deletion
&& FRAME_HAS_MINIBUF_P (sf
))
633 resize_mini_window (XWINDOW (FRAME_MINIBUF_WINDOW (sf
)), 1);
635 selected_frame
= frame
;
636 if (! FRAME_MINIBUF_ONLY_P (XFRAME (selected_frame
)))
637 last_nonminibuf_frame
= XFRAME (selected_frame
);
639 Fselect_window (XFRAME (frame
)->selected_window
);
641 /* We want to make sure that the next event generates a frame-switch
642 event to the appropriate frame. This seems kludgy to me, but
643 before you take it out, make sure that evaluating something like
644 (select-window (frame-root-window (new-frame))) doesn't end up
645 with your typing being interpreted in the new frame instead of
646 the one you're actually typing in. */
647 internal_last_event_frame
= Qnil
;
652 DEFUN ("select-frame", Fselect_frame
, Sselect_frame
, 1, 2, "e",
653 "Select the frame FRAME.\n\
654 Subsequent editing commands apply to its selected window.\n\
655 The selection of FRAME lasts until the next time the user does\n\
656 something to select a different frame, or until the next time this\n\
657 function is called.")
659 Lisp_Object frame
, no_enter
;
661 return do_switch_frame (frame
, 1, 0);
665 DEFUN ("handle-switch-frame", Fhandle_switch_frame
, Shandle_switch_frame
, 1, 2, "e",
666 "Handle a switch-frame event EVENT.\n\
667 Switch-frame events are usually bound to this function.\n\
668 A switch-frame event tells Emacs that the window manager has requested\n\
669 that the user's events be directed to the frame mentioned in the event.\n\
670 This function selects the selected window of the frame of EVENT.\n\
672 If EVENT is frame object, handle it as if it were a switch-frame event\n\
675 Lisp_Object event
, no_enter
;
677 /* Preserve prefix arg that the command loop just cleared. */
678 current_kboard
->Vprefix_arg
= Vcurrent_prefix_arg
;
679 call1 (Vrun_hooks
, Qmouse_leave_buffer_hook
);
680 return do_switch_frame (event
, 0, 0);
683 DEFUN ("ignore-event", Fignore_event
, Signore_event
, 0, 0, "",
684 "Do nothing, but preserve any prefix argument already specified.\n\
685 This is a suitable binding for iconify-frame and make-frame-visible.")
688 current_kboard
->Vprefix_arg
= Vcurrent_prefix_arg
;
692 DEFUN ("selected-frame", Fselected_frame
, Sselected_frame
, 0, 0, 0,
693 "Return the frame that is now selected.")
696 return selected_frame
;
699 DEFUN ("window-frame", Fwindow_frame
, Swindow_frame
, 1, 1, 0,
700 "Return the frame object that window WINDOW is on.")
704 CHECK_LIVE_WINDOW (window
, 0);
705 return XWINDOW (window
)->frame
;
708 DEFUN ("frame-first-window", Fframe_first_window
, Sframe_first_window
, 0, 1, 0,
709 "Returns the topmost, leftmost window of FRAME.\n\
710 If omitted, FRAME defaults to the currently selected frame.")
717 w
= SELECTED_FRAME ()->root_window
;
720 CHECK_LIVE_FRAME (frame
, 0);
721 w
= XFRAME (frame
)->root_window
;
723 while (NILP (XWINDOW (w
)->buffer
))
725 if (! NILP (XWINDOW (w
)->hchild
))
726 w
= XWINDOW (w
)->hchild
;
727 else if (! NILP (XWINDOW (w
)->vchild
))
728 w
= XWINDOW (w
)->vchild
;
735 DEFUN ("active-minibuffer-window", Factive_minibuffer_window
,
736 Sactive_minibuffer_window
, 0, 0, 0,
737 "Return the currently active minibuffer window, or nil if none.")
740 return minibuf_level
? minibuf_window
: Qnil
;
743 DEFUN ("frame-root-window", Fframe_root_window
, Sframe_root_window
, 0, 1, 0,
744 "Returns the root-window of FRAME.\n\
745 If omitted, FRAME defaults to the currently selected frame.")
752 window
= SELECTED_FRAME ()->root_window
;
755 CHECK_LIVE_FRAME (frame
, 0);
756 window
= XFRAME (frame
)->root_window
;
762 DEFUN ("frame-selected-window", Fframe_selected_window
,
763 Sframe_selected_window
, 0, 1, 0,
764 "Return the selected window of frame object FRAME.\n\
765 If omitted, FRAME defaults to the currently selected frame.")
772 window
= SELECTED_FRAME ()->selected_window
;
775 CHECK_LIVE_FRAME (frame
, 0);
776 window
= XFRAME (frame
)->selected_window
;
782 DEFUN ("set-frame-selected-window", Fset_frame_selected_window
,
783 Sset_frame_selected_window
, 2, 2, 0,
784 "Set the selected window of frame object FRAME to WINDOW.\n\
785 If FRAME is nil, the selected frame is used.\n\
786 If FRAME is the selected frame, this makes WINDOW the selected window.")
788 Lisp_Object frame
, window
;
791 frame
= selected_frame
;
793 CHECK_LIVE_FRAME (frame
, 0);
794 CHECK_LIVE_WINDOW (window
, 1);
796 if (! EQ (frame
, WINDOW_FRAME (XWINDOW (window
))))
797 error ("In `set-frame-selected-window', WINDOW is not on FRAME");
799 if (EQ (frame
, selected_frame
))
800 return Fselect_window (window
);
802 return XFRAME (frame
)->selected_window
= window
;
805 DEFUN ("frame-list", Fframe_list
, Sframe_list
,
807 "Return a list of all frames.")
810 return Fcopy_sequence (Vframe_list
);
813 /* Return the next frame in the frame list after FRAME.
814 If MINIBUF is nil, exclude minibuffer-only frames.
815 If MINIBUF is a window, include only its own frame
816 and any frame now using that window as the minibuffer.
817 If MINIBUF is `visible', include all visible frames.
818 If MINIBUF is 0, include all visible and iconified frames.
819 Otherwise, include all frames. */
822 next_frame (frame
, minibuf
)
829 /* There must always be at least one frame in Vframe_list. */
830 if (! CONSP (Vframe_list
))
833 /* If this frame is dead, it won't be in Vframe_list, and we'll loop
834 forever. Forestall that. */
835 CHECK_LIVE_FRAME (frame
, 0);
838 for (tail
= Vframe_list
; CONSP (tail
); tail
= XCDR (tail
))
845 && FRAME_KBOARD (XFRAME (f
)) == FRAME_KBOARD (XFRAME (frame
)))
847 /* Decide whether this frame is eligible to be returned. */
849 /* If we've looped all the way around without finding any
850 eligible frames, return the original frame. */
854 /* Let minibuf decide if this frame is acceptable. */
857 if (! FRAME_MINIBUF_ONLY_P (XFRAME (f
)))
860 else if (EQ (minibuf
, Qvisible
))
862 FRAME_SAMPLE_VISIBILITY (XFRAME (f
));
863 if (FRAME_VISIBLE_P (XFRAME (f
)))
866 else if (INTEGERP (minibuf
) && XINT (minibuf
) == 0)
868 FRAME_SAMPLE_VISIBILITY (XFRAME (f
));
869 if (FRAME_VISIBLE_P (XFRAME (f
))
870 || FRAME_ICONIFIED_P (XFRAME (f
)))
873 else if (WINDOWP (minibuf
))
875 if (EQ (FRAME_MINIBUF_WINDOW (XFRAME (f
)), minibuf
)
876 || EQ (WINDOW_FRAME (XWINDOW (minibuf
)), f
)
877 || EQ (WINDOW_FRAME (XWINDOW (minibuf
)),
878 FRAME_FOCUS_FRAME (XFRAME (f
))))
890 /* Return the previous frame in the frame list before FRAME.
891 If MINIBUF is nil, exclude minibuffer-only frames.
892 If MINIBUF is a window, include only its own frame
893 and any frame now using that window as the minibuffer.
894 If MINIBUF is `visible', include all visible frames.
895 If MINIBUF is 0, include all visible and iconified frames.
896 Otherwise, include all frames. */
899 prev_frame (frame
, minibuf
)
906 /* There must always be at least one frame in Vframe_list. */
907 if (! CONSP (Vframe_list
))
911 for (tail
= Vframe_list
; CONSP (tail
); tail
= XCDR (tail
))
919 if (EQ (frame
, f
) && !NILP (prev
))
922 if (FRAME_KBOARD (XFRAME (f
)) == FRAME_KBOARD (XFRAME (frame
)))
924 /* Decide whether this frame is eligible to be returned,
925 according to minibuf. */
928 if (! FRAME_MINIBUF_ONLY_P (XFRAME (f
)))
931 else if (WINDOWP (minibuf
))
933 if (EQ (FRAME_MINIBUF_WINDOW (XFRAME (f
)), minibuf
)
934 || EQ (WINDOW_FRAME (XWINDOW (minibuf
)), f
)
935 || EQ (WINDOW_FRAME (XWINDOW (minibuf
)),
936 FRAME_FOCUS_FRAME (XFRAME (f
))))
939 else if (EQ (minibuf
, Qvisible
))
941 FRAME_SAMPLE_VISIBILITY (XFRAME (f
));
942 if (FRAME_VISIBLE_P (XFRAME (f
)))
945 else if (XFASTINT (minibuf
) == 0)
947 FRAME_SAMPLE_VISIBILITY (XFRAME (f
));
948 if (FRAME_VISIBLE_P (XFRAME (f
))
949 || FRAME_ICONIFIED_P (XFRAME (f
)))
957 /* We've scanned the entire list. */
959 /* We went through the whole frame list without finding a single
960 acceptable frame. Return the original frame. */
963 /* There were no acceptable frames in the list before FRAME; otherwise,
964 we would have returned directly from the loop. Since PREV is the last
965 acceptable frame in the list, return it. */
970 DEFUN ("next-frame", Fnext_frame
, Snext_frame
, 0, 2, 0,
971 "Return the next frame in the frame list after FRAME.\n\
972 It considers only frames on the same terminal as FRAME.\n\
973 By default, skip minibuffer-only frames.\n\
974 If omitted, FRAME defaults to the selected frame.\n\
975 If optional argument MINIFRAME is nil, exclude minibuffer-only frames.\n\
976 If MINIFRAME is a window, include only its own frame\n\
977 and any frame now using that window as the minibuffer.\n\
978 If MINIFRAME is `visible', include all visible frames.\n\
979 If MINIFRAME is 0, include all visible and iconified frames.\n\
980 Otherwise, include all frames.")
982 Lisp_Object frame
, miniframe
;
985 frame
= selected_frame
;
987 CHECK_LIVE_FRAME (frame
, 0);
988 return next_frame (frame
, miniframe
);
991 DEFUN ("previous-frame", Fprevious_frame
, Sprevious_frame
, 0, 2, 0,
992 "Return the previous frame in the frame list before FRAME.\n\
993 It considers only frames on the same terminal as FRAME.\n\
994 By default, skip minibuffer-only frames.\n\
995 If omitted, FRAME defaults to the selected frame.\n\
996 If optional argument MINIFRAME is nil, exclude minibuffer-only frames.\n\
997 If MINIFRAME is a window, include only its own frame\n\
998 and any frame now using that window as the minibuffer.\n\
999 If MINIFRAME is `visible', include all visible frames.\n\
1000 If MINIFRAME is 0, include all visible and iconified frames.\n\
1001 Otherwise, include all frames.")
1003 Lisp_Object frame
, miniframe
;
1006 frame
= selected_frame
;
1007 CHECK_LIVE_FRAME (frame
, 0);
1008 return prev_frame (frame
, miniframe
);
1011 /* Return 1 if it is ok to delete frame F;
1012 0 if all frames aside from F are invisible.
1013 (Exception: if F is the terminal frame, and we are using X, return 1.) */
1016 other_visible_frames (f
)
1019 /* We know the selected frame is visible,
1020 so if F is some other frame, it can't be the sole visible one. */
1021 if (f
== SELECTED_FRAME ())
1026 for (frames
= Vframe_list
;
1028 frames
= XCDR (frames
))
1032 this = XCAR (frames
);
1033 /* Verify that the frame's window still exists
1034 and we can still talk to it. And note any recent change
1036 #ifdef HAVE_WINDOW_SYSTEM
1037 if (FRAME_WINDOW_P (XFRAME (this)))
1039 x_sync (XFRAME (this));
1040 FRAME_SAMPLE_VISIBILITY (XFRAME (this));
1044 if (FRAME_VISIBLE_P (XFRAME (this))
1045 || FRAME_ICONIFIED_P (XFRAME (this))
1046 /* Allow deleting the terminal frame when at least
1047 one X frame exists! */
1048 || (FRAME_WINDOW_P (XFRAME (this)) && !FRAME_WINDOW_P (f
)))
1056 DEFUN ("delete-frame", Fdelete_frame
, Sdelete_frame
, 0, 2, "",
1057 "Delete FRAME, permanently eliminating it from use.\n\
1058 If omitted, FRAME defaults to the selected frame.\n\
1059 A frame may not be deleted if its minibuffer is used by other frames.\n\
1060 Normally, you may not delete a frame if all other frames are invisible,\n\
1061 but if the second optional argument FORCE is non-nil, you may do so.\n\
1063 This function runs `delete-frame-hook' before actually deleting the\n\
1064 frame. The hook is called with one argument FRAME.")
1066 Lisp_Object frame
, force
;
1069 struct frame
*sf
= SELECTED_FRAME ();
1070 int minibuffer_selected
;
1072 if (EQ (frame
, Qnil
))
1075 XSETFRAME (frame
, f
);
1079 CHECK_FRAME (frame
, 0);
1083 if (! FRAME_LIVE_P (f
))
1086 if (NILP (force
) && !other_visible_frames (f
)
1088 /* Terminal frame deleted before any other visible frames are
1090 && strcmp (XSTRING (f
->name
)->data
, "F1") != 0
1093 error ("Attempt to delete the sole visible or iconified frame");
1096 /* This is a nice idea, but x_connection_closed needs to be able
1097 to delete the last frame, if it is gone. */
1098 if (NILP (XCDR (Vframe_list
)))
1099 error ("Attempt to delete the only frame");
1102 /* Does this frame have a minibuffer, and is it the surrogate
1103 minibuffer for any other frame? */
1104 if (FRAME_HAS_MINIBUF_P (XFRAME (frame
)))
1108 for (frames
= Vframe_list
;
1110 frames
= XCDR (frames
))
1113 this = XCAR (frames
);
1115 if (! EQ (this, frame
)
1117 WINDOW_FRAME (XWINDOW
1118 (FRAME_MINIBUF_WINDOW (XFRAME (this))))))
1119 error ("Attempt to delete a surrogate minibuffer frame");
1123 /* Run `delete-frame-hook'. */
1124 if (!NILP (Vrun_hooks
))
1126 Lisp_Object args
[2];
1127 args
[0] = intern ("delete-frame-hook");
1129 Frun_hook_with_args (2, args
);
1132 minibuffer_selected
= EQ (minibuf_window
, selected_window
);
1134 /* Don't let the frame remain selected. */
1137 Lisp_Object tail
, frame1
;
1139 /* Look for another visible frame on the same terminal. */
1140 frame1
= next_frame (frame
, Qvisible
);
1142 /* If there is none, find *some* other frame. */
1143 if (NILP (frame1
) || EQ (frame1
, frame
))
1145 FOR_EACH_FRAME (tail
, frame1
)
1147 if (! EQ (frame
, frame1
))
1152 do_switch_frame (frame1
, 0, 1);
1153 sf
= SELECTED_FRAME ();
1156 /* Don't allow minibuf_window to remain on a deleted frame. */
1157 if (EQ (f
->minibuffer_window
, minibuf_window
))
1159 Fset_window_buffer (sf
->minibuffer_window
,
1160 XWINDOW (minibuf_window
)->buffer
);
1161 minibuf_window
= sf
->minibuffer_window
;
1163 /* If the dying minibuffer window was selected,
1164 select the new one. */
1165 if (minibuffer_selected
)
1166 Fselect_window (minibuf_window
);
1169 /* Don't let echo_area_window to remain on a deleted frame. */
1170 if (EQ (f
->minibuffer_window
, echo_area_window
))
1171 echo_area_window
= sf
->minibuffer_window
;
1173 /* Clear any X selections for this frame. */
1174 #ifdef HAVE_X_WINDOWS
1176 x_clear_frame_selections (f
);
1180 This function must be called before the window tree of the
1181 frame is deleted because windows contain dynamically allocated
1185 /* Mark all the windows that used to be on FRAME as deleted, and then
1186 remove the reference to them. */
1187 delete_all_subwindows (XWINDOW (f
->root_window
));
1188 f
->root_window
= Qnil
;
1190 Vframe_list
= Fdelq (frame
, Vframe_list
);
1191 FRAME_SET_VISIBLE (f
, 0);
1195 if (FRAME_INSERT_COST (f
))
1196 xfree (FRAME_INSERT_COST (f
));
1197 if (FRAME_DELETEN_COST (f
))
1198 xfree (FRAME_DELETEN_COST (f
));
1199 if (FRAME_INSERTN_COST (f
))
1200 xfree (FRAME_INSERTN_COST (f
));
1201 if (FRAME_DELETE_COST (f
))
1202 xfree (FRAME_DELETE_COST (f
));
1203 if (FRAME_MESSAGE_BUF (f
))
1204 xfree (FRAME_MESSAGE_BUF (f
));
1206 /* Since some events are handled at the interrupt level, we may get
1207 an event for f at any time; if we zero out the frame's display
1208 now, then we may trip up the event-handling code. Instead, we'll
1209 promise that the display of the frame must be valid until we have
1210 called the window-system-dependent frame destruction routine. */
1212 /* I think this should be done with a hook. */
1213 #ifdef HAVE_WINDOW_SYSTEM
1214 if (FRAME_WINDOW_P (f
))
1215 x_destroy_window (f
);
1218 f
->output_data
.nothing
= 0;
1220 /* If we've deleted the last_nonminibuf_frame, then try to find
1222 if (f
== last_nonminibuf_frame
)
1226 last_nonminibuf_frame
= 0;
1228 for (frames
= Vframe_list
;
1230 frames
= XCDR (frames
))
1232 f
= XFRAME (XCAR (frames
));
1233 if (!FRAME_MINIBUF_ONLY_P (f
))
1235 last_nonminibuf_frame
= f
;
1241 /* If we've deleted this keyboard's default_minibuffer_frame, try to
1242 find another one. Prefer minibuffer-only frames, but also notice
1243 frames with other windows. */
1244 if (EQ (frame
, FRAME_KBOARD (f
)->Vdefault_minibuffer_frame
))
1248 /* The last frame we saw with a minibuffer, minibuffer-only or not. */
1249 Lisp_Object frame_with_minibuf
;
1250 /* Some frame we found on the same kboard, or nil if there are none. */
1251 Lisp_Object frame_on_same_kboard
;
1253 frame_on_same_kboard
= Qnil
;
1254 frame_with_minibuf
= Qnil
;
1256 for (frames
= Vframe_list
;
1258 frames
= XCDR (frames
))
1263 this = XCAR (frames
);
1268 /* Consider only frames on the same kboard
1269 and only those with minibuffers. */
1270 if (FRAME_KBOARD (f
) == FRAME_KBOARD (f1
)
1271 && FRAME_HAS_MINIBUF_P (f1
))
1273 frame_with_minibuf
= this;
1274 if (FRAME_MINIBUF_ONLY_P (f1
))
1278 if (FRAME_KBOARD (f
) == FRAME_KBOARD (f1
))
1279 frame_on_same_kboard
= this;
1282 if (!NILP (frame_on_same_kboard
))
1284 /* We know that there must be some frame with a minibuffer out
1285 there. If this were not true, all of the frames present
1286 would have to be minibufferless, which implies that at some
1287 point their minibuffer frames must have been deleted, but
1288 that is prohibited at the top; you can't delete surrogate
1289 minibuffer frames. */
1290 if (NILP (frame_with_minibuf
))
1293 FRAME_KBOARD (f
)->Vdefault_minibuffer_frame
= frame_with_minibuf
;
1296 /* No frames left on this kboard--say no minibuffer either. */
1297 FRAME_KBOARD (f
)->Vdefault_minibuffer_frame
= Qnil
;
1300 /* Cause frame titles to update--necessary if we now have just one frame. */
1301 update_mode_lines
= 1;
1306 /* Return mouse position in character cell units. */
1308 DEFUN ("mouse-position", Fmouse_position
, Smouse_position
, 0, 0, 0,
1309 "Return a list (FRAME X . Y) giving the current mouse frame and position.\n\
1310 The position is given in character cells, where (0, 0) is the\n\
1311 upper-left corner.\n\
1312 If Emacs is running on a mouseless terminal or hasn't been programmed\n\
1313 to read the mouse position, it returns the selected frame for FRAME\n\
1314 and nil for X and Y.\n\
1315 Runs the abnormal hook `mouse-position-function' with the normal return\n\
1316 value as argument.")
1320 Lisp_Object lispy_dummy
;
1321 enum scroll_bar_part party_dummy
;
1322 Lisp_Object x
, y
, retval
;
1324 unsigned long long_dummy
;
1325 struct gcpro gcpro1
;
1327 f
= SELECTED_FRAME ();
1331 /* It's okay for the hook to refrain from storing anything. */
1332 if (mouse_position_hook
)
1333 (*mouse_position_hook
) (&f
, -1,
1334 &lispy_dummy
, &party_dummy
,
1341 pixel_to_glyph_coords (f
, col
, row
, &col
, &row
, NULL
, 1);
1346 XSETFRAME (lispy_dummy
, f
);
1347 retval
= Fcons (lispy_dummy
, Fcons (x
, y
));
1349 if (!NILP (Vmouse_position_function
))
1350 retval
= call1 (Vmouse_position_function
, retval
);
1351 RETURN_UNGCPRO (retval
);
1354 DEFUN ("mouse-pixel-position", Fmouse_pixel_position
,
1355 Smouse_pixel_position
, 0, 0, 0,
1356 "Return a list (FRAME X . Y) giving the current mouse frame and position.\n\
1357 The position is given in pixel units, where (0, 0) is the\n\
1358 upper-left corner.\n\
1359 If Emacs is running on a mouseless terminal or hasn't been programmed\n\
1360 to read the mouse position, it returns the selected frame for FRAME\n\
1361 and nil for X and Y.")
1365 Lisp_Object lispy_dummy
;
1366 enum scroll_bar_part party_dummy
;
1368 unsigned long long_dummy
;
1370 f
= SELECTED_FRAME ();
1374 /* It's okay for the hook to refrain from storing anything. */
1375 if (mouse_position_hook
)
1376 (*mouse_position_hook
) (&f
, -1,
1377 &lispy_dummy
, &party_dummy
,
1381 XSETFRAME (lispy_dummy
, f
);
1382 return Fcons (lispy_dummy
, Fcons (x
, y
));
1385 DEFUN ("set-mouse-position", Fset_mouse_position
, Sset_mouse_position
, 3, 3, 0,
1386 "Move the mouse pointer to the center of character cell (X,Y) in FRAME.\n\
1387 Coordinates are relative to the frame, not a window,\n\
1388 so the coordinates of the top left character in the frame\n\
1389 may be nonzero due to left-hand scroll bars or the menu bar.\n\
1391 This function is a no-op for an X frame that is not visible.\n\
1392 If you have just created a frame, you must wait for it to become visible\n\
1393 before calling this function on it, like this.\n\
1394 (while (not (frame-visible-p frame)) (sleep-for .5))")
1396 Lisp_Object frame
, x
, y
;
1398 CHECK_LIVE_FRAME (frame
, 0);
1399 CHECK_NUMBER (x
, 2);
1400 CHECK_NUMBER (y
, 1);
1402 /* I think this should be done with a hook. */
1403 #ifdef HAVE_WINDOW_SYSTEM
1404 if (FRAME_WINDOW_P (XFRAME (frame
)))
1405 /* Warping the mouse will cause enternotify and focus events. */
1406 x_set_mouse_position (XFRAME (frame
), XINT (x
), XINT (y
));
1408 #if defined (MSDOS) && defined (HAVE_MOUSE)
1409 if (FRAME_MSDOS_P (XFRAME (frame
)))
1411 Fselect_frame (frame
, Qnil
);
1412 mouse_moveto (XINT (x
), XINT (y
));
1420 DEFUN ("set-mouse-pixel-position", Fset_mouse_pixel_position
,
1421 Sset_mouse_pixel_position
, 3, 3, 0,
1422 "Move the mouse pointer to pixel position (X,Y) in FRAME.\n\
1423 Note, this is a no-op for an X frame that is not visible.\n\
1424 If you have just created a frame, you must wait for it to become visible\n\
1425 before calling this function on it, like this.\n\
1426 (while (not (frame-visible-p frame)) (sleep-for .5))")
1428 Lisp_Object frame
, x
, y
;
1430 CHECK_LIVE_FRAME (frame
, 0);
1431 CHECK_NUMBER (x
, 2);
1432 CHECK_NUMBER (y
, 1);
1434 /* I think this should be done with a hook. */
1435 #ifdef HAVE_WINDOW_SYSTEM
1436 if (FRAME_WINDOW_P (XFRAME (frame
)))
1437 /* Warping the mouse will cause enternotify and focus events. */
1438 x_set_mouse_pixel_position (XFRAME (frame
), XINT (x
), XINT (y
));
1440 #if defined (MSDOS) && defined (HAVE_MOUSE)
1441 if (FRAME_MSDOS_P (XFRAME (frame
)))
1443 Fselect_frame (frame
, Qnil
);
1444 mouse_moveto (XINT (x
), XINT (y
));
1452 static void make_frame_visible_1
P_ ((Lisp_Object
));
1454 DEFUN ("make-frame-visible", Fmake_frame_visible
, Smake_frame_visible
,
1456 "Make the frame FRAME visible (assuming it is an X-window).\n\
1457 If omitted, FRAME defaults to the currently selected frame.")
1462 frame
= selected_frame
;
1464 CHECK_LIVE_FRAME (frame
, 0);
1466 /* I think this should be done with a hook. */
1467 #ifdef HAVE_WINDOW_SYSTEM
1468 if (FRAME_WINDOW_P (XFRAME (frame
)))
1470 FRAME_SAMPLE_VISIBILITY (XFRAME (frame
));
1471 x_make_frame_visible (XFRAME (frame
));
1475 make_frame_visible_1 (XFRAME (frame
)->root_window
);
1477 /* Make menu bar update for the Buffers and Frams menus. */
1478 windows_or_buffers_changed
++;
1483 /* Update the display_time slot of the buffers shown in WINDOW
1484 and all its descendents. */
1487 make_frame_visible_1 (window
)
1492 for (;!NILP (window
); window
= w
->next
)
1494 w
= XWINDOW (window
);
1496 if (!NILP (w
->buffer
))
1497 XBUFFER (w
->buffer
)->display_time
= Fcurrent_time ();
1499 if (!NILP (w
->vchild
))
1500 make_frame_visible_1 (w
->vchild
);
1501 if (!NILP (w
->hchild
))
1502 make_frame_visible_1 (w
->hchild
);
1506 DEFUN ("make-frame-invisible", Fmake_frame_invisible
, Smake_frame_invisible
,
1508 "Make the frame FRAME invisible (assuming it is an X-window).\n\
1509 If omitted, FRAME defaults to the currently selected frame.\n\
1510 Normally you may not make FRAME invisible if all other frames are invisible,\n\
1511 but if the second optional argument FORCE is non-nil, you may do so.")
1513 Lisp_Object frame
, force
;
1516 frame
= selected_frame
;
1518 CHECK_LIVE_FRAME (frame
, 0);
1520 if (NILP (force
) && !other_visible_frames (XFRAME (frame
)))
1521 error ("Attempt to make invisible the sole visible or iconified frame");
1523 #if 0 /* This isn't logically necessary, and it can do GC. */
1524 /* Don't let the frame remain selected. */
1525 if (EQ (frame
, selected_frame
))
1526 do_switch_frame (next_frame (frame
, Qt
), 0, 0)
1529 /* Don't allow minibuf_window to remain on a deleted frame. */
1530 if (EQ (XFRAME (frame
)->minibuffer_window
, minibuf_window
))
1532 struct frame
*sf
= XFRAME (selected_frame
);
1533 Fset_window_buffer (sf
->minibuffer_window
,
1534 XWINDOW (minibuf_window
)->buffer
);
1535 minibuf_window
= sf
->minibuffer_window
;
1538 /* I think this should be done with a hook. */
1539 #ifdef HAVE_WINDOW_SYSTEM
1540 if (FRAME_WINDOW_P (XFRAME (frame
)))
1541 x_make_frame_invisible (XFRAME (frame
));
1544 /* Make menu bar update for the Buffers and Frams menus. */
1545 windows_or_buffers_changed
++;
1550 DEFUN ("iconify-frame", Ficonify_frame
, Siconify_frame
,
1552 "Make the frame FRAME into an icon.\n\
1553 If omitted, FRAME defaults to the currently selected frame.")
1558 frame
= selected_frame
;
1560 CHECK_LIVE_FRAME (frame
, 0);
1562 #if 0 /* This isn't logically necessary, and it can do GC. */
1563 /* Don't let the frame remain selected. */
1564 if (EQ (frame
, selected_frame
))
1565 Fhandle_switch_frame (next_frame (frame
, Qt
), Qnil
);
1568 /* Don't allow minibuf_window to remain on a deleted frame. */
1569 if (EQ (XFRAME (frame
)->minibuffer_window
, minibuf_window
))
1571 struct frame
*sf
= XFRAME (selected_frame
);
1572 Fset_window_buffer (sf
->minibuffer_window
,
1573 XWINDOW (minibuf_window
)->buffer
);
1574 minibuf_window
= sf
->minibuffer_window
;
1577 /* I think this should be done with a hook. */
1578 #ifdef HAVE_WINDOW_SYSTEM
1579 if (FRAME_WINDOW_P (XFRAME (frame
)))
1580 x_iconify_frame (XFRAME (frame
));
1583 /* Make menu bar update for the Buffers and Frams menus. */
1584 windows_or_buffers_changed
++;
1589 DEFUN ("frame-visible-p", Fframe_visible_p
, Sframe_visible_p
,
1591 "Return t if FRAME is now \"visible\" (actually in use for display).\n\
1592 A frame that is not \"visible\" is not updated and, if it works through\n\
1593 a window system, it may not show at all.\n\
1594 Return the symbol `icon' if frame is visible only as an icon.")
1598 CHECK_LIVE_FRAME (frame
, 0);
1600 FRAME_SAMPLE_VISIBILITY (XFRAME (frame
));
1602 if (FRAME_VISIBLE_P (XFRAME (frame
)))
1604 if (FRAME_ICONIFIED_P (XFRAME (frame
)))
1609 DEFUN ("visible-frame-list", Fvisible_frame_list
, Svisible_frame_list
,
1611 "Return a list of all frames now \"visible\" (being updated).")
1614 Lisp_Object tail
, frame
;
1619 for (tail
= Vframe_list
; CONSP (tail
); tail
= XCDR (tail
))
1621 frame
= XCAR (tail
);
1622 if (!FRAMEP (frame
))
1625 if (FRAME_VISIBLE_P (f
))
1626 value
= Fcons (frame
, value
);
1632 DEFUN ("raise-frame", Fraise_frame
, Sraise_frame
, 0, 1, "",
1633 "Bring FRAME to the front, so it occludes any frames it overlaps.\n\
1634 If FRAME is invisible, make it visible.\n\
1635 If you don't specify a frame, the selected frame is used.\n\
1636 If Emacs is displaying on an ordinary terminal or some other device which\n\
1637 doesn't support multiple overlapping frames, this function does nothing.")
1642 frame
= selected_frame
;
1644 CHECK_LIVE_FRAME (frame
, 0);
1646 /* Do like the documentation says. */
1647 Fmake_frame_visible (frame
);
1649 if (frame_raise_lower_hook
)
1650 (*frame_raise_lower_hook
) (XFRAME (frame
), 1);
1655 /* Should we have a corresponding function called Flower_Power? */
1656 DEFUN ("lower-frame", Flower_frame
, Slower_frame
, 0, 1, "",
1657 "Send FRAME to the back, so it is occluded by any frames that overlap it.\n\
1658 If you don't specify a frame, the selected frame is used.\n\
1659 If Emacs is displaying on an ordinary terminal or some other device which\n\
1660 doesn't support multiple overlapping frames, this function does nothing.")
1665 frame
= selected_frame
;
1667 CHECK_LIVE_FRAME (frame
, 0);
1669 if (frame_raise_lower_hook
)
1670 (*frame_raise_lower_hook
) (XFRAME (frame
), 0);
1676 DEFUN ("redirect-frame-focus", Fredirect_frame_focus
, Sredirect_frame_focus
,
1678 "Arrange for keystrokes typed at FRAME to be sent to FOCUS-FRAME.\n\
1679 In other words, switch-frame events caused by events in FRAME will\n\
1680 request a switch to FOCUS-FRAME, and `last-event-frame' will be\n\
1681 FOCUS-FRAME after reading an event typed at FRAME.\n\
1683 If FOCUS-FRAME is omitted or nil, any existing redirection is\n\
1684 cancelled, and the frame again receives its own keystrokes.\n\
1686 Focus redirection is useful for temporarily redirecting keystrokes to\n\
1687 a surrogate minibuffer frame when a frame doesn't have its own\n\
1688 minibuffer window.\n\
1690 A frame's focus redirection can be changed by select-frame. If frame\n\
1691 FOO is selected, and then a different frame BAR is selected, any\n\
1692 frames redirecting their focus to FOO are shifted to redirect their\n\
1693 focus to BAR. This allows focus redirection to work properly when the\n\
1694 user switches from one frame to another using `select-window'.\n\
1696 This means that a frame whose focus is redirected to itself is treated\n\
1697 differently from a frame whose focus is redirected to nil; the former\n\
1698 is affected by select-frame, while the latter is not.\n\
1700 The redirection lasts until `redirect-frame-focus' is called to change it.")
1701 (frame
, focus_frame
)
1702 Lisp_Object frame
, focus_frame
;
1704 /* Note that we don't check for a live frame here. It's reasonable
1705 to redirect the focus of a frame you're about to delete, if you
1706 know what other frame should receive those keystrokes. */
1707 CHECK_FRAME (frame
, 0);
1709 if (! NILP (focus_frame
))
1710 CHECK_LIVE_FRAME (focus_frame
, 1);
1712 XFRAME (frame
)->focus_frame
= focus_frame
;
1714 if (frame_rehighlight_hook
)
1715 (*frame_rehighlight_hook
) (XFRAME (frame
));
1721 DEFUN ("frame-focus", Fframe_focus
, Sframe_focus
, 1, 1, 0,
1722 "Return the frame to which FRAME's keystrokes are currently being sent.\n\
1723 This returns nil if FRAME's focus is not redirected.\n\
1724 See `redirect-frame-focus'.")
1728 CHECK_LIVE_FRAME (frame
, 0);
1730 return FRAME_FOCUS_FRAME (XFRAME (frame
));
1735 /* Return the value of frame parameter PROP in frame FRAME. */
1738 get_frame_param (frame
, prop
)
1739 register struct frame
*frame
;
1742 register Lisp_Object tem
;
1744 tem
= Fassq (prop
, frame
->param_alist
);
1750 /* Return the buffer-predicate of the selected frame. */
1753 frame_buffer_predicate (frame
)
1756 return XFRAME (frame
)->buffer_predicate
;
1759 /* Return the buffer-list of the selected frame. */
1762 frame_buffer_list (frame
)
1765 return XFRAME (frame
)->buffer_list
;
1768 /* Set the buffer-list of the selected frame. */
1771 set_frame_buffer_list (frame
, list
)
1772 Lisp_Object frame
, list
;
1774 XFRAME (frame
)->buffer_list
= list
;
1777 /* Discard BUFFER from the buffer-list of each frame. */
1780 frames_discard_buffer (buffer
)
1783 Lisp_Object frame
, tail
;
1785 FOR_EACH_FRAME (tail
, frame
)
1787 XFRAME (frame
)->buffer_list
1788 = Fdelq (buffer
, XFRAME (frame
)->buffer_list
);
1792 /* Move BUFFER to the end of the buffer-list of each frame. */
1795 frames_bury_buffer (buffer
)
1798 Lisp_Object frame
, tail
;
1800 FOR_EACH_FRAME (tail
, frame
)
1802 struct frame
*f
= XFRAME (frame
);
1805 found
= Fmemq (buffer
, f
->buffer_list
);
1807 f
->buffer_list
= nconc2 (Fdelq (buffer
, f
->buffer_list
),
1808 Fcons (buffer
, Qnil
));
1812 /* Modify the alist in *ALISTPTR to associate PROP with VAL.
1813 If the alist already has an element for PROP, we change it. */
1816 store_in_alist (alistptr
, prop
, val
)
1817 Lisp_Object
*alistptr
, val
;
1820 register Lisp_Object tem
;
1822 tem
= Fassq (prop
, *alistptr
);
1824 *alistptr
= Fcons (Fcons (prop
, val
), *alistptr
);
1830 frame_name_fnn_p (str
, len
)
1834 if (len
> 1 && str
[0] == 'F')
1838 strtol (str
+ 1, &end_ptr
, 10);
1840 if (end_ptr
== str
+ len
)
1846 /* Set the name of the terminal frame. Also used by MSDOS frames.
1847 Modeled after x_set_name which is used for WINDOW frames. */
1850 set_term_frame_name (f
, name
)
1854 f
->explicit_name
= ! NILP (name
);
1856 /* If NAME is nil, set the name to F<num>. */
1861 /* Check for no change needed in this very common case
1862 before we do any consing. */
1863 if (frame_name_fnn_p (XSTRING (f
->name
)->data
,
1864 STRING_BYTES (XSTRING (f
->name
))))
1867 terminal_frame_count
++;
1868 sprintf (namebuf
, "F%d", terminal_frame_count
);
1869 name
= build_string (namebuf
);
1873 CHECK_STRING (name
, 0);
1875 /* Don't change the name if it's already NAME. */
1876 if (! NILP (Fstring_equal (name
, f
->name
)))
1879 /* Don't allow the user to set the frame name to F<num>, so it
1880 doesn't clash with the names we generate for terminal frames. */
1881 if (frame_name_fnn_p (XSTRING (name
)->data
, STRING_BYTES (XSTRING (name
))))
1882 error ("Frame names of the form F<num> are usurped by Emacs");
1886 update_mode_lines
= 1;
1890 store_frame_param (f
, prop
, val
)
1892 Lisp_Object prop
, val
;
1894 register Lisp_Object old_alist_elt
;
1896 /* The buffer-alist parameter is stored in a special place and is
1897 not in the alist. */
1898 if (EQ (prop
, Qbuffer_list
))
1900 f
->buffer_list
= val
;
1904 /* If PROP is a symbol which is supposed to have frame-local values,
1905 and it is set up based on this frame, switch to the global
1906 binding. That way, we can create or alter the frame-local binding
1907 without messing up the symbol's status. */
1910 Lisp_Object valcontents
;
1911 valcontents
= XSYMBOL (prop
)->value
;
1912 if ((BUFFER_LOCAL_VALUEP (valcontents
)
1913 || SOME_BUFFER_LOCAL_VALUEP (valcontents
))
1914 && XBUFFER_LOCAL_VALUE (valcontents
)->check_frame
1915 && XFRAME (XBUFFER_LOCAL_VALUE (valcontents
)->frame
) == f
)
1916 swap_in_global_binding (prop
);
1919 /* Update the frame parameter alist. */
1920 old_alist_elt
= Fassq (prop
, f
->param_alist
);
1921 if (EQ (old_alist_elt
, Qnil
))
1922 f
->param_alist
= Fcons (Fcons (prop
, val
), f
->param_alist
);
1924 Fsetcdr (old_alist_elt
, val
);
1926 /* Update some other special parameters in their special places
1927 in addition to the alist. */
1929 if (EQ (prop
, Qbuffer_predicate
))
1930 f
->buffer_predicate
= val
;
1932 if (! FRAME_WINDOW_P (f
))
1934 if (EQ (prop
, Qmenu_bar_lines
))
1935 set_menu_bar_lines (f
, val
, make_number (FRAME_MENU_BAR_LINES (f
)));
1936 else if (EQ (prop
, Qname
))
1937 set_term_frame_name (f
, val
);
1940 if (EQ (prop
, Qminibuffer
) && WINDOWP (val
))
1942 if (! MINI_WINDOW_P (XWINDOW (val
)))
1943 error ("Surrogate minibuffer windows must be minibuffer windows.");
1945 if ((FRAME_HAS_MINIBUF_P (f
) || FRAME_MINIBUF_ONLY_P (f
))
1946 && !EQ (val
, f
->minibuffer_window
))
1947 error ("Can't change the surrogate minibuffer of a frame with its own minibuffer");
1949 /* Install the chosen minibuffer window, with proper buffer. */
1950 f
->minibuffer_window
= val
;
1954 DEFUN ("frame-parameters", Fframe_parameters
, Sframe_parameters
, 0, 1, 0,
1955 "Return the parameters-alist of frame FRAME.\n\
1956 It is a list of elements of the form (PARM . VALUE), where PARM is a symbol.\n\
1957 The meaningful PARMs depend on the kind of frame.\n\
1958 If FRAME is omitted, return information on the currently selected frame.")
1965 struct gcpro gcpro1
;
1968 frame
= selected_frame
;
1970 CHECK_FRAME (frame
, 0);
1973 if (!FRAME_LIVE_P (f
))
1976 alist
= Fcopy_alist (f
->param_alist
);
1979 if (!FRAME_WINDOW_P (f
))
1981 int fg
= FRAME_FOREGROUND_PIXEL (f
);
1982 int bg
= FRAME_BACKGROUND_PIXEL (f
);
1985 /* If the frame's parameter alist says the colors are
1986 unspecified and reversed, take the frame's background pixel
1987 for foreground and vice versa. */
1988 elt
= Fassq (Qforeground_color
, alist
);
1989 if (!NILP (elt
) && CONSP (elt
) && STRINGP (XCDR (elt
)))
1991 if (strncmp (XSTRING (XCDR (elt
))->data
,
1993 XSTRING (XCDR (elt
))->size
) == 0)
1994 store_in_alist (&alist
, Qforeground_color
, tty_color_name (f
, bg
));
1995 else if (strncmp (XSTRING (XCDR (elt
))->data
,
1997 XSTRING (XCDR (elt
))->size
) == 0)
1998 store_in_alist (&alist
, Qforeground_color
, tty_color_name (f
, fg
));
2001 store_in_alist (&alist
, Qforeground_color
, tty_color_name (f
, fg
));
2002 elt
= Fassq (Qbackground_color
, alist
);
2003 if (!NILP (elt
) && CONSP (elt
) && STRINGP (XCDR (elt
)))
2005 if (strncmp (XSTRING (XCDR (elt
))->data
,
2007 XSTRING (XCDR (elt
))->size
) == 0)
2008 store_in_alist (&alist
, Qbackground_color
, tty_color_name (f
, fg
));
2009 else if (strncmp (XSTRING (XCDR (elt
))->data
,
2011 XSTRING (XCDR (elt
))->size
) == 0)
2012 store_in_alist (&alist
, Qbackground_color
, tty_color_name (f
, bg
));
2015 store_in_alist (&alist
, Qbackground_color
, tty_color_name (f
, bg
));
2016 store_in_alist (&alist
, intern ("font"),
2017 build_string (FRAME_MSDOS_P (f
)
2019 : FRAME_W32_P (f
) ? "w32term"
2022 store_in_alist (&alist
, Qname
, f
->name
);
2023 height
= (FRAME_NEW_HEIGHT (f
) ? FRAME_NEW_HEIGHT (f
) : FRAME_HEIGHT (f
));
2024 store_in_alist (&alist
, Qheight
, make_number (height
));
2025 width
= (FRAME_NEW_WIDTH (f
) ? FRAME_NEW_WIDTH (f
) : FRAME_WIDTH (f
));
2026 store_in_alist (&alist
, Qwidth
, make_number (width
));
2027 store_in_alist (&alist
, Qmodeline
, (FRAME_WANTS_MODELINE_P (f
) ? Qt
: Qnil
));
2028 store_in_alist (&alist
, Qminibuffer
,
2029 (! FRAME_HAS_MINIBUF_P (f
) ? Qnil
2030 : FRAME_MINIBUF_ONLY_P (f
) ? Qonly
2031 : FRAME_MINIBUF_WINDOW (f
)));
2032 store_in_alist (&alist
, Qunsplittable
, (FRAME_NO_SPLIT_P (f
) ? Qt
: Qnil
));
2033 store_in_alist (&alist
, Qbuffer_list
, frame_buffer_list (frame
));
2035 /* I think this should be done with a hook. */
2036 #ifdef HAVE_WINDOW_SYSTEM
2037 if (FRAME_WINDOW_P (f
))
2038 x_report_frame_params (f
, &alist
);
2042 /* This ought to be correct in f->param_alist for an X frame. */
2044 XSETFASTINT (lines
, FRAME_MENU_BAR_LINES (f
));
2045 store_in_alist (&alist
, Qmenu_bar_lines
, lines
);
2053 DEFUN ("frame-parameter", Fframe_parameter
, Sframe_parameter
, 2, 2, 0,
2054 "Return FRAME's value for parameter PARAMETER.\n\
2055 If FRAME is nil, describe the currently selected frame.")
2057 Lisp_Object frame
, parameter
;
2063 frame
= selected_frame
;
2065 CHECK_FRAME (frame
, 0);
2066 CHECK_SYMBOL (parameter
, 1);
2071 if (FRAME_LIVE_P (f
))
2073 if (EQ (parameter
, Qname
))
2075 #ifdef HAVE_X_WINDOWS
2076 else if (EQ (parameter
, Qdisplay
) && FRAME_X_P (f
))
2077 value
= XCAR (FRAME_X_DISPLAY_INFO (f
)->name_list_element
);
2078 #endif /* HAVE_X_WINDOWS */
2081 value
= Fassq (parameter
, f
->param_alist
);
2084 value
= XCDR (value
);
2085 /* Fframe_parameters puts the actual fg/bg color names,
2086 even if f->param_alist says otherwise. This is
2087 important when param_alist's notion of colors is
2088 "unspecified". We need to do the same here. */
2089 if (STRINGP (value
) && !FRAME_WINDOW_P (f
))
2094 if (EQ (parameter
, Qbackground_color
))
2096 color_name
= XSTRING (value
)->data
;
2097 csz
= XSTRING (value
)->size
;
2098 if (strncmp (color_name
, unspecified_bg
, csz
) == 0)
2099 value
= tty_color_name (f
, FRAME_BACKGROUND_PIXEL (f
));
2100 else if (strncmp (color_name
, unspecified_fg
, csz
) == 0)
2101 value
= tty_color_name (f
, FRAME_FOREGROUND_PIXEL (f
));
2103 else if (EQ (parameter
, Qforeground_color
))
2105 color_name
= XSTRING (value
)->data
;
2106 csz
= XSTRING (value
)->size
;
2107 if (strncmp (color_name
, unspecified_fg
, csz
) == 0)
2108 value
= tty_color_name (f
, FRAME_FOREGROUND_PIXEL (f
));
2109 else if (strncmp (color_name
, unspecified_bg
, csz
) == 0)
2110 value
= tty_color_name (f
, FRAME_BACKGROUND_PIXEL (f
));
2114 else if (EQ (parameter
, Qdisplay_type
)
2115 || EQ (parameter
, Qbackground_mode
))
2116 /* Avoid consing in frequent cases. */
2119 value
= Fcdr (Fassq (parameter
, Fframe_parameters (frame
)));
2127 DEFUN ("modify-frame-parameters", Fmodify_frame_parameters
,
2128 Smodify_frame_parameters
, 2, 2, 0,
2129 "Modify the parameters of frame FRAME according to ALIST.\n\
2130 If FRAME is nil, it defaults to the selected frame.\n\
2131 ALIST is an alist of parameters to change and their new values.\n\
2132 Each element of ALIST has the form (PARM . VALUE), where PARM is a symbol.\n\
2133 The meaningful PARMs depend on the kind of frame.\n\
2134 Undefined PARMs are ignored, but stored in the frame's parameter list\n\
2135 so that `frame-parameters' will return them.\n\
2137 The value of frame parameter FOO can also be accessed\n\
2138 as a frame-local binding for the variable FOO, if you have\n\
2139 enabled such bindings for that variable with `make-variable-frame-local'.")
2141 Lisp_Object frame
, alist
;
2144 register Lisp_Object tail
, prop
, val
;
2145 int count
= BINDING_STACK_SIZE ();
2147 /* Bind this to t to inhibit initialization of the default face from
2148 X resources in face-set-after-frame-default. If we don't inhibit
2149 this, modifying the `font' frame parameter, for example, while
2150 there is a `default.attributeFont' X resource, won't work,
2151 because `default's font is reset to the value of the X resource
2152 and that resets the `font' frame parameter. */
2153 specbind (Qinhibit_default_face_x_resources
, Qt
);
2155 if (EQ (frame
, Qnil
))
2156 frame
= selected_frame
;
2157 CHECK_LIVE_FRAME (frame
, 0);
2160 /* I think this should be done with a hook. */
2161 #ifdef HAVE_WINDOW_SYSTEM
2162 if (FRAME_WINDOW_P (f
))
2163 x_set_frame_parameters (f
, alist
);
2167 if (FRAME_MSDOS_P (f
))
2168 IT_set_frame_parameters (f
, alist
);
2173 int length
= XINT (Flength (alist
));
2176 = (Lisp_Object
*) alloca (length
* sizeof (Lisp_Object
));
2178 = (Lisp_Object
*) alloca (length
* sizeof (Lisp_Object
));
2180 /* Extract parm names and values into those vectors. */
2183 for (tail
= alist
; CONSP (tail
); tail
= Fcdr (tail
))
2188 parms
[i
] = Fcar (elt
);
2189 values
[i
] = Fcdr (elt
);
2193 /* Now process them in reverse of specified order. */
2194 for (i
--; i
>= 0; i
--)
2198 store_frame_param (f
, prop
, val
);
2202 return unbind_to (count
, Qnil
);
2205 DEFUN ("frame-char-height", Fframe_char_height
, Sframe_char_height
,
2207 "Height in pixels of a line in the font in frame FRAME.\n\
2208 If FRAME is omitted, the selected frame is used.\n\
2209 For a terminal frame, the value is always 1.")
2216 frame
= selected_frame
;
2217 CHECK_FRAME (frame
, 0);
2220 #ifdef HAVE_WINDOW_SYSTEM
2221 if (FRAME_WINDOW_P (f
))
2222 return make_number (x_char_height (f
));
2225 return make_number (1);
2229 DEFUN ("frame-char-width", Fframe_char_width
, Sframe_char_width
,
2231 "Width in pixels of characters in the font in frame FRAME.\n\
2232 If FRAME is omitted, the selected frame is used.\n\
2233 The width is the same for all characters, because\n\
2234 currently Emacs supports only fixed-width fonts.\n\
2235 For a terminal screen, the value is always 1.")
2242 frame
= selected_frame
;
2243 CHECK_FRAME (frame
, 0);
2246 #ifdef HAVE_WINDOW_SYSTEM
2247 if (FRAME_WINDOW_P (f
))
2248 return make_number (x_char_width (f
));
2251 return make_number (1);
2254 DEFUN ("frame-pixel-height", Fframe_pixel_height
,
2255 Sframe_pixel_height
, 0, 1, 0,
2256 "Return a FRAME's height in pixels.\n\
2257 This counts only the height available for text lines,\n\
2258 not menu bars on window-system Emacs frames.\n\
2259 For a terminal frame, the result really gives the height in characters.\n\
2260 If FRAME is omitted, the selected frame is used.")
2267 frame
= selected_frame
;
2268 CHECK_FRAME (frame
, 0);
2271 #ifdef HAVE_WINDOW_SYSTEM
2272 if (FRAME_WINDOW_P (f
))
2273 return make_number (x_pixel_height (f
));
2276 return make_number (FRAME_HEIGHT (f
));
2279 DEFUN ("frame-pixel-width", Fframe_pixel_width
,
2280 Sframe_pixel_width
, 0, 1, 0,
2281 "Return FRAME's width in pixels.\n\
2282 For a terminal frame, the result really gives the width in characters.\n\
2283 If FRAME is omitted, the selected frame is used.")
2290 frame
= selected_frame
;
2291 CHECK_FRAME (frame
, 0);
2294 #ifdef HAVE_WINDOW_SYSTEM
2295 if (FRAME_WINDOW_P (f
))
2296 return make_number (x_pixel_width (f
));
2299 return make_number (FRAME_WIDTH (f
));
2302 DEFUN ("set-frame-height", Fset_frame_height
, Sset_frame_height
, 2, 3, 0,
2303 "Specify that the frame FRAME has LINES lines.\n\
2304 Optional third arg non-nil means that redisplay should use LINES lines\n\
2305 but that the idea of the actual height of the frame should not be changed.")
2306 (frame
, lines
, pretend
)
2307 Lisp_Object frame
, lines
, pretend
;
2309 register struct frame
*f
;
2311 CHECK_NUMBER (lines
, 0);
2313 frame
= selected_frame
;
2314 CHECK_LIVE_FRAME (frame
, 0);
2317 /* I think this should be done with a hook. */
2318 #ifdef HAVE_WINDOW_SYSTEM
2319 if (FRAME_WINDOW_P (f
))
2321 if (XINT (lines
) != f
->height
)
2322 x_set_window_size (f
, 1, f
->width
, XINT (lines
));
2323 do_pending_window_change (0);
2327 change_frame_size (f
, XINT (lines
), 0, !NILP (pretend
), 0, 0);
2331 DEFUN ("set-frame-width", Fset_frame_width
, Sset_frame_width
, 2, 3, 0,
2332 "Specify that the frame FRAME has COLS columns.\n\
2333 Optional third arg non-nil means that redisplay should use COLS columns\n\
2334 but that the idea of the actual width of the frame should not be changed.")
2335 (frame
, cols
, pretend
)
2336 Lisp_Object frame
, cols
, pretend
;
2338 register struct frame
*f
;
2339 CHECK_NUMBER (cols
, 0);
2341 frame
= selected_frame
;
2342 CHECK_LIVE_FRAME (frame
, 0);
2345 /* I think this should be done with a hook. */
2346 #ifdef HAVE_WINDOW_SYSTEM
2347 if (FRAME_WINDOW_P (f
))
2349 if (XINT (cols
) != f
->width
)
2350 x_set_window_size (f
, 1, XINT (cols
), f
->height
);
2351 do_pending_window_change (0);
2355 change_frame_size (f
, 0, XINT (cols
), !NILP (pretend
), 0, 0);
2359 DEFUN ("set-frame-size", Fset_frame_size
, Sset_frame_size
, 3, 3, 0,
2360 "Sets size of FRAME to COLS by ROWS, measured in characters.")
2362 Lisp_Object frame
, cols
, rows
;
2364 register struct frame
*f
;
2366 CHECK_LIVE_FRAME (frame
, 0);
2367 CHECK_NUMBER (cols
, 2);
2368 CHECK_NUMBER (rows
, 1);
2371 /* I think this should be done with a hook. */
2372 #ifdef HAVE_WINDOW_SYSTEM
2373 if (FRAME_WINDOW_P (f
))
2375 if (XINT (rows
) != f
->height
|| XINT (cols
) != f
->width
2376 || FRAME_NEW_HEIGHT (f
) || FRAME_NEW_WIDTH (f
))
2377 x_set_window_size (f
, 1, XINT (cols
), XINT (rows
));
2378 do_pending_window_change (0);
2382 change_frame_size (f
, XINT (rows
), XINT (cols
), 0, 0, 0);
2387 DEFUN ("set-frame-position", Fset_frame_position
,
2388 Sset_frame_position
, 3, 3, 0,
2389 "Sets position of FRAME in pixels to XOFFSET by YOFFSET.\n\
2390 This is actually the position of the upper left corner of the frame.\n\
2391 Negative values for XOFFSET or YOFFSET are interpreted relative to\n\
2392 the rightmost or bottommost possible position (that stays within the screen).")
2393 (frame
, xoffset
, yoffset
)
2394 Lisp_Object frame
, xoffset
, yoffset
;
2396 register struct frame
*f
;
2398 CHECK_LIVE_FRAME (frame
, 0);
2399 CHECK_NUMBER (xoffset
, 1);
2400 CHECK_NUMBER (yoffset
, 2);
2403 /* I think this should be done with a hook. */
2404 #ifdef HAVE_WINDOW_SYSTEM
2405 if (FRAME_WINDOW_P (f
))
2406 x_set_offset (f
, XINT (xoffset
), XINT (yoffset
), 1);
2416 Qframep
= intern ("framep");
2417 staticpro (&Qframep
);
2418 Qframe_live_p
= intern ("frame-live-p");
2419 staticpro (&Qframe_live_p
);
2420 Qheight
= intern ("height");
2421 staticpro (&Qheight
);
2422 Qicon
= intern ("icon");
2424 Qminibuffer
= intern ("minibuffer");
2425 staticpro (&Qminibuffer
);
2426 Qmodeline
= intern ("modeline");
2427 staticpro (&Qmodeline
);
2428 Qname
= intern ("name");
2430 Qonly
= intern ("only");
2432 Qunsplittable
= intern ("unsplittable");
2433 staticpro (&Qunsplittable
);
2434 Qmenu_bar_lines
= intern ("menu-bar-lines");
2435 staticpro (&Qmenu_bar_lines
);
2436 Qtool_bar_lines
= intern ("tool-bar-lines");
2437 staticpro (&Qtool_bar_lines
);
2438 Qwidth
= intern ("width");
2439 staticpro (&Qwidth
);
2442 Qw32
= intern ("w32");
2444 Qpc
= intern ("pc");
2446 Qmac
= intern ("mac");
2448 Qvisible
= intern ("visible");
2449 staticpro (&Qvisible
);
2450 Qbuffer_predicate
= intern ("buffer-predicate");
2451 staticpro (&Qbuffer_predicate
);
2452 Qbuffer_list
= intern ("buffer-list");
2453 staticpro (&Qbuffer_list
);
2454 Qtitle
= intern ("title");
2455 staticpro (&Qtitle
);
2456 Qdisplay_type
= intern ("display-type");
2457 staticpro (&Qdisplay_type
);
2458 Qbackground_mode
= intern ("background-mode");
2459 staticpro (&Qbackground_mode
);
2461 DEFVAR_LISP ("default-frame-alist", &Vdefault_frame_alist
,
2462 "Alist of default values for frame creation.\n\
2463 These may be set in your init file, like this:\n\
2464 (setq default-frame-alist '((width . 80) (height . 55) (menu-bar-lines . 1))\n\
2465 These override values given in window system configuration data,\n\
2466 including X Windows' defaults database.\n\
2467 For values specific to the first Emacs frame, see `initial-frame-alist'.\n\
2468 For values specific to the separate minibuffer frame, see\n\
2469 `minibuffer-frame-alist'.\n\
2470 The `menu-bar-lines' element of the list controls whether new frames\n\
2471 have menu bars; `menu-bar-mode' works by altering this element.");
2472 Vdefault_frame_alist
= Qnil
;
2474 Qinhibit_default_face_x_resources
2475 = intern ("inhibit-default-face-x-resources");
2476 staticpro (&Qinhibit_default_face_x_resources
);
2478 DEFVAR_LISP ("terminal-frame", &Vterminal_frame
,
2479 "The initial frame-object, which represents Emacs's stdout.");
2481 DEFVAR_LISP ("emacs-iconified", &Vemacs_iconified
,
2482 "Non-nil if all of emacs is iconified and frame updates are not needed.");
2483 Vemacs_iconified
= Qnil
;
2485 DEFVAR_LISP ("mouse-position-function", &Vmouse_position_function
,
2486 "If non-nil, function applied to the normal result of `mouse-position'.\n\
2487 This abnormal hook exists for the benefit of packages like XTerm-mouse\n\
2488 which need to do mouse handling at the Lisp level.");
2489 Vmouse_position_function
= Qnil
;
2491 DEFVAR_KBOARD ("default-minibuffer-frame", Vdefault_minibuffer_frame
,
2492 "Minibufferless frames use this frame's minibuffer.\n\
2494 Emacs cannot create minibufferless frames unless this is set to an\n\
2495 appropriate surrogate.\n\
2497 Emacs consults this variable only when creating minibufferless\n\
2498 frames; once the frame is created, it sticks with its assigned\n\
2499 minibuffer, no matter what this variable is set to. This means that\n\
2500 this variable doesn't necessarily say anything meaningful about the\n\
2501 current set of frames, or where the minibuffer is currently being\n\
2504 staticpro (&Vframe_list
);
2506 defsubr (&Sactive_minibuffer_window
);
2508 defsubr (&Sframe_live_p
);
2509 defsubr (&Smake_terminal_frame
);
2510 defsubr (&Shandle_switch_frame
);
2511 defsubr (&Signore_event
);
2512 defsubr (&Sselect_frame
);
2513 defsubr (&Sselected_frame
);
2514 defsubr (&Swindow_frame
);
2515 defsubr (&Sframe_root_window
);
2516 defsubr (&Sframe_first_window
);
2517 defsubr (&Sframe_selected_window
);
2518 defsubr (&Sset_frame_selected_window
);
2519 defsubr (&Sframe_list
);
2520 defsubr (&Snext_frame
);
2521 defsubr (&Sprevious_frame
);
2522 defsubr (&Sdelete_frame
);
2523 defsubr (&Smouse_position
);
2524 defsubr (&Smouse_pixel_position
);
2525 defsubr (&Sset_mouse_position
);
2526 defsubr (&Sset_mouse_pixel_position
);
2528 defsubr (&Sframe_configuration
);
2529 defsubr (&Srestore_frame_configuration
);
2531 defsubr (&Smake_frame_visible
);
2532 defsubr (&Smake_frame_invisible
);
2533 defsubr (&Siconify_frame
);
2534 defsubr (&Sframe_visible_p
);
2535 defsubr (&Svisible_frame_list
);
2536 defsubr (&Sraise_frame
);
2537 defsubr (&Slower_frame
);
2538 defsubr (&Sredirect_frame_focus
);
2539 defsubr (&Sframe_focus
);
2540 defsubr (&Sframe_parameters
);
2541 defsubr (&Sframe_parameter
);
2542 defsubr (&Smodify_frame_parameters
);
2543 defsubr (&Sframe_char_height
);
2544 defsubr (&Sframe_char_width
);
2545 defsubr (&Sframe_pixel_height
);
2546 defsubr (&Sframe_pixel_width
);
2547 defsubr (&Sset_frame_height
);
2548 defsubr (&Sset_frame_width
);
2549 defsubr (&Sset_frame_size
);
2550 defsubr (&Sset_frame_position
);
2556 initial_define_lispy_key (global_map
, "switch-frame", "handle-switch-frame");
2557 initial_define_lispy_key (global_map
, "delete-frame", "handle-delete-frame");
2558 initial_define_lispy_key (global_map
, "iconify-frame", "ignore-event");
2559 initial_define_lispy_key (global_map
, "make-frame-visible", "ignore-event");