frame.c 41.8 KB
Newer Older
Jim Blandy's avatar
Jim Blandy committed
1
/* Generic frame functions.
Jim Blandy's avatar
Jim Blandy committed
2
   Copyright (C) 1989, 1992 Free Software Foundation.
Jim Blandy's avatar
Jim Blandy committed
3 4 5 6 7

This file is part of GNU Emacs.

GNU Emacs is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
Jim Blandy's avatar
Jim Blandy committed
8
the Free Software Foundation; either version 2, or (at your option)
Jim Blandy's avatar
Jim Blandy committed
9 10 11 12 13 14 15 16 17 18 19
any later version.

GNU Emacs is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with GNU Emacs; see the file COPYING.  If not, write to
the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */

Jim Blandy's avatar
Jim Blandy committed
20 21
#include <stdio.h>

Jim Blandy's avatar
Jim Blandy committed
22
#include "config.h"
23 24
#include "lisp.h"
#include "frame.h"
Jim Blandy's avatar
Jim Blandy committed
25

Jim Blandy's avatar
Jim Blandy committed
26
#ifdef MULTI_FRAME
Jim Blandy's avatar
Jim Blandy committed
27

Jim Blandy's avatar
Jim Blandy committed
28
#include "buffer.h"
Jim Blandy's avatar
Jim Blandy committed
29
#include "window.h"
Jim Blandy's avatar
Jim Blandy committed
30
#include "termhooks.h"
Jim Blandy's avatar
Jim Blandy committed
31

32 33 34 35
/* These help us bind and responding to switch-frame events.  */
#include "commands.h"
#include "keyboard.h"

Jim Blandy's avatar
Jim Blandy committed
36
Lisp_Object Vemacs_iconified;
Jim Blandy's avatar
Jim Blandy committed
37 38 39 40
Lisp_Object Vframe_list;
Lisp_Object Vterminal_frame;
Lisp_Object Vdefault_minibuffer_frame;
Lisp_Object Vdefault_frame_alist;
41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79

/* Evaluate this expression to rebuild the section of syms_of_frame
   that initializes and staticpros the symbols declared below.  Note
   that Emacs 18 has a bug that keeps C-x C-e from being able to
   evaluate this expression.

(progn
  ;; Accumulate a list of the symbols we want to initialize from the
  ;; declarations at the top of the file.
  (goto-char (point-min))
  (search-forward "/\*&&& symbols declared here &&&*\/\n")
  (let (symbol-list)
    (while (looking-at "Lisp_Object \\(Q[a-z_]+\\)")
      (setq symbol-list
	    (cons (buffer-substring (match-beginning 1) (match-end 1))
		  symbol-list))
      (forward-line 1))
    (setq symbol-list (nreverse symbol-list))
    ;; Delete the section of syms_of_... where we initialize the symbols.
    (search-forward "\n  /\*&&& init symbols here &&&*\/\n")
    (let ((start (point)))
      (while (looking-at "^  Q")
	(forward-line 2))
      (kill-region start (point)))
    ;; Write a new symbol initialization section.
    (while symbol-list
      (insert (format "  %s = intern (\"" (car symbol-list)))
      (let ((start (point)))
	(insert (substring (car symbol-list) 1))
	(subst-char-in-region start (point) ?_ ?-))
      (insert (format "\");\n  staticpro (&%s);\n" (car symbol-list)))
      (setq symbol-list (cdr symbol-list)))))
  */        

/*&&& symbols declared here &&&*/
Lisp_Object Qframep;
Lisp_Object Qlive_frame_p;
Lisp_Object Qheight;
Lisp_Object Qicon;
Jim Blandy's avatar
Jim Blandy committed
80
Lisp_Object Qminibuffer;
81 82 83 84 85 86 87
Lisp_Object Qmodeline;
Lisp_Object Qname;
Lisp_Object Qnone;
Lisp_Object Qonly;
Lisp_Object Qunsplittable;
Lisp_Object Qwidth;
Lisp_Object Qx;
Jim Blandy's avatar
Jim Blandy committed
88 89 90 91

extern Lisp_Object Vminibuffer_list;
extern Lisp_Object get_minibuffer ();

Jim Blandy's avatar
Jim Blandy committed
92 93 94 95 96
DEFUN ("framep", Fframep, Sframep, 1, 1, 0,
  "Return non-nil if OBJECT is a frame.\n\
Value is t for a termcap frame (a character-only terminal),\n\
`x' for an Emacs frame that is really an X window.\n\
Also see `live-frame-p'.")
Jim Blandy's avatar
Jim Blandy committed
97 98
  (object)
     Lisp_Object object;
Jim Blandy's avatar
Jim Blandy committed
99
{
Jim Blandy's avatar
Jim Blandy committed
100
  if (XTYPE (object) != Lisp_Frame)
Jim Blandy's avatar
Jim Blandy committed
101
    return Qnil;
Jim Blandy's avatar
Jim Blandy committed
102
  switch (XFRAME (object)->output_method)
Jim Blandy's avatar
Jim Blandy committed
103 104 105 106
    {
    case output_termcap:
      return Qt;
    case output_x_window:
107
      return Qx;
Jim Blandy's avatar
Jim Blandy committed
108 109 110 111 112
    default:
      abort ();
    }
}

Jim Blandy's avatar
Jim Blandy committed
113 114 115 116 117 118
DEFUN ("live-frame-p", Flive_frame_p, Slive_frame_p, 1, 1, 0,
  "Return non-nil if OBJECT is a frame which has not been deleted.\n\
Value is nil if OBJECT is not a live frame.  If object is a live\n\
frame, the return value indicates what sort of output device it is\n\
displayed on.  Value is t for a termcap frame (a character-only\n\
terminal), `x' for an Emacs frame being displayed in an X window.")
Jim Blandy's avatar
Jim Blandy committed
119 120 121
  (object)
     Lisp_Object object;
{
Jim Blandy's avatar
Jim Blandy committed
122 123 124
  return ((FRAMEP (object)
	   && FRAME_LIVE_P (XFRAME (object)))
	  ? Fframep (object)
Jim Blandy's avatar
Jim Blandy committed
125 126 127
	  : Qnil);
}

Jim Blandy's avatar
Jim Blandy committed
128 129
struct frame *
make_frame (mini_p)
Jim Blandy's avatar
Jim Blandy committed
130 131
     int mini_p;
{
Jim Blandy's avatar
Jim Blandy committed
132 133
  Lisp_Object frame;
  register struct frame *f;
Jim Blandy's avatar
Jim Blandy committed
134 135 136
  register Lisp_Object root_window;
  register Lisp_Object mini_window;

Jim Blandy's avatar
Jim Blandy committed
137
  frame = Fmake_vector (((sizeof (struct frame) - (sizeof (Lisp_Vector)
Jim Blandy's avatar
Jim Blandy committed
138 139
						     - sizeof (Lisp_Object)))
			  / sizeof (Lisp_Object)),
Jim Blandy's avatar
Jim Blandy committed
140
			 make_number (0));
Jim Blandy's avatar
Jim Blandy committed
141 142 143 144 145 146 147 148
  XSETTYPE (frame, Lisp_Frame);
  f = XFRAME (frame);

  f->cursor_x = 0;
  f->cursor_y = 0;
  f->current_glyphs = 0;
  f->desired_glyphs = 0;
  f->visible = 0;
149
  f->async_visible = 0;
Jim Blandy's avatar
Jim Blandy committed
150 151
  f->display.nothing = 0;
  f->iconified = 0;
152
  f->async_iconified = 0;
Jim Blandy's avatar
Jim Blandy committed
153 154 155 156 157 158
  f->wants_modeline = 1;
  f->auto_raise = 0;
  f->auto_lower = 0;
  f->no_split = 0;
  f->garbaged = 0;
  f->has_minibuffer = mini_p;
159
  f->focus_frame = Qnil;
160
  f->explicit_name = 0;
161 162
  f->can_have_scrollbars = 0;
  f->has_vertical_scrollbars = 0;
Jim Blandy's avatar
Jim Blandy committed
163 164

  f->param_alist = Qnil;
Jim Blandy's avatar
Jim Blandy committed
165

166
  root_window = make_window ();
Jim Blandy's avatar
Jim Blandy committed
167 168
  if (mini_p)
    {
169
      mini_window = make_window ();
Jim Blandy's avatar
Jim Blandy committed
170 171 172
      XWINDOW (root_window)->next = mini_window;
      XWINDOW (mini_window)->prev = root_window;
      XWINDOW (mini_window)->mini_p = Qt;
Jim Blandy's avatar
Jim Blandy committed
173 174
      XWINDOW (mini_window)->frame = frame;
      f->minibuffer_window = mini_window;
Jim Blandy's avatar
Jim Blandy committed
175 176 177 178 179
    }
  else
    {
      mini_window = Qnil;
      XWINDOW (root_window)->next = Qnil;
Jim Blandy's avatar
Jim Blandy committed
180
      f->minibuffer_window = Qnil;
Jim Blandy's avatar
Jim Blandy committed
181 182
    }

Jim Blandy's avatar
Jim Blandy committed
183
  XWINDOW (root_window)->frame = frame;
Jim Blandy's avatar
Jim Blandy committed
184 185 186

  /* 10 is arbitrary,
     just so that there is "something there."
Jim Blandy's avatar
Jim Blandy committed
187
     Correct size will be set up later with change_frame_size.  */
Jim Blandy's avatar
Jim Blandy committed
188

Jim Blandy's avatar
Jim Blandy committed
189 190
  f->width = 10;
  f->height = 10;
Jim Blandy's avatar
Jim Blandy committed
191 192 193 194 195 196 197 198 199 200 201

  XFASTINT (XWINDOW (root_window)->width) = 10;
  XFASTINT (XWINDOW (root_window)->height) = (mini_p ? 9 : 10);

  if (mini_p)
    {
      XFASTINT (XWINDOW (mini_window)->width) = 10;
      XFASTINT (XWINDOW (mini_window)->top) = 9;
      XFASTINT (XWINDOW (mini_window)->height) = 1;
    }

Jim Blandy's avatar
Jim Blandy committed
202
  /* Choose a buffer for the frame's root window.  */
Jim Blandy's avatar
Jim Blandy committed
203 204 205 206 207 208 209 210
  {
    Lisp_Object buf;

    XWINDOW (root_window)->buffer = Qt;
    buf = Fcurrent_buffer ();
    /* If buf is a 'hidden' buffer (i.e. one whose name starts with
       a space), try to find another one.  */
    if (XSTRING (Fbuffer_name (buf))->data[0] == ' ')
211
      buf = Fother_buffer (buf, Qnil);
Jim Blandy's avatar
Jim Blandy committed
212 213 214
    Fset_window_buffer (root_window, buf);
  }

Jim Blandy's avatar
Jim Blandy committed
215 216 217 218
  if (mini_p)
    {
      XWINDOW (mini_window)->buffer = Qt;
      Fset_window_buffer (mini_window,
Jim Blandy's avatar
Jim Blandy committed
219
			  (NILP (Vminibuffer_list)
Jim Blandy's avatar
Jim Blandy committed
220 221 222 223
			   ? get_minibuffer (0)
			   : Fcar (Vminibuffer_list)));
    }

Jim Blandy's avatar
Jim Blandy committed
224 225
  f->root_window = root_window;
  f->selected_window = root_window;
Jim Blandy's avatar
Jim Blandy committed
226 227
  /* Make sure this window seems more recently used than
     a newly-created, never-selected window.  */
Jim Blandy's avatar
Jim Blandy committed
228
  XFASTINT (XWINDOW (f->selected_window)->use_time) = ++window_select_count;
Jim Blandy's avatar
Jim Blandy committed
229

Jim Blandy's avatar
Jim Blandy committed
230
  Vframe_list = Fcons (frame, Vframe_list);
Jim Blandy's avatar
Jim Blandy committed
231

Jim Blandy's avatar
Jim Blandy committed
232
  return f;
Jim Blandy's avatar
Jim Blandy committed
233 234
}

Jim Blandy's avatar
Jim Blandy committed
235
/* Make a frame using a separate minibuffer window on another frame.
Jim Blandy's avatar
Jim Blandy committed
236 237 238
   MINI_WINDOW is the minibuffer window to use.  nil means use the
   default (the global minibuffer).  */

Jim Blandy's avatar
Jim Blandy committed
239 240
struct frame *
make_frame_without_minibuffer (mini_window)
Jim Blandy's avatar
Jim Blandy committed
241 242
     register Lisp_Object mini_window;
{
Jim Blandy's avatar
Jim Blandy committed
243
  register struct frame *f;
Jim Blandy's avatar
Jim Blandy committed
244 245

  /* Choose the minibuffer window to use.  */
Jim Blandy's avatar
Jim Blandy committed
246
  if (NILP (mini_window))
Jim Blandy's avatar
Jim Blandy committed
247
    {
Jim Blandy's avatar
Jim Blandy committed
248 249 250 251 252
      if (XTYPE (Vdefault_minibuffer_frame) != Lisp_Frame)
	error ("default-minibuffer-frame must be set when creating minibufferless frames");
      if (! FRAME_LIVE_P (XFRAME (Vdefault_minibuffer_frame)))
	error ("default-minibuffer-frame must be a live frame");
      mini_window = XFRAME (Vdefault_minibuffer_frame)->minibuffer_window;
Jim Blandy's avatar
Jim Blandy committed
253 254 255
    }
  else
    {
256
      CHECK_LIVE_WINDOW (mini_window, 0);
Jim Blandy's avatar
Jim Blandy committed
257 258
    }

Jim Blandy's avatar
Jim Blandy committed
259 260
  /* Make a frame containing just a root window.  */
  f = make_frame (0);
Jim Blandy's avatar
Jim Blandy committed
261 262

  /* Install the chosen minibuffer window, with proper buffer.  */
Jim Blandy's avatar
Jim Blandy committed
263
  f->minibuffer_window = mini_window;
Jim Blandy's avatar
Jim Blandy committed
264
  Fset_window_buffer (mini_window,
Jim Blandy's avatar
Jim Blandy committed
265
		      (NILP (Vminibuffer_list)
Jim Blandy's avatar
Jim Blandy committed
266 267
		       ? get_minibuffer (0)
		       : Fcar (Vminibuffer_list)));
Jim Blandy's avatar
Jim Blandy committed
268
  return f;
Jim Blandy's avatar
Jim Blandy committed
269 270
}

Jim Blandy's avatar
Jim Blandy committed
271
/* Make a frame containing only a minibuffer window.  */
Jim Blandy's avatar
Jim Blandy committed
272

Jim Blandy's avatar
Jim Blandy committed
273 274
struct frame *
make_minibuffer_frame ()
Jim Blandy's avatar
Jim Blandy committed
275
{
Jim Blandy's avatar
Jim Blandy committed
276
  /* First make a frame containing just a root window, no minibuffer.  */
Jim Blandy's avatar
Jim Blandy committed
277

Jim Blandy's avatar
Jim Blandy committed
278
  register struct frame *f = make_frame (0);
Jim Blandy's avatar
Jim Blandy committed
279
  register Lisp_Object mini_window;
Jim Blandy's avatar
Jim Blandy committed
280
  register Lisp_Object frame;
Jim Blandy's avatar
Jim Blandy committed
281

Jim Blandy's avatar
Jim Blandy committed
282
  XSET (frame, Lisp_Frame, f);
Jim Blandy's avatar
Jim Blandy committed
283

284
  f->auto_raise = 0;
Jim Blandy's avatar
Jim Blandy committed
285 286 287 288
  f->auto_lower = 0;
  f->no_split = 1;
  f->wants_modeline = 0;
  f->has_minibuffer = 1;
Jim Blandy's avatar
Jim Blandy committed
289 290 291 292 293

  /* Now label the root window as also being the minibuffer.
     Avoid infinite looping on the window chain by marking next pointer
     as nil. */

Jim Blandy's avatar
Jim Blandy committed
294
  mini_window = f->minibuffer_window = f->root_window;
Jim Blandy's avatar
Jim Blandy committed
295 296
  XWINDOW (mini_window)->mini_p = Qt;
  XWINDOW (mini_window)->next = Qnil;
297
  XWINDOW (mini_window)->prev = Qnil;
Jim Blandy's avatar
Jim Blandy committed
298
  XWINDOW (mini_window)->frame = frame;
Jim Blandy's avatar
Jim Blandy committed
299 300 301 302

  /* Put the proper buffer in that window.  */

  Fset_window_buffer (mini_window,
Jim Blandy's avatar
Jim Blandy committed
303
		      (NILP (Vminibuffer_list)
Jim Blandy's avatar
Jim Blandy committed
304 305
		       ? get_minibuffer (0)
		       : Fcar (Vminibuffer_list)));
Jim Blandy's avatar
Jim Blandy committed
306
  return f;
Jim Blandy's avatar
Jim Blandy committed
307 308
}

Jim Blandy's avatar
Jim Blandy committed
309
/* Construct a frame that refers to the terminal (stdin and stdout).  */
Jim Blandy's avatar
Jim Blandy committed
310

Jim Blandy's avatar
Jim Blandy committed
311 312
struct frame *
make_terminal_frame ()
Jim Blandy's avatar
Jim Blandy committed
313
{
Jim Blandy's avatar
Jim Blandy committed
314 315 316 317 318
  register struct frame *f;

  Vframe_list = Qnil;
  f = make_frame (1);
  f->name = build_string ("terminal");
319
  FRAME_SET_VISIBLE (f, 1);
Jim Blandy's avatar
Jim Blandy committed
320 321 322
  f->display.nothing = 1;   /* Nonzero means frame isn't deleted.  */
  XSET (Vterminal_frame, Lisp_Frame, f);
  return f;
Jim Blandy's avatar
Jim Blandy committed
323 324
}

325
DEFUN ("select-frame", Fselect_frame, Sselect_frame, 1, 2, "e",
326
  "Select the frame FRAME.  FRAME's selected window becomes \"the\"\n\
Jim Blandy's avatar
Jim Blandy committed
327
selected window.  If the optional parameter NO-ENTER is non-nil, don't\n\
328 329 330 331 332
focus on that frame.\n\
\n\
This function is interactive, and may be bound to the ``switch-frame''\n\
event; when invoked this way, it switches to the frame named in the\n\
event.  When called from lisp, FRAME may be a ``switch-frame'' event;\n\
333 334 335 336
if it is, select the frame named in the event.\n\
\n\
Changing the selected frame can change focus redirections.  See\n\
`redirect-frame-focus' for details.")
Jim Blandy's avatar
Jim Blandy committed
337 338
  (frame, no_enter)
     Lisp_Object frame, no_enter;
Jim Blandy's avatar
Jim Blandy committed
339
{
340 341 342 343 344 345 346
  /* If FRAME is a switch-frame event, extract the frame we should
     switch to.  */
  if (CONSP (frame)
      && EQ (XCONS (frame)->car, Qswitch_frame)
      && CONSP (XCONS (frame)->cdr))
    frame = XCONS (XCONS (frame)->cdr)->car;

Jim Blandy's avatar
Jim Blandy committed
347
  CHECK_LIVE_FRAME (frame, 0);
Jim Blandy's avatar
Jim Blandy committed
348

Jim Blandy's avatar
Jim Blandy committed
349 350
  if (selected_frame == XFRAME (frame))
    return frame;
Jim Blandy's avatar
Jim Blandy committed
351

352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376
  /* If a frame's focus has been redirected toward the currently
     selected frame, we should change the redirection to point to the
     newly selected frame.  This means that if the focus is redirected
     from a minibufferless frame to a surrogate minibuffer frame, we
     can use `other-window' to switch between all the frames using
     that minibuffer frame, and the focus redirection will follow us
     around.  */
  {
    Lisp_Object tail;

    for (tail = Vframe_list; CONSP (tail); tail = XCONS (tail)->cdr)
      {
	Lisp_Object focus;

	if (XTYPE (XCONS (tail)->car) != Lisp_Frame)
	  abort ();

	focus = FRAME_FOCUS_FRAME (XFRAME (XCONS (tail)->car));

	if (XTYPE (focus) == Lisp_Frame
	    && XFRAME (focus) == selected_frame)
	  Fredirect_frame_focus (XCONS (tail)->car, frame);
      }
  }

Jim Blandy's avatar
Jim Blandy committed
377 378 379
  selected_frame = XFRAME (frame);
  if (! FRAME_MINIBUF_ONLY_P (selected_frame))
    last_nonminibuf_frame = selected_frame;
Jim Blandy's avatar
Jim Blandy committed
380

Jim Blandy's avatar
Jim Blandy committed
381
  Fselect_window (XFRAME (frame)->selected_window);
Jim Blandy's avatar
Jim Blandy committed
382 383

#ifdef HAVE_X_WINDOWS
Jim Blandy's avatar
Jim Blandy committed
384
#ifdef MULTI_FRAME
385
  if (FRAME_X_P (XFRAME (frame))
Jim Blandy's avatar
Jim Blandy committed
386
      && NILP (no_enter))
Jim Blandy's avatar
Jim Blandy committed
387
    {
Jim Blandy's avatar
Jim Blandy committed
388
      Ffocus_frame (frame);
Jim Blandy's avatar
Jim Blandy committed
389 390 391
    }
#endif
#endif
Jim Blandy's avatar
Jim Blandy committed
392
  choose_minibuf_frame ();
Jim Blandy's avatar
Jim Blandy committed
393

Jim Blandy's avatar
Jim Blandy committed
394
  return frame;
Jim Blandy's avatar
Jim Blandy committed
395 396
}

Jim Blandy's avatar
Jim Blandy committed
397 398
DEFUN ("selected-frame", Fselected_frame, Sselected_frame, 0, 0, 0,
  "Return the frame that is now selected.")
Jim Blandy's avatar
Jim Blandy committed
399 400 401
  ()
{
  Lisp_Object tem;
Jim Blandy's avatar
Jim Blandy committed
402
  XSET (tem, Lisp_Frame, selected_frame);
Jim Blandy's avatar
Jim Blandy committed
403 404 405
  return tem;
}

Jim Blandy's avatar
Jim Blandy committed
406 407
DEFUN ("window-frame", Fwindow_frame, Swindow_frame, 1, 1, 0,
  "Return the frame object that window WINDOW is on.")
Jim Blandy's avatar
Jim Blandy committed
408 409 410
  (window)
     Lisp_Object window;
{
411
  CHECK_LIVE_WINDOW (window, 0);
Jim Blandy's avatar
Jim Blandy committed
412
  return XWINDOW (window)->frame;
Jim Blandy's avatar
Jim Blandy committed
413 414
}

Jim Blandy's avatar
Jim Blandy committed
415
DEFUN ("frame-root-window", Fframe_root_window, Sframe_root_window, 0, 1, 0,
416 417
       "Returns the root-window of FRAME.\n\
If omitted, FRAME defaults to the currently selected frame.")
Jim Blandy's avatar
Jim Blandy committed
418 419
  (frame)
     Lisp_Object frame;
Jim Blandy's avatar
Jim Blandy committed
420
{
Jim Blandy's avatar
Jim Blandy committed
421 422
  if (NILP (frame))
    XSET (frame, Lisp_Frame, selected_frame);
Jim Blandy's avatar
Jim Blandy committed
423
  else
Jim Blandy's avatar
Jim Blandy committed
424
    CHECK_LIVE_FRAME (frame, 0);
Jim Blandy's avatar
Jim Blandy committed
425

Jim Blandy's avatar
Jim Blandy committed
426
  return XFRAME (frame)->root_window;
Jim Blandy's avatar
Jim Blandy committed
427 428
}

Jim Blandy's avatar
Jim Blandy committed
429 430
DEFUN ("frame-selected-window", Fframe_selected_window,
       Sframe_selected_window, 0, 1, 0,
431 432
  "Return the selected window of frame object FRAME.\n\
If omitted, FRAME defaults to the currently selected frame.")
Jim Blandy's avatar
Jim Blandy committed
433 434
  (frame)
     Lisp_Object frame;
Jim Blandy's avatar
Jim Blandy committed
435
{
Jim Blandy's avatar
Jim Blandy committed
436 437
  if (NILP (frame))
    XSET (frame, Lisp_Frame, selected_frame);
Jim Blandy's avatar
Jim Blandy committed
438
  else
Jim Blandy's avatar
Jim Blandy committed
439
    CHECK_LIVE_FRAME (frame, 0);
Jim Blandy's avatar
Jim Blandy committed
440

Jim Blandy's avatar
Jim Blandy committed
441
  return XFRAME (frame)->selected_window;
Jim Blandy's avatar
Jim Blandy committed
442 443
}

Jim Blandy's avatar
Jim Blandy committed
444
DEFUN ("frame-list", Fframe_list, Sframe_list,
Jim Blandy's avatar
Jim Blandy committed
445
       0, 0, 0,
Jim Blandy's avatar
Jim Blandy committed
446
       "Return a list of all frames.")
Jim Blandy's avatar
Jim Blandy committed
447 448
  ()
{
Jim Blandy's avatar
Jim Blandy committed
449
  return Fcopy_sequence (Vframe_list);
Jim Blandy's avatar
Jim Blandy committed
450 451
}

Jim Blandy's avatar
Jim Blandy committed
452
#ifdef MULTI_FRAME
Jim Blandy's avatar
Jim Blandy committed
453

Jim Blandy's avatar
Jim Blandy committed
454 455 456
/* Return the next frame in the frame list after FRAME.
   If MINIBUF is nil, exclude minibuffer-only frames.
   If MINIBUF is a window, include only frames using that window for
457 458
   their minibuffer.
   If MINIBUF is non-nil, and not a window, include all frames.  */
Jim Blandy's avatar
Jim Blandy committed
459
Lisp_Object
Jim Blandy's avatar
Jim Blandy committed
460 461
next_frame (frame, minibuf)
     Lisp_Object frame;
Jim Blandy's avatar
Jim Blandy committed
462
     Lisp_Object minibuf;
Jim Blandy's avatar
Jim Blandy committed
463 464 465 466
{
  Lisp_Object tail;
  int passed = 0;

Jim Blandy's avatar
Jim Blandy committed
467 468
  /* There must always be at least one frame in Vframe_list.  */
  if (! CONSP (Vframe_list))
Jim Blandy's avatar
Jim Blandy committed
469 470
    abort ();

Jim Blandy's avatar
Jim Blandy committed
471
  while (1)
Jim Blandy's avatar
Jim Blandy committed
472
    for (tail = Vframe_list; CONSP (tail); tail = XCONS (tail)->cdr)
Jim Blandy's avatar
Jim Blandy committed
473
      {
474 475
	Lisp_Object f = XCONS (tail)->car;

Jim Blandy's avatar
Jim Blandy committed
476
	if (passed)
Jim Blandy's avatar
Jim Blandy committed
477
	  {
478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496
	    /* Decide whether this frame is eligible to be returned.  */

	    /* If we've looped all the way around without finding any
	       eligible frames, return the original frame.  */
	    if (EQ (f, frame))
	      return f;

	    /* Let minibuf decide if this frame is acceptable.  */
	    if (NILP (minibuf))
	      {
		if (! FRAME_MINIBUF_ONLY_P (XFRAME (f)))
		  return f;
	      }
	    else if (XTYPE (minibuf) == Lisp_Window)
	      {
		if (EQ (FRAME_MINIBUF_WINDOW (XFRAME (f)), minibuf))
		  return f;
	      }
	    else
Jim Blandy's avatar
Jim Blandy committed
497
	      return f;
Jim Blandy's avatar
Jim Blandy committed
498
	  }
Jim Blandy's avatar
Jim Blandy committed
499

500
	if (EQ (frame, f))
Jim Blandy's avatar
Jim Blandy committed
501 502 503 504
	  passed++;
      }
}

505 506 507
#if 0
/* Nobody seems to be using this code right now.  */

Jim Blandy's avatar
Jim Blandy committed
508 509 510
/* Return the previous frame in the frame list before FRAME.
   If MINIBUF is nil, exclude minibuffer-only frames.
   If MINIBUF is a window, include only frames using that window for
511 512
   their minibuffer.
   If MINIBUF is non-nil and not a window, include all frames.  */
Jim Blandy's avatar
Jim Blandy committed
513
Lisp_Object
Jim Blandy's avatar
Jim Blandy committed
514 515
prev_frame (frame, minibuf)
     Lisp_Object frame;
Jim Blandy's avatar
Jim Blandy committed
516
     Lisp_Object minibuf;
Jim Blandy's avatar
Jim Blandy committed
517 518 519 520
{
  Lisp_Object tail;
  Lisp_Object prev;

Jim Blandy's avatar
Jim Blandy committed
521 522
  /* There must always be at least one frame in Vframe_list.  */
  if (! CONSP (Vframe_list))
Jim Blandy's avatar
Jim Blandy committed
523 524
    abort ();

Jim Blandy's avatar
Jim Blandy committed
525
  prev = Qnil;
526
  for (tail = Vframe_list; CONSP (tail); tail = XCONS (tail)->cdr)
Jim Blandy's avatar
Jim Blandy committed
527
    {
528
      Lisp_Object f = XCONS (tail)->car;
Jim Blandy's avatar
Jim Blandy committed
529

530 531
      if (XTYPE (f) != Lisp_Frame)
	abort ();
Jim Blandy's avatar
Jim Blandy committed
532

533 534
      if (EQ (frame, f) && !NILP (prev))
	return prev;
Jim Blandy's avatar
Jim Blandy committed
535

536 537 538 539 540 541
      /* Decide whether this frame is eligible to be returned,
	 according to minibuf.  */
      if (NILP (minibuf))
	{
	  if (! FRAME_MINIBUF_ONLY_P (XFRAME (f)))
	    prev = f;
Jim Blandy's avatar
Jim Blandy committed
542
	}
543 544 545 546 547 548 549
      else if (XTYPE (minibuf) == Lisp_Window)
	{
	  if (EQ (FRAME_MINIBUF_WINDOW (XFRAME (f)), minibuf))
	    prev = f;
	}
      else
	prev = f;
Jim Blandy's avatar
Jim Blandy committed
550
    }
551 552 553 554 555 556 557 558 559 560 561

  /* We've scanned the entire list.  */
  if (NILP (prev))
    /* We went through the whole frame list without finding a single
       acceptable frame.  Return the original frame.  */
    return frame;
  else
    /* There were no acceptable frames in the list before FRAME; otherwise,
       we would have returned directly from the loop.  Since PREV is the last
       acceptable frame in the list, return it.  */
    return prev;
Jim Blandy's avatar
Jim Blandy committed
562
}
563
#endif
Jim Blandy's avatar
Jim Blandy committed
564

Jim Blandy's avatar
Jim Blandy committed
565 566
DEFUN ("next-frame", Fnext_frame, Snext_frame, 0, 2, 0,
  "Return the next frame in the frame list after FRAME.\n\
567
By default, skip minibuffer-only frames.\n\
568
If omitted, FRAME defaults to the selected frame.\n\
569 570
If optional argument MINIFRAME is non-nil, include minibuffer-only frames.\n\
If MINIFRAME is a window, include only frames using that window for their\n\
571
minibuffer.\n\
572
If MINIFRAME is non-nil and not a window, include all frames.")
Jim Blandy's avatar
Jim Blandy committed
573
  (frame, miniframe)
574
     Lisp_Object frame, miniframe;
Jim Blandy's avatar
Jim Blandy committed
575 576 577
{
  Lisp_Object tail;

Jim Blandy's avatar
Jim Blandy committed
578 579
  if (NILP (frame))
    XSET (frame, Lisp_Frame, selected_frame);
Jim Blandy's avatar
Jim Blandy committed
580
  else
Jim Blandy's avatar
Jim Blandy committed
581
    CHECK_LIVE_FRAME (frame, 0);
Jim Blandy's avatar
Jim Blandy committed
582

Jim Blandy's avatar
Jim Blandy committed
583
  return next_frame (frame, miniframe);
Jim Blandy's avatar
Jim Blandy committed
584
}
Jim Blandy's avatar
Jim Blandy committed
585
#endif /* MULTI_FRAME */
Jim Blandy's avatar
Jim Blandy committed
586

Jim Blandy's avatar
Jim Blandy committed
587 588 589 590 591 592
DEFUN ("delete-frame", Fdelete_frame, Sdelete_frame, 0, 1, "",
  "Delete FRAME, permanently eliminating it from use.\n\
If omitted, FRAME defaults to the selected frame.\n\
A frame may not be deleted if its minibuffer is used by other frames.")
  (frame)
     Lisp_Object frame;
Jim Blandy's avatar
Jim Blandy committed
593
{
Jim Blandy's avatar
Jim Blandy committed
594
  struct frame *f;
Jim Blandy's avatar
Jim Blandy committed
595 596
  union display displ;

Jim Blandy's avatar
Jim Blandy committed
597
  if (EQ (frame, Qnil))
Jim Blandy's avatar
Jim Blandy committed
598
    {
Jim Blandy's avatar
Jim Blandy committed
599 600
      f = selected_frame;
      XSET (frame, Lisp_Frame, f);
Jim Blandy's avatar
Jim Blandy committed
601 602 603
    }
  else
    {
Jim Blandy's avatar
Jim Blandy committed
604 605
      CHECK_FRAME (frame, 0);
      f = XFRAME (frame);
Jim Blandy's avatar
Jim Blandy committed
606 607
    }

Jim Blandy's avatar
Jim Blandy committed
608
  if (! FRAME_LIVE_P (f))
Jim Blandy's avatar
Jim Blandy committed
609 610
    return;

Jim Blandy's avatar
Jim Blandy committed
611 612 613
  /* Are there any other frames besides this one?  */
  if (f == selected_frame && EQ (next_frame (frame, Qt), frame))
    error ("Attempt to delete the only frame");
Jim Blandy's avatar
Jim Blandy committed
614

Jim Blandy's avatar
Jim Blandy committed
615 616
  /* Does this frame have a minibuffer, and is it the surrogate
     minibuffer for any other frame?  */
617
  if (FRAME_HAS_MINIBUF_P (XFRAME (frame)))
Jim Blandy's avatar
Jim Blandy committed
618
    {
Jim Blandy's avatar
Jim Blandy committed
619
      Lisp_Object frames;
Jim Blandy's avatar
Jim Blandy committed
620

Jim Blandy's avatar
Jim Blandy committed
621 622 623
      for (frames = Vframe_list;
	   CONSP (frames);
	   frames = XCONS (frames)->cdr)
Jim Blandy's avatar
Jim Blandy committed
624
	{
Jim Blandy's avatar
Jim Blandy committed
625
	  Lisp_Object this = XCONS (frames)->car;
Jim Blandy's avatar
Jim Blandy committed
626

Jim Blandy's avatar
Jim Blandy committed
627 628 629
	  if (! EQ (this, frame)
	      && EQ (frame,
		     (WINDOW_FRAME
Jim Blandy's avatar
Jim Blandy committed
630
		      (XWINDOW
Jim Blandy's avatar
Jim Blandy committed
631 632 633
		       (FRAME_MINIBUF_WINDOW
			(XFRAME (this)))))))
	    error ("Attempt to delete a surrogate minibuffer frame");
Jim Blandy's avatar
Jim Blandy committed
634
	}
Jim Blandy's avatar
Jim Blandy committed
635 636
    }

Jim Blandy's avatar
Jim Blandy committed
637 638
  /* Don't let the frame remain selected.  */
  if (f == selected_frame)
639
    Fselect_frame (next_frame (frame, Qt), Qnil);
Jim Blandy's avatar
Jim Blandy committed
640

Jim Blandy's avatar
Jim Blandy committed
641 642
  /* Don't allow minibuf_window to remain on a deleted frame.  */
  if (EQ (f->minibuffer_window, minibuf_window))
Jim Blandy's avatar
Jim Blandy committed
643
    {
Jim Blandy's avatar
Jim Blandy committed
644
      Fset_window_buffer (selected_frame->minibuffer_window,
Jim Blandy's avatar
Jim Blandy committed
645
			  XWINDOW (minibuf_window)->buffer);
Jim Blandy's avatar
Jim Blandy committed
646
      minibuf_window = selected_frame->minibuffer_window;
Jim Blandy's avatar
Jim Blandy committed
647 648
    }

649 650 651 652 653
  /* Mark all the windows that used to be on FRAME as deleted, and then
     remove the reference to them.  */
  delete_all_subwindows (XWINDOW (f->root_window));
  f->root_window = Qnil;

Jim Blandy's avatar
Jim Blandy committed
654
  Vframe_list = Fdelq (frame, Vframe_list);
655
  FRAME_SET_VISIBLE (f, 0);
Jim Blandy's avatar
Jim Blandy committed
656 657
  displ = f->display;
  f->display.nothing = 0;
Jim Blandy's avatar
Jim Blandy committed
658

Jim Blandy's avatar
Jim Blandy committed
659
#ifdef HAVE_X_WINDOWS
660
  if (FRAME_X_P (f))
Jim Blandy's avatar
Jim Blandy committed
661
    x_destroy_window (f, displ);
Jim Blandy's avatar
Jim Blandy committed
662 663
#endif

Jim Blandy's avatar
Jim Blandy committed
664
  /* If we've deleted the last_nonminibuf_frame, then try to find
Jim Blandy's avatar
Jim Blandy committed
665
     another one.  */
Jim Blandy's avatar
Jim Blandy committed
666
  if (f == last_nonminibuf_frame)
Jim Blandy's avatar
Jim Blandy committed
667
    {
Jim Blandy's avatar
Jim Blandy committed
668
      Lisp_Object frames;
Jim Blandy's avatar
Jim Blandy committed
669

Jim Blandy's avatar
Jim Blandy committed
670
      last_nonminibuf_frame = 0;
Jim Blandy's avatar
Jim Blandy committed
671

Jim Blandy's avatar
Jim Blandy committed
672 673 674
      for (frames = Vframe_list;
	   CONSP (frames);
	   frames = XCONS (frames)->cdr)
Jim Blandy's avatar
Jim Blandy committed
675
	{
Jim Blandy's avatar
Jim Blandy committed
676 677
	  f = XFRAME (XCONS (frames)->car);
	  if (!FRAME_MINIBUF_ONLY_P (f))
Jim Blandy's avatar
Jim Blandy committed
678
	    {
Jim Blandy's avatar
Jim Blandy committed
679
	      last_nonminibuf_frame = f;
Jim Blandy's avatar
Jim Blandy committed
680 681 682 683
	      break;
	    }
	}
    }
Jim Blandy's avatar
Jim Blandy committed
684

Jim Blandy's avatar
Jim Blandy committed
685 686
  /* If we've deleted Vdefault_minibuffer_frame, try to find another
     one.  Prefer minibuffer-only frames, but also notice frames
Jim Blandy's avatar
Jim Blandy committed
687
     with other windows.  */
Jim Blandy's avatar
Jim Blandy committed
688
  if (EQ (frame, Vdefault_minibuffer_frame))
Jim Blandy's avatar
Jim Blandy committed
689
    {
Jim Blandy's avatar
Jim Blandy committed
690
      Lisp_Object frames;
Jim Blandy's avatar
Jim Blandy committed
691

Jim Blandy's avatar
Jim Blandy committed
692 693
      /* The last frame we saw with a minibuffer, minibuffer-only or not.  */
      Lisp_Object frame_with_minibuf = Qnil;
Jim Blandy's avatar
Jim Blandy committed
694

Jim Blandy's avatar
Jim Blandy committed
695 696 697
      for (frames = Vframe_list;
	   CONSP (frames);
	   frames = XCONS (frames)->cdr)
Jim Blandy's avatar
Jim Blandy committed
698
	{
Jim Blandy's avatar
Jim Blandy committed
699
	  Lisp_Object this = XCONS (frames)->car;
Jim Blandy's avatar
Jim Blandy committed
700

Jim Blandy's avatar
Jim Blandy committed
701
	  if (XTYPE (this) != Lisp_Frame)
Jim Blandy's avatar
Jim Blandy committed
702
	    abort ();
Jim Blandy's avatar
Jim Blandy committed
703
	  f = XFRAME (this);
Jim Blandy's avatar
Jim Blandy committed
704

705
	  if (FRAME_HAS_MINIBUF_P (f))
Jim Blandy's avatar
Jim Blandy committed
706
	    {
Jim Blandy's avatar
Jim Blandy committed
707 708
	      frame_with_minibuf = this;
	      if (FRAME_MINIBUF_ONLY_P (f))
Jim Blandy's avatar
Jim Blandy committed
709 710 711 712
		break;
	    }
	}

Jim Blandy's avatar
Jim Blandy committed
713 714
      /* We know that there must be some frame with a minibuffer out
	 there.  If this were not true, all of the frames present
Jim Blandy's avatar
Jim Blandy committed
715
	 would have to be minibufferless, which implies that at some
Jim Blandy's avatar
Jim Blandy committed
716
	 point their minibuffer frames must have been deleted, but
Jim Blandy's avatar
Jim Blandy committed
717
	 that is prohibited at the top; you can't delete surrogate
Jim Blandy's avatar
Jim Blandy committed
718 719
	 minibuffer frames.  */
      if (NILP (frame_with_minibuf))
Jim Blandy's avatar
Jim Blandy committed
720 721
	abort ();

Jim Blandy's avatar
Jim Blandy committed
722
      Vdefault_minibuffer_frame = frame_with_minibuf;
Jim Blandy's avatar
Jim Blandy committed
723 724
    }

Jim Blandy's avatar
Jim Blandy committed
725 726 727 728 729
  return Qnil;
}

/* Return mouse position in character cell units.  */

Jim Blandy's avatar
Jim Blandy committed
730
DEFUN ("mouse-position", Fmouse_position, Smouse_position, 0, 0, 0,
Jim Blandy's avatar
Jim Blandy committed
731
  "Return a list (FRAME X . Y) giving the current mouse frame and position.\n\
Jim Blandy's avatar
Jim Blandy committed
732
If Emacs is running on a mouseless terminal or hasn't been programmed\n\
Jim Blandy's avatar
Jim Blandy committed
733
to read the mouse position, it returns the selected frame for FRAME\n\
Jim Blandy's avatar
Jim Blandy committed
734 735
and nil for X and Y.")
  ()
Jim Blandy's avatar
Jim Blandy committed
736
{
Jim Blandy's avatar
Jim Blandy committed
737
  Lisp_Object x, y, dummy;
Jim Blandy's avatar
Jim Blandy committed
738
  FRAME_PTR f;
Jim Blandy's avatar
Jim Blandy committed
739

Jim Blandy's avatar
Jim Blandy committed
740
  if (mouse_position_hook)
Jim Blandy's avatar
Jim Blandy committed
741
    (*mouse_position_hook) (&f, &x, &y, &dummy);
Jim Blandy's avatar
Jim Blandy committed
742 743
  else
    {
Jim Blandy's avatar
Jim Blandy committed
744
      f = selected_frame;
Jim Blandy's avatar
Jim Blandy committed
745 746
      x = y = Qnil;
    }
Jim Blandy's avatar
Jim Blandy committed
747

Jim Blandy's avatar
Jim Blandy committed
748
  XSET (dummy, Lisp_Frame, f);
Jim Blandy's avatar
Jim Blandy committed
749
  return Fcons (dummy, Fcons (make_number (x), make_number (y)));
Jim Blandy's avatar
Jim Blandy committed
750 751 752
}

DEFUN ("set-mouse-position", Fset_mouse_position, Sset_mouse_position, 3, 3, 0,
Jim Blandy's avatar
Jim Blandy committed
753 754 755 756
  "Move the mouse pointer to the center of cell (X,Y) in FRAME.\n\
WARNING:  If you use this under X, you should do `unfocus-frame' afterwards.")
  (frame, x, y)
     Lisp_Object frame, x, y;
Jim Blandy's avatar
Jim Blandy committed
757
{
Jim Blandy's avatar
Jim Blandy committed
758
  CHECK_LIVE_FRAME (frame, 0);
Jim Blandy's avatar
Jim Blandy committed
759 760 761 762
  CHECK_NUMBER (x, 2);
  CHECK_NUMBER (y, 1);

#ifdef HAVE_X_WINDOWS
763
  if (FRAME_X_P (XFRAME (frame)))
Jim Blandy's avatar
Jim Blandy committed
764
    /* Warping the mouse will cause  enternotify and focus events. */
Jim Blandy's avatar
Jim Blandy committed
765
    x_set_mouse_position (XFRAME (frame), x, y);
Jim Blandy's avatar
Jim Blandy committed
766 767 768 769 770 771 772
#endif

  return Qnil;
}

#if 0
/* ??? Can this be replaced with a Lisp function?
Jim Blandy's avatar
Jim Blandy committed
773 774
   It is used in minibuf.c.  Can we get rid of that?
   Yes.  All uses in minibuf.c are gone, and parallels to these
Jim Blandy's avatar
Jim Blandy committed
775
   functions have been defined in frame.el.  */
Jim Blandy's avatar
Jim Blandy committed
776

Jim Blandy's avatar
Jim Blandy committed
777
DEFUN ("frame-configuration", Fframe_configuration, Sframe_configuration,
Jim Blandy's avatar
Jim Blandy committed
778
       0, 0, 0,
Jim Blandy's avatar
Jim Blandy committed
779 780 781 782
  "Return object describing current frame configuration.\n\
The frame configuration is the current mouse position and selected frame.\n\
This object can be given to `restore-frame-configuration'\n\
to restore this frame configuration.")
Jim Blandy's avatar
Jim Blandy committed
783 784
  ()
{
Jim Blandy's avatar
Jim Blandy committed
785
  Lisp_Object c, time;
Jim Blandy's avatar
Jim Blandy committed
786
  
Jim Blandy's avatar
Jim Blandy committed
787
  c = Fmake_vector (make_number(4), Qnil);
Jim Blandy's avatar
Jim Blandy committed
788
  XVECTOR (c)->contents[0] = Fselected_frame();
Jim Blandy's avatar
Jim Blandy committed
789 790 791 792 793
  if (mouse_position_hook)
    (*mouse_position_hook) (&XVECTOR (c)->contents[1]
			    &XVECTOR (c)->contents[2],
			    &XVECTOR (c)->contents[3],
			    &time);
Jim Blandy's avatar
Jim Blandy committed
794 795 796
  return c;
}

Jim Blandy's avatar
Jim Blandy committed
797 798
DEFUN ("restore-frame-configuration", Frestore_frame_configuration,
       Srestore_frame_configuration,
Jim Blandy's avatar
Jim Blandy committed
799
       1, 1, 0,
Jim Blandy's avatar
Jim Blandy committed
800
  "Restores frame configuration CONFIGURATION.")
Jim Blandy's avatar
Jim Blandy committed
801 802 803
  (config)
  Lisp_Object config;
{
Jim Blandy's avatar
Jim Blandy committed
804
  Lisp_Object x_pos, y_pos, frame;
Jim Blandy's avatar
Jim Blandy committed
805 806 807 808

  CHECK_VECTOR (config, 0);
  if (XVECTOR (config)->size != 3)
    {
Jim Blandy's avatar
Jim Blandy committed
809
      error ("Wrong size vector passed to restore-frame-configuration");
Jim Blandy's avatar
Jim Blandy committed
810
    }
Jim Blandy's avatar
Jim Blandy committed
811 812
  frame = XVECTOR (config)->contents[0];
  CHECK_LIVE_FRAME (frame, 0);
Jim Blandy's avatar
Jim Blandy committed
813

Jim Blandy's avatar
Jim Blandy committed
814
  Fselect_frame (frame, Qnil);
Jim Blandy's avatar
Jim Blandy committed
815 816

#if 0
Jim Blandy's avatar
Jim Blandy committed
817
  /* This seems to interfere with the frame selection mechanism. jla */
Jim Blandy's avatar
Jim Blandy committed
818 819
  x_pos = XVECTOR (config)->contents[2];
  y_pos = XVECTOR (config)->contents[3];
Jim Blandy's avatar
Jim Blandy committed
820
  set_mouse_position (frame, XINT (x_pos), XINT (y_pos));
Jim Blandy's avatar
Jim Blandy committed
821 822
#endif

Jim Blandy's avatar
Jim Blandy committed
823
  return frame;
Jim Blandy's avatar
Jim Blandy committed
824 825 826
}    
#endif

Jim Blandy's avatar
Jim Blandy committed
827
DEFUN ("make-frame-visible", Fmake_frame_visible, Smake_frame_visible,
Jim Blandy's avatar
Jim Blandy committed
828
       0, 1, 0,
Jim Blandy's avatar
Jim Blandy committed
829
  "Make the frame FRAME visible (assuming it is an X-window).\n\
830 831
Also raises the frame so that nothing obscures it.\n\
If omitted, FRAME defaults to the currently selected frame.")
Jim Blandy's avatar
Jim Blandy committed
832 833
  (frame)
     Lisp_Object frame;
Jim Blandy's avatar
Jim Blandy committed
834
{
Jim Blandy's avatar
Jim Blandy committed
835
  if (NILP (frame))
Jim Blandy's avatar
Jim Blandy committed
836
    XSET (frame, Lisp_Frame, selected_frame);
Jim Blandy's avatar
Jim Blandy committed
837

Jim Blandy's avatar
Jim Blandy committed
838
  CHECK_LIVE_FRAME (frame, 0);
Jim Blandy's avatar
Jim Blandy committed
839

840 841
#ifdef HAVE_X_WINDOWS
  if (FRAME_X_P (XFRAME (frame)))
Jim Blandy's avatar
Jim Blandy committed
842
    x_make_frame_visible (XFRAME (frame));
843
#endif
Jim Blandy's avatar
Jim Blandy committed
844

Jim Blandy's avatar
Jim Blandy committed
845
  return frame;
Jim Blandy's avatar
Jim Blandy committed
846 847
}

Jim Blandy's avatar
Jim Blandy committed
848
DEFUN ("make-frame-invisible", Fmake_frame_invisible, Smake_frame_invisible,
Jim Blandy's avatar
Jim Blandy committed
849
       0, 1, "",
850 851
  "Make the frame FRAME invisible (assuming it is an X-window).\n\
If omitted, FRAME defaults to the currently selected frame.")
Jim Blandy's avatar
Jim Blandy committed
852 853
  (frame)
     Lisp_Object frame;
Jim Blandy's avatar
Jim Blandy committed
854
{
Jim Blandy's avatar
Jim Blandy committed
855
  if (NILP (frame))
Jim Blandy's avatar
Jim Blandy committed
856
    XSET (frame, Lisp_Frame, selected_frame);
Jim Blandy's avatar
Jim Blandy committed
857

Jim Blandy's avatar
Jim Blandy committed
858
  CHECK_LIVE_FRAME (frame, 0);
Jim Blandy's avatar
Jim Blandy committed
859

860 861
#ifdef HAVE_X_WINDOWS
  if (FRAME_X_P (XFRAME (frame)))
Jim Blandy's avatar
Jim Blandy committed
862
    x_make_frame_invisible (XFRAME (frame));
863
#endif
Jim Blandy's avatar
Jim Blandy committed
864 865 866 867

  return Qnil;
}

Jim Blandy's avatar
Jim Blandy committed
868
DEFUN ("iconify-frame", Ficonify_frame, Siconify_frame,
Jim Blandy's avatar
Jim Blandy committed
869
       0, 1, "",
870 871
  "Make the frame FRAME into an icon.\n\
If omitted, FRAME defaults to the currently selected frame.")
Jim Blandy's avatar
Jim Blandy committed
872 873
  (frame)
     Lisp_Object frame;
Jim Blandy's avatar
Jim Blandy committed
874
{
Jim Blandy's avatar
Jim Blandy committed
875
  if (NILP (frame))
Jim Blandy's avatar
Jim Blandy committed
876
    XSET (frame, Lisp_Frame, selected_frame);
Jim Blandy's avatar
Jim Blandy committed
877
  
Jim Blandy's avatar
Jim Blandy committed
878
  CHECK_LIVE_FRAME (frame, 0);
Jim Blandy's avatar
Jim Blandy committed
879

880 881
#ifdef HAVE_X_WINDOWS
  if (FRAME_X_P (XFRAME (frame)))
Jim Blandy's avatar
Jim Blandy committed
882
      x_iconify_frame (XFRAME (frame));
883
#endif
Jim Blandy's avatar
Jim Blandy committed
884 885 886 887

  return Qnil;
}

Jim Blandy's avatar
Jim Blandy committed
888
DEFUN ("frame-visible-p", Fframe_visible_p, Sframe_visible_p,
Jim Blandy's avatar
Jim Blandy committed
889
       1, 1, 0,
Jim Blandy's avatar
Jim Blandy committed
890 891
       "Return t if FRAME is now \"visible\" (actually in use for display).\n\
A frame that is not \"visible\" is not updated and, if it works through\n\
Jim Blandy's avatar
Jim Blandy committed
892
a window system, it may not show at all.\n\
893
Return the symbol `icon' if frame is visible only as an icon.")
Jim Blandy's avatar
Jim Blandy committed
894 895
  (frame)
     Lisp_Object frame;
Jim Blandy's avatar
Jim Blandy committed
896
{
Jim Blandy's avatar
Jim Blandy committed
897
  CHECK_LIVE_FRAME (frame, 0);
Jim Blandy's avatar
Jim Blandy committed
898

899
  if (FRAME_VISIBLE_P (XFRAME (frame)))
Jim Blandy's avatar
Jim Blandy committed
900
    return Qt;
901
  if (FRAME_ICONIFIED_P (XFRAME (frame)))
902
    return Qicon;
Jim Blandy's avatar
Jim Blandy committed
903 904 905
  return Qnil;
}

Jim Blandy's avatar
Jim Blandy committed
906
DEFUN ("visible-frame-list", Fvisible_frame_list, Svisible_frame_list