aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJim Blandy1991-12-11 19:19:07 +0000
committerJim Blandy1991-12-11 19:19:07 +0000
commitf9898cc66c69d6c931e0ca7f74d85e41538f63c9 (patch)
tree3dc8ab44df55c95f5ed18620886362dc84094e24 /src
parenta17915dc4c38e41ce29ec74dd56074ea01e6a206 (diff)
downloademacs-f9898cc66c69d6c931e0ca7f74d85e41538f63c9.tar.gz
emacs-f9898cc66c69d6c931e0ca7f74d85e41538f63c9.zip
*** empty log message ***
Diffstat (limited to 'src')
-rw-r--r--src/frame.c392
1 files changed, 189 insertions, 203 deletions
diff --git a/src/frame.c b/src/frame.c
index 4e02463857a..5eaf5897e01 100644
--- a/src/frame.c
+++ b/src/frame.c
@@ -27,9 +27,10 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
27 27
28Lisp_Object Vemacs_iconified; 28Lisp_Object Vemacs_iconified;
29Lisp_Object Qscreenp; 29Lisp_Object Qscreenp;
30Lisp_Object Qlive_screen_p;
30Lisp_Object Vscreen_list; 31Lisp_Object Vscreen_list;
31Lisp_Object Vterminal_screen; 32Lisp_Object Vterminal_screen;
32Lisp_Object Vglobal_minibuffer_screen; 33Lisp_Object Vdefault_minibuffer_screen;
33Lisp_Object Vdefault_screen_alist; 34Lisp_Object Vdefault_screen_alist;
34 35
35/* A screen which is not just a minibuffer, or 0 if there are no 36/* A screen which is not just a minibuffer, or 0 if there are no
@@ -43,13 +44,14 @@ extern Lisp_Object get_minibuffer ();
43DEFUN ("screenp", Fscreenp, Sscreenp, 1, 1, 0, 44DEFUN ("screenp", Fscreenp, Sscreenp, 1, 1, 0,
44 "Return non-nil if OBJECT is a screen.\n\ 45 "Return non-nil if OBJECT is a screen.\n\
45Value is t for a termcap screen (a character-only terminal),\n\ 46Value is t for a termcap screen (a character-only terminal),\n\
46`x' for an Emacs screen that is really an X window.") 47`x' for an Emacs screen that is really an X window.\n\
47 (screen) 48Also see live-screen-p.")
48 Lisp_Object screen; 49 (object)
50 Lisp_Object object;
49{ 51{
50 if (XTYPE (screen) != Lisp_Screen) 52 if (XTYPE (object) != Lisp_Screen)
51 return Qnil; 53 return Qnil;
52 switch (XSCREEN (screen)->output_method) 54 switch (XSCREEN (object)->output_method)
53 { 55 {
54 case output_termcap: 56 case output_termcap:
55 return Qt; 57 return Qt;
@@ -60,6 +62,21 @@ Value is t for a termcap screen (a character-only terminal),\n\
60 } 62 }
61} 63}
62 64
65DEFUN ("live-screen-p", Flive_screen_p, Slive_screen_p, 1, 1, 0,
66 "Return non-nil if OBJECT is a screen which has not been deleted.\n\
67Value is nil if OBJECT is not a live screen. If object is a live\n\
68screen, the return value indicates what sort of output device it is\n\
69displayed on. Value is t for a termcap screen (a character-only\n\
70terminal), `x' for an Emacs screen being displayed in an X window.")
71 (object)
72 Lisp_Object object;
73{
74 return ((SCREENP (object)
75 && SCREEN_LIVE_P (XSCREEN (object)))
76 ? Fscreenp (object)
77 : Qnil);
78}
79
63struct screen * 80struct screen *
64make_screen (mini_p) 81make_screen (mini_p)
65 int mini_p; 82 int mini_p;
@@ -175,9 +192,9 @@ make_screen_without_minibuffer (mini_window)
175 /* Choose the minibuffer window to use. */ 192 /* Choose the minibuffer window to use. */
176 if (NULL (mini_window)) 193 if (NULL (mini_window))
177 { 194 {
178 if (XTYPE (Vglobal_minibuffer_screen) != Lisp_Screen) 195 if (XTYPE (Vdefault_minibuffer_screen) != Lisp_Screen)
179 error ("global-minibuffer-screen must be set to create minibufferless screens."); 196 error ("default-minibuffer-screen must be set when creating minibufferless screens.");
180 mini_window = XSCREEN (Vglobal_minibuffer_screen)->minibuffer_window; 197 mini_window = XSCREEN (Vdefault_minibuffer_screen)->minibuffer_window;
181 } 198 }
182 else 199 else
183 { 200 {
@@ -214,7 +231,7 @@ make_minibuffer_screen ()
214 s->auto_lower = 0; 231 s->auto_lower = 0;
215 s->no_split = 1; 232 s->no_split = 1;
216 s->wants_modeline = 0; 233 s->wants_modeline = 0;
217 /* Note we leave has_minibuffer as 0. This is a little strange. */ 234 s->has_minibuffer = 1;
218 235
219 /* Now label the root window as also being the minibuffer. 236 /* Now label the root window as also being the minibuffer.
220 Avoid infinite looping on the window chain by marking next pointer 237 Avoid infinite looping on the window chain by marking next pointer
@@ -258,14 +275,13 @@ focus on that screen.")
258 (screen, no_enter) 275 (screen, no_enter)
259 Lisp_Object screen, no_enter; 276 Lisp_Object screen, no_enter;
260{ 277{
261 CHECK_SCREEN (screen, 0); 278 CHECK_LIVE_SCREEN (screen, 0);
262 279
263 if (selected_screen == XSCREEN (screen)) 280 if (selected_screen == XSCREEN (screen))
264 return screen; 281 return screen;
265 282
266 selected_screen = XSCREEN (screen); 283 selected_screen = XSCREEN (screen);
267 if (!EQ (SCREEN_ROOT_WINDOW (selected_screen), 284 if (! SCREEN_MINIBUF_ONLY_P (selected_screen))
268 SCREEN_MINIBUF_WINDOW (selected_screen)))
269 last_nonminibuf_screen = selected_screen; 285 last_nonminibuf_screen = selected_screen;
270 286
271 Fselect_window (XSCREEN (screen)->selected_window); 287 Fselect_window (XSCREEN (screen)->selected_window);
@@ -309,7 +325,8 @@ DEFUN ("screen-root-window", Fscreen_root_window, Sscreen_root_window, 0, 1, 0,
309{ 325{
310 if (NULL (screen)) 326 if (NULL (screen))
311 XSET (screen, Lisp_Screen, selected_screen); 327 XSET (screen, Lisp_Screen, selected_screen);
312 CHECK_SCREEN (screen, 0); 328 else
329 CHECK_LIVE_SCREEN (screen, 0);
313 330
314 return XSCREEN (screen)->root_window; 331 return XSCREEN (screen)->root_window;
315} 332}
@@ -322,7 +339,8 @@ DEFUN ("screen-selected-window", Fscreen_selected_window,
322{ 339{
323 if (NULL (screen)) 340 if (NULL (screen))
324 XSET (screen, Lisp_Screen, selected_screen); 341 XSET (screen, Lisp_Screen, selected_screen);
325 CHECK_SCREEN (screen, 0); 342 else
343 CHECK_LIVE_SCREEN (screen, 0);
326 344
327 return XSCREEN (screen)->selected_window; 345 return XSCREEN (screen)->selected_window;
328} 346}
@@ -336,34 +354,38 @@ DEFUN ("screen-list", Fscreen_list, Sscreen_list,
336} 354}
337 355
338#ifdef MULTI_SCREEN 356#ifdef MULTI_SCREEN
357
358/* Return the next screen in the screen list after SCREEN.
359 If MINIBUF is non-nil, include all screens.
360 If MINIBUF is nil, exclude minibuffer-only screens.
361 If MINIBUF is a window, include only screens using that window for
362 their minibuffer. */
339Lisp_Object 363Lisp_Object
340next_screen (screen, mini_screen) 364next_screen (screen, minibuf)
341 Lisp_Object screen; 365 Lisp_Object screen;
342 int mini_screen; 366 Lisp_Object minibuf;
343{ 367{
344 Lisp_Object tail; 368 Lisp_Object tail;
345 int passed = 0; 369 int passed = 0;
346 370
371 /* There must always be at least one screen in Vscreen_list. */
372 if (! CONSP (Vscreen_list))
373 abort ();
374
347 while (1) 375 while (1)
348 for (tail = Vscreen_list; CONSP (tail); tail = XCONS (tail)->cdr) 376 for (tail = Vscreen_list; CONSP (tail); tail = XCONS (tail)->cdr)
349 { 377 {
350 if (passed) 378 if (passed)
351 { 379 {
352 SCREEN_PTR s = XSCREEN (XCONS (tail)->car); 380 Lisp_Object s = XCONS (tail)->car;
353 381
354 if (!mini_screen 382 /* Decide whether this screen is eligible to be returned,
355 383 according to minibuf. */
356 /* Is this screen only a minibuffer? */ 384 if ((NULL (minibuf) && ! SCREEN_MINIBUF_ONLY_P (XSCREEN (s)))
357 && EQ (SCREEN_ROOT_WINDOW (s), 385 || XTYPE (minibuf) != Lisp_Window
358 SCREEN_MINIBUF_WINDOW (s)) 386 || EQ (SCREEN_MINIBUF_WINDOW (XSCREEN (s)), minibuf)
359 387 || EQ (s, screen))
360 /* If we have wrapped all the way around the list (i.e. 388 return s;
361 the only screen is an all-minibuffer screen), return
362 it anyway. */
363 && s != XSCREEN (screen))
364 continue;
365 else
366 return XCONS (tail)->car;
367 } 389 }
368 390
369 if (EQ (screen, XCONS (tail)->car)) 391 if (EQ (screen, XCONS (tail)->car))
@@ -371,34 +393,58 @@ next_screen (screen, mini_screen)
371 } 393 }
372} 394}
373 395
396/* Return the previous screen in the screen list before SCREEN.
397 If MINIBUF is non-nil, include all screens.
398 If MINIBUF is nil, exclude minibuffer-only screens.
399 If MINIBUF is a window, include only screens using that window for
400 their minibuffer. */
374Lisp_Object 401Lisp_Object
375prev_screen (screen, mini_screen) 402prev_screen (screen, minibuf)
376 Lisp_Object screen; 403 Lisp_Object screen;
377 int mini_screen; 404 Lisp_Object minibuf;
378{ 405{
379 Lisp_Object tail; 406 Lisp_Object tail;
380 Lisp_Object prev; 407 Lisp_Object prev;
381 408
409 /* There must always be at least one screen in Vscreen_list. */
410 if (! CONSP (Vscreen_list))
411 abort ();
412
382 prev = Qnil; 413 prev = Qnil;
383 while (1) 414 while (1)
384 for (tail = Vscreen_list; CONSP (tail); tail = XCONS (tail)->cdr) 415 {
385 { 416 for (tail = Vscreen_list; CONSP (tail); tail = XCONS (tail)->cdr)
386 if (EQ (screen, XCONS (tail)->car)) 417 {
387 { 418 Lisp_Object scr = XCONS (tail)->car;
388 if (!NULL (prev) && (mini_screen 419
389 || !EQ (XCONS (tail)->car, 420 if (XTYPE (scr) != Lisp_Screen)
390 Vglobal_minibuffer_screen))) 421 abort ();
391 return prev; 422
392 } 423 if (EQ (screen, scr) && !NULL (prev))
393 prev = XCONS (tail)->car; 424 return prev;
394 } 425
426 /* Decide whether this screen is eligible to be returned,
427 according to minibuf. */
428 if ((NULL (minibuf) && ! SCREEN_MINIBUF_ONLY_P (XSCREEN (scr)))
429 || XTYPE (minibuf) != Lisp_Window
430 || EQ (SCREEN_MINIBUF_WINDOW (XSCREEN (scr)), minibuf))
431 prev = scr;
432 }
433
434 if (NULL (prev))
435 /* We went through the whole screen list without finding a single
436 acceptable screen. Return the original screen. */
437 prev = screen;
438 }
439
395} 440}
396 441
397DEFUN ("next-screen", Fnext_screen, Snext_screen, 442DEFUN ("next-screen", Fnext_screen, Snext_screen, 0, 2, 0,
398 0, 2, 0, 443 "Return the next screen in the screen list after SCREEN.\n\
399 "Return the next screen in the screen list after SCREEN.\n\ 444If optional argument MINIBUF is non-nil, include all screens. If\n\
400If MINISCREEN is non-nil, include screens whose only window is a minibuffer.\n\ 445MINIBUF is nil or omitted, exclude minibuffer-only screens. If\n\
401If MINISCREEN is nil or omitted, these screens are skipped.") 446MINIBUF is a window, include only screens using that window for their\n\
447minibuffer.")
402 (screen, miniscreen) 448 (screen, miniscreen)
403Lisp_Object screen, miniscreen; 449Lisp_Object screen, miniscreen;
404{ 450{
@@ -406,16 +452,17 @@ Lisp_Object screen, miniscreen;
406 452
407 if (NULL (screen)) 453 if (NULL (screen))
408 XSET (screen, Lisp_Screen, selected_screen); 454 XSET (screen, Lisp_Screen, selected_screen);
409 CHECK_SCREEN (screen, 0); 455 else
456 CHECK_LIVE_SCREEN (screen, 0);
410 457
411 return next_screen (screen, (NULL (miniscreen) ? 0 : 1)); 458 return next_screen (screen, miniscreen);
412} 459}
413#endif /* MULTI_SCREEN */ 460#endif /* MULTI_SCREEN */
414 461
415DEFUN ("delete-screen", Fdelete_screen, Sdelete_screen, 462DEFUN ("delete-screen", Fdelete_screen, Sdelete_screen, 0, 1, "",
416 0, 1, "", 463 "Delete SCREEN, permanently eliminating it from use.\n\
417 "Delete SCREEN, permanently eliminating it from use.\n\ 464If omitted, SCREEN defaults to the selected screen.\n\
418Default is current screen.") 465A screen may not be deleted if its minibuffer is used by other screens.")
419 (screen) 466 (screen)
420 Lisp_Object screen; 467 Lisp_Object screen;
421{ 468{
@@ -433,27 +480,32 @@ Default is current screen.")
433 s = XSCREEN (screen); 480 s = XSCREEN (screen);
434 } 481 }
435 482
483 if (! SCREEN_LIVE_P (s))
484 return;
485
436 /* Are there any other screens besides this one? */ 486 /* Are there any other screens besides this one? */
437 if (s == selected_screen && EQ (next_screen (screen, 1), screen)) 487 if (s == selected_screen && EQ (next_screen (screen, Qt), screen))
438 error ("Attempt to delete the only screen"); 488 error ("Attempt to delete the only screen");
439 489
440 /* Does this screen have a minibuffer, and is it the surrogate 490 /* Does this screen have a minibuffer, and is it the surrogate
441 minibuffer for any other screen? */ 491 minibuffer for any other screen? */
442 if (EQ (screen, 492 if (SCREEN_HAS_MINIBUF (XSCREEN (screen)))
443 WINDOW_SCREEN (XWINDOW (SCREEN_MINIBUF_WINDOW (XSCREEN (screen))))))
444 { 493 {
445 Lisp_Object screen2; 494 Lisp_Object screen2;
446 495
447 for (screen2 = Vscreen_list; CONSP (2); screen2 = XCONS (screen2)->cdr) 496 for (screen2 = Vscreen_list; CONSP (2); screen2 = XCONS (screen2)->cdr)
448 if (! EQ (screen2, screen) 497 if (! EQ (screen2, screen)
449 && EQ (screen, 498 && EQ (screen,
450 WINDOW_SCREEN (XWINDOW (SCREEN_MINIBUF_WINDOW (XSCREEN (screen2)))))) 499 (WINDOW_SCREEN
500 (XWINDOW
501 (SCREEN_MINIBUF_WINDOW
502 (XSCREEN (screen2)))))))
451 error ("Attempt to delete a surrogate minibuffer screen"); 503 error ("Attempt to delete a surrogate minibuffer screen");
452 } 504 }
453 505
454 /* Don't let the screen remain selected. */ 506 /* Don't let the screen remain selected. */
455 if (s == selected_screen) 507 if (s == selected_screen)
456 Fselect_screen (next_screen (screen, 1)); 508 Fselect_screen (next_screen (screen, Qt));
457 509
458 /* Don't allow minibuf_window to remain on a deleted screen. */ 510 /* Don't allow minibuf_window to remain on a deleted screen. */
459 if (EQ (s->minibuffer_window, minibuf_window)) 511 if (EQ (s->minibuffer_window, minibuf_window))
@@ -481,8 +533,8 @@ Default is current screen.")
481 533
482 for (screen = Vscreen_list; CONSP (screen); screen = XCONS (screen)->cdr) 534 for (screen = Vscreen_list; CONSP (screen); screen = XCONS (screen)->cdr)
483 { 535 {
484 s = XSCREEN (XCONS (screen)->cdr); 536 s = XSCREEN (XCONS (screen)->car);
485 if (!EQ (SCREEN_ROOT_WINDOW (s), SCREEN_MINIBUF_WINDOW (s))) 537 if (!SCREEN_MINIBUF_ONLY_P (s))
486 { 538 {
487 last_nonminibuf_screen = s; 539 last_nonminibuf_screen = s;
488 break; 540 break;
@@ -495,34 +547,26 @@ Default is current screen.")
495 547
496/* Return mouse position in character cell units. */ 548/* Return mouse position in character cell units. */
497 549
498static 550DEFUN ("mouse-position", Fmouse_position, Smouse_position, 0, 0, 0,
499read_mouse_position (screen, x, y) 551 "Return a list (SCREEN X . Y) giving the current mouse screen and position.\n\
500 Lisp_Object screen; 552If Emacs is running on a mouseless terminal or hasn't been programmed\n\
501 int *x, *y; 553to read the mouse position, it returns the selected screen for SCREEN\n\
502{ 554and nil for X and Y.")
503 CHECK_SCREEN (screen, 0); 555 ()
504
505 *x = 1;
506 *y = 1;
507
508#ifdef HAVE_X_WINDOWS
509 if (XSCREEN (screen)->output_method == output_x_window)
510 x_read_mouse_position (XSCREEN (screen), x, y);
511#endif
512}
513
514DEFUN ("read-mouse-position", Fread_mouse_position, Sread_mouse_position, 1, 1, 0,
515 "Return a cons (x . y) which represents the position of the mouse.")
516 (screen)
517 Lisp_Object screen;
518{ 556{
519 int x, y; 557 Lisp_Object x, y, dummy;
520 struct screen *s; 558 SCREEN_PTR s;
521 559
522 CHECK_SCREEN (screen, 0); 560 if (mouse_position_hook)
561 (*mouse_position_hook) (&s, &x, &y, &dummy);
562 else
563 {
564 s = selected_screen;
565 x = y = Qnil;
566 }
523 567
524 read_mouse_position (screen, &x, &y); 568 XSET (dummy, Lisp_Screen, s);
525 return Fcons (make_number (x), make_number (y)); 569 return Fcons (dummy, Fcons (make_number (x), make_number (y)));
526} 570}
527 571
528DEFUN ("set-mouse-position", Fset_mouse_position, Sset_mouse_position, 3, 3, 0, 572DEFUN ("set-mouse-position", Fset_mouse_position, Sset_mouse_position, 3, 3, 0,
@@ -531,7 +575,7 @@ WARNING: If you use this under X, you should do unfocus-screen afterwards.")
531 (screen, x, y) 575 (screen, x, y)
532 Lisp_Object screen, x, y; 576 Lisp_Object screen, x, y;
533{ 577{
534 CHECK_SCREEN (screen, 0); 578 CHECK_LIVE_SCREEN (screen, 0);
535 CHECK_NUMBER (x, 2); 579 CHECK_NUMBER (x, 2);
536 CHECK_NUMBER (y, 1); 580 CHECK_NUMBER (y, 1);
537 581
@@ -556,16 +600,15 @@ This object can be given to `restore-screen-configuration'\n\
556to restore this screen configuration.") 600to restore this screen configuration.")
557 () 601 ()
558{ 602{
559 int x, y; 603 Lisp_Object c, time;
560 Lisp_Object c, screen;
561 struct screen *s;
562 604
563 c = Fmake_vector (make_number(3), Qnil); 605 c = Fmake_vector (make_number(4), Qnil);
564 XVECTOR (c)->contents[0] = screen = Fselected_screen(); 606 XVECTOR (c)->contents[0] = Fselected_screen();
565 read_mouse_position (screen, &x, &y); 607 if (mouse_position_hook)
566 XVECTOR (c)->contents[1] = make_number (x); 608 (*mouse_position_hook) (&XVECTOR (c)->contents[1]
567 XVECTOR (c)->contents[2] = make_number (y); 609 &XVECTOR (c)->contents[2],
568 610 &XVECTOR (c)->contents[3],
611 &time);
569 return c; 612 return c;
570} 613}
571 614
@@ -584,14 +627,14 @@ DEFUN ("restore-screen-configuration", Frestore_screen_configuration,
584 error ("Wrong size vector passed to restore-screen-configuration"); 627 error ("Wrong size vector passed to restore-screen-configuration");
585 } 628 }
586 screen = XVECTOR (config)->contents[0]; 629 screen = XVECTOR (config)->contents[0];
587 CHECK_SCREEN (screen, 0); 630 CHECK_LIVE_SCREEN (screen, 0);
588 631
589 Fselect_screen (screen, Qnil); 632 Fselect_screen (screen, Qnil);
590 633
591#if 0 634#if 0
592 /* This seems to interfere with the screen selection mechanism. jla */ 635 /* This seems to interfere with the screen selection mechanism. jla */
593 x_pos = XVECTOR (config)->contents[1]; 636 x_pos = XVECTOR (config)->contents[2];
594 y_pos = XVECTOR (config)->contents[2]; 637 y_pos = XVECTOR (config)->contents[3];
595 set_mouse_position (screen, XINT (x_pos), XINT (y_pos)); 638 set_mouse_position (screen, XINT (x_pos), XINT (y_pos));
596#endif 639#endif
597 640
@@ -606,10 +649,7 @@ Also raises the screen so that nothing obscures it.")
606 (screen) 649 (screen)
607 Lisp_Object screen; 650 Lisp_Object screen;
608{ 651{
609 CHECK_SCREEN (screen, 0); 652 CHECK_LIVE_SCREEN (screen, 0);
610
611 if (XSCREEN (screen)->display.nothing == 0)
612 error ("Cannot make a dead screen object visible");
613 653
614 if (XSCREEN (screen)->output_method == output_x_window) 654 if (XSCREEN (screen)->output_method == output_x_window)
615 x_make_screen_visible (XSCREEN (screen)); 655 x_make_screen_visible (XSCREEN (screen));
@@ -623,7 +663,7 @@ DEFUN ("make-screen-invisible", Fmake_screen_invisible, Smake_screen_invisible,
623 (screen) 663 (screen)
624 Lisp_Object screen; 664 Lisp_Object screen;
625{ 665{
626 CHECK_SCREEN (screen, 0); 666 CHECK_LIVE_SCREEN (screen, 0);
627 667
628 if (XSCREEN (screen)->output_method == output_x_window) 668 if (XSCREEN (screen)->output_method == output_x_window)
629 x_make_screen_invisible (XSCREEN (screen)); 669 x_make_screen_invisible (XSCREEN (screen));
@@ -637,10 +677,7 @@ DEFUN ("iconify-screen", Ficonify_screen, Siconify_screen,
637 (screen) 677 (screen)
638 Lisp_Object screen; 678 Lisp_Object screen;
639{ 679{
640 CHECK_SCREEN (screen, 0); 680 CHECK_LIVE_SCREEN (screen, 0);
641
642 if (XSCREEN (screen)->display.nothing == 0)
643 error ("Cannot make a dead screen object iconified.");
644 681
645 if (XSCREEN (screen)->output_method == output_x_window) 682 if (XSCREEN (screen)->output_method == output_x_window)
646 x_iconify_screen (XSCREEN (screen)); 683 x_iconify_screen (XSCREEN (screen));
@@ -654,10 +691,7 @@ DEFUN ("deiconify-screen", Fdeiconify_screen, Sdeiconify_screen,
654 (screen) 691 (screen)
655 Lisp_Object screen; 692 Lisp_Object screen;
656{ 693{
657 CHECK_SCREEN (screen, 0); 694 CHECK_LIVE_SCREEN (screen, 0);
658
659 if (XSCREEN (screen)->display.nothing == 0)
660 error ("Cannot deiconify a dead screen object.");
661 695
662 if (XSCREEN (screen)->output_method == output_x_window) 696 if (XSCREEN (screen)->output_method == output_x_window)
663 x_make_screen_visible (XSCREEN (screen)); 697 x_make_screen_visible (XSCREEN (screen));
@@ -674,7 +708,7 @@ Return the symbol `icon' if window is visible only as an icon.")
674 (screen) 708 (screen)
675 Lisp_Object screen; 709 Lisp_Object screen;
676{ 710{
677 CHECK_SCREEN (screen, 0); 711 CHECK_LIVE_SCREEN (screen, 0);
678 712
679 if (XSCREEN (screen)->visible) 713 if (XSCREEN (screen)->visible)
680 return Qt; 714 return Qt;
@@ -724,11 +758,12 @@ window when a screen doesn't have its own minibuffer.")
724 (screen, focus_screen) 758 (screen, focus_screen)
725 Lisp_Object screen, focus_screen; 759 Lisp_Object screen, focus_screen;
726{ 760{
727 CHECK_SCREEN (screen, 0); 761 CHECK_LIVE_SCREEN (screen, 0);
762
728 if (NULL (focus_screen)) 763 if (NULL (focus_screen))
729 focus_screen = screen; 764 focus_screen = screen;
730 else 765 else
731 CHECK_SCREEN (focus_screen, 1); 766 CHECK_LIVE_SCREEN (focus_screen, 1);
732 767
733 XSCREEN (screen)->focus_screen = focus_screen; 768 XSCREEN (screen)->focus_screen = focus_screen;
734 769
@@ -745,7 +780,7 @@ See redirect-screen-focus.")
745 (screen) 780 (screen)
746 Lisp_Object screen; 781 Lisp_Object screen;
747{ 782{
748 CHECK_SCREEN (screen, 0); 783 CHECK_LIVE_SCREEN (screen, 0);
749 return SCREEN_FOCUS_SCREEN (XSCREEN (screen)); 784 return SCREEN_FOCUS_SCREEN (XSCREEN (screen));
750} 785}
751 786
@@ -820,7 +855,10 @@ The meaningful PARMs depend on the kind of screen.")
820 store_in_alist (&alist, "height", make_number (s->height)); 855 store_in_alist (&alist, "height", make_number (s->height));
821 store_in_alist (&alist, "width", make_number (s->width)); 856 store_in_alist (&alist, "width", make_number (s->width));
822 store_in_alist (&alist, "modeline", (s->wants_modeline ? Qt : Qnil)); 857 store_in_alist (&alist, "modeline", (s->wants_modeline ? Qt : Qnil));
823 store_in_alist (&alist, "minibuffer", (s->has_minibuffer ? Qt : Qnil)); 858 store_in_alist (&alist, "minibuffer",
859 (SCREEN_HAS_MINIBUF (s)
860 ? (SCREEN_MINIBUF_ONLY_P (s) ? intern ("only") : Qt)
861 : Qnil));
824 store_in_alist (&alist, "unsplittable", (s->no_split ? Qt : Qnil)); 862 store_in_alist (&alist, "unsplittable", (s->no_split ? Qt : Qnil));
825 863
826 if (s->output_method == output_x_window) 864 if (s->output_method == output_x_window)
@@ -844,13 +882,10 @@ The meaningful PARMs depend on the kind of screen; undefined PARMs are ignored."
844 s = selected_screen; 882 s = selected_screen;
845 else 883 else
846 { 884 {
847 CHECK_SCREEN (screen, 0); 885 CHECK_LIVE_SCREEN (screen, 0);
848 s = XSCREEN (screen); 886 s = XSCREEN (screen);
849 } 887 }
850 888
851 if (s->display.nothing == 0)
852 error ("Cannot modify parameters of a deleted screen");
853
854 if (s->output_method == output_x_window) 889 if (s->output_method == output_x_window)
855 for (tail = alist; !EQ (tail, Qnil); tail = Fcdr (tail)) 890 for (tail = alist; !EQ (tail, Qnil); tail = Fcdr (tail))
856 { 891 {
@@ -868,14 +903,14 @@ The meaningful PARMs depend on the kind of screen; undefined PARMs are ignored."
868 903
869DEFUN ("screen-pixel-size", Fscreen_pixel_size, 904DEFUN ("screen-pixel-size", Fscreen_pixel_size,
870 Sscreen_pixel_size, 1, 1, 0, 905 Sscreen_pixel_size, 1, 1, 0,
871 "Return a cons (width . height) of screen SCREEN's dimensions.") 906 "Return a cons (width . height) of SCREEN's size in pixels.")
872 (screen) 907 (screen)
873 Lisp_Object screen; 908 Lisp_Object screen;
874{ 909{
875 register struct screen *s; 910 register struct screen *s;
876 int width, height; 911 int width, height;
877 912
878 CHECK_SCREEN (screen, 0); 913 CHECK_LIVE_SCREEN (screen, 0);
879 s = XSCREEN (screen); 914 s = XSCREEN (screen);
880 915
881 return Fcons (make_number (x_pixel_width (s)), 916 return Fcons (make_number (x_pixel_width (s)),
@@ -910,7 +945,7 @@ but that the idea of the actual height of the screen should not be changed.")
910 s = selected_screen; 945 s = selected_screen;
911 else 946 else
912 { 947 {
913 CHECK_SCREEN (screen, 0); 948 CHECK_LIVE_SCREEN (screen, 0);
914 s = XSCREEN (screen); 949 s = XSCREEN (screen);
915 } 950 }
916 951
@@ -937,7 +972,7 @@ but that the idea of the actual width of the screen should not be changed.")
937 s = selected_screen; 972 s = selected_screen;
938 else 973 else
939 { 974 {
940 CHECK_SCREEN (screen, 0); 975 CHECK_LIVE_SCREEN (screen, 0);
941 s = XSCREEN (screen); 976 s = XSCREEN (screen);
942 } 977 }
943 978
@@ -951,8 +986,7 @@ but that the idea of the actual width of the screen should not be changed.")
951 return Qnil; 986 return Qnil;
952} 987}
953 988
954DEFUN ("set-screen-size", Fset_screen_size, 989DEFUN ("set-screen-size", Fset_screen_size, Sset_screen_size, 3, 3, 0,
955 Sset_screen_size, 3, 3, 0,
956 "Sets size of SCREEN to COLS by ROWS, measured in characters.") 990 "Sets size of SCREEN to COLS by ROWS, measured in characters.")
957 (screen, cols, rows) 991 (screen, cols, rows)
958 Lisp_Object screen, cols, rows; 992 Lisp_Object screen, cols, rows;
@@ -960,7 +994,7 @@ DEFUN ("set-screen-size", Fset_screen_size,
960 register struct screen *s; 994 register struct screen *s;
961 int mask; 995 int mask;
962 996
963 CHECK_SCREEN (screen, 0); 997 CHECK_LIVE_SCREEN (screen, 0);
964 CHECK_NUMBER (cols, 2); 998 CHECK_NUMBER (cols, 2);
965 CHECK_NUMBER (rows, 1); 999 CHECK_NUMBER (rows, 1);
966 s = XSCREEN (screen); 1000 s = XSCREEN (screen);
@@ -978,14 +1012,17 @@ DEFUN ("set-screen-size", Fset_screen_size,
978 1012
979DEFUN ("set-screen-position", Fset_screen_position, 1013DEFUN ("set-screen-position", Fset_screen_position,
980 Sset_screen_position, 3, 3, 0, 1014 Sset_screen_position, 3, 3, 0,
981 "Sets size of SCREEN in pixels to XOFFSET by YOFFSET.") 1015 "Sets position of SCREEN in pixels to XOFFSET by YOFFSET.\n\
1016If XOFFSET or YOFFSET are negative, they are interpreted relative to\n\
1017the leftmost or bottommost position SCREEN could occupy without going\n\
1018off the screen.")
982 (screen, xoffset, yoffset) 1019 (screen, xoffset, yoffset)
983 Lisp_Object screen, xoffset, yoffset; 1020 Lisp_Object screen, xoffset, yoffset;
984{ 1021{
985 register struct screen *s; 1022 register struct screen *s;
986 int mask; 1023 int mask;
987 1024
988 CHECK_SCREEN (screen, 0); 1025 CHECK_LIVE_SCREEN (screen, 0);
989 CHECK_NUMBER (xoffset, 1); 1026 CHECK_NUMBER (xoffset, 1);
990 CHECK_NUMBER (yoffset, 2); 1027 CHECK_NUMBER (yoffset, 2);
991 s = XSCREEN (screen); 1028 s = XSCREEN (screen);
@@ -996,68 +1033,6 @@ DEFUN ("set-screen-position", Fset_screen_position,
996 return Qt; 1033 return Qt;
997} 1034}
998 1035
999/* Test if column *x, row *y is within window *w. If they are not,
1000 return 0; if they are on the window's modeline, return -1; if
1001 they are in the window's text area (the only other alternative)
1002 set *x and *y to their locations relative to the upper left
1003 corner of the window, and return 1. */
1004int
1005coordinates_in_window (w, x, y)
1006 register struct window *w;
1007 register int *x, *y;
1008{
1009 register int left = XINT (w->left);
1010 register int width = XINT (w->width);
1011 register int window_height = XINT (w->height);
1012 register int top = XFASTINT (w->top);
1013
1014 if (*x < left || *x >= left + width
1015 || *y < top || *y > top + window_height - 1)
1016 return 0;
1017
1018 if (*y == top + window_height - 1
1019 && window_height > 1) /* 1 line => minibuffer */
1020 /* in modeline */
1021 return -1;
1022
1023 *x -= left;
1024 *y -= top;
1025 return 1;
1026}
1027
1028DEFUN ("coordinates-in-window-p", Fcoordinates_in_window_p,
1029 Scoordinates_in_window_p, 2, 2, 0,
1030 "Return non-nil if COORDINATES are in WINDOW.\n\
1031COORDINATES is a cons of the form (X Y), X and Y being screen-relative.\n\
1032If COORDINATES are in the text portion of WINDOW, the coordinates relative\n\
1033to the window are returned. If they are in the modeline of WINDOW, t is\n\
1034returned.")
1035 (coordinates, window)
1036 register Lisp_Object coordinates, window;
1037{
1038 int x, y;
1039
1040 CHECK_WINDOW (window, 0);
1041 CHECK_CONS (coordinates, 1);
1042 x = XINT (Fcar (coordinates));
1043 y = XINT (Fcar (Fcdr (coordinates)));
1044
1045 switch (coordinates_in_window (XWINDOW (window), &x, &y))
1046 {
1047 case -1: /* In modeline of window. */
1048 return Qt;
1049
1050 case 0: /* NOT in window at all. */
1051 return Qnil;
1052
1053 case 1: /* In text part of window. */
1054 return Fcons (x, Fcons (y, Qnil));
1055
1056 default:
1057 abort ();
1058 }
1059}
1060
1061#ifndef HAVE_X11 1036#ifndef HAVE_X11
1062DEFUN ("rubber-band-rectangle", Frubber_band_rectangle, Srubber_band_rectangle, 1037DEFUN ("rubber-band-rectangle", Frubber_band_rectangle, Srubber_band_rectangle,
1063 3, 3, "", 1038 3, 3, "",
@@ -1116,6 +1091,10 @@ choose_minibuf_screen ()
1116syms_of_screen () 1091syms_of_screen ()
1117{ 1092{
1118 Qscreenp = intern ("screenp"); 1093 Qscreenp = intern ("screenp");
1094 Qlive_screen_p = intern ("live_screen_p");
1095
1096 staticpro (&Qscreenp);
1097 staticpro (&Qlive_screen_p);
1119 1098
1120 staticpro (&Vscreen_list); 1099 staticpro (&Vscreen_list);
1121 1100
@@ -1123,15 +1102,22 @@ syms_of_screen ()
1123 "The initial screen-object, which represents Emacs's stdout."); 1102 "The initial screen-object, which represents Emacs's stdout.");
1124 1103
1125 DEFVAR_LISP ("emacs-iconified", &Vemacs_iconified, 1104 DEFVAR_LISP ("emacs-iconified", &Vemacs_iconified,
1126 "Non-nil if all of emacs is iconified and not screen updates are needed."); 1105 "Non-nil if all of emacs is iconified and screen updates are not needed.");
1127 Vemacs_iconified = Qnil; 1106 Vemacs_iconified = Qnil;
1128 1107
1129 DEFVAR_LISP ("global-minibuffer-screen", &Vglobal_minibuffer_screen, 1108 DEFVAR_LISP ("default-minibuffer-screen", &Vdefault_minibuffer_screen,
1130 "A screen whose minibuffer is used by minibufferless screens.\n\ 1109 "Minibufferless screens use this screen's minibuffer.\n\
1131When you create a minibufferless screen, by default it will use the\n\ 1110\n\
1132minibuffer of this screen. It is up to you to create a suitable screen\n\ 1111Emacs cannot create minibufferless screens unless this is set to an\n\
1133and store it in this variable."); 1112appropriate surrogate.\n\
1134 Vglobal_minibuffer_screen = Qnil; 1113\n\
1114Emacs consults this variable only when creating minibufferless\n\
1115screens; once the screen is created, it sticks with its assigned\n\
1116minibuffer, no matter what this variable is set to. This means that\n\
1117this variable doesn't necessarily say anything meaningful about the\n\
1118current set of screens, or where the minibuffer is currently being\n\
1119displayed.");
1120 Vdefault_minibuffer_screen = Qnil;
1135 1121
1136 DEFVAR_LISP ("default-screen-alist", &Vdefault_screen_alist, 1122 DEFVAR_LISP ("default-screen-alist", &Vdefault_screen_alist,
1137 "Alist of default values for screen creation.\n\ 1123 "Alist of default values for screen creation.\n\
@@ -1145,6 +1131,7 @@ minibuffer-screen-alist.");
1145 Vdefault_screen_alist = Qnil; 1131 Vdefault_screen_alist = Qnil;
1146 1132
1147 defsubr (&Sscreenp); 1133 defsubr (&Sscreenp);
1134 defsubr (&Slive_screen_p);
1148 defsubr (&Sselect_screen); 1135 defsubr (&Sselect_screen);
1149 defsubr (&Sselected_screen); 1136 defsubr (&Sselected_screen);
1150 defsubr (&Swindow_screen); 1137 defsubr (&Swindow_screen);
@@ -1153,7 +1140,7 @@ minibuffer-screen-alist.");
1153 defsubr (&Sscreen_list); 1140 defsubr (&Sscreen_list);
1154 defsubr (&Snext_screen); 1141 defsubr (&Snext_screen);
1155 defsubr (&Sdelete_screen); 1142 defsubr (&Sdelete_screen);
1156 defsubr (&Sread_mouse_position); 1143 defsubr (&Smouse_position);
1157 defsubr (&Sset_mouse_position); 1144 defsubr (&Sset_mouse_position);
1158#if 0 1145#if 0
1159 defsubr (&Sscreen_configuration); 1146 defsubr (&Sscreen_configuration);
@@ -1176,7 +1163,6 @@ minibuffer-screen-alist.");
1176 defsubr (&Sset_screen_width); 1163 defsubr (&Sset_screen_width);
1177 defsubr (&Sset_screen_size); 1164 defsubr (&Sset_screen_size);
1178 defsubr (&Sset_screen_position); 1165 defsubr (&Sset_screen_position);
1179 defsubr (&Scoordinates_in_window_p);
1180#ifndef HAVE_X11 1166#ifndef HAVE_X11
1181 defsubr (&Srubber_band_rectangle); 1167 defsubr (&Srubber_band_rectangle);
1182#endif /* HAVE_X11 */ 1168#endif /* HAVE_X11 */